From: "Wu, Hao A" <hao.a.wu@intel.com>
To: "Ni, Ruiyu" <ruiyu.ni@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Gao, Liming" <liming.gao@intel.com>
Subject: Re: [PATCH] EmulatorPkg: formalize line endings
Date: Wed, 29 Aug 2018 05:06:11 +0000 [thread overview]
Message-ID: <B80AF82E9BFB8E4FBD8C89DA810C6A0931E3CEAB@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20180829033955.105432-1-ruiyu.ni@intel.com>
Reviewed-by: Hao Wu <hao.a.wu@intel.com>
Best Regards,
Hao Wu
> -----Original Message-----
> From: Ni, Ruiyu
> Sent: Wednesday, August 29, 2018 11:40 AM
> To: edk2-devel@lists.01.org
> Cc: Wu, Hao A; Gao, Liming
> Subject: [PATCH] EmulatorPkg: formalize line endings
>
> The patch is the result of running
> "BaseTools/Scripts/FormatDosFiles.py EmulatorPkg/"
>
> No functionality impact.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
> Cc: Hao A Wu <hao.a.wu@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> ---
> EmulatorPkg/CpuRuntimeDxe/Cpu.c | 24 +-
> EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c | 2 +-
> EmulatorPkg/EmuGopDxe/Gop.h | 390 +--
> EmulatorPkg/EmuGopDxe/GopInput.c | 1800 +++++------
> EmulatorPkg/EmuGopDxe/GopScreen.c | 832 ++---
> EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c | 2 +-
> EmulatorPkg/Include/Library/EmuMagicPageLib.h | 76 +-
> EmulatorPkg/Include/Library/EmuThunkLib.h | 84 +-
> EmulatorPkg/Include/Library/PpiListLib.h | 42 +-
> EmulatorPkg/Include/Library/SmbiosLib.h | 404 +--
> EmulatorPkg/Include/Protocol/EmuBlockIo.h | 2 +-
> EmulatorPkg/Include/Protocol/EmuFileSystem.h | 280 +-
> EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h | 268 +-
> .../Library/DevicePathTextLib/DevicePathTextLib.c | 2 +-
> .../DevicePathTextLib/DevicePathTextLib.inf | 2 +-
> EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c | 2 +-
> .../DxeEmuPeCoffExtraActionLib.inf | 96 +-
> .../DxeEmuStdErrSerialPortLib.c | 2 +-
> EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c | 2 +-
> .../PeiServicesTablePointer.c | 12 +-
> .../PeiEmuPeCoffExtraActionLib.inf | 98 +-
> .../PeiServicesTablePointer.c | 12 +-
> .../PeiServicesTablePointer.c | 12 +-
> EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf | 2 +-
> EmulatorPkg/Library/SecPeiServicesLib/FwVol.c | 562 ++--
> EmulatorPkg/Library/SecPpiListLib/PpiListLib.c | 34 +-
> EmulatorPkg/Library/SmbiosLib/SmbiosLib.c | 704 ++---
> EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf | 94 +-
> .../MiscSubClassPlatformDxe/MiscSubClassDriver.h | 4 +-
> .../MiscSubclassDriverEntryPoint.c | 4 +-
> EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c | 18 +-
> .../PlatformSmbiosDxe/PlatformSmbiosDxe.inf | 4 +-
> EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c | 26 +-
> EmulatorPkg/Sec/Ia32/SwitchRam.asm | 26 +-
> EmulatorPkg/Sec/Sec.c | 298 +-
> EmulatorPkg/Sec/Sec.h | 102 +-
> EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c | 78 +-
> EmulatorPkg/Unix/Host/BlockIo.c | 2 +-
> EmulatorPkg/Unix/Host/EmuThunk.c | 880 +++---
> EmulatorPkg/Unix/Host/Host.c | 14 +-
> EmulatorPkg/Unix/Host/Host.h | 2 +-
> EmulatorPkg/Unix/Host/Ia32/Gasket.S | 2984 +++++++++---------
> EmulatorPkg/Unix/Host/Ia32/SwitchStack.c | 148 +-
> EmulatorPkg/Unix/Host/MemoryAllocationLib.c | 290 +-
> EmulatorPkg/Unix/Host/PosixFileSystem.c | 3112 +++++++++----------
> EmulatorPkg/Unix/Host/Pthreads.c | 470 +--
> EmulatorPkg/Unix/Host/X11GraphicsWindow.c | 2056 ++++++------
> EmulatorPkg/Unix/Host/X64/Gasket.S | 3262 ++++++++++----------
> EmulatorPkg/Unix/lldbefi.py | 1080 +++----
> EmulatorPkg/Win/Host/WinBlockIo.c | 2 +-
> EmulatorPkg/Win/Host/WinHost.h | 2 +-
> 51 files changed, 10353 insertions(+), 10353 deletions(-)
>
> diff --git a/EmulatorPkg/CpuRuntimeDxe/Cpu.c
> b/EmulatorPkg/CpuRuntimeDxe/Cpu.c
> index 47fb7f07e8..83e876509a 100644
> --- a/EmulatorPkg/CpuRuntimeDxe/Cpu.c
> +++ b/EmulatorPkg/CpuRuntimeDxe/Cpu.c
> @@ -63,7 +63,7 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
> 0, // ProcessorXModel: 4;
> 0, // ProcessorXFamily: 8;
> 0, // ProcessorReserved2: 4;
> - },
> + },
> { // PROCESSOR_FEATURE_FLAGS
> 0, // ProcessorFpu :1;
> 0, // ProcessorVme :1;
> @@ -100,13 +100,13 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
> },
> 3, // ProcessorVersion String;
> { // Voltage;
> - 1, // ProcessorVoltageCapability5V :1;
> - 1, // ProcessorVoltageCapability3_3V :1;
> - 1, // ProcessorVoltageCapability2_9V :1;
> + 1, // ProcessorVoltageCapability5V :1;
> + 1, // ProcessorVoltageCapability3_3V :1;
> + 1, // ProcessorVoltageCapability2_9V :1;
> 0, // ProcessorVoltageCapabilityReserved :1; ///< Bit 3, must be zero.
> 0, // ProcessorVoltageReserved :3; ///< Bits 4-6, must be zero.
> 0 // ProcessorVoltageIndicateLegacy :1;
> - },
> + },
> 0, // ExternalClock;
> 0, // MaxSpeed;
> 0, // CurrentSpeed;
> @@ -151,26 +151,26 @@ CHAR8 *mCpuSmbiosType4Strings[] = {
> "Not Found",
> NULL
> };
> -
> +
> ...
> LogSmbiosData (
> - (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> + (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> gSmbiosType12Strings
> );
>
> @param Template Fixed SMBIOS structure, required.
> - @param StringArray Array of strings to convert to an SMBIOS string pack.
> + @param StringArray Array of strings to convert to an SMBIOS string pack.
> NULL is OK.
>
> **/
> EFI_STATUS
> LogSmbiosData (
> IN EFI_SMBIOS_TABLE_HEADER *Template,
> - IN CHAR8 **StringPack
> + IN CHAR8 **StringPack
> )
> {
> EFI_STATUS Status;
> - EFI_SMBIOS_PROTOCOL *Smbios;
> + EFI_SMBIOS_PROTOCOL *Smbios;
> EFI_SMBIOS_HANDLE SmbiosHandle;
> EFI_SMBIOS_TABLE_HEADER *Record;
> UINTN Index;
> @@ -219,7 +219,7 @@ LogSmbiosData (
> Str += StringSize;
> }
> *Str = 0;
> -
> +
> SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> Status = Smbios->Add (
> Smbios,
> @@ -228,7 +228,7 @@ LogSmbiosData (
> Record
> );
> ASSERT_EFI_ERROR (Status);
> -
> +
> FreePool (Record);
> return Status;
> }
> diff --git a/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
> b/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
> index e77de2c7bc..b9ac6ce080 100644
> --- a/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
> +++ b/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
> @@ -61,7 +61,7 @@ EmuBlockIo2Reset (
> @param[in] MediaId Id of the media, changes every time the media is
> replaced.
> @param[in] Lba The starting Logical Block Address to read from.
> - @param[in, out] Token A pointer to the token associated with the
> transaction.
> + @param[in, out] Token A pointer to the token associated with the
> transaction.
> @param[in] BufferSize Size of Buffer, must be a multiple of device block
> size.
> @param[out] Buffer A pointer to the destination buffer for the data.
> The
> caller is responsible for either having implicit or
> diff --git a/EmulatorPkg/EmuGopDxe/Gop.h b/EmulatorPkg/EmuGopDxe/Gop.h
> index 6f7b082618..3b533013ce 100644
> --- a/EmulatorPkg/EmuGopDxe/Gop.h
> +++ b/EmulatorPkg/EmuGopDxe/Gop.h
> @@ -1,195 +1,195 @@
> -/*++ @file
> -
> -Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef __UGA_H_
> -#define __UGA_H_
> -
> -#include <PiDxe.h>
> -
> -#include <Protocol/GraphicsOutput.h>
> -#include <Protocol/SimpleTextIn.h>
> -#include <Protocol/SimpleTextInEx.h>
> -#include <Protocol/SimplePointer.h>
> -#include <Protocol/EmuIoThunk.h>
> -#include <Protocol/EmuGraphicsWindow.h>
> -
> -#include <Guid/EventGroup.h>
> -
> -#include <Library/DebugLib.h>
> -#include <Library/BaseLib.h>
> -#include <Library/UefiDriverEntryPoint.h>
> -#include <Library/UefiLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -#include <Library/KeyMapLib.h>
> -
> -
> -#define MAX_Q 256
> -
> -typedef struct {
> - UINTN Front;
> - UINTN Rear;
> - UINTN Count;
> - EFI_INPUT_KEY Q[MAX_Q];
> -} GOP_QUEUE_FIXED;
> -
> -#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32
> ('U', 'g', 'S', 'n')
> -typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
> - UINTN Signature;
> - EFI_HANDLE NotifyHandle;
> - EFI_KEY_DATA KeyData;
> - EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
> - EFI_EVENT Event;
> - LIST_ENTRY NotifyEntry;
> -} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
> -
> -#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
> -
> -typedef struct {
> - UINT32 HorizontalResolution;
> - UINT32 VerticalResolution;
> - UINT32 ColorDepth;
> - UINT32 RefreshRate;
> -} GOP_MODE_DATA;
> -
> -
> -
> -extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
> -extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
> -
> -#define EMU_UGA_CLASS_NAME L"EmuGopWindow"
> -
> -#define GOP_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('G', 'o', 'p', 'N')
> -typedef struct {
> - UINT64 Signature;
> -
> - EFI_HANDLE Handle;
> - EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
> - EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
> - EFI_SIMPLE_POINTER_PROTOCOL SimplePointer;
> -
> - EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
> - EMU_GRAPHICS_WINDOW_PROTOCOL *EmuGraphicsWindow;
> -
> - EFI_UNICODE_STRING_TABLE *ControllerNameTable;
> -
> - EFI_SIMPLE_POINTER_MODE PointerMode;
> - //
> - // GOP Private Data for QueryMode ()
> - //
> - GOP_MODE_DATA *ModeData;
> -
> -
> - //
> - // UGA Private Data knowing when to start hardware
> - //
> - BOOLEAN HardwareNeedsStarting;
> -
> - CHAR16 *WindowName;
> -
> - GOP_QUEUE_FIXED Queue;
> -
> - EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
> - EFI_KEY_STATE KeyState;
> - LIST_ENTRY NotifyList;
> -} GOP_PRIVATE_DATA;
> -
> -
> -#define GOP_PRIVATE_DATA_FROM_THIS(a) \
> - CR(a, GOP_PRIVATE_DATA, GraphicsOutput,
> GOP_PRIVATE_DATA_SIGNATURE)
> -
> -#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a) \
> - CR(a, GOP_PRIVATE_DATA, SimpleTextIn,
> GOP_PRIVATE_DATA_SIGNATURE)
> -
> -#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a) \
> - CR(a, GOP_PRIVATE_DATA, SimpleTextInEx,
> GOP_PRIVATE_DATA_SIGNATURE)
> -
> -#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a) \
> - CR(a, GOP_PRIVATE_DATA, SimplePointer,
> GOP_PRIVATE_DATA_SIGNATURE)
> -
> -
> -//
> -// Global Protocol Variables
> -//
> -extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
> -extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
> -extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
> -
> -//
> -// Gop Hardware abstraction internal worker functions
> -//
> -EFI_STATUS
> -EmuGopSupported (
> - IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
> - );
> -
> -EFI_STATUS
> -EmuGopConstructor (
> - IN GOP_PRIVATE_DATA *Private
> - );
> -
> -EFI_STATUS
> -EmuGopDestructor (
> - IN GOP_PRIVATE_DATA *Private
> - );
> -
> -
> -EFI_STATUS
> -GopPrivateAddQ (
> - IN GOP_PRIVATE_DATA *Private,
> - IN EFI_INPUT_KEY Key
> - );
> -
> -EFI_STATUS
> -EmuGopInitializeSimpleTextInForWindow (
> - IN GOP_PRIVATE_DATA *Private
> - );
> -
> -EFI_STATUS
> -EmuGopInitializeSimplePointerForWindow (
> - IN GOP_PRIVATE_DATA *Private
> - );
> -
> -EFI_STATUS
> -EmuGopStartWindow (
> - IN GOP_PRIVATE_DATA *Private,
> - IN UINT32 HorizontalResolution,
> - IN UINT32 VerticalResolution,
> - IN UINT32 ColorDepth,
> - IN UINT32 RefreshRate
> - );
> -
> -VOID
> -EFIAPI
> -ShutdownGopEvent (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - );
> -
> -VOID
> -EFIAPI
> -GopPrivateMakeCallbackFunction (
> - IN VOID *Context,
> - IN EFI_KEY_DATA *KeyData
> - );
> -
> -VOID
> -EFIAPI
> -GopPrivateBreakCallbackFunction (
> - IN VOID *Context,
> - IN EFI_KEY_DATA *KeyData
> - );
> -
> -#endif
> +/*++ @file
> +
> +Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef __UGA_H_
> +#define __UGA_H_
> +
> +#include <PiDxe.h>
> +
> +#include <Protocol/GraphicsOutput.h>
> +#include <Protocol/SimpleTextIn.h>
> +#include <Protocol/SimpleTextInEx.h>
> +#include <Protocol/SimplePointer.h>
> +#include <Protocol/EmuIoThunk.h>
> +#include <Protocol/EmuGraphicsWindow.h>
> +
> +#include <Guid/EventGroup.h>
> +
> +#include <Library/DebugLib.h>
> +#include <Library/BaseLib.h>
> +#include <Library/UefiDriverEntryPoint.h>
> +#include <Library/UefiLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/KeyMapLib.h>
> +
> +
> +#define MAX_Q 256
> +
> +typedef struct {
> + UINTN Front;
> + UINTN Rear;
> + UINTN Count;
> + EFI_INPUT_KEY Q[MAX_Q];
> +} GOP_QUEUE_FIXED;
> +
> +#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32
> ('U', 'g', 'S', 'n')
> +typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
> + UINTN Signature;
> + EFI_HANDLE NotifyHandle;
> + EFI_KEY_DATA KeyData;
> + EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
> + EFI_EVENT Event;
> + LIST_ENTRY NotifyEntry;
> +} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
> +
> +#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
> +
> +typedef struct {
> + UINT32 HorizontalResolution;
> + UINT32 VerticalResolution;
> + UINT32 ColorDepth;
> + UINT32 RefreshRate;
> +} GOP_MODE_DATA;
> +
> +
> +
> +extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
> +extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
> +
> +#define EMU_UGA_CLASS_NAME L"EmuGopWindow"
> +
> +#define GOP_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('G', 'o', 'p', 'N')
> +typedef struct {
> + UINT64 Signature;
> +
> + EFI_HANDLE Handle;
> + EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
> + EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
> + EFI_SIMPLE_POINTER_PROTOCOL SimplePointer;
> +
> + EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
> + EMU_GRAPHICS_WINDOW_PROTOCOL *EmuGraphicsWindow;
> +
> + EFI_UNICODE_STRING_TABLE *ControllerNameTable;
> +
> + EFI_SIMPLE_POINTER_MODE PointerMode;
> + //
> + // GOP Private Data for QueryMode ()
> + //
> + GOP_MODE_DATA *ModeData;
> +
> +
> + //
> + // UGA Private Data knowing when to start hardware
> + //
> + BOOLEAN HardwareNeedsStarting;
> +
> + CHAR16 *WindowName;
> +
> + GOP_QUEUE_FIXED Queue;
> +
> + EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
> + EFI_KEY_STATE KeyState;
> + LIST_ENTRY NotifyList;
> +} GOP_PRIVATE_DATA;
> +
> +
> +#define GOP_PRIVATE_DATA_FROM_THIS(a) \
> + CR(a, GOP_PRIVATE_DATA, GraphicsOutput,
> GOP_PRIVATE_DATA_SIGNATURE)
> +
> +#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a) \
> + CR(a, GOP_PRIVATE_DATA, SimpleTextIn,
> GOP_PRIVATE_DATA_SIGNATURE)
> +
> +#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a) \
> + CR(a, GOP_PRIVATE_DATA, SimpleTextInEx,
> GOP_PRIVATE_DATA_SIGNATURE)
> +
> +#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a) \
> + CR(a, GOP_PRIVATE_DATA, SimplePointer,
> GOP_PRIVATE_DATA_SIGNATURE)
> +
> +
> +//
> +// Global Protocol Variables
> +//
> +extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
> +extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
> +extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
> +
> +//
> +// Gop Hardware abstraction internal worker functions
> +//
> +EFI_STATUS
> +EmuGopSupported (
> + IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
> + );
> +
> +EFI_STATUS
> +EmuGopConstructor (
> + IN GOP_PRIVATE_DATA *Private
> + );
> +
> +EFI_STATUS
> +EmuGopDestructor (
> + IN GOP_PRIVATE_DATA *Private
> + );
> +
> +
> +EFI_STATUS
> +GopPrivateAddQ (
> + IN GOP_PRIVATE_DATA *Private,
> + IN EFI_INPUT_KEY Key
> + );
> +
> +EFI_STATUS
> +EmuGopInitializeSimpleTextInForWindow (
> + IN GOP_PRIVATE_DATA *Private
> + );
> +
> +EFI_STATUS
> +EmuGopInitializeSimplePointerForWindow (
> + IN GOP_PRIVATE_DATA *Private
> + );
> +
> +EFI_STATUS
> +EmuGopStartWindow (
> + IN GOP_PRIVATE_DATA *Private,
> + IN UINT32 HorizontalResolution,
> + IN UINT32 VerticalResolution,
> + IN UINT32 ColorDepth,
> + IN UINT32 RefreshRate
> + );
> +
> +VOID
> +EFIAPI
> +ShutdownGopEvent (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> + );
> +
> +VOID
> +EFIAPI
> +GopPrivateMakeCallbackFunction (
> + IN VOID *Context,
> + IN EFI_KEY_DATA *KeyData
> + );
> +
> +VOID
> +EFIAPI
> +GopPrivateBreakCallbackFunction (
> + IN VOID *Context,
> + IN EFI_KEY_DATA *KeyData
> + );
> +
> +#endif
> diff --git a/EmulatorPkg/EmuGopDxe/GopInput.c
> b/EmulatorPkg/EmuGopDxe/GopInput.c
> index cf37a7bd70..1d40b1d7d6 100644
> --- a/EmulatorPkg/EmuGopDxe/GopInput.c
> +++ b/EmulatorPkg/EmuGopDxe/GopInput.c
> @@ -1,900 +1,900 @@
> -/*++ @file
> -
> -Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -
> -**/
> -
> -#include "Gop.h"
> -
> -
> -BOOLEAN
> -GopPrivateIsKeyRegistered (
> - IN EFI_KEY_DATA *RegsiteredData,
> - IN EFI_KEY_DATA *InputData
> - )
> -/*++
> -
> -Routine Description:
> -
> -Arguments:
> -
> - RegsiteredData - A pointer to a buffer that is filled in with the keystroke
> - state data for the key that was registered.
> - InputData - A pointer to a buffer that is filled in with the keystroke
> - state data for the key that was pressed.
> -
> -Returns:
> - TRUE - Key be pressed matches a registered key.
> - FLASE - Match failed.
> -
> -**/
> -{
> - ASSERT (RegsiteredData != NULL && InputData != NULL);
> -
> - if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
> - (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
> - return FALSE;
> - }
> -
> - //
> - // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means
> these state could be ignored.
> - //
> - if (RegsiteredData->KeyState.KeyShiftState != 0 &&
> - RegsiteredData->KeyState.KeyShiftState != InputData-
> >KeyState.KeyShiftState) {
> - return FALSE;
> - }
> - if (RegsiteredData->KeyState.KeyToggleState != 0 &&
> - RegsiteredData->KeyState.KeyToggleState != InputData-
> >KeyState.KeyToggleState) {
> - return FALSE;
> - }
> -
> - return TRUE;
> -
> -}
> -
> -
> -VOID
> -EFIAPI
> -GopPrivateMakeCallbackFunction (
> - IN VOID *Context,
> - IN EFI_KEY_DATA *KeyData
> - )
> -{
> - LIST_ENTRY *Link;
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> - GOP_PRIVATE_DATA *Private = (GOP_PRIVATE_DATA *)Context;
> -
> - KeyMapMake (KeyData);
> -
> - for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link =
> Link->ForwardLink) {
> - CurrentNotify = CR (
> - Link,
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> - NotifyEntry,
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> - );
> - if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
> - // We could be called at a high TPL so signal an event to call the registered
> function
> - // at a lower TPL.
> - gBS->SignalEvent (CurrentNotify->Event);
> - }
> - }
> -}
> -
> -
> -VOID
> -EFIAPI
> -GopPrivateBreakCallbackFunction (
> - IN VOID *Context,
> - IN EFI_KEY_DATA *KeyData
> - )
> -{
> - KeyMapBreak (KeyData);
> -}
> -
> -
> -
> -//
> -// Simple Text In implementation.
> -//
> -
> -/**
> - Reset the input device and optionally run diagnostics
> -
> - @param This Protocol instance pointer.
> - @param ExtendedVerification Driver may perform diagnostics on reset.
> -
> - @retval EFI_SUCCESS The device was reset.
> - @retval EFI_DEVICE_ERROR The device is not functioning properly and
> could not be reset.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInReset (
> - IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
> - IN BOOLEAN ExtendedVerification
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_KEY_DATA KeyData;
> - EFI_TPL OldTpl;
> -
> - Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
> - if (Private->EmuGraphicsWindow == NULL) {
> - return EFI_SUCCESS;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - //
> - // A reset is draining the Queue
> - //
> - while (Private->EmuGraphicsWindow->GetKey (Private-
> >EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)
> - ;
> -
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Reads the next keystroke from the input device. The WaitForKey Event can
> - be used to test for existence of a keystroke via WaitForEvent () call.
> -
> - @param This Protocol instance pointer.
> - @param Key A pointer to a buffer that is filled in with the keystroke
> - information for the key that was pressed.
> -
> - @retval EFI_SUCCESS The keystroke information was returned.
> - @retval EFI_NOT_READY There was no keystroke data available.
> - @retval EFI_DEVICE_ERROR The keystroke information was not returned due
> to
> - hardware errors.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInReadKeyStroke (
> - IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
> - OUT EFI_INPUT_KEY *Key
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_STATUS Status;
> - EFI_TPL OldTpl;
> - EFI_KEY_DATA KeyData;
> -
> - Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
> - if (Private->EmuGraphicsWindow == NULL) {
> - return EFI_NOT_READY;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - Status = Private->EmuGraphicsWindow->GetKey (Private-
> >EmuGraphicsWindow, &KeyData);
> - if (!EFI_ERROR (Status)) {
> - if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {
> - // Modifier key was pressed
> - Status = EFI_NOT_READY;
> - } else {
> - CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));
> - }
> - }
> -
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> -
> - return Status;
> -}
> -
> -
> -
> -/**
> - SimpleTextIn and SimpleTextInEx Notify Wait Event
> -
> - @param Event Event whose notification function is being invoked.
> - @param Context Pointer to GOP_PRIVATE_DATA.
> -
> -**/
> -VOID
> -EFIAPI
> -EmuGopSimpleTextInWaitForKey (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_STATUS Status;
> - EFI_TPL OldTpl;
> -
> - Private = (GOP_PRIVATE_DATA *) Context;
> - if (Private->EmuGraphicsWindow == NULL) {
> - return;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - Status = Private->EmuGraphicsWindow->CheckKey (Private-
> >EmuGraphicsWindow);
> - if (!EFI_ERROR (Status)) {
> - //
> - // If a there is a key in the queue signal our event.
> - //
> - gBS->SignalEvent (Event);
> - }
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> -}
> -
> -
> -//
> -// Simple Text Input Ex protocol functions
> -//
> -
> -
> -/**
> - The Reset() function resets the input device hardware. As part
> - of initialization process, the firmware/device will make a quick
> - but reasonable attempt to verify that the device is functioning.
> - If the ExtendedVerification flag is TRUE the firmware may take
> - an extended amount of time to verify the device is operating on
> - reset. Otherwise the reset operation is to occur as quickly as
> - possible. The hardware verification process is not defined by
> - this specification and is left up to the platform firmware or
> - driver to implement.
> -
> - @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> -
> - @param ExtendedVerification Indicates that the driver may
> - perform a more exhaustive
> - verification operation of the
> - device during reset.
> -
> -
> - @retval EFI_SUCCESS The device was reset.
> -
> - @retval EFI_DEVICE_ERROR The device is not functioning
> - correctly and could not be reset.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExResetEx (
> - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> - IN BOOLEAN ExtendedVerification
> - )
> -/*++
> -
> - Routine Description:
> - Reset the input device and optionaly run diagnostics
> -
> - Arguments:
> - This - Protocol instance pointer.
> - ExtendedVerification - Driver may perform diagnostics on reset.
> -
> - Returns:
> - EFI_SUCCESS - The device was reset.
> -
> -**/
> -{
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -/**
> - The function reads the next keystroke from the input device. If
> - there is no pending keystroke the function returns
> - EFI_NOT_READY. If there is a pending keystroke, then
> - KeyData.Key.ScanCode is the EFI scan code defined in Error!
> - Reference source not found. The KeyData.Key.UnicodeChar is the
> - actual printable character or is zero if the key does not
> - represent a printable character (control key, function key,
> - etc.). The KeyData.KeyState is shift state for the character
> - reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .
> - When interpreting the data from this function, it should be
> - noted that if a class of printable characters that are
> - normally adjusted by shift modifiers (e.g. Shift Key + "f"
> - key) would be presented solely as a KeyData.Key.UnicodeChar
> - without the associated shift state. So in the previous example
> - of a Shift Key + "f" key being pressed, the only pertinent
> - data returned would be KeyData.Key.UnicodeChar with the value
> - of "F". This of course would not typically be the case for
> - non-printable characters such as the pressing of the Right
> - Shift Key + F10 key since the corresponding returned data
> - would be reflected both in the KeyData.KeyState.KeyShiftState
> - and KeyData.Key.ScanCode values. UEFI drivers which implement
> - the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return
> - KeyData.Key and KeyData.KeyState values. These drivers must
> - always return the most current state of
> - KeyData.KeyState.KeyShiftState and
> - KeyData.KeyState.KeyToggleState. It should also be noted that
> - certain input devices may not be able to produce shift or toggle
> - state information, and in those cases the high order bit in the
> - respective Toggle and Shift state fields should not be active.
> -
> -
> - @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
> instance.
> -
> - @param KeyData A pointer to a buffer that is filled in with
> - the keystroke state data for the key that was
> - pressed.
> -
> -
> - @retval EFI_SUCCESS The keystroke information was
> - returned.
> -
> - @retval EFI_NOT_READY There was no keystroke data available.
> - EFI_DEVICE_ERROR The keystroke
> - information was not returned due to
> - hardware errors.
> -
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExReadKeyStrokeEx (
> - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> - OUT EFI_KEY_DATA *KeyData
> - )
> -/*++
> -
> - Routine Description:
> - Reads the next keystroke from the input device. The WaitForKey Event can
> - be used to test for existance of a keystroke via WaitForEvent () call.
> -
> - Arguments:
> - This - Protocol instance pointer.
> - KeyData - A pointer to a buffer that is filled in with the keystroke
> - state data for the key that was pressed.
> -
> - Returns:
> - EFI_SUCCESS - The keystroke information was returned.
> - EFI_NOT_READY - There was no keystroke data availiable.
> - EFI_DEVICE_ERROR - The keystroke information was not returned due to
> - hardware errors.
> - EFI_INVALID_PARAMETER - KeyData is NULL.
> -
> -**/
> -{
> - EFI_STATUS Status;
> - GOP_PRIVATE_DATA *Private;
> - EFI_TPL OldTpl;
> -
> -
> - if (KeyData == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> - if (Private->EmuGraphicsWindow == NULL) {
> - return EFI_NOT_READY;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - Status = Private->EmuGraphicsWindow->GetKey(Private-
> >EmuGraphicsWindow, KeyData);
> -
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> -
> - return Status;
> -}
> -
> -
> -
> -/**
> - The SetState() function allows the input device hardware to
> - have state settings adjusted.
> -
> - @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
> instance.
> -
> - @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to
> - set the state for the input device.
> -
> -
> - @retval EFI_SUCCESS The device state was set appropriately.
> -
> - @retval EFI_DEVICE_ERROR The device is not functioning
> - correctly and could not have the
> - setting adjusted.
> -
> - @retval EFI_UNSUPPORTED The device does not support the
> - ability to have its state set.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExSetState (
> - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> - IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_STATUS Status;
> - EFI_TPL OldTpl;
> -
> - Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> - if (Private->EmuGraphicsWindow == NULL) {
> - return EFI_NOT_READY;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - Status = Private->EmuGraphicsWindow->KeySetState (Private-
> >EmuGraphicsWindow, KeyToggleState);
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> -
> - return Status;
> -}
> -
> -
> -/**
> - SimpleTextIn and SimpleTextInEx Notify Wait Event
> -
> - @param Event Event whose notification function is being invoked.
> - @param Context Pointer to GOP_PRIVATE_DATA.
> -
> -**/
> -VOID
> -EFIAPI
> -EmuGopRegisterKeyCallback (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify =
> (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;
> -
> - ExNotify->KeyNotificationFn (&ExNotify->KeyData);
> -}
> -
> -
> -
> -/**
> - The RegisterKeystrokeNotify() function registers a function
> - which will be called when a specified keystroke will occur.
> -
> - @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> -
> - @param KeyData A pointer to a buffer that is filled in with
> - the keystroke information for the key that was
> - pressed.
> -
> - @param KeyNotificationFunction Points to the function to be
> - called when the key sequence
> - is typed specified by KeyData.
> -
> -
> - @param NotifyHandle Points to the unique handle assigned to
> - the registered notification.
> -
> - @retval EFI_SUCCESS The device state was set
> - appropriately.
> -
> - @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary
> - data structures.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExRegisterKeyNotify (
> - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> - IN EFI_KEY_DATA *KeyData,
> - IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
> - OUT EFI_HANDLE *NotifyHandle
> - )
> -{
> - EFI_STATUS Status;
> - GOP_PRIVATE_DATA *Private;
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> - LIST_ENTRY *Link;
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NewNotify;
> -
> - if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle ==
> NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> -
> - //
> - // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already
> registered.
> - //
> - for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link =
> Link->ForwardLink) {
> - CurrentNotify = CR (
> - Link,
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> - NotifyEntry,
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> - );
> - if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
> - if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
> - *NotifyHandle = CurrentNotify->NotifyHandle;
> - return EFI_SUCCESS;
> - }
> - }
> - }
> -
> - //
> - // Allocate resource to save the notification function
> - //
> - NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool
> (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));
> - if (NewNotify == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - NewNotify->Signature =
> EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;
> - NewNotify->KeyNotificationFn = KeyNotificationFunction;
> - NewNotify->NotifyHandle = (EFI_HANDLE) NewNotify;
> - CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));
> - InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - EmuGopRegisterKeyCallback,
> - NewNotify,
> - &NewNotify->Event
> - );
> - ASSERT_EFI_ERROR (Status);
> -
> -
> - *NotifyHandle = NewNotify->NotifyHandle;
> -
> - return EFI_SUCCESS;
> -
> -}
> -
> -
> -/**
> - The UnregisterKeystrokeNotify() function removes the
> - notification which was previously registered.
> -
> - @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> -
> - @param NotificationHandle The handle of the notification
> - function being unregistered.
> -
> - @retval EFI_SUCCESS The device state was set appropriately.
> -
> - @retval EFI_INVALID_PARAMETER The NotificationHandle is
> - invalid.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExUnregisterKeyNotify (
> - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> - IN EFI_HANDLE NotificationHandle
> - )
> -/*++
> -
> - Routine Description:
> - Remove a registered notification function from a particular keystroke.
> -
> - Arguments:
> - This - Protocol instance pointer.
> - NotificationHandle - The handle of the notification function being
> unregistered.
> -
> - Returns:
> - EFI_SUCCESS - The notification function was unregistered
> successfully.
> - EFI_INVALID_PARAMETER - The NotificationHandle is invalid.
> -
> -**/
> -{
> - GOP_PRIVATE_DATA *Private;
> - LIST_ENTRY *Link;
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> -
> - if (NotificationHandle == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)-
> >Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> -
> - for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link =
> Link->ForwardLink) {
> - CurrentNotify = CR (
> - Link,
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> - NotifyEntry,
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> - );
> - if (CurrentNotify->NotifyHandle == NotificationHandle) {
> - //
> - // Remove the notification function from NotifyList and free resources
> - //
> - RemoveEntryList (&CurrentNotify->NotifyEntry);
> -
> - gBS->CloseEvent (CurrentNotify->Event);
> -
> - gBS->FreePool (CurrentNotify);
> - return EFI_SUCCESS;
> - }
> - }
> -
> - //
> - // Can not find the specified Notification Handle
> - //
> - return EFI_INVALID_PARAMETER;
> -}
> -
> -
> -
> -/**
> - Initialize SimplelTextIn and SimpleTextInEx protocols in the Private
> - context structure.
> -
> - @param Private Context structure to fill in.
> -
> - @return EFI_SUCCESS Initialization was a success
> -
> -**/
> -EFI_STATUS
> -EmuGopInitializeSimpleTextInForWindow (
> - IN GOP_PRIVATE_DATA *Private
> - )
> -{
> - EFI_STATUS Status;
> -
> - //
> - // Initialize Simple Text In protoocol
> - //
> - Private->SimpleTextIn.Reset = EmuGopSimpleTextInReset;
> - Private->SimpleTextIn.ReadKeyStroke = EmuGopSimpleTextInReadKeyStroke;
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_WAIT,
> - TPL_NOTIFY,
> - EmuGopSimpleTextInWaitForKey,
> - Private,
> - &Private->SimpleTextIn.WaitForKey
> - );
> - ASSERT_EFI_ERROR (Status);
> -
> -
> - //
> - // Initialize Simple Text In Ex
> - //
> -
> - Private->SimpleTextInEx.Reset = EmuGopSimpleTextInExResetEx;
> - Private->SimpleTextInEx.ReadKeyStrokeEx =
> EmuGopSimpleTextInExReadKeyStrokeEx;
> - Private->SimpleTextInEx.SetState = EmuGopSimpleTextInExSetState;
> - Private->SimpleTextInEx.RegisterKeyNotify =
> EmuGopSimpleTextInExRegisterKeyNotify;
> - Private->SimpleTextInEx.UnregisterKeyNotify =
> EmuGopSimpleTextInExUnregisterKeyNotify;
> -
> - Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE);
> -
> - InitializeListHead (&Private->NotifyList);
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_WAIT,
> - TPL_NOTIFY,
> - EmuGopSimpleTextInWaitForKey,
> - Private,
> - &Private->SimpleTextInEx.WaitForKeyEx
> - );
> - ASSERT_EFI_ERROR (Status);
> -
> -
> - return Status;
> -}
> -
> -
> -
> -
> -
> -
> -
> -//
> -// Simple Pointer implementation.
> -//
> -
> -
> -/**
> - Resets the pointer device hardware.
> -
> - @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
> - instance.
> - @param ExtendedVerification Indicates that the driver may perform a more
> exhaustive
> - verification operation of the device during reset.
> -
> - @retval EFI_SUCCESS The device was reset.
> - @retval EFI_DEVICE_ERROR The device is not functioning correctly and
> could not be reset.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimplePointerReset (
> - IN EFI_SIMPLE_POINTER_PROTOCOL *This,
> - IN BOOLEAN ExtendedVerification
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_SIMPLE_POINTER_STATE State;
> - EFI_TPL OldTpl;
> -
> - Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
> - if (Private->EmuGraphicsWindow == NULL) {
> - return EFI_SUCCESS;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - //
> - // A reset is draining the Queue
> - //
> - while (Private->EmuGraphicsWindow->GetPointerState (Private-
> >EmuGraphicsWindow, &State) == EFI_SUCCESS)
> - ;
> -
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Retrieves the current state of a pointer device.
> -
> - @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
> - instance.
> - @param State A pointer to the state information on the pointer
> device.
> -
> - @retval EFI_SUCCESS The state of the pointer device was returned in
> State.
> - @retval EFI_NOT_READY The state of the pointer device has not
> changed since the last call to
> - GetState().
> - @retval EFI_DEVICE_ERROR A device error occurred while attempting to
> retrieve the pointer device's
> - current state.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimplePointerGetState (
> - IN EFI_SIMPLE_POINTER_PROTOCOL *This,
> - IN OUT EFI_SIMPLE_POINTER_STATE *State
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_STATUS Status;
> - EFI_TPL OldTpl;
> -
> - Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
> - if (Private->EmuGraphicsWindow == NULL) {
> - return EFI_NOT_READY;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - Status = Private->EmuGraphicsWindow->GetPointerState (Private-
> >EmuGraphicsWindow, State);
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> -
> - return Status;
> -}
> -
> -
> -/**
> - SimplePointer Notify Wait Event
> -
> - @param Event Event whose notification function is being invoked.
> - @param Context Pointer to GOP_PRIVATE_DATA.
> -
> -**/
> -VOID
> -EFIAPI
> -EmuGopSimplePointerWaitForInput (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_STATUS Status;
> - EFI_TPL OldTpl;
> -
> - Private = (GOP_PRIVATE_DATA *) Context;
> - if (Private->EmuGraphicsWindow == NULL) {
> - return;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - Status = Private->EmuGraphicsWindow->CheckPointer (Private-
> >EmuGraphicsWindow);
> - if (!EFI_ERROR (Status)) {
> - //
> - // If the pointer state has changed, signal our event.
> - //
> - gBS->SignalEvent (Event);
> - }
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> -}
> -
> -
> -/**
> - SimplePointer constructor
> -
> - @param Private Context structure to fill in.
> -
> - @retval EFI_SUCCESS Constructor had success
> -
> -**/
> -EFI_STATUS
> -EmuGopInitializeSimplePointerForWindow (
> - IN GOP_PRIVATE_DATA *Private
> - )
> -{
> - EFI_STATUS Status;
> -
> - //
> - // Initialize Simple Pointer protoocol
> - //
> - Private->PointerMode.ResolutionX = 1;
> - Private->PointerMode.ResolutionY = 1;
> - Private->PointerMode.ResolutionZ = 1;
> - Private->PointerMode.LeftButton = TRUE;
> - Private->PointerMode.RightButton = TRUE;
> -
> - Private->SimplePointer.Reset = EmuGopSimplePointerReset;
> - Private->SimplePointer.GetState = EmuGopSimplePointerGetState;
> - Private->SimplePointer.Mode = &Private->PointerMode;
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_WAIT,
> - TPL_NOTIFY,
> - EmuGopSimplePointerWaitForInput,
> - Private,
> - &Private->SimplePointer.WaitForInput
> - );
> -
> - return Status;
> -}
> +/*++ @file
> +
> +Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +
> +**/
> +
> +#include "Gop.h"
> +
> +
> +BOOLEAN
> +GopPrivateIsKeyRegistered (
> + IN EFI_KEY_DATA *RegsiteredData,
> + IN EFI_KEY_DATA *InputData
> + )
> +/*++
> +
> +Routine Description:
> +
> +Arguments:
> +
> + RegsiteredData - A pointer to a buffer that is filled in with the keystroke
> + state data for the key that was registered.
> + InputData - A pointer to a buffer that is filled in with the keystroke
> + state data for the key that was pressed.
> +
> +Returns:
> + TRUE - Key be pressed matches a registered key.
> + FLASE - Match failed.
> +
> +**/
> +{
> + ASSERT (RegsiteredData != NULL && InputData != NULL);
> +
> + if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
> + (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
> + return FALSE;
> + }
> +
> + //
> + // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means
> these state could be ignored.
> + //
> + if (RegsiteredData->KeyState.KeyShiftState != 0 &&
> + RegsiteredData->KeyState.KeyShiftState != InputData-
> >KeyState.KeyShiftState) {
> + return FALSE;
> + }
> + if (RegsiteredData->KeyState.KeyToggleState != 0 &&
> + RegsiteredData->KeyState.KeyToggleState != InputData-
> >KeyState.KeyToggleState) {
> + return FALSE;
> + }
> +
> + return TRUE;
> +
> +}
> +
> +
> +VOID
> +EFIAPI
> +GopPrivateMakeCallbackFunction (
> + IN VOID *Context,
> + IN EFI_KEY_DATA *KeyData
> + )
> +{
> + LIST_ENTRY *Link;
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> + GOP_PRIVATE_DATA *Private = (GOP_PRIVATE_DATA *)Context;
> +
> + KeyMapMake (KeyData);
> +
> + for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link
> = Link->ForwardLink) {
> + CurrentNotify = CR (
> + Link,
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> + NotifyEntry,
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> + );
> + if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
> + // We could be called at a high TPL so signal an event to call the
> registered function
> + // at a lower TPL.
> + gBS->SignalEvent (CurrentNotify->Event);
> + }
> + }
> +}
> +
> +
> +VOID
> +EFIAPI
> +GopPrivateBreakCallbackFunction (
> + IN VOID *Context,
> + IN EFI_KEY_DATA *KeyData
> + )
> +{
> + KeyMapBreak (KeyData);
> +}
> +
> +
> +
> +//
> +// Simple Text In implementation.
> +//
> +
> +/**
> + Reset the input device and optionally run diagnostics
> +
> + @param This Protocol instance pointer.
> + @param ExtendedVerification Driver may perform diagnostics on reset.
> +
> + @retval EFI_SUCCESS The device was reset.
> + @retval EFI_DEVICE_ERROR The device is not functioning properly and
> could not be reset.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInReset (
> + IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
> + IN BOOLEAN ExtendedVerification
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_KEY_DATA KeyData;
> + EFI_TPL OldTpl;
> +
> + Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
> + if (Private->EmuGraphicsWindow == NULL) {
> + return EFI_SUCCESS;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + //
> + // A reset is draining the Queue
> + //
> + while (Private->EmuGraphicsWindow->GetKey (Private-
> >EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)
> + ;
> +
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> + return EFI_SUCCESS;
> +}
> +
> +
> +/**
> + Reads the next keystroke from the input device. The WaitForKey Event can
> + be used to test for existence of a keystroke via WaitForEvent () call.
> +
> + @param This Protocol instance pointer.
> + @param Key A pointer to a buffer that is filled in with the keystroke
> + information for the key that was pressed.
> +
> + @retval EFI_SUCCESS The keystroke information was returned.
> + @retval EFI_NOT_READY There was no keystroke data available.
> + @retval EFI_DEVICE_ERROR The keystroke information was not returned due
> to
> + hardware errors.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInReadKeyStroke (
> + IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
> + OUT EFI_INPUT_KEY *Key
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_STATUS Status;
> + EFI_TPL OldTpl;
> + EFI_KEY_DATA KeyData;
> +
> + Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
> + if (Private->EmuGraphicsWindow == NULL) {
> + return EFI_NOT_READY;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + Status = Private->EmuGraphicsWindow->GetKey (Private-
> >EmuGraphicsWindow, &KeyData);
> + if (!EFI_ERROR (Status)) {
> + if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {
> + // Modifier key was pressed
> + Status = EFI_NOT_READY;
> + } else {
> + CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));
> + }
> + }
> +
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> +
> + return Status;
> +}
> +
> +
> +
> +/**
> + SimpleTextIn and SimpleTextInEx Notify Wait Event
> +
> + @param Event Event whose notification function is being invoked.
> + @param Context Pointer to GOP_PRIVATE_DATA.
> +
> +**/
> +VOID
> +EFIAPI
> +EmuGopSimpleTextInWaitForKey (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_STATUS Status;
> + EFI_TPL OldTpl;
> +
> + Private = (GOP_PRIVATE_DATA *) Context;
> + if (Private->EmuGraphicsWindow == NULL) {
> + return;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + Status = Private->EmuGraphicsWindow->CheckKey (Private-
> >EmuGraphicsWindow);
> + if (!EFI_ERROR (Status)) {
> + //
> + // If a there is a key in the queue signal our event.
> + //
> + gBS->SignalEvent (Event);
> + }
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> +}
> +
> +
> +//
> +// Simple Text Input Ex protocol functions
> +//
> +
> +
> +/**
> + The Reset() function resets the input device hardware. As part
> + of initialization process, the firmware/device will make a quick
> + but reasonable attempt to verify that the device is functioning.
> + If the ExtendedVerification flag is TRUE the firmware may take
> + an extended amount of time to verify the device is operating on
> + reset. Otherwise the reset operation is to occur as quickly as
> + possible. The hardware verification process is not defined by
> + this specification and is left up to the platform firmware or
> + driver to implement.
> +
> + @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> +
> + @param ExtendedVerification Indicates that the driver may
> + perform a more exhaustive
> + verification operation of the
> + device during reset.
> +
> +
> + @retval EFI_SUCCESS The device was reset.
> +
> + @retval EFI_DEVICE_ERROR The device is not functioning
> + correctly and could not be reset.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExResetEx (
> + IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> + IN BOOLEAN ExtendedVerification
> + )
> +/*++
> +
> + Routine Description:
> + Reset the input device and optionaly run diagnostics
> +
> + Arguments:
> + This - Protocol instance pointer.
> + ExtendedVerification - Driver may perform diagnostics on reset.
> +
> + Returns:
> + EFI_SUCCESS - The device was reset.
> +
> +**/
> +{
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +/**
> + The function reads the next keystroke from the input device. If
> + there is no pending keystroke the function returns
> + EFI_NOT_READY. If there is a pending keystroke, then
> + KeyData.Key.ScanCode is the EFI scan code defined in Error!
> + Reference source not found. The KeyData.Key.UnicodeChar is the
> + actual printable character or is zero if the key does not
> + represent a printable character (control key, function key,
> + etc.). The KeyData.KeyState is shift state for the character
> + reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .
> + When interpreting the data from this function, it should be
> + noted that if a class of printable characters that are
> + normally adjusted by shift modifiers (e.g. Shift Key + "f"
> + key) would be presented solely as a KeyData.Key.UnicodeChar
> + without the associated shift state. So in the previous example
> + of a Shift Key + "f" key being pressed, the only pertinent
> + data returned would be KeyData.Key.UnicodeChar with the value
> + of "F". This of course would not typically be the case for
> + non-printable characters such as the pressing of the Right
> + Shift Key + F10 key since the corresponding returned data
> + would be reflected both in the KeyData.KeyState.KeyShiftState
> + and KeyData.Key.ScanCode values. UEFI drivers which implement
> + the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return
> + KeyData.Key and KeyData.KeyState values. These drivers must
> + always return the most current state of
> + KeyData.KeyState.KeyShiftState and
> + KeyData.KeyState.KeyToggleState. It should also be noted that
> + certain input devices may not be able to produce shift or toggle
> + state information, and in those cases the high order bit in the
> + respective Toggle and Shift state fields should not be active.
> +
> +
> + @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
> instance.
> +
> + @param KeyData A pointer to a buffer that is filled in with
> + the keystroke state data for the key that was
> + pressed.
> +
> +
> + @retval EFI_SUCCESS The keystroke information was
> + returned.
> +
> + @retval EFI_NOT_READY There was no keystroke data available.
> + EFI_DEVICE_ERROR The keystroke
> + information was not returned due to
> + hardware errors.
> +
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExReadKeyStrokeEx (
> + IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> + OUT EFI_KEY_DATA *KeyData
> + )
> +/*++
> +
> + Routine Description:
> + Reads the next keystroke from the input device. The WaitForKey Event can
> + be used to test for existance of a keystroke via WaitForEvent () call.
> +
> + Arguments:
> + This - Protocol instance pointer.
> + KeyData - A pointer to a buffer that is filled in with the keystroke
> + state data for the key that was pressed.
> +
> + Returns:
> + EFI_SUCCESS - The keystroke information was returned.
> + EFI_NOT_READY - There was no keystroke data availiable.
> + EFI_DEVICE_ERROR - The keystroke information was not returned due to
> + hardware errors.
> + EFI_INVALID_PARAMETER - KeyData is NULL.
> +
> +**/
> +{
> + EFI_STATUS Status;
> + GOP_PRIVATE_DATA *Private;
> + EFI_TPL OldTpl;
> +
> +
> + if (KeyData == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> + if (Private->EmuGraphicsWindow == NULL) {
> + return EFI_NOT_READY;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + Status = Private->EmuGraphicsWindow->GetKey(Private-
> >EmuGraphicsWindow, KeyData);
> +
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> +
> + return Status;
> +}
> +
> +
> +
> +/**
> + The SetState() function allows the input device hardware to
> + have state settings adjusted.
> +
> + @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> +
> + @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to
> + set the state for the input device.
> +
> +
> + @retval EFI_SUCCESS The device state was set appropriately.
> +
> + @retval EFI_DEVICE_ERROR The device is not functioning
> + correctly and could not have the
> + setting adjusted.
> +
> + @retval EFI_UNSUPPORTED The device does not support the
> + ability to have its state set.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExSetState (
> + IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> + IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_STATUS Status;
> + EFI_TPL OldTpl;
> +
> + Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> + if (Private->EmuGraphicsWindow == NULL) {
> + return EFI_NOT_READY;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + Status = Private->EmuGraphicsWindow->KeySetState (Private-
> >EmuGraphicsWindow, KeyToggleState);
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> +
> + return Status;
> +}
> +
> +
> +/**
> + SimpleTextIn and SimpleTextInEx Notify Wait Event
> +
> + @param Event Event whose notification function is being invoked.
> + @param Context Pointer to GOP_PRIVATE_DATA.
> +
> +**/
> +VOID
> +EFIAPI
> +EmuGopRegisterKeyCallback (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> + )
> +{
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify =
> (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;
> +
> + ExNotify->KeyNotificationFn (&ExNotify->KeyData);
> +}
> +
> +
> +
> +/**
> + The RegisterKeystrokeNotify() function registers a function
> + which will be called when a specified keystroke will occur.
> +
> + @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> +
> + @param KeyData A pointer to a buffer that is filled in with
> + the keystroke information for the key that was
> + pressed.
> +
> + @param KeyNotificationFunction Points to the function to be
> + called when the key sequence
> + is typed specified by KeyData.
> +
> +
> + @param NotifyHandle Points to the unique handle assigned to
> + the registered notification.
> +
> + @retval EFI_SUCCESS The device state was set
> + appropriately.
> +
> + @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary
> + data structures.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExRegisterKeyNotify (
> + IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> + IN EFI_KEY_DATA *KeyData,
> + IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
> + OUT EFI_HANDLE *NotifyHandle
> + )
> +{
> + EFI_STATUS Status;
> + GOP_PRIVATE_DATA *Private;
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> + LIST_ENTRY *Link;
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NewNotify;
> +
> + if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle ==
> NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> +
> + //
> + // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already
> registered.
> + //
> + for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link
> = Link->ForwardLink) {
> + CurrentNotify = CR (
> + Link,
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> + NotifyEntry,
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> + );
> + if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
> + if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
> + *NotifyHandle = CurrentNotify->NotifyHandle;
> + return EFI_SUCCESS;
> + }
> + }
> + }
> +
> + //
> + // Allocate resource to save the notification function
> + //
> + NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool
> (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));
> + if (NewNotify == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + NewNotify->Signature =
> EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;
> + NewNotify->KeyNotificationFn = KeyNotificationFunction;
> + NewNotify->NotifyHandle = (EFI_HANDLE) NewNotify;
> + CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));
> + InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);
> +
> + Status = gBS->CreateEvent (
> + EVT_NOTIFY_SIGNAL,
> + TPL_NOTIFY,
> + EmuGopRegisterKeyCallback,
> + NewNotify,
> + &NewNotify->Event
> + );
> + ASSERT_EFI_ERROR (Status);
> +
> +
> + *NotifyHandle = NewNotify->NotifyHandle;
> +
> + return EFI_SUCCESS;
> +
> +}
> +
> +
> +/**
> + The UnregisterKeystrokeNotify() function removes the
> + notification which was previously registered.
> +
> + @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> +
> + @param NotificationHandle The handle of the notification
> + function being unregistered.
> +
> + @retval EFI_SUCCESS The device state was set appropriately.
> +
> + @retval EFI_INVALID_PARAMETER The NotificationHandle is
> + invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExUnregisterKeyNotify (
> + IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> + IN EFI_HANDLE NotificationHandle
> + )
> +/*++
> +
> + Routine Description:
> + Remove a registered notification function from a particular keystroke.
> +
> + Arguments:
> + This - Protocol instance pointer.
> + NotificationHandle - The handle of the notification function being
> unregistered.
> +
> + Returns:
> + EFI_SUCCESS - The notification function was unregistered
> successfully.
> + EFI_INVALID_PARAMETER - The NotificationHandle is invalid.
> +
> +**/
> +{
> + GOP_PRIVATE_DATA *Private;
> + LIST_ENTRY *Link;
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> +
> + if (NotificationHandle == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)-
> >Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> +
> + for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link
> = Link->ForwardLink) {
> + CurrentNotify = CR (
> + Link,
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> + NotifyEntry,
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> + );
> + if (CurrentNotify->NotifyHandle == NotificationHandle) {
> + //
> + // Remove the notification function from NotifyList and free resources
> + //
> + RemoveEntryList (&CurrentNotify->NotifyEntry);
> +
> + gBS->CloseEvent (CurrentNotify->Event);
> +
> + gBS->FreePool (CurrentNotify);
> + return EFI_SUCCESS;
> + }
> + }
> +
> + //
> + // Can not find the specified Notification Handle
> + //
> + return EFI_INVALID_PARAMETER;
> +}
> +
> +
> +
> +/**
> + Initialize SimplelTextIn and SimpleTextInEx protocols in the Private
> + context structure.
> +
> + @param Private Context structure to fill in.
> +
> + @return EFI_SUCCESS Initialization was a success
> +
> +**/
> +EFI_STATUS
> +EmuGopInitializeSimpleTextInForWindow (
> + IN GOP_PRIVATE_DATA *Private
> + )
> +{
> + EFI_STATUS Status;
> +
> + //
> + // Initialize Simple Text In protoocol
> + //
> + Private->SimpleTextIn.Reset = EmuGopSimpleTextInReset;
> + Private->SimpleTextIn.ReadKeyStroke = EmuGopSimpleTextInReadKeyStroke;
> +
> + Status = gBS->CreateEvent (
> + EVT_NOTIFY_WAIT,
> + TPL_NOTIFY,
> + EmuGopSimpleTextInWaitForKey,
> + Private,
> + &Private->SimpleTextIn.WaitForKey
> + );
> + ASSERT_EFI_ERROR (Status);
> +
> +
> + //
> + // Initialize Simple Text In Ex
> + //
> +
> + Private->SimpleTextInEx.Reset = EmuGopSimpleTextInExResetEx;
> + Private->SimpleTextInEx.ReadKeyStrokeEx =
> EmuGopSimpleTextInExReadKeyStrokeEx;
> + Private->SimpleTextInEx.SetState = EmuGopSimpleTextInExSetState;
> + Private->SimpleTextInEx.RegisterKeyNotify =
> EmuGopSimpleTextInExRegisterKeyNotify;
> + Private->SimpleTextInEx.UnregisterKeyNotify =
> EmuGopSimpleTextInExUnregisterKeyNotify;
> +
> + Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE);
> +
> + InitializeListHead (&Private->NotifyList);
> +
> + Status = gBS->CreateEvent (
> + EVT_NOTIFY_WAIT,
> + TPL_NOTIFY,
> + EmuGopSimpleTextInWaitForKey,
> + Private,
> + &Private->SimpleTextInEx.WaitForKeyEx
> + );
> + ASSERT_EFI_ERROR (Status);
> +
> +
> + return Status;
> +}
> +
> +
> +
> +
> +
> +
> +
> +//
> +// Simple Pointer implementation.
> +//
> +
> +
> +/**
> + Resets the pointer device hardware.
> +
> + @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
> + instance.
> + @param ExtendedVerification Indicates that the driver may perform a
> more exhaustive
> + verification operation of the device during reset.
> +
> + @retval EFI_SUCCESS The device was reset.
> + @retval EFI_DEVICE_ERROR The device is not functioning correctly and
> could not be reset.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimplePointerReset (
> + IN EFI_SIMPLE_POINTER_PROTOCOL *This,
> + IN BOOLEAN ExtendedVerification
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_SIMPLE_POINTER_STATE State;
> + EFI_TPL OldTpl;
> +
> + Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
> + if (Private->EmuGraphicsWindow == NULL) {
> + return EFI_SUCCESS;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + //
> + // A reset is draining the Queue
> + //
> + while (Private->EmuGraphicsWindow->GetPointerState (Private-
> >EmuGraphicsWindow, &State) == EFI_SUCCESS)
> + ;
> +
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> + return EFI_SUCCESS;
> +}
> +
> +
> +/**
> + Retrieves the current state of a pointer device.
> +
> + @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
> + instance.
> + @param State A pointer to the state information on the pointer
> device.
> +
> + @retval EFI_SUCCESS The state of the pointer device was returned in
> State.
> + @retval EFI_NOT_READY The state of the pointer device has not
> changed since the last call to
> + GetState().
> + @retval EFI_DEVICE_ERROR A device error occurred while attempting to
> retrieve the pointer device's
> + current state.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimplePointerGetState (
> + IN EFI_SIMPLE_POINTER_PROTOCOL *This,
> + IN OUT EFI_SIMPLE_POINTER_STATE *State
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_STATUS Status;
> + EFI_TPL OldTpl;
> +
> + Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
> + if (Private->EmuGraphicsWindow == NULL) {
> + return EFI_NOT_READY;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + Status = Private->EmuGraphicsWindow->GetPointerState (Private-
> >EmuGraphicsWindow, State);
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> +
> + return Status;
> +}
> +
> +
> +/**
> + SimplePointer Notify Wait Event
> +
> + @param Event Event whose notification function is being invoked.
> + @param Context Pointer to GOP_PRIVATE_DATA.
> +
> +**/
> +VOID
> +EFIAPI
> +EmuGopSimplePointerWaitForInput (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_STATUS Status;
> + EFI_TPL OldTpl;
> +
> + Private = (GOP_PRIVATE_DATA *) Context;
> + if (Private->EmuGraphicsWindow == NULL) {
> + return;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + Status = Private->EmuGraphicsWindow->CheckPointer (Private-
> >EmuGraphicsWindow);
> + if (!EFI_ERROR (Status)) {
> + //
> + // If the pointer state has changed, signal our event.
> + //
> + gBS->SignalEvent (Event);
> + }
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> +}
> +
> +
> +/**
> + SimplePointer constructor
> +
> + @param Private Context structure to fill in.
> +
> + @retval EFI_SUCCESS Constructor had success
> +
> +**/
> +EFI_STATUS
> +EmuGopInitializeSimplePointerForWindow (
> + IN GOP_PRIVATE_DATA *Private
> + )
> +{
> + EFI_STATUS Status;
> +
> + //
> + // Initialize Simple Pointer protoocol
> + //
> + Private->PointerMode.ResolutionX = 1;
> + Private->PointerMode.ResolutionY = 1;
> + Private->PointerMode.ResolutionZ = 1;
> + Private->PointerMode.LeftButton = TRUE;
> + Private->PointerMode.RightButton = TRUE;
> +
> + Private->SimplePointer.Reset = EmuGopSimplePointerReset;
> + Private->SimplePointer.GetState = EmuGopSimplePointerGetState;
> + Private->SimplePointer.Mode = &Private->PointerMode;
> +
> + Status = gBS->CreateEvent (
> + EVT_NOTIFY_WAIT,
> + TPL_NOTIFY,
> + EmuGopSimplePointerWaitForInput,
> + Private,
> + &Private->SimplePointer.WaitForInput
> + );
> +
> + return Status;
> +}
> diff --git a/EmulatorPkg/EmuGopDxe/GopScreen.c
> b/EmulatorPkg/EmuGopDxe/GopScreen.c
> index aa21fa68de..761d945c15 100644
> --- a/EmulatorPkg/EmuGopDxe/GopScreen.c
> +++ b/EmulatorPkg/EmuGopDxe/GopScreen.c
> @@ -1,416 +1,416 @@
> -/*++ @file
> -
> -Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -Module Name:
> -
> - EmuGopScreen.c
> -
> -Abstract:
> -
> - This file produces the graphics abstration of UGA. It is called by
> - EmuGopDriver.c file which deals with the EFI 1.1 driver model.
> - This file just does graphics.
> -
> -**/
> -
> -#include "Gop.h"
> -
> -
> -EFI_EVENT mGopScreenExitBootServicesEvent;
> -
> -GOP_MODE_DATA mGopModeData[] = {
> - { 800, 600, 0, 0 },
> - { 640, 480, 0, 0 },
> - { 720, 400, 0, 0 },
> - {1024, 768, 0, 0 },
> - {1280, 1024, 0, 0 }
> - };
> -
> -
> -/**
> - Returns information for an available graphics mode that the graphics device
> - and the set of active video output devices supports.
> -
> - @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
> - @param ModeNumber The mode number to return information on.
> - @param SizeOfInfo A pointer to the size, in bytes, of the Info buffer.
> - @param Info A pointer to callee allocated buffer that returns
> information about ModeNumber.
> -
> - @retval EFI_SUCCESS Mode information returned.
> - @retval EFI_BUFFER_TOO_SMALL The Info buffer was too small.
> - @retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve
> the video mode.
> - @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()
> - @retval EFI_INVALID_PARAMETER One of the input args was NULL.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopQuerytMode (
> - IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
> - IN UINT32 ModeNumber,
> - OUT UINTN *SizeOfInfo,
> - OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> -
> - Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This-
> >Mode->MaxMode) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - *Info = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
> - if (*Info == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
> -
> - (*Info)->Version = 0;
> - (*Info)->HorizontalResolution = Private-
> >ModeData[ModeNumber].HorizontalResolution;
> - (*Info)->VerticalResolution = Private-
> >ModeData[ModeNumber].VerticalResolution;
> - (*Info)->PixelFormat = PixelBltOnly;
> - (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -/**
> - Set the video device into the specified mode and clears the visible portions of
> - the output display to black.
> -
> - @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
> - @param ModeNumber Abstraction that defines the current video mode.
> -
> - @retval EFI_SUCCESS The graphics mode specified by ModeNumber was
> selected.
> - @retval EFI_DEVICE_ERROR The device had an error and could not complete
> the request.
> - @retval EFI_UNSUPPORTED ModeNumber is not supported by this device.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSetMode (
> - IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
> - IN UINT32 ModeNumber
> - )
> -{
> - EFI_STATUS Status;
> - GOP_PRIVATE_DATA *Private;
> - GOP_MODE_DATA *ModeData;
> - EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;
> -
> - Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (ModeNumber >= This->Mode->MaxMode) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - ModeData = &Private->ModeData[ModeNumber];
> - This->Mode->Mode = ModeNumber;
> - Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData-
> >HorizontalResolution;
> - Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData-
> >VerticalResolution;
> - Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData-
> >HorizontalResolution;
> -
> - if (Private->HardwareNeedsStarting) {
> - Status = EmuGopStartWindow (
> - Private,
> - ModeData->HorizontalResolution,
> - ModeData->VerticalResolution,
> - ModeData->ColorDepth,
> - ModeData->RefreshRate
> - );
> - if (EFI_ERROR (Status)) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - Private->HardwareNeedsStarting = FALSE;
> - }
> -
> -
> - Status = Private->EmuGraphicsWindow->Size(
> - Private->EmuGraphicsWindow,
> - ModeData->HorizontalResolution,
> - ModeData->VerticalResolution
> - );
> -
> -
> - Fill.Red = 0x7f;
> - Fill.Green = 0x7F;
> - Fill.Blue = 0x7f;
> - This->Blt (
> - This,
> - &Fill,
> - EfiBltVideoFill,
> - 0,
> - 0,
> - 0,
> - 0,
> - ModeData->HorizontalResolution,
> - ModeData->VerticalResolution,
> - ModeData->HorizontalResolution * sizeof
> (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> - );
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -/**
> - Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
> -
> - @param This Protocol instance pointer.
> - @param BltBuffer Buffer containing data to blit into video buffer. This
> - buffer has a size of
> Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> - @param BltOperation Operation to perform on BlitBuffer and video
> memory
> - @param SourceX X coordinate of source for the BltBuffer.
> - @param SourceY Y coordinate of source for the BltBuffer.
> - @param DestinationX X coordinate of destination for the BltBuffer.
> - @param DestinationY Y coordinate of destination for the BltBuffer.
> - @param Width Width of rectangle in BltBuffer in pixels.
> - @param Height Hight of rectangle in BltBuffer in pixels.
> - @param Delta OPTIONAL
> -
> - @retval EFI_SUCCESS The Blt operation completed.
> - @retval EFI_INVALID_PARAMETER BltOperation is not valid.
> - @retval EFI_DEVICE_ERROR A hardware error occured writting to the
> video buffer.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopBlt (
> - IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
> - IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
> - IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
> - IN UINTN SourceX,
> - IN UINTN SourceY,
> - IN UINTN DestinationX,
> - IN UINTN DestinationY,
> - IN UINTN Width,
> - IN UINTN Height,
> - IN UINTN Delta OPTIONAL
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_TPL OriginalTPL;
> - EFI_STATUS Status;
> - EMU_GRAPHICS_WINDOWS__BLT_ARGS GopBltArgs;
> -
> - Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> -
> - if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (Width == 0 || Height == 0) {
> - return EFI_INVALID_PARAMETER;
> - }
> - //
> - // If Delta is zero, then the entire BltBuffer is being used, so Delta
> - // is the number of bytes in each row of BltBuffer. Since BltBuffer is Width
> pixels size,
> - // the number of bytes in each row can be computed.
> - //
> - if (Delta == 0) {
> - Delta = Width * sizeof (EFI_UGA_PIXEL);
> - }
> -
> - //
> - // We have to raise to TPL Notify, so we make an atomic write the frame
> buffer.
> - // We would not want a timer based event (Cursor, ...) to come in while we
> are
> - // doing this operation.
> - //
> - OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - //
> - // Pack UGA Draw protocol parameters to
> EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to
> - // GopBlt() API of Unix UGA IO protocol.
> - //
> - GopBltArgs.DestinationX = DestinationX;
> - GopBltArgs.DestinationY = DestinationY;
> - GopBltArgs.Height = Height;
> - GopBltArgs.Width = Width;
> - GopBltArgs.SourceX = SourceX;
> - GopBltArgs.SourceY = SourceY;
> - GopBltArgs.Delta = Delta;
> - Status = Private->EmuGraphicsWindow->Blt (
> - Private->EmuGraphicsWindow,
> - (EFI_UGA_PIXEL *)BltBuffer,
> - (EFI_UGA_BLT_OPERATION)BltOperation,
> - &GopBltArgs
> - );
> -
> - gBS->RestoreTPL (OriginalTPL);
> -
> - return Status;
> -}
> -
> -
> -//
> -// Construction and Destruction functions
> -//
> -
> -EFI_STATUS
> -EmuGopSupported (
> - IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
> - )
> -{
> - //
> - // Check to see if the IO abstraction represents a device type we support.
> - //
> - // This would be replaced a check of PCI subsystem ID, etc.
> - //
> - if (!CompareGuid (EmuIoThunk->Protocol,
> &gEmuGraphicsWindowProtocolGuid)) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -EmuGopStartWindow (
> - IN GOP_PRIVATE_DATA *Private,
> - IN UINT32 HorizontalResolution,
> - IN UINT32 VerticalResolution,
> - IN UINT32 ColorDepth,
> - IN UINT32 RefreshRate
> - )
> -{
> - EFI_STATUS Status;
> -
> - //
> - // Register to be notified on exit boot services so we can destroy the window.
> - //
> - Status = gBS->CreateEvent (
> - EVT_SIGNAL_EXIT_BOOT_SERVICES,
> - TPL_CALLBACK,
> - ShutdownGopEvent,
> - Private,
> - &mGopScreenExitBootServicesEvent
> - );
> -
> - Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);
> - if (!EFI_ERROR (Status)) {
> - Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
> -
> - // Register callback to support RegisterKeyNotify()
> - Status = Private->EmuGraphicsWindow->RegisterKeyNotify (
> - Private->EmuGraphicsWindow,
> - GopPrivateMakeCallbackFunction,
> - GopPrivateBreakCallbackFunction,
> - Private
> - );
> - ASSERT_EFI_ERROR (Status);
> - }
> - return Status;
> -}
> -
> -EFI_STATUS
> -EmuGopConstructor (
> - GOP_PRIVATE_DATA *Private
> - )
> -{
> - Private->ModeData = mGopModeData;
> -
> - Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;
> - Private->GraphicsOutput.SetMode = EmuGopSetMode;
> - Private->GraphicsOutput.Blt = EmuGopBlt;
> -
> - //
> - // Allocate buffer for Graphics Output Protocol mode information
> - //
> - Private->GraphicsOutput.Mode = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));
> - if (Private->GraphicsOutput.Mode == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> - Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
> - if (Private->GraphicsOutput.Mode->Info == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) /
> sizeof(GOP_MODE_DATA);
> - //
> - // Till now, we have no idea about the window size.
> - //
> - Private->GraphicsOutput.Mode->Mode =
> GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
> - Private->GraphicsOutput.Mode->Info->Version = 0;
> - Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
> - Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
> - Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
> - Private->GraphicsOutput.Mode->SizeOfInfo = sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
> - Private->GraphicsOutput.Mode->FrameBufferBase =
> (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
> - Private->GraphicsOutput.Mode->FrameBufferSize = 0;
> -
> - Private->HardwareNeedsStarting = TRUE;
> - Private->EmuGraphicsWindow = NULL;
> -
> - EmuGopInitializeSimpleTextInForWindow (Private);
> -
> - EmuGopInitializeSimplePointerForWindow (Private);
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -EFI_STATUS
> -EmuGopDestructor (
> - GOP_PRIVATE_DATA *Private
> - )
> -{
> - if (!Private->HardwareNeedsStarting) {
> - Private->EmuIoThunk->Close (Private->EmuIoThunk);
> - Private->EmuGraphicsWindow = NULL;
> - }
> -
> - //
> - // Free graphics output protocol occupied resource
> - //
> - if (Private->GraphicsOutput.Mode != NULL) {
> - if (Private->GraphicsOutput.Mode->Info != NULL) {
> - FreePool (Private->GraphicsOutput.Mode->Info);
> - }
> - FreePool (Private->GraphicsOutput.Mode);
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -VOID
> -EFIAPI
> -ShutdownGopEvent (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -/*++
> -
> -Routine Description:
> -
> - This is the UGA screen's callback notification function for exit-boot-services.
> - All we do here is call EmuGopDestructor().
> -
> -Arguments:
> -
> - Event - not used
> - Context - pointer to the Private structure.
> -
> -Returns:
> -
> - None.
> -
> -**/
> -{
> - EmuGopDestructor (Context);
> -}
> -
> +/*++ @file
> +
> +Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +Module Name:
> +
> + EmuGopScreen.c
> +
> +Abstract:
> +
> + This file produces the graphics abstration of UGA. It is called by
> + EmuGopDriver.c file which deals with the EFI 1.1 driver model.
> + This file just does graphics.
> +
> +**/
> +
> +#include "Gop.h"
> +
> +
> +EFI_EVENT mGopScreenExitBootServicesEvent;
> +
> +GOP_MODE_DATA mGopModeData[] = {
> + { 800, 600, 0, 0 },
> + { 640, 480, 0, 0 },
> + { 720, 400, 0, 0 },
> + {1024, 768, 0, 0 },
> + {1280, 1024, 0, 0 }
> + };
> +
> +
> +/**
> + Returns information for an available graphics mode that the graphics device
> + and the set of active video output devices supports.
> +
> + @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
> + @param ModeNumber The mode number to return information on.
> + @param SizeOfInfo A pointer to the size, in bytes, of the Info buffer.
> + @param Info A pointer to callee allocated buffer that returns
> information about ModeNumber.
> +
> + @retval EFI_SUCCESS Mode information returned.
> + @retval EFI_BUFFER_TOO_SMALL The Info buffer was too small.
> + @retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve
> the video mode.
> + @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()
> + @retval EFI_INVALID_PARAMETER One of the input args was NULL.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopQuerytMode (
> + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
> + IN UINT32 ModeNumber,
> + OUT UINTN *SizeOfInfo,
> + OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> +
> + Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This-
> >Mode->MaxMode) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + *Info = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
> + if (*Info == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
> +
> + (*Info)->Version = 0;
> + (*Info)->HorizontalResolution = Private-
> >ModeData[ModeNumber].HorizontalResolution;
> + (*Info)->VerticalResolution = Private-
> >ModeData[ModeNumber].VerticalResolution;
> + (*Info)->PixelFormat = PixelBltOnly;
> + (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +/**
> + Set the video device into the specified mode and clears the visible portions of
> + the output display to black.
> +
> + @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
> + @param ModeNumber Abstraction that defines the current video mode.
> +
> + @retval EFI_SUCCESS The graphics mode specified by ModeNumber was
> selected.
> + @retval EFI_DEVICE_ERROR The device had an error and could not
> complete the request.
> + @retval EFI_UNSUPPORTED ModeNumber is not supported by this device.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSetMode (
> + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
> + IN UINT32 ModeNumber
> + )
> +{
> + EFI_STATUS Status;
> + GOP_PRIVATE_DATA *Private;
> + GOP_MODE_DATA *ModeData;
> + EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;
> +
> + Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (ModeNumber >= This->Mode->MaxMode) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + ModeData = &Private->ModeData[ModeNumber];
> + This->Mode->Mode = ModeNumber;
> + Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData-
> >HorizontalResolution;
> + Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData-
> >VerticalResolution;
> + Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData-
> >HorizontalResolution;
> +
> + if (Private->HardwareNeedsStarting) {
> + Status = EmuGopStartWindow (
> + Private,
> + ModeData->HorizontalResolution,
> + ModeData->VerticalResolution,
> + ModeData->ColorDepth,
> + ModeData->RefreshRate
> + );
> + if (EFI_ERROR (Status)) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + Private->HardwareNeedsStarting = FALSE;
> + }
> +
> +
> + Status = Private->EmuGraphicsWindow->Size(
> + Private->EmuGraphicsWindow,
> + ModeData->HorizontalResolution,
> + ModeData->VerticalResolution
> + );
> +
> +
> + Fill.Red = 0x7f;
> + Fill.Green = 0x7F;
> + Fill.Blue = 0x7f;
> + This->Blt (
> + This,
> + &Fill,
> + EfiBltVideoFill,
> + 0,
> + 0,
> + 0,
> + 0,
> + ModeData->HorizontalResolution,
> + ModeData->VerticalResolution,
> + ModeData->HorizontalResolution * sizeof
> (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> + );
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +/**
> + Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
> +
> + @param This Protocol instance pointer.
> + @param BltBuffer Buffer containing data to blit into video buffer. This
> + buffer has a size of
> Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> + @param BltOperation Operation to perform on BlitBuffer and video
> memory
> + @param SourceX X coordinate of source for the BltBuffer.
> + @param SourceY Y coordinate of source for the BltBuffer.
> + @param DestinationX X coordinate of destination for the BltBuffer.
> + @param DestinationY Y coordinate of destination for the BltBuffer.
> + @param Width Width of rectangle in BltBuffer in pixels.
> + @param Height Hight of rectangle in BltBuffer in pixels.
> + @param Delta OPTIONAL
> +
> + @retval EFI_SUCCESS The Blt operation completed.
> + @retval EFI_INVALID_PARAMETER BltOperation is not valid.
> + @retval EFI_DEVICE_ERROR A hardware error occured writting to the
> video buffer.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopBlt (
> + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
> + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
> + IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
> + IN UINTN SourceX,
> + IN UINTN SourceY,
> + IN UINTN DestinationX,
> + IN UINTN DestinationY,
> + IN UINTN Width,
> + IN UINTN Height,
> + IN UINTN Delta OPTIONAL
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_TPL OriginalTPL;
> + EFI_STATUS Status;
> + EMU_GRAPHICS_WINDOWS__BLT_ARGS GopBltArgs;
> +
> + Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> +
> + if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (Width == 0 || Height == 0) {
> + return EFI_INVALID_PARAMETER;
> + }
> + //
> + // If Delta is zero, then the entire BltBuffer is being used, so Delta
> + // is the number of bytes in each row of BltBuffer. Since BltBuffer is Width
> pixels size,
> + // the number of bytes in each row can be computed.
> + //
> + if (Delta == 0) {
> + Delta = Width * sizeof (EFI_UGA_PIXEL);
> + }
> +
> + //
> + // We have to raise to TPL Notify, so we make an atomic write the frame
> buffer.
> + // We would not want a timer based event (Cursor, ...) to come in while we
> are
> + // doing this operation.
> + //
> + OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + //
> + // Pack UGA Draw protocol parameters to
> EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to
> + // GopBlt() API of Unix UGA IO protocol.
> + //
> + GopBltArgs.DestinationX = DestinationX;
> + GopBltArgs.DestinationY = DestinationY;
> + GopBltArgs.Height = Height;
> + GopBltArgs.Width = Width;
> + GopBltArgs.SourceX = SourceX;
> + GopBltArgs.SourceY = SourceY;
> + GopBltArgs.Delta = Delta;
> + Status = Private->EmuGraphicsWindow->Blt (
> + Private->EmuGraphicsWindow,
> + (EFI_UGA_PIXEL *)BltBuffer,
> + (EFI_UGA_BLT_OPERATION)BltOperation,
> + &GopBltArgs
> + );
> +
> + gBS->RestoreTPL (OriginalTPL);
> +
> + return Status;
> +}
> +
> +
> +//
> +// Construction and Destruction functions
> +//
> +
> +EFI_STATUS
> +EmuGopSupported (
> + IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
> + )
> +{
> + //
> + // Check to see if the IO abstraction represents a device type we support.
> + //
> + // This would be replaced a check of PCI subsystem ID, etc.
> + //
> + if (!CompareGuid (EmuIoThunk->Protocol,
> &gEmuGraphicsWindowProtocolGuid)) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +EmuGopStartWindow (
> + IN GOP_PRIVATE_DATA *Private,
> + IN UINT32 HorizontalResolution,
> + IN UINT32 VerticalResolution,
> + IN UINT32 ColorDepth,
> + IN UINT32 RefreshRate
> + )
> +{
> + EFI_STATUS Status;
> +
> + //
> + // Register to be notified on exit boot services so we can destroy the window.
> + //
> + Status = gBS->CreateEvent (
> + EVT_SIGNAL_EXIT_BOOT_SERVICES,
> + TPL_CALLBACK,
> + ShutdownGopEvent,
> + Private,
> + &mGopScreenExitBootServicesEvent
> + );
> +
> + Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);
> + if (!EFI_ERROR (Status)) {
> + Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
> +
> + // Register callback to support RegisterKeyNotify()
> + Status = Private->EmuGraphicsWindow->RegisterKeyNotify (
> + Private->EmuGraphicsWindow,
> + GopPrivateMakeCallbackFunction,
> + GopPrivateBreakCallbackFunction,
> + Private
> + );
> + ASSERT_EFI_ERROR (Status);
> + }
> + return Status;
> +}
> +
> +EFI_STATUS
> +EmuGopConstructor (
> + GOP_PRIVATE_DATA *Private
> + )
> +{
> + Private->ModeData = mGopModeData;
> +
> + Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;
> + Private->GraphicsOutput.SetMode = EmuGopSetMode;
> + Private->GraphicsOutput.Blt = EmuGopBlt;
> +
> + //
> + // Allocate buffer for Graphics Output Protocol mode information
> + //
> + Private->GraphicsOutput.Mode = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));
> + if (Private->GraphicsOutput.Mode == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> + Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
> + if (Private->GraphicsOutput.Mode->Info == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) /
> sizeof(GOP_MODE_DATA);
> + //
> + // Till now, we have no idea about the window size.
> + //
> + Private->GraphicsOutput.Mode->Mode =
> GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
> + Private->GraphicsOutput.Mode->Info->Version = 0;
> + Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
> + Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
> + Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
> + Private->GraphicsOutput.Mode->SizeOfInfo = sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
> + Private->GraphicsOutput.Mode->FrameBufferBase =
> (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
> + Private->GraphicsOutput.Mode->FrameBufferSize = 0;
> +
> + Private->HardwareNeedsStarting = TRUE;
> + Private->EmuGraphicsWindow = NULL;
> +
> + EmuGopInitializeSimpleTextInForWindow (Private);
> +
> + EmuGopInitializeSimplePointerForWindow (Private);
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +EFI_STATUS
> +EmuGopDestructor (
> + GOP_PRIVATE_DATA *Private
> + )
> +{
> + if (!Private->HardwareNeedsStarting) {
> + Private->EmuIoThunk->Close (Private->EmuIoThunk);
> + Private->EmuGraphicsWindow = NULL;
> + }
> +
> + //
> + // Free graphics output protocol occupied resource
> + //
> + if (Private->GraphicsOutput.Mode != NULL) {
> + if (Private->GraphicsOutput.Mode->Info != NULL) {
> + FreePool (Private->GraphicsOutput.Mode->Info);
> + }
> + FreePool (Private->GraphicsOutput.Mode);
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +VOID
> +EFIAPI
> +ShutdownGopEvent (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> + )
> +/*++
> +
> +Routine Description:
> +
> + This is the UGA screen's callback notification function for exit-boot-services.
> + All we do here is call EmuGopDestructor().
> +
> +Arguments:
> +
> + Event - not used
> + Context - pointer to the Private structure.
> +
> +Returns:
> +
> + None.
> +
> +**/
> +{
> + EmuGopDestructor (Context);
> +}
> +
> diff --git a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
> b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
> index 09d16fd8b6..0031baea52 100644
> --- a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
> +++ b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
> @@ -42,7 +42,7 @@ EFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate =
> {
> NULL // Mode
> };
>
> -EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
> +EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
> EfiSimpleNetworkStopped, // State
> NET_ETHER_ADDR_LEN, // HwAddressSize
> NET_ETHER_HEADER_SIZE, // MediaHeaderSize
> diff --git a/EmulatorPkg/Include/Library/EmuMagicPageLib.h
> b/EmulatorPkg/Include/Library/EmuMagicPageLib.h
> index e0c339a3b8..edae364b06 100644
> --- a/EmulatorPkg/Include/Library/EmuMagicPageLib.h
> +++ b/EmulatorPkg/Include/Library/EmuMagicPageLib.h
> @@ -1,38 +1,38 @@
> -/*++ @file
> -The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a
> magic page
> -of memory that is like SRAM on an embedded system. This file defines what
> goes
> -where in the magic page.
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef __EMU_MAGIC_PAGE_LIB_H__
> -#define __EMU_MAGIC_PAGE_LIB_H__
> -
> -#include <PiPei.h>
> -#include <Library/PcdLib.h>
> -#include <Protocol/EmuThunk.h>
> -
> -typedef struct {
> - // Used by PEI Core and PEIMs to store the PEI Services pointer.
> - // Privilege issues prevent using the PI mechanism in the emulator.
> - CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
> -
> - // Used by SecPeiServicesLib
> - EFI_PEI_PPI_DESCRIPTOR *PpiList;
> -
> - // Needed by PEI PEI PeCoffLoaderExtraActionLib
> - EMU_THUNK_PROTOCOL *Thunk;
> -} EMU_MAGIC_PAGE_LAYOUT;
> -
> -#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT
> *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
> -
> -#endif
> +/*++ @file
> +The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a
> magic page
> +of memory that is like SRAM on an embedded system. This file defines what
> goes
> +where in the magic page.
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef __EMU_MAGIC_PAGE_LIB_H__
> +#define __EMU_MAGIC_PAGE_LIB_H__
> +
> +#include <PiPei.h>
> +#include <Library/PcdLib.h>
> +#include <Protocol/EmuThunk.h>
> +
> +typedef struct {
> + // Used by PEI Core and PEIMs to store the PEI Services pointer.
> + // Privilege issues prevent using the PI mechanism in the emulator.
> + CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
> +
> + // Used by SecPeiServicesLib
> + EFI_PEI_PPI_DESCRIPTOR *PpiList;
> +
> + // Needed by PEI PEI PeCoffLoaderExtraActionLib
> + EMU_THUNK_PROTOCOL *Thunk;
> +} EMU_MAGIC_PAGE_LAYOUT;
> +
> +#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT
> *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Library/EmuThunkLib.h
> b/EmulatorPkg/Include/Library/EmuThunkLib.h
> index 98b22e16ee..e18a613d94 100644
> --- a/EmulatorPkg/Include/Library/EmuThunkLib.h
> +++ b/EmulatorPkg/Include/Library/EmuThunkLib.h
> @@ -1,42 +1,42 @@
> -/*++ @file
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef __EMU_THUNK_LIB_H__
> -#define __EMU_THUNK_LIB_H__
> -
> -#include <Protocol/EmuThunk.h>
> -
> -
> -extern EMU_THUNK_PROTOCOL *gEmuThunk;
> -
> -
> -/**
> - Serach the EMU IO Thunk database for a matching EMU IO Thunk
> - Protocol instance.
> -
> - @param Protocol Protocol to search for.
> - @param Instance Instance of protocol to search for.
> -
> - @retval NULL Protocol and Instance not found.
> - @retval other EMU IO Thunk protocol that matched.
> -
> -**/
> -EMU_IO_THUNK_PROTOCOL *
> -EFIAPI
> -GetIoThunkInstance (
> - IN EFI_GUID *Protocol,
> - IN UINTN Instance
> - );
> -
> -
> -#endif
> +/*++ @file
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef __EMU_THUNK_LIB_H__
> +#define __EMU_THUNK_LIB_H__
> +
> +#include <Protocol/EmuThunk.h>
> +
> +
> +extern EMU_THUNK_PROTOCOL *gEmuThunk;
> +
> +
> +/**
> + Serach the EMU IO Thunk database for a matching EMU IO Thunk
> + Protocol instance.
> +
> + @param Protocol Protocol to search for.
> + @param Instance Instance of protocol to search for.
> +
> + @retval NULL Protocol and Instance not found.
> + @retval other EMU IO Thunk protocol that matched.
> +
> +**/
> +EMU_IO_THUNK_PROTOCOL *
> +EFIAPI
> +GetIoThunkInstance (
> + IN EFI_GUID *Protocol,
> + IN UINTN Instance
> + );
> +
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Library/PpiListLib.h
> b/EmulatorPkg/Include/Library/PpiListLib.h
> index c1271b23c8..fad1473a41 100644
> --- a/EmulatorPkg/Include/Library/PpiListLib.h
> +++ b/EmulatorPkg/Include/Library/PpiListLib.h
> @@ -1,21 +1,21 @@
> -/*++ @file
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef __PPI_LIST_LIB_H__
> -#define __PPI_LIST_LIB_H__
> -
> -
> -extern CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList;
> -
> -
> -#endif
> +/*++ @file
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef __PPI_LIST_LIB_H__
> +#define __PPI_LIST_LIB_H__
> +
> +
> +extern CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList;
> +
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Library/SmbiosLib.h
> b/EmulatorPkg/Include/Library/SmbiosLib.h
> index 8ee14e07dd..6dcb7336d5 100644
> --- a/EmulatorPkg/Include/Library/SmbiosLib.h
> +++ b/EmulatorPkg/Include/Library/SmbiosLib.h
> @@ -1,202 +1,202 @@
> -/** @file
> - Provides library functions for common SMBIOS operations. Only available to
> DXE
> - and UEFI module types.
> -
> -
> -Copyright (c) 2012, Apple Inc. All rights reserved.
> -Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
> -This program and the accompanying materials are licensed and made
> available under
> -the terms and conditions of the BSD License that accompanies this distribution.
> -The full text of the license may be found at
> -http://opensource.org/licenses/bsd-license.php.
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef _SMBIOS_LIB_H__
> -#define _SMBIOS_LIB_H__
> -
> -#include <IndustryStandard/SmBios.h>
> -#include <Protocol/Smbios.h>
> -
> -
> -///
> -/// Cache copy of the SMBIOS Protocol pointer
> -///
> -extern EFI_SMBIOS_PROTOCOL *gSmbios;
> -
> -
> -///
> -/// Template for SMBIOS table initialization.
> -/// The SMBIOS_TABLE_STRING types in the formated area must match the
> -/// StringArray sequene.
> -///
> -typedef struct {
> - //
> - // formatted area of a given SMBIOS record
> - //
> - SMBIOS_STRUCTURE *Entry;
> - //
> - // NULL terminated array of ASCII strings to be added to the SMBIOS record.
> - //
> - CHAR8 **StringArray;
> -} SMBIOS_TEMPLATE_ENTRY;
> -
> -
> -/**
> - Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
> - entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
> -
> - @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
> -
> - @retval EFI_SUCCESS New SMBIOS tables were created.
> - @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibInitializeFromTemplate (
> - IN SMBIOS_TEMPLATE_ENTRY *Template
> - );
> -
> -
> -
> -/**
> - Create SMBIOS record.
> -
> - Converts a fixed SMBIOS structure and an array of pointers to strings into
> - an SMBIOS record where the strings are cat'ed on the end of the fixed record
> - and terminated via a double NULL and add to SMBIOS table.
> -
> - SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> - { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> - 1 // StringCount
> - };
> - CHAR8 *gSmbiosType12Strings[] = {
> - "Not Found",
> - NULL
> - };
> -
> - ...
> - AddSmbiosEntryFromTemplate (
> - (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> - gSmbiosType12Strings
> - );
> -
> - @param SmbiosEntry Fixed SMBIOS structure
> - @param StringArray Array of strings to convert to an SMBIOS string pack.
> - NULL is OK.
> -
> - @retval EFI_SUCCESS New SmbiosEntry was added to SMBIOS table.
> - @retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibCreateEntry (
> - IN SMBIOS_STRUCTURE *SmbiosEntry,
> - IN CHAR8 **StringArray
> - );
> -
> -
> -/**
> - Update the string associated with an existing SMBIOS record.
> -
> - This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> - SMBIOS record is defined by how many strings were present when Add() was
> called.
> -
> - @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> - @param[in] StringNumber The non-zero string number of the string to
> update.
> - @param[in] String Update the StringNumber string with String.
> -
> - @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> - @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> - @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> - @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibUpdateString (
> - IN EFI_SMBIOS_HANDLE SmbiosHandle,
> - IN SMBIOS_TABLE_STRING StringNumber,
> - IN CHAR8 *String
> - );
> -
> -/**
> - Update the string associated with an existing SMBIOS record.
> -
> - This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> - SMBIOS record is defined by how many strings were present when Add() was
> called.
> -
> - @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> - @param[in] StringNumber The non-zero string number of the string to
> update.
> - @param[in] String Update the StringNumber string with String.
> -
> - @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> - @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> - @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> - @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibUpdateUnicodeString (
> - IN EFI_SMBIOS_HANDLE SmbiosHandle,
> - IN SMBIOS_TABLE_STRING StringNumber,
> - IN CHAR16 *String
> - );
> -
> -/**
> - Allow caller to read a specific SMBIOS string
> -
> - @param[in] Header SMBIOS record that contains the string.
> - @param[in[ StringNumber Instance of SMBIOS string 1 - N.
> -
> - @retval NULL Instance of Type SMBIOS string was not found.
> - @retval Other Pointer to matching SMBIOS string.
> -**/
> -CHAR8 *
> -EFIAPI
> -SmbiosLibReadString (
> - IN SMBIOS_STRUCTURE *Header,
> - IN EFI_SMBIOS_STRING StringNumber
> - );
> -
> -
> -/**
> - Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
> -
> - @param[in] Type Type of the next SMBIOS record to return.
> - @param[in[ Instance Instance of SMBIOS record 0 - N-1.
> - @param[out] SmbiosHandle Returns SMBIOS handle for the matching
> record.
> -
> - @retval NULL Instance of Type SMBIOS record was not found.
> - @retval Other Pointer to matching SMBIOS record.
> -**/
> -SMBIOS_STRUCTURE *
> -EFIAPI
> -SmbiosLibGetRecord (
> - IN EFI_SMBIOS_TYPE Type,
> - IN UINTN Instance,
> - OUT EFI_SMBIOS_HANDLE *SmbiosHandle
> - );
> -
> -/**
> - Remove an SMBIOS record.
> -
> - This function removes an SMBIOS record using the handle specified by
> SmbiosHandle.
> -
> - @param[in] SmbiosHandle The handle of the SMBIOS record to
> remove.
> -
> - @retval EFI_SUCCESS SMBIOS record was removed.
> - @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid
> SMBIOS record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibRemove (
> - OUT EFI_SMBIOS_HANDLE SmbiosHandle
> - );
> -
> -
> -
> -
> -#endif
> +/** @file
> + Provides library functions for common SMBIOS operations. Only available to
> DXE
> + and UEFI module types.
> +
> +
> +Copyright (c) 2012, Apple Inc. All rights reserved.
> +Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials are licensed and made
> available under
> +the terms and conditions of the BSD License that accompanies this distribution.
> +The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php.
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef _SMBIOS_LIB_H__
> +#define _SMBIOS_LIB_H__
> +
> +#include <IndustryStandard/SmBios.h>
> +#include <Protocol/Smbios.h>
> +
> +
> +///
> +/// Cache copy of the SMBIOS Protocol pointer
> +///
> +extern EFI_SMBIOS_PROTOCOL *gSmbios;
> +
> +
> +///
> +/// Template for SMBIOS table initialization.
> +/// The SMBIOS_TABLE_STRING types in the formated area must match the
> +/// StringArray sequene.
> +///
> +typedef struct {
> + //
> + // formatted area of a given SMBIOS record
> + //
> + SMBIOS_STRUCTURE *Entry;
> + //
> + // NULL terminated array of ASCII strings to be added to the SMBIOS record.
> + //
> + CHAR8 **StringArray;
> +} SMBIOS_TEMPLATE_ENTRY;
> +
> +
> +/**
> + Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
> + entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
> +
> + @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
> +
> + @retval EFI_SUCCESS New SMBIOS tables were created.
> + @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibInitializeFromTemplate (
> + IN SMBIOS_TEMPLATE_ENTRY *Template
> + );
> +
> +
> +
> +/**
> + Create SMBIOS record.
> +
> + Converts a fixed SMBIOS structure and an array of pointers to strings into
> + an SMBIOS record where the strings are cat'ed on the end of the fixed
> record
> + and terminated via a double NULL and add to SMBIOS table.
> +
> + SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> + { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> + 1 // StringCount
> + };
> + CHAR8 *gSmbiosType12Strings[] = {
> + "Not Found",
> + NULL
> + };
> +
> + ...
> + AddSmbiosEntryFromTemplate (
> + (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> + gSmbiosType12Strings
> + );
> +
> + @param SmbiosEntry Fixed SMBIOS structure
> + @param StringArray Array of strings to convert to an SMBIOS string pack.
> + NULL is OK.
> +
> + @retval EFI_SUCCESS New SmbiosEntry was added to SMBIOS table.
> + @retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibCreateEntry (
> + IN SMBIOS_STRUCTURE *SmbiosEntry,
> + IN CHAR8 **StringArray
> + );
> +
> +
> +/**
> + Update the string associated with an existing SMBIOS record.
> +
> + This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> + SMBIOS record is defined by how many strings were present when Add() was
> called.
> +
> + @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> + @param[in] StringNumber The non-zero string number of the string to
> update.
> + @param[in] String Update the StringNumber string with String.
> +
> + @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> + @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> + @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> + @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibUpdateString (
> + IN EFI_SMBIOS_HANDLE SmbiosHandle,
> + IN SMBIOS_TABLE_STRING StringNumber,
> + IN CHAR8 *String
> + );
> +
> +/**
> + Update the string associated with an existing SMBIOS record.
> +
> + This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> + SMBIOS record is defined by how many strings were present when Add() was
> called.
> +
> + @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> + @param[in] StringNumber The non-zero string number of the string to
> update.
> + @param[in] String Update the StringNumber string with String.
> +
> + @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> + @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> + @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> + @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibUpdateUnicodeString (
> + IN EFI_SMBIOS_HANDLE SmbiosHandle,
> + IN SMBIOS_TABLE_STRING StringNumber,
> + IN CHAR16 *String
> + );
> +
> +/**
> + Allow caller to read a specific SMBIOS string
> +
> + @param[in] Header SMBIOS record that contains the string.
> + @param[in[ StringNumber Instance of SMBIOS string 1 - N.
> +
> + @retval NULL Instance of Type SMBIOS string was not found.
> + @retval Other Pointer to matching SMBIOS string.
> +**/
> +CHAR8 *
> +EFIAPI
> +SmbiosLibReadString (
> + IN SMBIOS_STRUCTURE *Header,
> + IN EFI_SMBIOS_STRING StringNumber
> + );
> +
> +
> +/**
> + Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
> +
> + @param[in] Type Type of the next SMBIOS record to return.
> + @param[in[ Instance Instance of SMBIOS record 0 - N-1.
> + @param[out] SmbiosHandle Returns SMBIOS handle for the matching
> record.
> +
> + @retval NULL Instance of Type SMBIOS record was not found.
> + @retval Other Pointer to matching SMBIOS record.
> +**/
> +SMBIOS_STRUCTURE *
> +EFIAPI
> +SmbiosLibGetRecord (
> + IN EFI_SMBIOS_TYPE Type,
> + IN UINTN Instance,
> + OUT EFI_SMBIOS_HANDLE *SmbiosHandle
> + );
> +
> +/**
> + Remove an SMBIOS record.
> +
> + This function removes an SMBIOS record using the handle specified by
> SmbiosHandle.
> +
> + @param[in] SmbiosHandle The handle of the SMBIOS record to
> remove.
> +
> + @retval EFI_SUCCESS SMBIOS record was removed.
> + @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid
> SMBIOS record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibRemove (
> + OUT EFI_SMBIOS_HANDLE SmbiosHandle
> + );
> +
> +
> +
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Protocol/EmuBlockIo.h
> b/EmulatorPkg/Include/Protocol/EmuBlockIo.h
> index 8e5463c74e..45ca5b9a7a 100644
> --- a/EmulatorPkg/Include/Protocol/EmuBlockIo.h
> +++ b/EmulatorPkg/Include/Protocol/EmuBlockIo.h
> @@ -62,7 +62,7 @@ EFI_STATUS
> @param[in] MediaId Id of the media, changes every time the media is
> replaced.
> @param[in] Lba The starting Logical Block Address to read from.
> - @param[in, out] Token A pointer to the token associated with the
> transaction.
> + @param[in, out] Token A pointer to the token associated with the
> transaction.
> @param[in] BufferSize Size of Buffer, must be a multiple of device block
> size.
> @param[out] Buffer A pointer to the destination buffer for the data.
> The
> caller is responsible for either having implicit or
> diff --git a/EmulatorPkg/Include/Protocol/EmuFileSystem.h
> b/EmulatorPkg/Include/Protocol/EmuFileSystem.h
> index 6d8717479b..d13853877e 100644
> --- a/EmulatorPkg/Include/Protocol/EmuFileSystem.h
> +++ b/EmulatorPkg/Include/Protocol/EmuFileSystem.h
> @@ -1,140 +1,140 @@
> -/** @file
> - SimpleFileSystem protocol as defined in the UEFI 2.0 specification.
> -
> - The SimpleFileSystem protocol is the programmatic access to the FAT
> (12,16,32)
> - file system specified in UEFI 2.0. It can also be used to abstract a file
> - system other than FAT.
> -
> - UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.
> -
> -Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2011, Apple Inc. All rights reserved.
> -This program and the accompanying materials are licensed and made
> available under
> -the terms and conditions of the BSD License that accompanies this distribution.
> -The full text of the license may be found at
> -http://opensource.org/licenses/bsd-license.php.
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef _EMU_UGA_IO_H_
> -#define _EMU_UGA_IO_H_
> -
> -#include <Protocol/SimplePointer.h>
> -#include <Protocol/SimpleTextIn.h>
> -#include <Protocol/SimpleTextInEx.h>
> -#include <Protocol/UgaDraw.h>
> -
> -#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
> - { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA,
> 0xC1 } }
> -
> -typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL
> EMU_GRAPHICS_WINDOW_PROTOCOL;
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> - UINT32 Width,
> - UINT32 Height
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> - EFI_KEY_DATA *key
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> - );
> -
> -
> -typedef
> -VOID
> -(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
> - IN VOID *Context,
> - IN EFI_KEY_DATA *KeyData
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
> - IN VOID *Context
> - );
> -
> -
> -typedef struct {
> - UINTN SourceX;
> - UINTN SourceY;
> - UINTN DestinationX;
> - UINTN DestinationY;
> - UINTN Width;
> - UINTN Height;
> - UINTN Delta;
> -} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
> - IN EFI_UGA_BLT_OPERATION BltOperation,
> - IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
> - );
> -
> -typedef
> -BOOLEAN
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EFI_KEY_DATA *KeyData
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - EFI_SIMPLE_POINTER_STATE *state
> - );
> -
> -struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
> - EMU_GRAPHICS_WINDOWS_SIZE Size;
> - EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
> - EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
> - EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
> - EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
> - EMU_GRAPHICS_WINDOWS_BLT Blt;
> - EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
> - EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
> - EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
> -};
> -
> -
> -extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
> -
> -#endif
> +/** @file
> + SimpleFileSystem protocol as defined in the UEFI 2.0 specification.
> +
> + The SimpleFileSystem protocol is the programmatic access to the FAT
> (12,16,32)
> + file system specified in UEFI 2.0. It can also be used to abstract a file
> + system other than FAT.
> +
> + UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.
> +
> +Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2011, Apple Inc. All rights reserved.
> +This program and the accompanying materials are licensed and made
> available under
> +the terms and conditions of the BSD License that accompanies this distribution.
> +The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php.
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef _EMU_UGA_IO_H_
> +#define _EMU_UGA_IO_H_
> +
> +#include <Protocol/SimplePointer.h>
> +#include <Protocol/SimpleTextIn.h>
> +#include <Protocol/SimpleTextInEx.h>
> +#include <Protocol/UgaDraw.h>
> +
> +#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
> + { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA,
> 0xC1 } }
> +
> +typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL
> EMU_GRAPHICS_WINDOW_PROTOCOL;
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> + UINT32 Width,
> + UINT32 Height
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> + EFI_KEY_DATA *key
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> + );
> +
> +
> +typedef
> +VOID
> +(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
> + IN VOID *Context,
> + IN EFI_KEY_DATA *KeyData
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
> + IN VOID *Context
> + );
> +
> +
> +typedef struct {
> + UINTN SourceX;
> + UINTN SourceY;
> + UINTN DestinationX;
> + UINTN DestinationY;
> + UINTN Width;
> + UINTN Height;
> + UINTN Delta;
> +} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
> + IN EFI_UGA_BLT_OPERATION BltOperation,
> + IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
> + );
> +
> +typedef
> +BOOLEAN
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EFI_KEY_DATA *KeyData
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + EFI_SIMPLE_POINTER_STATE *state
> + );
> +
> +struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
> + EMU_GRAPHICS_WINDOWS_SIZE Size;
> + EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
> + EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
> + EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
> + EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
> + EMU_GRAPHICS_WINDOWS_BLT Blt;
> + EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
> + EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
> + EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
> +};
> +
> +
> +extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
> b/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
> index 844159a766..e502fc68da 100644
> --- a/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
> +++ b/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
> @@ -1,134 +1,134 @@
> -/*++ @file
> -
> -Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>
> -Portitions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the
> -BSD License which accompanies this distribution. The full text of the
> -license may be found at http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef _EMU_UGA_IO_H_
> -#define _EMU_UGA_IO_H_
> -
> -#include <Protocol/SimplePointer.h>
> -#include <Protocol/SimpleTextIn.h>
> -#include <Protocol/SimpleTextInEx.h>
> -#include <Protocol/UgaDraw.h>
> -
> -#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
> - { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA,
> 0xC1 } }
> -
> -typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL
> EMU_GRAPHICS_WINDOW_PROTOCOL;
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> - UINT32 Width,
> - UINT32 Height
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> - EFI_KEY_DATA *key
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> - );
> -
> -
> -typedef
> -VOID
> -(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
> - IN VOID *Context,
> - IN EFI_KEY_DATA *KeyData
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeCallBack,
> - IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakCallBack,
> - IN VOID *Context
> - );
> -
> -
> -typedef struct {
> - UINTN SourceX;
> - UINTN SourceY;
> - UINTN DestinationX;
> - UINTN DestinationY;
> - UINTN Width;
> - UINTN Height;
> - UINTN Delta;
> -} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
> - IN EFI_UGA_BLT_OPERATION BltOperation,
> - IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
> - );
> -
> -typedef
> -BOOLEAN
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EFI_KEY_DATA *KeyData
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - EFI_SIMPLE_POINTER_STATE *state
> - );
> -
> -struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
> - EMU_GRAPHICS_WINDOWS_SIZE Size;
> - EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
> - EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
> - EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
> - EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
> - EMU_GRAPHICS_WINDOWS_BLT Blt;
> - EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
> - EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
> - EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
> -};
> -
> -
> -extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
> -
> -#endif
> +/*++ @file
> +
> +Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>
> +Portitions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the
> +BSD License which accompanies this distribution. The full text of the
> +license may be found at http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef _EMU_UGA_IO_H_
> +#define _EMU_UGA_IO_H_
> +
> +#include <Protocol/SimplePointer.h>
> +#include <Protocol/SimpleTextIn.h>
> +#include <Protocol/SimpleTextInEx.h>
> +#include <Protocol/UgaDraw.h>
> +
> +#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
> + { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA,
> 0xC1 } }
> +
> +typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL
> EMU_GRAPHICS_WINDOW_PROTOCOL;
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> + UINT32 Width,
> + UINT32 Height
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> + EFI_KEY_DATA *key
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> + );
> +
> +
> +typedef
> +VOID
> +(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
> + IN VOID *Context,
> + IN EFI_KEY_DATA *KeyData
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeCallBack,
> + IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakCallBack,
> + IN VOID *Context
> + );
> +
> +
> +typedef struct {
> + UINTN SourceX;
> + UINTN SourceY;
> + UINTN DestinationX;
> + UINTN DestinationY;
> + UINTN Width;
> + UINTN Height;
> + UINTN Delta;
> +} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
> + IN EFI_UGA_BLT_OPERATION BltOperation,
> + IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
> + );
> +
> +typedef
> +BOOLEAN
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EFI_KEY_DATA *KeyData
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + EFI_SIMPLE_POINTER_STATE *state
> + );
> +
> +struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
> + EMU_GRAPHICS_WINDOWS_SIZE Size;
> + EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
> + EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
> + EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
> + EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
> + EMU_GRAPHICS_WINDOWS_BLT Blt;
> + EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
> + EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
> + EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
> +};
> +
> +
> +extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
> +
> +#endif
> diff --git a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
> b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
> index 7478a5ef2a..aa2066e132 100644
> --- a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
> +++ b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
> @@ -180,4 +180,4 @@ DevicePathToTextLibConstructor (
> DevicePathFromTextAddFilter (L"EmuThread", DevPathFromTextEmuThread);
> DevicePathFromTextAddFilter (L"EmuFs", DevPathFromTextEmuFs);
> return EFI_SUCCESS;
> -}
> \ No newline at end of file
> +}
> diff --git a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
> b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
> index f5726785e1..c484f8ec16 100644
> --- a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
> +++ b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
> @@ -45,4 +45,4 @@ [Protocols]
> gEmuGraphicsWindowProtocolGuid
> gEfiSimpleFileSystemProtocolGuid
> gEmuBlockIoProtocolGuid
> - gEmuThreadThunkProtocolGuid
> \ No newline at end of file
> + gEmuThreadThunkProtocolGuid
> diff --git a/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
> b/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
> index 22f8da7b64..7dd2d49451 100644
> --- a/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
> +++ b/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
> @@ -85,4 +85,4 @@ GetIoThunkInstance (
> }
>
> return NULL;
> -}
> \ No newline at end of file
> +}
> diff --git
> a/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio
> nLib.inf
> b/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio
> nLib.inf
> index f79ebc78e2..682231b83e 100644
> ---
> a/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio
> nLib.inf
> +++
> b/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio
> nLib.inf
> @@ -1,48 +1,48 @@
> -## @file
> -# PeCoff extra action libary for DXE phase that run Emu emulator.
> -#
> -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
> -# Portions copyright (c) 2011, Apple Inc. All rights reserved.
> -# This program and the accompanying materials
> -# are licensed and made available under the terms and conditions of the BSD
> License
> -# which accompanies this distribution. The full text of the license may be
> found at
> -# http://opensource.org/licenses/bsd-license.php
> -#
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -
> -#
> -#
> -##
> -
> -[Defines]
> - INF_VERSION = 0x00010005
> - BASE_NAME = DxeEmuPeCoffExtraActionLib
> - FILE_GUID = 68FCD487-D230-6846-95B1-5E1F2EF942C4
> - MODULE_TYPE = DXE_DRIVER
> - VERSION_STRING = 1.0
> - LIBRARY_CLASS = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER
> DXE_RUNTIME_DRIVER UEFI_DRIVER
> -
> - CONSTRUCTOR = DxeEmuPeCoffLibExtraActionConstructor
> -
> -#
> -# The following information is for reference only and not required by the build
> tools.
> -#
> -# VALID_ARCHITECTURES = IA32
> -#
> -
> -[Sources]
> - DxeEmuPeCoffExtraActionLib.c
> -
> -[Packages]
> - MdePkg/MdePkg.dec
> - EmulatorPkg/EmulatorPkg.dec
> -
> -[LibraryClasses]
> - DebugLib
> - HobLib
> - BaseMemoryLib
> -
> -[Protocols]
> - gEmuThunkProtocolGuid # PROTOCOL ALWAYS_CONSUMED
> -
> +## @file
> +# PeCoff extra action libary for DXE phase that run Emu emulator.
> +#
> +# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
> +# Portions copyright (c) 2011, Apple Inc. All rights reserved.
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD
> License
> +# which accompanies this distribution. The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +#
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = DxeEmuPeCoffExtraActionLib
> + FILE_GUID = 68FCD487-D230-6846-95B1-5E1F2EF942C4
> + MODULE_TYPE = DXE_DRIVER
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER
> DXE_RUNTIME_DRIVER UEFI_DRIVER
> +
> + CONSTRUCTOR = DxeEmuPeCoffLibExtraActionConstructor
> +
> +#
> +# The following information is for reference only and not required by the build
> tools.
> +#
> +# VALID_ARCHITECTURES = IA32
> +#
> +
> +[Sources]
> + DxeEmuPeCoffExtraActionLib.c
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + EmulatorPkg/EmulatorPkg.dec
> +
> +[LibraryClasses]
> + DebugLib
> + HobLib
> + BaseMemoryLib
> +
> +[Protocols]
> + gEmuThunkProtocolGuid # PROTOCOL ALWAYS_CONSUMED
> +
> diff --git
> a/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.
> c
> b/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.
> c
> index 00d9f19369..6bd44bfd0d 100644
> ---
> a/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.
> c
> +++
> b/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.
> c
> @@ -69,7 +69,7 @@ SerialPortWrite (
> if (gEmuThunk == NULL) {
> return NumberOfBytes;
> }
> -
> +
> return gEmuThunk->WriteStdErr (Buffer, NumberOfBytes);
> }
>
> diff --git a/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
> b/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
> index e555026601..b995266cc8 100644
> --- a/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
> +++ b/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
> @@ -47,4 +47,4 @@ KeyMapBreak (
> )
> {
> return EFI_SUCCESS;
> -}
> \ No newline at end of file
> +}
> diff --git
> a/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointe
> r.c
> b/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointe
> r.c
> index 06f995b0d3..72b68c283c 100644
> ---
> a/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointe
> r.c
> +++
> b/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointe
> r.c
> @@ -89,16 +89,16 @@ PeiServicesTablePointerLibConstructor (
> }
>
> /**
> - Perform CPU specific actions required to migrate the PEI Services Table
> + Perform CPU specific actions required to migrate the PEI Services Table
> pointer from temporary RAM to permanent RAM.
>
> - For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> + For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> - For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> + For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
> - a dedicated CPU register. This means that there is no memory storage
> - associated with storing the PEI Services Table pointer, so no additional
> + a dedicated CPU register. This means that there is no memory storage
> + associated with storing the PEI Services Table pointer, so no additional
> migration actions are required for Itanium or ARM CPUs.
>
> **/
> @@ -109,7 +109,7 @@ MigratePeiServicesTablePointer (
> )
> {
> //
> - // PEI Services Table pointer is cached in the global variable. No additional
> + // PEI Services Table pointer is cached in the global variable. No additional
> // migration actions are required.
> //
> return;
> diff --git
> a/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction
> Lib.inf
> b/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction
> Lib.inf
> index 9a757f7294..fdaf19ab6c 100644
> ---
> a/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction
> Lib.inf
> +++
> b/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction
> Lib.inf
> @@ -1,49 +1,49 @@
> -## @file
> -# PeCoff extra action libary for Pei phase that run Emu emulator.
> -#
> -# Lib to provide memory journal status code reporting Routines
> -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
> -# Portions copyright (c) 2011, Apple Inc. All rights reserved.
> -# This program and the accompanying materials
> -# are licensed and made available under the terms and conditions of the BSD
> License
> -# which accompanies this distribution. The full text of the license may be
> found at
> -# http://opensource.org/licenses/bsd-license.php
> -#
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -
> -#
> -#
> -##
> -
> -[Defines]
> - INF_VERSION = 0x00010005
> - BASE_NAME = PeiEmuPeCoffExtraActionLib
> - FILE_GUID = 79C4E72A-730B-F040-8129-95877B3A97A8
> - MODULE_TYPE = PEIM
> - VERSION_STRING = 1.0
> - LIBRARY_CLASS = PeCoffExtraActionLib|PEI_CORE PEIM
> -
> -#
> -# The following information is for reference only and not required by the build
> tools.
> -#
> -# VALID_ARCHITECTURES = IA32
> -#
> -
> -[Sources]
> - PeiEmuPeCoffExtraActionLib.c
> -
> -[Packages]
> - MdePkg/MdePkg.dec
> - EmulatorPkg/EmulatorPkg.dec
> -
> -[LibraryClasses]
> - BaseLib
> - PeiServicesLib
> - DebugLib
> -
> -[Ppis]
> - gEmuThunkPpiGuid # PPI ALWAYS_CONSUMED
> -
> -[Pcd]
> - gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage
> +## @file
> +# PeCoff extra action libary for Pei phase that run Emu emulator.
> +#
> +# Lib to provide memory journal status code reporting Routines
> +# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
> +# Portions copyright (c) 2011, Apple Inc. All rights reserved.
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD
> License
> +# which accompanies this distribution. The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +#
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = PeiEmuPeCoffExtraActionLib
> + FILE_GUID = 79C4E72A-730B-F040-8129-95877B3A97A8
> + MODULE_TYPE = PEIM
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = PeCoffExtraActionLib|PEI_CORE PEIM
> +
> +#
> +# The following information is for reference only and not required by the build
> tools.
> +#
> +# VALID_ARCHITECTURES = IA32
> +#
> +
> +[Sources]
> + PeiEmuPeCoffExtraActionLib.c
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + EmulatorPkg/EmulatorPkg.dec
> +
> +[LibraryClasses]
> + BaseLib
> + PeiServicesLib
> + DebugLib
> +
> +[Ppis]
> + gEmuThunkPpiGuid # PPI ALWAYS_CONSUMED
> +
> +[Pcd]
> + gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage
> diff --git
> a/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
> b/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
> index 5aaf296389..d79688820b 100644
> ---
> a/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
> +++
> b/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
> @@ -134,16 +134,16 @@ PeiServicesTablePointerLibConstructor (
> }
>
> /**
> - Perform CPU specific actions required to migrate the PEI Services Table
> + Perform CPU specific actions required to migrate the PEI Services Table
> pointer from temporary RAM to permanent RAM.
>
> - For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> + For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> - For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> + For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
> - a dedicated CPU register. This means that there is no memory storage
> - associated with storing the PEI Services Table pointer, so no additional
> + a dedicated CPU register. This means that there is no memory storage
> + associated with storing the PEI Services Table pointer, so no additional
> migration actions are required for Itanium or ARM CPUs.
>
> **/
> @@ -154,7 +154,7 @@ MigratePeiServicesTablePointer (
> )
> {
> //
> - // PEI Services Table pointer is cached in the global variable. No additional
> + // PEI Services Table pointer is cached in the global variable. No additional
> // migration actions are required.
> //
> return;
> diff --git
> a/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTable
> Pointer.c
> b/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTable
> Pointer.c
> index fa04ed3e04..383460b342 100644
> ---
> a/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTable
> Pointer.c
> +++
> b/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTable
> Pointer.c
> @@ -72,16 +72,16 @@ GetPeiServicesTablePointer (
> }
>
> /**
> - Perform CPU specific actions required to migrate the PEI Services Table
> + Perform CPU specific actions required to migrate the PEI Services Table
> pointer from temporary RAM to permanent RAM.
>
> - For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> + For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> - For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> + For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
> - a dedicated CPU register. This means that there is no memory storage
> - associated with storing the PEI Services Table pointer, so no additional
> + a dedicated CPU register. This means that there is no memory storage
> + associated with storing the PEI Services Table pointer, so no additional
> migration actions are required for Itanium or ARM CPUs.
>
> **/
> @@ -92,7 +92,7 @@ MigratePeiServicesTablePointer (
> )
> {
> //
> - // PEI Services Table pointer is cached in SRAM. No additional
> + // PEI Services Table pointer is cached in SRAM. No additional
> // migration actions are required.
> //
> return;
> diff --git a/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
> b/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
> index e473b52376..0f23178533 100644
> --- a/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
> +++ b/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
> @@ -44,4 +44,4 @@ [LibraryClasses]
> PeiServicesLib
>
> [Ppis]
> - gEmuThunkPpiGuid
> \ No newline at end of file
> + gEmuThunkPpiGuid
> diff --git a/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
> b/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
> index 7fa4ddb594..a48f2b5f53 100644
> --- a/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
> +++ b/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
> @@ -1,281 +1,281 @@
> -/*++ @file
> - A simple FV stack so the SEC can extract the SEC Core from an
> - FV.
> -
> -Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#include <PiPei.h>
> -
> -
> -#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
> - (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment)
> - 1))
> -
> -EFI_FFS_FILE_STATE
> -GetFileState (
> - IN UINT8 ErasePolarity,
> - IN EFI_FFS_FILE_HEADER *FfsHeader
> - )
> -/*++
> -
> -Routine Description:
> - Returns the highest bit set of the State field
> -
> -Arguments:
> - ErasePolarity - Erase Polarity as defined by EFI_FVB2_ERASE_POLARITY
> - in the Attributes field.
> - FfsHeader - Pointer to FFS File Header.
> -
> -Returns:
> - Returns the highest bit in the State field
> -
> -**/
> -{
> - EFI_FFS_FILE_STATE FileState;
> - EFI_FFS_FILE_STATE HighestBit;
> -
> - FileState = FfsHeader->State;
> -
> - if (ErasePolarity != 0) {
> - FileState = (EFI_FFS_FILE_STATE)~FileState;
> - }
> -
> - HighestBit = 0x80;
> - while (HighestBit != 0 && (HighestBit & FileState) == 0) {
> - HighestBit >>= 1;
> - }
> -
> - return HighestBit;
> -}
> -
> -UINT8
> -CalculateHeaderChecksum (
> - IN EFI_FFS_FILE_HEADER *FileHeader
> - )
> -/*++
> -
> -Routine Description:
> - Calculates the checksum of the header of a file.
> -
> -Arguments:
> - FileHeader - Pointer to FFS File Header.
> -
> -Returns:
> - Checksum of the header.
> -
> -**/
> -{
> - UINT8 *ptr;
> - UINTN Index;
> - UINT8 Sum;
> -
> - Sum = 0;
> - ptr = (UINT8 *) FileHeader;
> -
> - for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
> - Sum = (UINT8) (Sum + ptr[Index]);
> - Sum = (UINT8) (Sum + ptr[Index + 1]);
> - Sum = (UINT8) (Sum + ptr[Index + 2]);
> - Sum = (UINT8) (Sum + ptr[Index + 3]);
> - }
> -
> - for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
> - Sum = (UINT8) (Sum + ptr[Index]);
> - }
> - //
> - // State field (since this indicates the different state of file).
> - //
> - Sum = (UINT8) (Sum - FileHeader->State);
> - //
> - // Checksum field of the file is not part of the header checksum.
> - //
> - Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
> -
> - return Sum;
> -}
> -
> -EFI_STATUS
> -SecFfsFindNextFile (
> - IN EFI_FV_FILETYPE SearchType,
> - IN EFI_PEI_FV_HANDLE FvHandle,
> - IN OUT EFI_PEI_FILE_HANDLE *FileHandle
> - )
> -/*++
> -
> -Routine Description:
> - Given the input file pointer, search for the next matching file in the
> - FFS volume as defined by SearchType. The search starts from FileHeader
> inside
> - the Firmware Volume defined by FwVolHeader.
> -
> -Arguments:
> - SearchType - Filter to find only files of this type.
> - Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
> - FwVolHeader - Pointer to the FV header of the volume to search.
> - This parameter must point to a valid FFS volume.
> - FileHeader - Pointer to the current file from which to begin searching.
> - This pointer will be updated upon return to reflect the file
> - found.
> -
> -Returns:
> - EFI_NOT_FOUND - No files matching the search criteria were found
> - EFI_SUCCESS
> -
> -**/
> -{
> - EFI_FFS_FILE_HEADER *FfsFileHeader;
> - UINT32 FileLength;
> - UINT32 FileOccupiedSize;
> - UINT32 FileOffset;
> - UINT64 FvLength;
> - UINT8 ErasePolarity;
> - UINT8 FileState;
> - EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
> - EFI_FFS_FILE_HEADER **FileHeader;
> -
> - //
> - // Convert the handle of FV to FV header for memory-mapped firmware
> volume
> - //
> - FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
> - FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle;
> -
> - FvLength = FwVolHeader->FvLength;
> - if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
> - ErasePolarity = 1;
> - } else {
> - ErasePolarity = 0;
> - }
> - //
> - // If FileHeader is not specified (NULL) start with the first file in the
> - // firmware volume. Otherwise, start from the FileHeader.
> - //
> - if (*FileHeader == NULL) {
> - FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader +
> FwVolHeader->HeaderLength);
> - } else {
> - //
> - // Length is 24 bits wide so mask upper 8 bits
> - // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
> - //
> - FileLength = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
> - FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
> - FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader +
> FileOccupiedSize);
> - }
> -
> - FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
> -
> - while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
> - //
> - // Get FileState which is the highest bit of the State
> - //
> - FileState = GetFileState (ErasePolarity, FfsFileHeader);
> -
> - switch (FileState) {
> -
> - case EFI_FILE_HEADER_INVALID:
> - FileOffset += sizeof (EFI_FFS_FILE_HEADER);
> - FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof
> (EFI_FFS_FILE_HEADER));
> - break;
> -
> - case EFI_FILE_DATA_VALID:
> - case EFI_FILE_MARKED_FOR_UPDATE:
> - if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
> - FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> - FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
> -
> - if ((SearchType == FfsFileHeader->Type) || (SearchType ==
> EFI_FV_FILETYPE_ALL)) {
> -
> - *FileHeader = FfsFileHeader;
> -
> - return EFI_SUCCESS;
> - }
> -
> - FileOffset += FileOccupiedSize;
> - FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> FileOccupiedSize);
> - } else {
> - return EFI_NOT_FOUND;
> - }
> - break;
> -
> - case EFI_FILE_DELETED:
> - FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> - FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
> - FileOffset += FileOccupiedSize;
> - FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> FileOccupiedSize);
> - break;
> -
> - default:
> - return EFI_NOT_FOUND;
> -
> - }
> - }
> -
> - return EFI_NOT_FOUND;
> -}
> -
> -EFI_STATUS
> -SecFfsFindSectionData (
> - IN EFI_SECTION_TYPE SectionType,
> - IN EFI_FFS_FILE_HEADER *FfsFileHeader,
> - IN OUT VOID **SectionData
> - )
> -/*++
> -
> -Routine Description:
> - Given the input file pointer, search for the next matching section in the
> - FFS volume.
> -
> -Arguments:
> - SearchType - Filter to find only sections of this type.
> - FfsFileHeader - Pointer to the current file to search.
> - SectionData - Pointer to the Section matching SectionType in FfsFileHeader.
> - NULL if section not found
> -
> -Returns:
> - EFI_NOT_FOUND - No files matching the search criteria were found
> - EFI_SUCCESS
> -
> -**/
> -{
> - UINT32 FileSize;
> - EFI_COMMON_SECTION_HEADER *Section;
> - UINT32 SectionLength;
> - UINT32 ParsedLength;
> -
> - //
> - // Size is 24 bits wide so mask upper 8 bits.
> - // Does not include FfsFileHeader header size
> - // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
> - //
> - Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
> - FileSize = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> - FileSize -= sizeof (EFI_FFS_FILE_HEADER);
> -
> - *SectionData = NULL;
> - ParsedLength = 0;
> - while (ParsedLength < FileSize) {
> - if (Section->Type == SectionType) {
> - *SectionData = (VOID *) (Section + 1);
> - return EFI_SUCCESS;
> - }
> - //
> - // Size is 24 bits wide so mask upper 8 bits.
> - // SectionLength is adjusted it is 4 byte aligned.
> - // Go to the next section
> - //
> - SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
> - SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
> -
> - ParsedLength += SectionLength;
> - Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section +
> SectionLength);
> - }
> -
> - return EFI_NOT_FOUND;
> -}
> -
> +/*++ @file
> + A simple FV stack so the SEC can extract the SEC Core from an
> + FV.
> +
> +Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include <PiPei.h>
> +
> +
> +#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
> + (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) &
> ((Alignment) - 1))
> +
> +EFI_FFS_FILE_STATE
> +GetFileState (
> + IN UINT8 ErasePolarity,
> + IN EFI_FFS_FILE_HEADER *FfsHeader
> + )
> +/*++
> +
> +Routine Description:
> + Returns the highest bit set of the State field
> +
> +Arguments:
> + ErasePolarity - Erase Polarity as defined by EFI_FVB2_ERASE_POLARITY
> + in the Attributes field.
> + FfsHeader - Pointer to FFS File Header.
> +
> +Returns:
> + Returns the highest bit in the State field
> +
> +**/
> +{
> + EFI_FFS_FILE_STATE FileState;
> + EFI_FFS_FILE_STATE HighestBit;
> +
> + FileState = FfsHeader->State;
> +
> + if (ErasePolarity != 0) {
> + FileState = (EFI_FFS_FILE_STATE)~FileState;
> + }
> +
> + HighestBit = 0x80;
> + while (HighestBit != 0 && (HighestBit & FileState) == 0) {
> + HighestBit >>= 1;
> + }
> +
> + return HighestBit;
> +}
> +
> +UINT8
> +CalculateHeaderChecksum (
> + IN EFI_FFS_FILE_HEADER *FileHeader
> + )
> +/*++
> +
> +Routine Description:
> + Calculates the checksum of the header of a file.
> +
> +Arguments:
> + FileHeader - Pointer to FFS File Header.
> +
> +Returns:
> + Checksum of the header.
> +
> +**/
> +{
> + UINT8 *ptr;
> + UINTN Index;
> + UINT8 Sum;
> +
> + Sum = 0;
> + ptr = (UINT8 *) FileHeader;
> +
> + for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
> + Sum = (UINT8) (Sum + ptr[Index]);
> + Sum = (UINT8) (Sum + ptr[Index + 1]);
> + Sum = (UINT8) (Sum + ptr[Index + 2]);
> + Sum = (UINT8) (Sum + ptr[Index + 3]);
> + }
> +
> + for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
> + Sum = (UINT8) (Sum + ptr[Index]);
> + }
> + //
> + // State field (since this indicates the different state of file).
> + //
> + Sum = (UINT8) (Sum - FileHeader->State);
> + //
> + // Checksum field of the file is not part of the header checksum.
> + //
> + Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
> +
> + return Sum;
> +}
> +
> +EFI_STATUS
> +SecFfsFindNextFile (
> + IN EFI_FV_FILETYPE SearchType,
> + IN EFI_PEI_FV_HANDLE FvHandle,
> + IN OUT EFI_PEI_FILE_HANDLE *FileHandle
> + )
> +/*++
> +
> +Routine Description:
> + Given the input file pointer, search for the next matching file in the
> + FFS volume as defined by SearchType. The search starts from FileHeader
> inside
> + the Firmware Volume defined by FwVolHeader.
> +
> +Arguments:
> + SearchType - Filter to find only files of this type.
> + Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
> + FwVolHeader - Pointer to the FV header of the volume to search.
> + This parameter must point to a valid FFS volume.
> + FileHeader - Pointer to the current file from which to begin searching.
> + This pointer will be updated upon return to reflect the file
> + found.
> +
> +Returns:
> + EFI_NOT_FOUND - No files matching the search criteria were found
> + EFI_SUCCESS
> +
> +**/
> +{
> + EFI_FFS_FILE_HEADER *FfsFileHeader;
> + UINT32 FileLength;
> + UINT32 FileOccupiedSize;
> + UINT32 FileOffset;
> + UINT64 FvLength;
> + UINT8 ErasePolarity;
> + UINT8 FileState;
> + EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
> + EFI_FFS_FILE_HEADER **FileHeader;
> +
> + //
> + // Convert the handle of FV to FV header for memory-mapped firmware
> volume
> + //
> + FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
> + FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle;
> +
> + FvLength = FwVolHeader->FvLength;
> + if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
> + ErasePolarity = 1;
> + } else {
> + ErasePolarity = 0;
> + }
> + //
> + // If FileHeader is not specified (NULL) start with the first file in the
> + // firmware volume. Otherwise, start from the FileHeader.
> + //
> + if (*FileHeader == NULL) {
> + FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader +
> FwVolHeader->HeaderLength);
> + } else {
> + //
> + // Length is 24 bits wide so mask upper 8 bits
> + // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
> + //
> + FileLength = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
> + FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
> + FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader +
> FileOccupiedSize);
> + }
> +
> + FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
> +
> + while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
> + //
> + // Get FileState which is the highest bit of the State
> + //
> + FileState = GetFileState (ErasePolarity, FfsFileHeader);
> +
> + switch (FileState) {
> +
> + case EFI_FILE_HEADER_INVALID:
> + FileOffset += sizeof (EFI_FFS_FILE_HEADER);
> + FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> sizeof (EFI_FFS_FILE_HEADER));
> + break;
> +
> + case EFI_FILE_DATA_VALID:
> + case EFI_FILE_MARKED_FOR_UPDATE:
> + if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
> + FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> + FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
> +
> + if ((SearchType == FfsFileHeader->Type) || (SearchType ==
> EFI_FV_FILETYPE_ALL)) {
> +
> + *FileHeader = FfsFileHeader;
> +
> + return EFI_SUCCESS;
> + }
> +
> + FileOffset += FileOccupiedSize;
> + FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> FileOccupiedSize);
> + } else {
> + return EFI_NOT_FOUND;
> + }
> + break;
> +
> + case EFI_FILE_DELETED:
> + FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> + FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
> + FileOffset += FileOccupiedSize;
> + FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> FileOccupiedSize);
> + break;
> +
> + default:
> + return EFI_NOT_FOUND;
> +
> + }
> + }
> +
> + return EFI_NOT_FOUND;
> +}
> +
> +EFI_STATUS
> +SecFfsFindSectionData (
> + IN EFI_SECTION_TYPE SectionType,
> + IN EFI_FFS_FILE_HEADER *FfsFileHeader,
> + IN OUT VOID **SectionData
> + )
> +/*++
> +
> +Routine Description:
> + Given the input file pointer, search for the next matching section in the
> + FFS volume.
> +
> +Arguments:
> + SearchType - Filter to find only sections of this type.
> + FfsFileHeader - Pointer to the current file to search.
> + SectionData - Pointer to the Section matching SectionType in FfsFileHeader.
> + NULL if section not found
> +
> +Returns:
> + EFI_NOT_FOUND - No files matching the search criteria were found
> + EFI_SUCCESS
> +
> +**/
> +{
> + UINT32 FileSize;
> + EFI_COMMON_SECTION_HEADER *Section;
> + UINT32 SectionLength;
> + UINT32 ParsedLength;
> +
> + //
> + // Size is 24 bits wide so mask upper 8 bits.
> + // Does not include FfsFileHeader header size
> + // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
> + //
> + Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
> + FileSize = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> + FileSize -= sizeof (EFI_FFS_FILE_HEADER);
> +
> + *SectionData = NULL;
> + ParsedLength = 0;
> + while (ParsedLength < FileSize) {
> + if (Section->Type == SectionType) {
> + *SectionData = (VOID *) (Section + 1);
> + return EFI_SUCCESS;
> + }
> + //
> + // Size is 24 bits wide so mask upper 8 bits.
> + // SectionLength is adjusted it is 4 byte aligned.
> + // Go to the next section
> + //
> + SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
> + SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
> +
> + ParsedLength += SectionLength;
> + Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section +
> SectionLength);
> + }
> +
> + return EFI_NOT_FOUND;
> +}
> +
> diff --git a/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
> b/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
> index f9c0c3d677..b8c5504b70 100644
> --- a/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
> +++ b/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
> @@ -1,17 +1,17 @@
> -/*++ @file
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#include <PiPei.h>
> -
> -CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList = NULL;
> -
> +/*++ @file
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include <PiPei.h>
> +
> +CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList = NULL;
> +
> diff --git a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
> b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
> index 3382d7d2a6..7bdadb32a3 100644
> --- a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
> +++ b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
> @@ -1,352 +1,352 @@
> -/** @file
> - Provides library functions for common SMBIOS operations. Only available to
> DXE
> - and UEFI module types.
> -
> -
> -Copyright (c) 2012, Apple Inc. All rights reserved.
> -Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> -This program and the accompanying materials are licensed and made
> available under
> -the terms and conditions of the BSD License that accompanies this distribution.
> -The full text of the license may be found at
> -http://opensource.org/licenses/bsd-license.php.
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#include <PiDxe.h>
> -#include <Library/BaseLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -#include <Library/UefiLib.h>
> -#include <Library/SmbiosLib.h>
> -
> -
> -EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
> -
> -
> -/**
> - Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
> - entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
> -
> - @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
> -
> - @retval EFI_SUCCESS New SMBIOS tables were created.
> - @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibInitializeFromTemplate (
> - IN SMBIOS_TEMPLATE_ENTRY *Template
> - )
> -{
> - EFI_STATUS Status;
> - UINTN Index;
> -
> - if (Template == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Status = EFI_SUCCESS;
> -
> - for (Index = 0; Template[Index].Entry != NULL; Index++) {
> - Status = SmbiosLibCreateEntry (Template[Index].Entry,
> Template[Index].StringArray);
> - }
> -
> - return Status;
> -}
> -
> -
> -
> -/**
> - Create SMBIOS record.
> -
> - Converts a fixed SMBIOS structure and an array of pointers to strings into
> - an SMBIOS record where the strings are cat'ed on the end of the fixed record
> - and terminated via a double NULL and add to SMBIOS table.
> -
> - SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> - { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> - 1 // StringCount
> - };
> - CHAR8 *gSmbiosType12Strings[] = {
> - "Not Found",
> - NULL
> - };
> -
> - ...
> - CreateSmbiosEntry (
> - (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> - gSmbiosType12Strings
> - );
> -
> - @param SmbiosEntry Fixed SMBIOS structure
> - @param StringArray Array of strings to convert to an SMBIOS string pack.
> - NULL is OK.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibCreateEntry (
> - IN SMBIOS_STRUCTURE *SmbiosEntry,
> - IN CHAR8 **StringArray
> - )
> -{
> - EFI_STATUS Status;
> - EFI_SMBIOS_HANDLE SmbiosHandle;
> - EFI_SMBIOS_TABLE_HEADER *Record;
> - UINTN Index;
> - UINTN StringSize;
> - UINTN Size;
> - CHAR8 *Str;
> -
> - // Calculate the size of the fixed record and optional string pack
> - Size = SmbiosEntry->Length;
> - if (StringArray == NULL) {
> - Size += 2; // Min string section is double null
> - } else if (StringArray[0] == NULL) {
> - Size += 2; // Min string section is double null
> - } else {
> - for (Index = 0; StringArray[Index] != NULL; Index++) {
> - StringSize = AsciiStrSize (StringArray[Index]);
> - Size += StringSize;
> - }
> - // Don't forget the terminating double null
> - Size += 1;
> - }
> -
> - // Copy over Template
> - Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
> - if (Record == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> - CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
> -
> - if (StringArray != NULL) {
> - // Append string pack
> - Str = ((CHAR8 *)Record) + Record->Length;
> - for (Index = 0; StringArray[Index] != NULL; Index++) {
> - StringSize = AsciiStrSize (StringArray[Index]);
> - CopyMem (Str, StringArray[Index], StringSize);
> - Str += StringSize;
> - }
> - *Str = 0;
> - }
> -
> - SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> - Status = gSmbios->Add (
> - gSmbios,
> - gImageHandle,
> - &SmbiosHandle,
> - Record
> - );
> -
> - FreePool (Record);
> - return Status;
> -}
> -
> -
> -
> -/**
> - Update the string associated with an existing SMBIOS record.
> -
> - This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> - SMBIOS record is defined by how many strings were present when Add() was
> called.
> -
> - @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> - @param[in] StringNumber The non-zero string number of the string to
> update.
> - @param[in] String Update the StringNumber string with String.
> -
> - @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> - @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> - @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> - @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibUpdateString (
> - IN EFI_SMBIOS_HANDLE SmbiosHandle,
> - IN SMBIOS_TABLE_STRING StringNumber,
> - IN CHAR8 *String
> - )
> -{
> - UINTN StringIndex;
> -
> - if (String == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (*String == '\0') {
> - // A string with no data is not legal in SMBIOS
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - StringIndex = StringNumber;
> - return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex,
> String);
> -}
> -
> -
> -/**
> - Update the string associated with an existing SMBIOS record.
> -
> - This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> - SMBIOS record is defined by how many strings were present when Add() was
> called.
> -
> - @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> - @param[in] StringNumber The non-zero string number of the string to
> update.
> - @param[in] String Update the StringNumber string with String.
> -
> - @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> - @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> - @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> - @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibUpdateUnicodeString (
> - IN EFI_SMBIOS_HANDLE SmbiosHandle,
> - IN SMBIOS_TABLE_STRING StringNumber,
> - IN CHAR16 *String
> - )
> -{
> - EFI_STATUS Status;
> - UINTN StringIndex;
> - CHAR8 *Ascii;
> -
> - if (String == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (*String == '\0') {
> - // A string with no data is not legal in SMBIOS
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Ascii = AllocateZeroPool (StrSize (String));
> - if (Ascii == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> - UnicodeStrToAsciiStr (String, Ascii);
> -
> - StringIndex = StringNumber;
> - Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex,
> Ascii);
> -
> - FreePool (Ascii);
> - return Status;
> -}
> -
> -
> -/**
> - Allow caller to read a specific SMBIOS string
> -
> - @param[in] Header SMBIOS record that contains the string.
> - @param[in[ StringNumber Instance of SMBIOS string 1 - N.
> -
> - @retval NULL Instance of Type SMBIOS string was not found.
> - @retval Other Pointer to matching SMBIOS string.
> -**/
> -CHAR8 *
> -EFIAPI
> -SmbiosLibReadString (
> - IN SMBIOS_STRUCTURE *Header,
> - IN EFI_SMBIOS_STRING StringNumber
> - )
> -{
> - CHAR8 *Data;
> - UINTN Match;
> -
> - Data = (CHAR8 *)Header + Header->Length;
> - for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
> - if (StringNumber == Match) {
> - return Data;
> - }
> - Data++;
> - if (*(Data - 1) == '\0') {
> - Match++;
> - }
> - }
> -
> - return NULL;
> -}
> -
> -
> -/**
> - Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
> -
> - @param[in] Type Type of the next SMBIOS record to return.
> - @param[in[ Instance Instance of SMBIOS record 0 - N-1.
> - @param[out] SmbiosHandle Returns SMBIOS handle for the matching
> record.
> -
> - @retval NULL Instance of Type SMBIOS record was not found.
> - @retval Other Pointer to matching SMBIOS record.
> -**/
> -SMBIOS_STRUCTURE *
> -EFIAPI
> -SmbiosLibGetRecord (
> - IN EFI_SMBIOS_TYPE Type,
> - IN UINTN Instance,
> - OUT EFI_SMBIOS_HANDLE *SmbiosHandle
> - )
> -{
> - EFI_STATUS Status;
> - EFI_SMBIOS_TABLE_HEADER *Record;
> - UINTN Match;
> -
> - Match = 0;
> - *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> - do {
> - Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record,
> NULL);
> - if (!EFI_ERROR (Status)) {
> - if (Match == Instance) {
> - return (SMBIOS_STRUCTURE *)Record;
> - }
> - Match++;
> - }
> - } while (!EFI_ERROR (Status));
> -
> - return NULL;
> -}
> -
> -
> -/**
> - Remove an SMBIOS record.
> -
> - This function removes an SMBIOS record using the handle specified by
> SmbiosHandle.
> -
> - @param[in] SmbiosHandle The handle of the SMBIOS record to
> remove.
> -
> - @retval EFI_SUCCESS SMBIOS record was removed.
> - @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid
> SMBIOS record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibRemove (
> - OUT EFI_SMBIOS_HANDLE SmbiosHandle
> - )
> -{
> - return gSmbios->Remove (gSmbios, SmbiosHandle);
> -}
> -
> -
> -
> -/**
> -
> - @param ImageHandle ImageHandle of the loaded driver.
> - @param SystemTable Pointer to the EFI System Table.
> -
> - @retval EFI_SUCCESS Register successfully.
> - @retval EFI_OUT_OF_RESOURCES No enough memory to register this
> handler.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibConstructor (
> - IN EFI_HANDLE ImageHandle,
> - IN EFI_SYSTEM_TABLE *SystemTable
> - )
> -{
> - return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID
> **)&gSmbios);
> -}
> -
> +/** @file
> + Provides library functions for common SMBIOS operations. Only available to
> DXE
> + and UEFI module types.
> +
> +
> +Copyright (c) 2012, Apple Inc. All rights reserved.
> +Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials are licensed and made
> available under
> +the terms and conditions of the BSD License that accompanies this distribution.
> +The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php.
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include <PiDxe.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiLib.h>
> +#include <Library/SmbiosLib.h>
> +
> +
> +EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
> +
> +
> +/**
> + Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
> + entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
> +
> + @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
> +
> + @retval EFI_SUCCESS New SMBIOS tables were created.
> + @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibInitializeFromTemplate (
> + IN SMBIOS_TEMPLATE_ENTRY *Template
> + )
> +{
> + EFI_STATUS Status;
> + UINTN Index;
> +
> + if (Template == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Status = EFI_SUCCESS;
> +
> + for (Index = 0; Template[Index].Entry != NULL; Index++) {
> + Status = SmbiosLibCreateEntry (Template[Index].Entry,
> Template[Index].StringArray);
> + }
> +
> + return Status;
> +}
> +
> +
> +
> +/**
> + Create SMBIOS record.
> +
> + Converts a fixed SMBIOS structure and an array of pointers to strings into
> + an SMBIOS record where the strings are cat'ed on the end of the fixed
> record
> + and terminated via a double NULL and add to SMBIOS table.
> +
> + SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> + { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> + 1 // StringCount
> + };
> + CHAR8 *gSmbiosType12Strings[] = {
> + "Not Found",
> + NULL
> + };
> +
> + ...
> + CreateSmbiosEntry (
> + (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> + gSmbiosType12Strings
> + );
> +
> + @param SmbiosEntry Fixed SMBIOS structure
> + @param StringArray Array of strings to convert to an SMBIOS string pack.
> + NULL is OK.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibCreateEntry (
> + IN SMBIOS_STRUCTURE *SmbiosEntry,
> + IN CHAR8 **StringArray
> + )
> +{
> + EFI_STATUS Status;
> + EFI_SMBIOS_HANDLE SmbiosHandle;
> + EFI_SMBIOS_TABLE_HEADER *Record;
> + UINTN Index;
> + UINTN StringSize;
> + UINTN Size;
> + CHAR8 *Str;
> +
> + // Calculate the size of the fixed record and optional string pack
> + Size = SmbiosEntry->Length;
> + if (StringArray == NULL) {
> + Size += 2; // Min string section is double null
> + } else if (StringArray[0] == NULL) {
> + Size += 2; // Min string section is double null
> + } else {
> + for (Index = 0; StringArray[Index] != NULL; Index++) {
> + StringSize = AsciiStrSize (StringArray[Index]);
> + Size += StringSize;
> + }
> + // Don't forget the terminating double null
> + Size += 1;
> + }
> +
> + // Copy over Template
> + Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
> + if (Record == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> + CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
> +
> + if (StringArray != NULL) {
> + // Append string pack
> + Str = ((CHAR8 *)Record) + Record->Length;
> + for (Index = 0; StringArray[Index] != NULL; Index++) {
> + StringSize = AsciiStrSize (StringArray[Index]);
> + CopyMem (Str, StringArray[Index], StringSize);
> + Str += StringSize;
> + }
> + *Str = 0;
> + }
> +
> + SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> + Status = gSmbios->Add (
> + gSmbios,
> + gImageHandle,
> + &SmbiosHandle,
> + Record
> + );
> +
> + FreePool (Record);
> + return Status;
> +}
> +
> +
> +
> +/**
> + Update the string associated with an existing SMBIOS record.
> +
> + This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> + SMBIOS record is defined by how many strings were present when Add() was
> called.
> +
> + @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> + @param[in] StringNumber The non-zero string number of the string to
> update.
> + @param[in] String Update the StringNumber string with String.
> +
> + @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> + @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> + @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> + @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibUpdateString (
> + IN EFI_SMBIOS_HANDLE SmbiosHandle,
> + IN SMBIOS_TABLE_STRING StringNumber,
> + IN CHAR8 *String
> + )
> +{
> + UINTN StringIndex;
> +
> + if (String == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (*String == '\0') {
> + // A string with no data is not legal in SMBIOS
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + StringIndex = StringNumber;
> + return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex,
> String);
> +}
> +
> +
> +/**
> + Update the string associated with an existing SMBIOS record.
> +
> + This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> + SMBIOS record is defined by how many strings were present when Add() was
> called.
> +
> + @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> + @param[in] StringNumber The non-zero string number of the string to
> update.
> + @param[in] String Update the StringNumber string with String.
> +
> + @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> + @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> + @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> + @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibUpdateUnicodeString (
> + IN EFI_SMBIOS_HANDLE SmbiosHandle,
> + IN SMBIOS_TABLE_STRING StringNumber,
> + IN CHAR16 *String
> + )
> +{
> + EFI_STATUS Status;
> + UINTN StringIndex;
> + CHAR8 *Ascii;
> +
> + if (String == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (*String == '\0') {
> + // A string with no data is not legal in SMBIOS
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Ascii = AllocateZeroPool (StrSize (String));
> + if (Ascii == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> + UnicodeStrToAsciiStr (String, Ascii);
> +
> + StringIndex = StringNumber;
> + Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex,
> Ascii);
> +
> + FreePool (Ascii);
> + return Status;
> +}
> +
> +
> +/**
> + Allow caller to read a specific SMBIOS string
> +
> + @param[in] Header SMBIOS record that contains the string.
> + @param[in[ StringNumber Instance of SMBIOS string 1 - N.
> +
> + @retval NULL Instance of Type SMBIOS string was not found.
> + @retval Other Pointer to matching SMBIOS string.
> +**/
> +CHAR8 *
> +EFIAPI
> +SmbiosLibReadString (
> + IN SMBIOS_STRUCTURE *Header,
> + IN EFI_SMBIOS_STRING StringNumber
> + )
> +{
> + CHAR8 *Data;
> + UINTN Match;
> +
> + Data = (CHAR8 *)Header + Header->Length;
> + for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
> + if (StringNumber == Match) {
> + return Data;
> + }
> + Data++;
> + if (*(Data - 1) == '\0') {
> + Match++;
> + }
> + }
> +
> + return NULL;
> +}
> +
> +
> +/**
> + Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
> +
> + @param[in] Type Type of the next SMBIOS record to return.
> + @param[in[ Instance Instance of SMBIOS record 0 - N-1.
> + @param[out] SmbiosHandle Returns SMBIOS handle for the matching
> record.
> +
> + @retval NULL Instance of Type SMBIOS record was not found.
> + @retval Other Pointer to matching SMBIOS record.
> +**/
> +SMBIOS_STRUCTURE *
> +EFIAPI
> +SmbiosLibGetRecord (
> + IN EFI_SMBIOS_TYPE Type,
> + IN UINTN Instance,
> + OUT EFI_SMBIOS_HANDLE *SmbiosHandle
> + )
> +{
> + EFI_STATUS Status;
> + EFI_SMBIOS_TABLE_HEADER *Record;
> + UINTN Match;
> +
> + Match = 0;
> + *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> + do {
> + Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record,
> NULL);
> + if (!EFI_ERROR (Status)) {
> + if (Match == Instance) {
> + return (SMBIOS_STRUCTURE *)Record;
> + }
> + Match++;
> + }
> + } while (!EFI_ERROR (Status));
> +
> + return NULL;
> +}
> +
> +
> +/**
> + Remove an SMBIOS record.
> +
> + This function removes an SMBIOS record using the handle specified by
> SmbiosHandle.
> +
> + @param[in] SmbiosHandle The handle of the SMBIOS record to
> remove.
> +
> + @retval EFI_SUCCESS SMBIOS record was removed.
> + @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid
> SMBIOS record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibRemove (
> + OUT EFI_SMBIOS_HANDLE SmbiosHandle
> + )
> +{
> + return gSmbios->Remove (gSmbios, SmbiosHandle);
> +}
> +
> +
> +
> +/**
> +
> + @param ImageHandle ImageHandle of the loaded driver.
> + @param SystemTable Pointer to the EFI System Table.
> +
> + @retval EFI_SUCCESS Register successfully.
> + @retval EFI_OUT_OF_RESOURCES No enough memory to register this
> handler.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibConstructor (
> + IN EFI_HANDLE ImageHandle,
> + IN EFI_SYSTEM_TABLE *SystemTable
> + )
> +{
> + return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID
> **)&gSmbios);
> +}
> +
> diff --git a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
> b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
> index 0593c47d48..8f4d4c6307 100644
> --- a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
> +++ b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
> @@ -1,47 +1,47 @@
> -## @file
> -# SMBIOS Library
> -#
> -# Copyright (c) 2012, Apple Inc. All rights reserved.
> -# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> -#
> -# This program and the accompanying materials
> -# are licensed and made available under the terms and conditions of the BSD
> License
> -# which accompanies this distribution. The full text of the license may be
> found at
> -# http://opensource.org/licenses/bsd-license.php
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -#
> -#
> -##
> -
> -[Defines]
> - INF_VERSION = 0x00010005
> - BASE_NAME = SmbiosLib
> - FILE_GUID = 881863A2-09FD-3E44-8D62-7AE038D03747
> - MODULE_TYPE = DXE_DRIVER
> - VERSION_STRING = 1.0
> - LIBRARY_CLASS = SmbiosLib|DXE_CORE DXE_DRIVER
> DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE
> UEFI_APPLICATION UEFI_DRIVER
> -
> - CONSTRUCTOR = SmbiosLibConstructor
> -
> -
> -[Sources]
> - SmbiosLib.c
> -
> -[Packages]
> - MdePkg/MdePkg.dec
> - EmulatorPkg/EmulatorPkg.dec
> -
> -[LibraryClasses]
> - BaseLib
> - BaseMemoryLib
> - DebugLib
> - MemoryAllocationLib
> - UefiBootServicesTableLib
> - UefiLib
> -
> -[Protocols]
> - gEfiSmbiosProtocolGuid
> -
> -[Depex]
> - gEfiSmbiosProtocolGuid
> \ No newline at end of file
> +## @file
> +# SMBIOS Library
> +#
> +# Copyright (c) 2012, Apple Inc. All rights reserved.
> +# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD
> License
> +# which accompanies this distribution. The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +#
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = SmbiosLib
> + FILE_GUID = 881863A2-09FD-3E44-8D62-7AE038D03747
> + MODULE_TYPE = DXE_DRIVER
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = SmbiosLib|DXE_CORE DXE_DRIVER
> DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE
> UEFI_APPLICATION UEFI_DRIVER
> +
> + CONSTRUCTOR = SmbiosLibConstructor
> +
> +
> +[Sources]
> + SmbiosLib.c
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + EmulatorPkg/EmulatorPkg.dec
> +
> +[LibraryClasses]
> + BaseLib
> + BaseMemoryLib
> + DebugLib
> + MemoryAllocationLib
> + UefiBootServicesTableLib
> + UefiLib
> +
> +[Protocols]
> + gEfiSmbiosProtocolGuid
> +
> +[Depex]
> + gEfiSmbiosProtocolGuid
> diff --git a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
> b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
> index c7749f3f17..e4d7cb67c8 100644
> --- a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
> +++ b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
> @@ -112,8 +112,8 @@ extern EFI_HII_HANDLE mHiiHandle;
> @param Smbios The EFI_SMBIOS_PROTOCOL instance.
> @param SmbiosHandle A unique handle will be assigned to the SMBIOS
> record.
> @param Record The data for the fixed portion of the SMBIOS
> record. The format of the record is
> - determined by EFI_SMBIOS_TABLE_HEADER.Type. The size
> of the formatted area is defined
> - by EFI_SMBIOS_TABLE_HEADER.Length and either
> followed by a double-null (0x0000) or
> + determined by EFI_SMBIOS_TABLE_HEADER.Type. The
> size of the formatted area is defined
> + by EFI_SMBIOS_TABLE_HEADER.Length and either
> followed by a double-null (0x0000) or
> a set of null terminated strings and a null.
>
> @retval EFI_SUCCESS Record was added.
> diff --git
> a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
> b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
> index 65fec01158..ab8ee258c8 100644
> --- a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
> +++ b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
> @@ -174,8 +174,8 @@ Returns:
> @param Smbios The EFI_SMBIOS_PROTOCOL instance.
> @param SmbiosHandle A unique handle will be assigned to the SMBIOS
> record.
> @param Record The data for the fixed portion of the SMBIOS
> record. The format of the record is
> - determined by EFI_SMBIOS_TABLE_HEADER.Type. The size
> of the formatted area is defined
> - by EFI_SMBIOS_TABLE_HEADER.Length and either
> followed by a double-null (0x0000) or
> + determined by EFI_SMBIOS_TABLE_HEADER.Type. The
> size of the formatted area is defined
> + by EFI_SMBIOS_TABLE_HEADER.Length and either
> followed by a double-null (0x0000) or
> a set of null terminated strings and a null.
>
> @retval EFI_SUCCESS Record was added.
> diff --git a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
> b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
> index 123e090ed0..676d324e6b 100644
> --- a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
> +++ b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
> @@ -66,10 +66,10 @@ CreatePlatformSmbiosMemoryRecords (
> while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,
> HobPtr.Raw)) != NULL) {
> if (HobPtr.ResourceDescriptor->ResourceType ==
> EFI_RESOURCE_SYSTEM_MEMORY) {
> gSmbiosType19Template.ExtendedStartingAddress =
> HobPtr.ResourceDescriptor->PhysicalStart;
> - gSmbiosType19Template.ExtendedEndingAddress =
> - HobPtr.ResourceDescriptor->PhysicalStart +
> + gSmbiosType19Template.ExtendedEndingAddress =
> + HobPtr.ResourceDescriptor->PhysicalStart +
> HobPtr.ResourceDescriptor->ResourceLength - 1;
> -
> +
> SmbiosLibCreateEntry ((SMBIOS_STRUCTURE *)&gSmbiosType19Template,
> NULL);
> }
> HobPtr.Raw = GET_NEXT_HOB (HobPtr);
> @@ -97,7 +97,7 @@ PlatfomrSmbiosDriverEntryPoint (
> EFI_SMBIOS_HANDLE SmbiosHandle;
> SMBIOS_STRUCTURE_POINTER Smbios;
>
> - // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
> + // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
> // to an early version of the specification.
>
> // Phase 1 - Initialize SMBIOS tables from template
> @@ -112,18 +112,18 @@ PlatfomrSmbiosDriverEntryPoint (
> Smbios.Type0->BiosSize = (UINT8)DivU64x32 (FixedPcdGet64
> (PcdEmuFirmwareFdSize), 64*1024) - 1;
>
> SmbiosLibUpdateUnicodeString (
> - SmbiosHandle,
> - Smbios.Type0->BiosVersion,
> + SmbiosHandle,
> + Smbios.Type0->BiosVersion,
> (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString)
> );
> SmbiosLibUpdateUnicodeString (
> - SmbiosHandle,
> - Smbios.Type0->BiosReleaseDate,
> + SmbiosHandle,
> + Smbios.Type0->BiosReleaseDate,
> (CHAR16 *) PcdGetPtr (PcdFirmwareReleaseDateString)
> );
> }
>
> - // Phase 3 - Create tables from scratch
> + // Phase 3 - Create tables from scratch
>
> // Create Type 13 record from EFI Variables
> // Do we need this record for EFI as the info is available from EFI varaibles
> diff --git a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
> b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
> index 737310f470..bee1abb3eb 100644
> --- a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
> +++ b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
> @@ -1,7 +1,7 @@
> ## @file
> # Platform SMBIOS driver that fills in SMBIOS table entries.
> #
> -# Copyright (c) 2012, Apple Inc. All rights reserved.
> +# Copyright (c) 2012, Apple Inc. All rights reserved.
> # Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> #
> # This program and the accompanying materials
> @@ -52,4 +52,4 @@ [Pcd]
> gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize
>
> [Depex]
> - TRUE
> \ No newline at end of file
> + TRUE
> diff --git a/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
> b/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
> index c79e57b304..27679518ef 100644
> --- a/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
> +++ b/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
> @@ -8,7 +8,7 @@
> Processor Information (Type 4) - CPU Driver
> Cache Information (Type 7) - For cache that is external to processor
> System Slots (Type 9) - If system has slots
> - Physical Memory Array (Type 16)
> + Physical Memory Array (Type 16)
> Memory Device (Type 17) - For each socketed system-memory Device
> Memory Array Mapped Address (Type 19) - One per contiguous block per
> Physical Memroy Array
> System Boot Information (Type 32)
> @@ -69,9 +69,9 @@ SMBIOS_TABLE_TYPE0 gSmbiosType0Template = {
> 0, // PrinterIsSupported :1;
> 0, // CgaMonoIsSupported :1;
> 0, // NecPc98 :1;
> - 0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47
> reserved for BIOS vendor
> - ///< and bits 48-63 reserved for System Vendor.
> - },
> + 0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47
> reserved for BIOS vendor
> + ///< and bits 48-63 reserved for System Vendor.
> + },
> { // BIOSCharacteristicsExtensionBytes[]
> 0x81, // AcpiIsSupported :1;
> // UsbLegacyIsSupported :1;
> @@ -108,7 +108,7 @@ SMBIOS_TABLE_TYPE1 gSmbiosType1Template = {
> 3, // Version String
> 4, // SerialNumber String
> { 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x7C,
> 0x02 } },
> - SystemWakeupTypePowerSwitch,
> + SystemWakeupTypePowerSwitch,
> 5, // SKUNumber String
> 6, // Family String
> };
> @@ -119,7 +119,7 @@ CHAR8 *gSmbiosType1Strings[] = {
> "System Serial#",
> "System SKU#",
> "edk2",
> - NULL
> + NULL
> };
>
> SMBIOS_TABLE_TYPE2 gSmbiosType2Template = {
> @@ -139,7 +139,7 @@ SMBIOS_TABLE_TYPE2 gSmbiosType2Template = {
> },
> 6, // LocationInChassis String
> 0, // ChassisHandle;
> - BaseBoardTypeMotherBoard, // BoardType;
> + BaseBoardTypeMotherBoard, // BoardType;
> 0, // NumberOfContainedObjectHandles;
> { 0 } // ContainedObjectHandles[1];
> };
> @@ -150,7 +150,7 @@ CHAR8 *gSmbiosType2Strings[] = {
> "Base Board Serial#",
> "Base Board Asset Tag#",
> "Part Component",
> - NULL
> + NULL
> };
>
> SMBIOS_TABLE_TYPE3 gSmbiosType3Template = {
> @@ -160,10 +160,10 @@ SMBIOS_TABLE_TYPE3 gSmbiosType3Template = {
> 2, // Version String
> 3, // SerialNumber String
> 4, // AssetTag String
> - ChassisStateSafe, // BootupState;
> - ChassisStateSafe, // PowerSupplyState;
> - ChassisStateSafe, // ThermalState;
> - ChassisSecurityStatusNone,// SecurityStatus;
> + ChassisStateSafe, // BootupState;
> + ChassisStateSafe, // PowerSupplyState;
> + ChassisStateSafe, // ThermalState;
> + ChassisSecurityStatusNone,// SecurityStatus;
> { 0, 0, 0, 0 }, // OemDefined[4];
> 0, // Height;
> 0, // NumberofPowerCords;
> @@ -176,7 +176,7 @@ CHAR8 *gSmbiosType3Strings[] = {
> "EmulatorPkg",
> "Chassis Board Serial#",
> "Chassis Board Asset Tag#",
> - NULL
> + NULL
> };
>
> SMBIOS_TABLE_TYPE8 gSmbiosType8Template1 = {
> diff --git a/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> b/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> index a2e1f3e910..731ee0ffdb 100644
> --- a/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> +++ b/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> @@ -22,7 +22,7 @@
> .586p
> .model flat,C
> .code
> -
> +
> ;------------------------------------------------------------------------------
> ; VOID
> ; EFIAPI
> @@ -30,7 +30,7 @@
> ; UINT32 TemporaryMemoryBase,
> ; UINT32 PermenentMemoryBase
> ; );
> -;------------------------------------------------------------------------------
> +;------------------------------------------------------------------------------
> SecSwitchStack PROC
> ;
> ; Save three register: eax, ebx, ecx
> @@ -39,16 +39,16 @@ SecSwitchStack PROC
> push ebx
> push ecx
> push edx
> -
> +
> ;
> ; !!CAUTION!! this function address's is pushed into stack after
> ; migration of whole temporary memory, so need save it to permenent
> ; memory at first!
> ;
> -
> +
> mov ebx, [esp + 20] ; Save the first parameter
> mov ecx, [esp + 24] ; Save the second parameter
> -
> +
> ;
> ; Save this function's return address into permenent memory at first.
> ; Then, Fixup the esp point to permenent memory
> @@ -57,17 +57,17 @@ SecSwitchStack PROC
> sub eax, ebx
> add eax, ecx
> mov edx, dword ptr [esp] ; copy pushed register's value to permenent
> memory
> - mov dword ptr [eax], edx
> + mov dword ptr [eax], edx
> mov edx, dword ptr [esp + 4]
> - mov dword ptr [eax + 4], edx
> + mov dword ptr [eax + 4], edx
> mov edx, dword ptr [esp + 8]
> - mov dword ptr [eax + 8], edx
> + mov dword ptr [eax + 8], edx
> mov edx, dword ptr [esp + 12]
> - mov dword ptr [eax + 12], edx
> + mov dword ptr [eax + 12], edx
> mov edx, dword ptr [esp + 16] ; Update this function's return address into
> permenent memory
> - mov dword ptr [eax + 16], edx
> + mov dword ptr [eax + 16], edx
> mov esp, eax ; From now, esp is pointed to permenent memory
> -
> +
> ;
> ; Fixup the ebp point to permenent memory
> ;
> @@ -75,7 +75,7 @@ SecSwitchStack PROC
> sub eax, ebx
> add eax, ecx
> mov ebp, eax ; From now, ebp is pointed to permenent memory
> -
> +
> ;
> ; Fixup callee's ebp point for PeiDispatch
> ;
> @@ -83,7 +83,7 @@ SecSwitchStack PROC
> sub eax, ebx
> add eax, ecx
> mov dword ptr [ebp], eax ; From now, Temporary's PPI caller's stack is in
> permenent memory
> -
> +
> pop edx
> pop ecx
> pop ebx
> diff --git a/EmulatorPkg/Sec/Sec.c b/EmulatorPkg/Sec/Sec.c
> index 8a015682dd..4132e9d9b7 100644
> --- a/EmulatorPkg/Sec/Sec.c
> +++ b/EmulatorPkg/Sec/Sec.c
> @@ -1,149 +1,149 @@
> -/*++ @file
> - Stub SEC that is called from the OS appliation that is the root of the emulator.
> -
> - The OS application will call the SEC with the PEI Entry Point API.
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#include "Sec.h"
> -
> -
> -
> -EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
> - SecTemporaryRamSupport
> -};
> -
> -
> -EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
> - {
> - EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
> - &gEfiTemporaryRamSupportPpiGuid,
> - &mSecTemporaryRamSupportPpi
> - }
> -};
> -
> -
> -
> -/**
> - The entry point of PE/COFF Image for the PEI Core, that has been hijacked by
> this
> - SEC that sits on top of an OS application. So the entry and exit of this module
> - has the same API.
> -
> - This function is the entry point for the PEI Foundation, which allows the SEC
> phase
> - to pass information about the stack, temporary RAM and the Boot Firmware
> Volume.
> - In addition, it also allows the SEC phase to pass services and data forward for
> use
> - during the PEI phase in the form of one or more PPIs.
> - There is no limit to the number of additional PPIs that can be passed from
> SEC into
> - the PEI Foundation. As part of its initialization phase, the PEI Foundation will
> add
> - these SEC-hosted PPIs to its PPI database such that both the PEI Foundation
> and any
> - modules can leverage the associated service calls and/or code in these early
> PPIs.
> - This function is required to call ProcessModuleEntryPointList() with the
> Context
> - parameter set to NULL. ProcessModuleEntryPoint() is never expected to
> return.
> - The PEI Core is responsible for calling ProcessLibraryConstructorList() as soon
> as
> - the PEI Services Table and the file handle for the PEI Core itself have been
> established.
> - If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.
> -
> - @param SecCoreData Points to a data structure containing information
> about the PEI
> - core's operating environment, such as the size and location of
> - temporary RAM, the stack location and the BFV location.
> -
> - @param PpiList Points to a list of one or more PPI descriptors to be
> installed
> - initially by the PEI core. An empty PPI list consists of a single
> - descriptor with the end-tag
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
> - As part of its initialization phase, the PEI Foundation will add
> - these SEC-hosted PPIs to its PPI database such that both the PEI
> - Foundation and any modules can leverage the associated service
> calls
> - and/or code in these early PPIs.
> -
> -**/
> -VOID
> -EFIAPI
> -_ModuleEntryPoint (
> - IN EFI_SEC_PEI_HAND_OFF *SecCoreData,
> - IN EFI_PEI_PPI_DESCRIPTOR *PpiList
> - )
> -{
> - EFI_STATUS Status;
> - EFI_PEI_FV_HANDLE VolumeHandle;
> - EFI_PEI_FILE_HANDLE FileHandle;
> - VOID *PeCoffImage;
> - EFI_PEI_CORE_ENTRY_POINT EntryPoint;
> - EFI_PEI_PPI_DESCRIPTOR *Ppi;
> - EFI_PEI_PPI_DESCRIPTOR *SecPpiList;
> - UINTN SecReseveredMemorySize;
> - UINTN Index;
> -
> - EMU_MAGIC_PAGE()->PpiList = PpiList;
> - ProcessLibraryConstructorList ();
> -
> - DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
> -
> - //
> - // Add Our PPIs to the list
> - //
> - SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
> - for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
> - SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
> -
> - if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
> - // Since we are appending, need to clear out privious list terminator.
> - Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
> - break;
> - }
> - }
> -
> - // Keep everything on a good alignment
> - SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize,
> CPU_STACK_ALIGNMENT);
> -
> -#if 0
> - // Tell the PEI Core to not use our buffer in temp RAM
> - SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData-
> >PeiTemporaryRamBase;
> - SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData-
> >PeiTemporaryRamBase + SecReseveredMemorySize);
> - SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
> -#else
> - {
> - //
> - // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core
> crashes? Either there is a bug
> - // or I don't understand temp RAM correctly?
> - //
> - EFI_PEI_PPI_DESCRIPTOR PpiArray[10];
> -
> - SecPpiList = &PpiArray[0];
> - ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
> - }
> -#endif
> - // Copy existing list, and append our entries.
> - CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
> - CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof
> (gPrivateDispatchTable));
> -
> - // Find PEI Core and transfer control
> - VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData-
> >BootFirmwareVolumeBase;
> - FileHandle = NULL;
> - Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE,
> VolumeHandle, &FileHandle);
> - ASSERT_EFI_ERROR (Status);
> -
> - Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle,
> &PeCoffImage);
> - ASSERT_EFI_ERROR (Status);
> -
> - Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);
> - ASSERT_EFI_ERROR (Status);
> -
> - // Transfer control to PEI Core
> - EntryPoint (SecCoreData, SecPpiList);
> -
> - // PEI Core never returns
> - ASSERT (FALSE);
> - return;
> -}
> -
> -
> -
> +/*++ @file
> + Stub SEC that is called from the OS appliation that is the root of the emulator.
> +
> + The OS application will call the SEC with the PEI Entry Point API.
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include "Sec.h"
> +
> +
> +
> +EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
> + SecTemporaryRamSupport
> +};
> +
> +
> +EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
> + {
> + EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
> + &gEfiTemporaryRamSupportPpiGuid,
> + &mSecTemporaryRamSupportPpi
> + }
> +};
> +
> +
> +
> +/**
> + The entry point of PE/COFF Image for the PEI Core, that has been hijacked by
> this
> + SEC that sits on top of an OS application. So the entry and exit of this module
> + has the same API.
> +
> + This function is the entry point for the PEI Foundation, which allows the SEC
> phase
> + to pass information about the stack, temporary RAM and the Boot Firmware
> Volume.
> + In addition, it also allows the SEC phase to pass services and data forward for
> use
> + during the PEI phase in the form of one or more PPIs.
> + There is no limit to the number of additional PPIs that can be passed from
> SEC into
> + the PEI Foundation. As part of its initialization phase, the PEI Foundation will
> add
> + these SEC-hosted PPIs to its PPI database such that both the PEI Foundation
> and any
> + modules can leverage the associated service calls and/or code in these early
> PPIs.
> + This function is required to call ProcessModuleEntryPointList() with the
> Context
> + parameter set to NULL. ProcessModuleEntryPoint() is never expected to
> return.
> + The PEI Core is responsible for calling ProcessLibraryConstructorList() as
> soon as
> + the PEI Services Table and the file handle for the PEI Core itself have been
> established.
> + If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.
> +
> + @param SecCoreData Points to a data structure containing information
> about the PEI
> + core's operating environment, such as the size and location of
> + temporary RAM, the stack location and the BFV location.
> +
> + @param PpiList Points to a list of one or more PPI descriptors to be
> installed
> + initially by the PEI core. An empty PPI list consists of a single
> + descriptor with the end-tag
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
> + As part of its initialization phase, the PEI Foundation will add
> + these SEC-hosted PPIs to its PPI database such that both the PEI
> + Foundation and any modules can leverage the associated service
> calls
> + and/or code in these early PPIs.
> +
> +**/
> +VOID
> +EFIAPI
> +_ModuleEntryPoint (
> + IN EFI_SEC_PEI_HAND_OFF *SecCoreData,
> + IN EFI_PEI_PPI_DESCRIPTOR *PpiList
> + )
> +{
> + EFI_STATUS Status;
> + EFI_PEI_FV_HANDLE VolumeHandle;
> + EFI_PEI_FILE_HANDLE FileHandle;
> + VOID *PeCoffImage;
> + EFI_PEI_CORE_ENTRY_POINT EntryPoint;
> + EFI_PEI_PPI_DESCRIPTOR *Ppi;
> + EFI_PEI_PPI_DESCRIPTOR *SecPpiList;
> + UINTN SecReseveredMemorySize;
> + UINTN Index;
> +
> + EMU_MAGIC_PAGE()->PpiList = PpiList;
> + ProcessLibraryConstructorList ();
> +
> + DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
> +
> + //
> + // Add Our PPIs to the list
> + //
> + SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
> + for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
> + SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
> +
> + if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
> + // Since we are appending, need to clear out privious list terminator.
> + Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
> + break;
> + }
> + }
> +
> + // Keep everything on a good alignment
> + SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize,
> CPU_STACK_ALIGNMENT);
> +
> +#if 0
> + // Tell the PEI Core to not use our buffer in temp RAM
> + SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData-
> >PeiTemporaryRamBase;
> + SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData-
> >PeiTemporaryRamBase + SecReseveredMemorySize);
> + SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
> +#else
> + {
> + //
> + // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core
> crashes? Either there is a bug
> + // or I don't understand temp RAM correctly?
> + //
> + EFI_PEI_PPI_DESCRIPTOR PpiArray[10];
> +
> + SecPpiList = &PpiArray[0];
> + ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
> + }
> +#endif
> + // Copy existing list, and append our entries.
> + CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
> + CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof
> (gPrivateDispatchTable));
> +
> + // Find PEI Core and transfer control
> + VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData-
> >BootFirmwareVolumeBase;
> + FileHandle = NULL;
> + Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE,
> VolumeHandle, &FileHandle);
> + ASSERT_EFI_ERROR (Status);
> +
> + Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle,
> &PeCoffImage);
> + ASSERT_EFI_ERROR (Status);
> +
> + Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);
> + ASSERT_EFI_ERROR (Status);
> +
> + // Transfer control to PEI Core
> + EntryPoint (SecCoreData, SecPpiList);
> +
> + // PEI Core never returns
> + ASSERT (FALSE);
> + return;
> +}
> +
> +
> +
> diff --git a/EmulatorPkg/Sec/Sec.h b/EmulatorPkg/Sec/Sec.h
> index 4782578efa..c5781201eb 100644
> --- a/EmulatorPkg/Sec/Sec.h
> +++ b/EmulatorPkg/Sec/Sec.h
> @@ -1,51 +1,51 @@
> -/*++ @file
> - Stub SEC that is called from the OS appliation that is the root of the emulator.
> -
> - The OS application will call the SEC with the PEI Entry Point API.
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef __SEC_H___
> -#define __SEC_H___
> -
> -
> -#include <PiPei.h>
> -#include <Library/EmuMagicPageLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/PeiServicesLib.h>
> -#include <Library/PeCoffGetEntryPointLib.h>
> -#include <Library/BaseMemoryLib.h>
> -
> -#include <Ppi/TemporaryRamSupport.h>
> -
> -
> -//
> -// I think this shold be defined in a MdePkg include file?
> -//
> -VOID
> -EFIAPI
> -ProcessLibraryConstructorList (
> - VOID
> - );
> -
> -EFI_STATUS
> -EFIAPI
> -SecTemporaryRamSupport (
> - IN CONST EFI_PEI_SERVICES **PeiServices,
> - IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
> - IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
> - IN UINTN CopySize
> - );
> -
> -
> -#endif
> -
> +/*++ @file
> + Stub SEC that is called from the OS appliation that is the root of the emulator.
> +
> + The OS application will call the SEC with the PEI Entry Point API.
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef __SEC_H___
> +#define __SEC_H___
> +
> +
> +#include <PiPei.h>
> +#include <Library/EmuMagicPageLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/PeCoffGetEntryPointLib.h>
> +#include <Library/BaseMemoryLib.h>
> +
> +#include <Ppi/TemporaryRamSupport.h>
> +
> +
> +//
> +// I think this shold be defined in a MdePkg include file?
> +//
> +VOID
> +EFIAPI
> +ProcessLibraryConstructorList (
> + VOID
> + );
> +
> +EFI_STATUS
> +EFIAPI
> +SecTemporaryRamSupport (
> + IN CONST EFI_PEI_SERVICES **PeiServices,
> + IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
> + IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
> + IN UINTN CopySize
> + );
> +
> +
> +#endif
> +
> diff --git a/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
> b/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
> index 4ba27c2a6a..42103e100a 100644
> --- a/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
> +++ b/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
> @@ -47,8 +47,8 @@ typedef struct {
> VOID *CurrentReadPointer;
> VOID *EndReadPointer;
>
> - UINT32
> ReceivedPackets;
> - UINT32
> DroppedPackets;
> + UINT32 ReceivedPackets;
> + UINT32 DroppedPackets;
>
> } EMU_SNP_PRIVATE;
>
> @@ -200,8 +200,8 @@ EmuSnpStart (
> struct ifreq BoundIf;
> struct bpf_program BpfProgram;
> struct bpf_insn *FilterProgram;
> - u_int Value;
> - u_int ReadBufferSize;
> + u_int Value;
> + u_int ReadBufferSize;
> UINT16 Temp16;
> UINT32 Temp32;
>
> @@ -229,23 +229,23 @@ EmuSnpStart (
> }
>
> //
> - // Get the read buffer size.
> - //
> - if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {
> - goto DeviceErrorExit;
> - }
> -
> - //
> - // Default value from BIOCGBLEN is usually too small, so use a
> much larger size, if necessary.
> - //
> - if (ReadBufferSize < FixedPcdGet32
> (PcdNetworkPacketFilterSize)) {
> - ReadBufferSize = FixedPcdGet32
> (PcdNetworkPacketFilterSize);
> - if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize)
> < 0) {
> - goto DeviceErrorExit;
> - }
> - }
> -
> - //
> + // Get the read buffer size.
> + //
> + if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {
> + goto DeviceErrorExit;
> + }
> +
> + //
> + // Default value from BIOCGBLEN is usually too small, so use a much larger
> size, if necessary.
> + //
> + if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {
> + ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);
> + if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {
> + goto DeviceErrorExit;
> + }
> + }
> +
> + //
> // Associate our interface with this BPF file descriptor.
> //
> AsciiStrCpy (BoundIf.ifr_name, Private->InterfaceName);
> @@ -254,7 +254,7 @@ EmuSnpStart (
> }
>
> //
> - // Enable immediate mode.
> + // Enable immediate mode.
> //
> Value = 1;
> if (ioctl (Private->BpfFd, BIOCIMMEDIATE, &Value) < 0) {
> @@ -286,8 +286,8 @@ EmuSnpStart (
> //
> // Allocate read buffer.
> //
> - Private->ReadBufferSize = ReadBufferSize;
> - Private->ReadBuffer = malloc (Private->ReadBufferSize);
> + Private->ReadBufferSize = ReadBufferSize;
> + Private->ReadBuffer = malloc (Private->ReadBufferSize);
> if (Private->ReadBuffer == NULL) {
> goto ErrorExit;
> }
> @@ -295,7 +295,7 @@ EmuSnpStart (
> Private->CurrentReadPointer = Private->EndReadPointer = Private-
> >ReadBuffer;
>
> //
> - // Install our packet filter: successful reads should only produce
> broadcast or unicast
> + // Install our packet filter: successful reads should only produce broadcast
> or unicast
> // packets directed to our fake MAC address.
> //
> FilterProgram = malloc (sizeof (mFilterInstructionTemplate)) ;
> @@ -906,7 +906,7 @@ EmuSnpReceive (
> {
> EMU_SNP_PRIVATE *Private;
> struct bpf_hdr *BpfHeader;
> - struct bpf_stat BpfStats;
> + struct bpf_stat BpfStats;
> ETHERNET_HEADER *EnetHeader;
> ssize_t Result;
>
> @@ -916,19 +916,19 @@ EmuSnpReceive (
> return EFI_NOT_STARTED;
> }
>
> - ZeroMem (&BpfStats, sizeof( BpfStats));
> + ZeroMem (&BpfStats, sizeof( BpfStats));
>
> - if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
> - Private->ReceivedPackets += BpfStats.bs_recv;
> - if (BpfStats.bs_drop > Private->DroppedPackets) {
> - printf (
> - "SNP: STATS: RCVD = %d DROPPED = %d. Probably
> need to increase BPF PcdNetworkPacketFilterSize?\n",
> - BpfStats.bs_recv,
> - BpfStats.bs_drop - Private->DroppedPackets
> - );
> - Private->DroppedPackets = BpfStats.bs_drop;
> - }
> - }
> + if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
> + Private->ReceivedPackets += BpfStats.bs_recv;
> + if (BpfStats.bs_drop > Private->DroppedPackets) {
> + printf (
> + "SNP: STATS: RCVD = %d DROPPED = %d. Probably need to increase BPF
> PcdNetworkPacketFilterSize?\n",
> + BpfStats.bs_recv,
> + BpfStats.bs_drop - Private->DroppedPackets
> + );
> + Private->DroppedPackets = BpfStats.bs_drop;
> + }
> + }
>
> //
> // Do we have any remaining packets from the previous read?
> @@ -1004,7 +1004,7 @@ GetInterfaceMacAddr (
> EMU_SNP_PRIVATE *Private
> )
> {
> - EFI_STATUS Status;
> + EFI_STATUS Status;
> struct ifaddrs *IfAddrs;
> struct ifaddrs *If;
> struct sockaddr_dl *IfSdl;
> diff --git a/EmulatorPkg/Unix/Host/BlockIo.c
> b/EmulatorPkg/Unix/Host/BlockIo.c
> index fa05fbc107..3b87a9e5b1 100644
> --- a/EmulatorPkg/Unix/Host/BlockIo.c
> +++ b/EmulatorPkg/Unix/Host/BlockIo.c
> @@ -347,7 +347,7 @@ EmuBlockIoReadWriteCommon (
> @param[in] MediaId Id of the media, changes every time the media is
> replaced.
> @param[in] Lba The starting Logical Block Address to read from.
> - @param[in, out] Token A pointer to the token associated with the
> transaction.
> + @param[in, out] Token A pointer to the token associated with the
> transaction.
> @param[in] BufferSize Size of Buffer, must be a multiple of device block
> size.
> @param[out] Buffer A pointer to the destination buffer for the data.
> The
> caller is responsible for either having implicit or
> diff --git a/EmulatorPkg/Unix/Host/EmuThunk.c
> b/EmulatorPkg/Unix/Host/EmuThunk.c
> index a7b12b14e5..1a2037f931 100644
> --- a/EmulatorPkg/Unix/Host/EmuThunk.c
> +++ b/EmulatorPkg/Unix/Host/EmuThunk.c
> @@ -1,440 +1,440 @@
> -/*++ @file
> - Since the SEC is the only program in our emulation we
> - must use a UEFI/PI mechanism to export APIs to other modules.
> - This is the role of the EFI_EMU_THUNK_PROTOCOL.
> -
> - The mUnixThunkTable exists so that a change to
> EFI_EMU_THUNK_PROTOCOL
> - will cause an error in initializing the array if all the member functions
> - are not added. It looks like adding a element to end and not initializing
> - it may cause the table to be initaliized with the members at the end being
> - set to zero. This is bad as jumping to zero will crash.
> -
> -Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#include "Host.h"
> -
> -#ifdef __APPLE__
> -#define DebugAssert _Mangle__DebugAssert
> -
> -#include <assert.h>
> -#include <CoreServices/CoreServices.h>
> -#include <mach/mach.h>
> -#include <mach/mach_time.h>
> -
> -#undef DebugAssert
> -#endif
> -
> -int settimer_initialized;
> -struct timeval settimer_timeval;
> -void (*settimer_callback)(UINT64 delta);
> -
> -BOOLEAN gEmulatorInterruptEnabled = FALSE;
> -
> -
> -UINTN
> -SecWriteStdErr (
> - IN UINT8 *Buffer,
> - IN UINTN NumberOfBytes
> - )
> -{
> - ssize_t Return;
> -
> - Return = write (STDERR_FILENO, (const void *)Buffer,
> (size_t)NumberOfBytes);
> -
> - return (Return == -1) ? 0 : Return;
> -}
> -
> -
> -EFI_STATUS
> -SecConfigStdIn (
> - VOID
> - )
> -{
> - struct termios tty;
> -
> - //
> - // Need to turn off line buffering, ECHO, and make it unbuffered.
> - //
> - tcgetattr (STDIN_FILENO, &tty);
> - tty.c_lflag &= ~(ICANON | ECHO);
> - tcsetattr (STDIN_FILENO, TCSANOW, &tty);
> -
> -// setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
> -
> - // now ioctl FIONREAD will do what we need
> - return EFI_SUCCESS;
> -}
> -
> -UINTN
> -SecWriteStdOut (
> - IN UINT8 *Buffer,
> - IN UINTN NumberOfBytes
> - )
> -{
> - ssize_t Return;
> -
> - Return = write (STDOUT_FILENO, (const void *)Buffer,
> (size_t)NumberOfBytes);
> -
> - return (Return == -1) ? 0 : Return;
> -}
> -
> -UINTN
> -SecReadStdIn (
> - IN UINT8 *Buffer,
> - IN UINTN NumberOfBytes
> - )
> -{
> - ssize_t Return;
> -
> - Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
> -
> - return (Return == -1) ? 0 : Return;
> -}
> -
> -BOOLEAN
> -SecPollStdIn (
> - VOID
> - )
> -{
> - int Result;
> - int Bytes;
> -
> - Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
> - if (Result == -1) {
> - return FALSE;
> - }
> -
> - return (BOOLEAN)(Bytes > 0);
> -}
> -
> -
> -VOID *
> -SecMalloc (
> - IN UINTN Size
> - )
> -{
> - return malloc ((size_t)Size);
> -}
> -
> -VOID *
> -SecValloc (
> - IN UINTN Size
> - )
> -{
> - return valloc ((size_t)Size);
> -}
> -
> -BOOLEAN
> -SecFree (
> - IN VOID *Ptr
> - )
> -{
> - if (EfiSystemMemoryRange (Ptr)) {
> - // If an address range is in the EFI memory map it was alloced via EFI.
> - // So don't free those ranges and let the caller know.
> - return FALSE;
> - }
> -
> - free (Ptr);
> - return TRUE;
> -}
> -
> -
> -void
> -settimer_handler (int sig)
> -{
> - struct timeval timeval;
> - UINT64 delta;
> -
> - gettimeofday (&timeval, NULL);
> - delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
> - - ((UINT64)settimer_timeval.tv_sec * 1000)
> - - (settimer_timeval.tv_usec / 1000);
> - settimer_timeval = timeval;
> -
> - if (settimer_callback) {
> - ReverseGasketUint64 (settimer_callback, delta);
> - }
> -}
> -
> -VOID
> -SecSetTimer (
> - IN UINT64 PeriodMs,
> - IN EMU_SET_TIMER_CALLBACK CallBack
> - )
> -{
> - struct itimerval timerval;
> - UINT32 remainder;
> -
> - if (!settimer_initialized) {
> - struct sigaction act;
> -
> - settimer_initialized = 1;
> - act.sa_handler = settimer_handler;
> - act.sa_flags = 0;
> - sigemptyset (&act.sa_mask);
> - gEmulatorInterruptEnabled = TRUE;
> - if (sigaction (SIGALRM, &act, NULL) != 0) {
> - printf ("SetTimer: sigaction error %s\n", strerror (errno));
> - }
> - if (gettimeofday (&settimer_timeval, NULL) != 0) {
> - printf ("SetTimer: gettimeofday error %s\n", strerror (errno));
> - }
> - }
> - timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
> - DivU64x32Remainder(PeriodMs, 1000, &remainder);
> - timerval.it_value.tv_usec = remainder * 1000;
> - timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
> - timerval.it_interval = timerval.it_value;
> -
> - if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
> - printf ("SetTimer: setitimer error %s\n", strerror (errno));
> - }
> - settimer_callback = CallBack;
> -}
> -
> -
> -VOID
> -SecEnableInterrupt (
> - VOID
> - )
> -{
> - sigset_t sigset;
> -
> - gEmulatorInterruptEnabled = TRUE;
> - // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
> - // by enabling/disabling SIGALRM.
> - sigemptyset (&sigset);
> - sigaddset (&sigset, SIGALRM);
> - pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
> -}
> -
> -
> -VOID
> -SecDisableInterrupt (
> - VOID
> - )
> -{
> - sigset_t sigset;
> -
> - // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
> - // by enabling/disabling SIGALRM.
> - sigemptyset (&sigset);
> - sigaddset (&sigset, SIGALRM);
> - pthread_sigmask (SIG_BLOCK, &sigset, NULL);
> - gEmulatorInterruptEnabled = FALSE;
> -}
> -
> -
> -BOOLEAN
> -SecInterruptEanbled (void)
> -{
> - return gEmulatorInterruptEnabled;
> -}
> -
> -
> -UINT64
> -QueryPerformanceFrequency (
> - VOID
> - )
> -{
> - // Hard code to nanoseconds
> - return 1000000000ULL;
> -}
> -
> -UINT64
> -QueryPerformanceCounter (
> - VOID
> - )
> -{
> -#if __APPLE__
> - UINT64 Start;
> - static mach_timebase_info_data_t sTimebaseInfo;
> -
> -
> - Start = mach_absolute_time ();
> -
> - // Convert to nanoseconds.
> -
> - // If this is the first time we've run, get the timebase.
> - // We can use denom == 0 to indicate that sTimebaseInfo is
> - // uninitialised because it makes no sense to have a zero
> - // denominator is a fraction.
> -
> - if ( sTimebaseInfo.denom == 0 ) {
> - (void) mach_timebase_info(&sTimebaseInfo);
> - }
> -
> - // Do the maths. We hope that the multiplication doesn't
> - // overflow; the price you pay for working in fixed point.
> -
> - return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
> -#else
> - // Need to figure out what to do for Linux?
> - return 0;
> -#endif
> -}
> -
> -
> -
> -VOID
> -SecSleep (
> - IN UINT64 Nanoseconds
> - )
> -{
> - struct timespec rq, rm;
> - struct timeval start, end;
> - unsigned long MicroSec;
> -
> - rq.tv_sec = DivU64x32 (Nanoseconds, 1000000000);
> - rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
> -
> - //
> - // nanosleep gets interrupted by our timer tic.
> - // we need to track wall clock time or we will stall for way too long
> - //
> - gettimeofday (&start, NULL);
> - end.tv_sec = start.tv_sec + rq.tv_sec;
> - MicroSec = (start.tv_usec + rq.tv_nsec/1000);
> - end.tv_usec = MicroSec % 1000000;
> - if (MicroSec > 1000000) {
> - end.tv_sec++;
> - }
> -
> - while (nanosleep (&rq, &rm) == -1) {
> - if (errno != EINTR) {
> - break;
> - }
> - gettimeofday (&start, NULL);
> - if (start.tv_sec > end.tv_sec) {
> - break;
> - } if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {
> - break;
> - }
> - rq = rm;
> - }
> -}
> -
> -
> -VOID
> -SecCpuSleep (
> - VOID
> - )
> -{
> - struct timespec rq, rm;
> -
> - // nanosleep gets interrupted by the timer tic
> - rq.tv_sec = 1;
> - rq.tv_nsec = 0;
> -
> - nanosleep (&rq, &rm);
> -}
> -
> -
> -VOID
> -SecExit (
> - UINTN Status
> - )
> -{
> - exit (Status);
> -}
> -
> -
> -VOID
> -SecGetTime (
> - OUT EFI_TIME *Time,
> - OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
> - )
> -{
> - struct tm *tm;
> - time_t t;
> -
> - t = time (NULL);
> - tm = localtime (&t);
> -
> - Time->Year = 1900 + tm->tm_year;
> - Time->Month = tm->tm_mon + 1;
> - Time->Day = tm->tm_mday;
> - Time->Hour = tm->tm_hour;
> - Time->Minute = tm->tm_min;
> - Time->Second = tm->tm_sec;
> - Time->Nanosecond = 0;
> - Time->TimeZone = timezone;
> - Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
> - | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
> -
> - if (Capabilities != NULL) {
> - Capabilities->Resolution = 1;
> - Capabilities->Accuracy = 50000000;
> - Capabilities->SetsToZero = FALSE;
> - }
> -}
> -
> -
> -
> -VOID
> -SecSetTime (
> - IN EFI_TIME *Time
> - )
> -{
> - // Don't change the time on the system
> - // We could save delta to localtime() and have SecGetTime adjust return
> values?
> - return;
> -}
> -
> -
> -EFI_STATUS
> -SecGetNextProtocol (
> - IN BOOLEAN EmuBusDriver,
> - OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
> - )
> -{
> - return GetNextThunkProtocol (EmuBusDriver, Instance);
> -}
> -
> -
> -EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
> - GasketSecWriteStdErr,
> - GasketSecConfigStdIn,
> - GasketSecWriteStdOut,
> - GasketSecReadStdIn,
> - GasketSecPollStdIn,
> - GasketSecMalloc,
> - GasketSecValloc,
> - GasketSecFree,
> - GasketSecPeCoffGetEntryPoint,
> - GasketSecPeCoffRelocateImageExtraAction,
> - GasketSecPeCoffUnloadImageExtraAction,
> - GasketSecEnableInterrupt,
> - GasketSecDisableInterrupt,
> - GasketQueryPerformanceFrequency,
> - GasketQueryPerformanceCounter,
> - GasketSecSleep,
> - GasketSecCpuSleep,
> - GasketSecExit,
> - GasketSecGetTime,
> - GasketSecSetTime,
> - GasketSecSetTimer,
> - GasketSecGetNextProtocol
> -};
> -
> -
> -VOID
> -SecInitThunkProtocol (
> - VOID
> - )
> -{
> - // timezone and daylight lib globals depend on tzset be called 1st.
> - tzset ();
> -}
> -
> +/*++ @file
> + Since the SEC is the only program in our emulation we
> + must use a UEFI/PI mechanism to export APIs to other modules.
> + This is the role of the EFI_EMU_THUNK_PROTOCOL.
> +
> + The mUnixThunkTable exists so that a change to
> EFI_EMU_THUNK_PROTOCOL
> + will cause an error in initializing the array if all the member functions
> + are not added. It looks like adding a element to end and not initializing
> + it may cause the table to be initaliized with the members at the end being
> + set to zero. This is bad as jumping to zero will crash.
> +
> +Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include "Host.h"
> +
> +#ifdef __APPLE__
> +#define DebugAssert _Mangle__DebugAssert
> +
> +#include <assert.h>
> +#include <CoreServices/CoreServices.h>
> +#include <mach/mach.h>
> +#include <mach/mach_time.h>
> +
> +#undef DebugAssert
> +#endif
> +
> +int settimer_initialized;
> +struct timeval settimer_timeval;
> +void (*settimer_callback)(UINT64 delta);
> +
> +BOOLEAN gEmulatorInterruptEnabled = FALSE;
> +
> +
> +UINTN
> +SecWriteStdErr (
> + IN UINT8 *Buffer,
> + IN UINTN NumberOfBytes
> + )
> +{
> + ssize_t Return;
> +
> + Return = write (STDERR_FILENO, (const void *)Buffer,
> (size_t)NumberOfBytes);
> +
> + return (Return == -1) ? 0 : Return;
> +}
> +
> +
> +EFI_STATUS
> +SecConfigStdIn (
> + VOID
> + )
> +{
> + struct termios tty;
> +
> + //
> + // Need to turn off line buffering, ECHO, and make it unbuffered.
> + //
> + tcgetattr (STDIN_FILENO, &tty);
> + tty.c_lflag &= ~(ICANON | ECHO);
> + tcsetattr (STDIN_FILENO, TCSANOW, &tty);
> +
> +// setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
> +
> + // now ioctl FIONREAD will do what we need
> + return EFI_SUCCESS;
> +}
> +
> +UINTN
> +SecWriteStdOut (
> + IN UINT8 *Buffer,
> + IN UINTN NumberOfBytes
> + )
> +{
> + ssize_t Return;
> +
> + Return = write (STDOUT_FILENO, (const void *)Buffer,
> (size_t)NumberOfBytes);
> +
> + return (Return == -1) ? 0 : Return;
> +}
> +
> +UINTN
> +SecReadStdIn (
> + IN UINT8 *Buffer,
> + IN UINTN NumberOfBytes
> + )
> +{
> + ssize_t Return;
> +
> + Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
> +
> + return (Return == -1) ? 0 : Return;
> +}
> +
> +BOOLEAN
> +SecPollStdIn (
> + VOID
> + )
> +{
> + int Result;
> + int Bytes;
> +
> + Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
> + if (Result == -1) {
> + return FALSE;
> + }
> +
> + return (BOOLEAN)(Bytes > 0);
> +}
> +
> +
> +VOID *
> +SecMalloc (
> + IN UINTN Size
> + )
> +{
> + return malloc ((size_t)Size);
> +}
> +
> +VOID *
> +SecValloc (
> + IN UINTN Size
> + )
> +{
> + return valloc ((size_t)Size);
> +}
> +
> +BOOLEAN
> +SecFree (
> + IN VOID *Ptr
> + )
> +{
> + if (EfiSystemMemoryRange (Ptr)) {
> + // If an address range is in the EFI memory map it was alloced via EFI.
> + // So don't free those ranges and let the caller know.
> + return FALSE;
> + }
> +
> + free (Ptr);
> + return TRUE;
> +}
> +
> +
> +void
> +settimer_handler (int sig)
> +{
> + struct timeval timeval;
> + UINT64 delta;
> +
> + gettimeofday (&timeval, NULL);
> + delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
> + - ((UINT64)settimer_timeval.tv_sec * 1000)
> + - (settimer_timeval.tv_usec / 1000);
> + settimer_timeval = timeval;
> +
> + if (settimer_callback) {
> + ReverseGasketUint64 (settimer_callback, delta);
> + }
> +}
> +
> +VOID
> +SecSetTimer (
> + IN UINT64 PeriodMs,
> + IN EMU_SET_TIMER_CALLBACK CallBack
> + )
> +{
> + struct itimerval timerval;
> + UINT32 remainder;
> +
> + if (!settimer_initialized) {
> + struct sigaction act;
> +
> + settimer_initialized = 1;
> + act.sa_handler = settimer_handler;
> + act.sa_flags = 0;
> + sigemptyset (&act.sa_mask);
> + gEmulatorInterruptEnabled = TRUE;
> + if (sigaction (SIGALRM, &act, NULL) != 0) {
> + printf ("SetTimer: sigaction error %s\n", strerror (errno));
> + }
> + if (gettimeofday (&settimer_timeval, NULL) != 0) {
> + printf ("SetTimer: gettimeofday error %s\n", strerror (errno));
> + }
> + }
> + timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
> + DivU64x32Remainder(PeriodMs, 1000, &remainder);
> + timerval.it_value.tv_usec = remainder * 1000;
> + timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
> + timerval.it_interval = timerval.it_value;
> +
> + if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
> + printf ("SetTimer: setitimer error %s\n", strerror (errno));
> + }
> + settimer_callback = CallBack;
> +}
> +
> +
> +VOID
> +SecEnableInterrupt (
> + VOID
> + )
> +{
> + sigset_t sigset;
> +
> + gEmulatorInterruptEnabled = TRUE;
> + // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
> + // by enabling/disabling SIGALRM.
> + sigemptyset (&sigset);
> + sigaddset (&sigset, SIGALRM);
> + pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
> +}
> +
> +
> +VOID
> +SecDisableInterrupt (
> + VOID
> + )
> +{
> + sigset_t sigset;
> +
> + // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
> + // by enabling/disabling SIGALRM.
> + sigemptyset (&sigset);
> + sigaddset (&sigset, SIGALRM);
> + pthread_sigmask (SIG_BLOCK, &sigset, NULL);
> + gEmulatorInterruptEnabled = FALSE;
> +}
> +
> +
> +BOOLEAN
> +SecInterruptEanbled (void)
> +{
> + return gEmulatorInterruptEnabled;
> +}
> +
> +
> +UINT64
> +QueryPerformanceFrequency (
> + VOID
> + )
> +{
> + // Hard code to nanoseconds
> + return 1000000000ULL;
> +}
> +
> +UINT64
> +QueryPerformanceCounter (
> + VOID
> + )
> +{
> +#if __APPLE__
> + UINT64 Start;
> + static mach_timebase_info_data_t sTimebaseInfo;
> +
> +
> + Start = mach_absolute_time ();
> +
> + // Convert to nanoseconds.
> +
> + // If this is the first time we've run, get the timebase.
> + // We can use denom == 0 to indicate that sTimebaseInfo is
> + // uninitialised because it makes no sense to have a zero
> + // denominator is a fraction.
> +
> + if ( sTimebaseInfo.denom == 0 ) {
> + (void) mach_timebase_info(&sTimebaseInfo);
> + }
> +
> + // Do the maths. We hope that the multiplication doesn't
> + // overflow; the price you pay for working in fixed point.
> +
> + return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
> +#else
> + // Need to figure out what to do for Linux?
> + return 0;
> +#endif
> +}
> +
> +
> +
> +VOID
> +SecSleep (
> + IN UINT64 Nanoseconds
> + )
> +{
> + struct timespec rq, rm;
> + struct timeval start, end;
> + unsigned long MicroSec;
> +
> + rq.tv_sec = DivU64x32 (Nanoseconds, 1000000000);
> + rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
> +
> + //
> + // nanosleep gets interrupted by our timer tic.
> + // we need to track wall clock time or we will stall for way too long
> + //
> + gettimeofday (&start, NULL);
> + end.tv_sec = start.tv_sec + rq.tv_sec;
> + MicroSec = (start.tv_usec + rq.tv_nsec/1000);
> + end.tv_usec = MicroSec % 1000000;
> + if (MicroSec > 1000000) {
> + end.tv_sec++;
> + }
> +
> + while (nanosleep (&rq, &rm) == -1) {
> + if (errno != EINTR) {
> + break;
> + }
> + gettimeofday (&start, NULL);
> + if (start.tv_sec > end.tv_sec) {
> + break;
> + } if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {
> + break;
> + }
> + rq = rm;
> + }
> +}
> +
> +
> +VOID
> +SecCpuSleep (
> + VOID
> + )
> +{
> + struct timespec rq, rm;
> +
> + // nanosleep gets interrupted by the timer tic
> + rq.tv_sec = 1;
> + rq.tv_nsec = 0;
> +
> + nanosleep (&rq, &rm);
> +}
> +
> +
> +VOID
> +SecExit (
> + UINTN Status
> + )
> +{
> + exit (Status);
> +}
> +
> +
> +VOID
> +SecGetTime (
> + OUT EFI_TIME *Time,
> + OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
> + )
> +{
> + struct tm *tm;
> + time_t t;
> +
> + t = time (NULL);
> + tm = localtime (&t);
> +
> + Time->Year = 1900 + tm->tm_year;
> + Time->Month = tm->tm_mon + 1;
> + Time->Day = tm->tm_mday;
> + Time->Hour = tm->tm_hour;
> + Time->Minute = tm->tm_min;
> + Time->Second = tm->tm_sec;
> + Time->Nanosecond = 0;
> + Time->TimeZone = timezone;
> + Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
> + | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
> +
> + if (Capabilities != NULL) {
> + Capabilities->Resolution = 1;
> + Capabilities->Accuracy = 50000000;
> + Capabilities->SetsToZero = FALSE;
> + }
> +}
> +
> +
> +
> +VOID
> +SecSetTime (
> + IN EFI_TIME *Time
> + )
> +{
> + // Don't change the time on the system
> + // We could save delta to localtime() and have SecGetTime adjust return
> values?
> + return;
> +}
> +
> +
> +EFI_STATUS
> +SecGetNextProtocol (
> + IN BOOLEAN EmuBusDriver,
> + OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
> + )
> +{
> + return GetNextThunkProtocol (EmuBusDriver, Instance);
> +}
> +
> +
> +EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
> + GasketSecWriteStdErr,
> + GasketSecConfigStdIn,
> + GasketSecWriteStdOut,
> + GasketSecReadStdIn,
> + GasketSecPollStdIn,
> + GasketSecMalloc,
> + GasketSecValloc,
> + GasketSecFree,
> + GasketSecPeCoffGetEntryPoint,
> + GasketSecPeCoffRelocateImageExtraAction,
> + GasketSecPeCoffUnloadImageExtraAction,
> + GasketSecEnableInterrupt,
> + GasketSecDisableInterrupt,
> + GasketQueryPerformanceFrequency,
> + GasketQueryPerformanceCounter,
> + GasketSecSleep,
> + GasketSecCpuSleep,
> + GasketSecExit,
> + GasketSecGetTime,
> + GasketSecSetTime,
> + GasketSecSetTimer,
> + GasketSecGetNextProtocol
> +};
> +
> +
> +VOID
> +SecInitThunkProtocol (
> + VOID
> + )
> +{
> + // timezone and daylight lib globals depend on tzset be called 1st.
> + tzset ();
> +}
> +
> diff --git a/EmulatorPkg/Unix/Host/Host.c b/EmulatorPkg/Unix/Host/Host.c
> index f84b22f576..9aba7c854d 100644
> --- a/EmulatorPkg/Unix/Host/Host.c
> +++ b/EmulatorPkg/Unix/Host/Host.c
> @@ -1148,7 +1148,7 @@ GdbScriptAddImage (
>
> if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext-
> >PdbPointer)) {
> FILE *GdbTempFile;
> - if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
> + if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
> GdbTempFile = fopen (gGdbWorkingFileName, "a");
> if (GdbTempFile != NULL) {
> long unsigned int SymbolsAddr = (long unsigned int)(ImageContext-
> >ImageAddress + ImageContext->SizeOfHeaders);
> @@ -1170,13 +1170,13 @@ GdbScriptAddImage (
> GdbTempFile = fopen (gGdbWorkingFileName, "w");
> if (GdbTempFile != NULL) {
> fprintf (
> - GdbTempFile,
> - "add-symbol-file %s 0x%08lx\n",
> - ImageContext->PdbPointer,
> + GdbTempFile,
> + "add-symbol-file %s 0x%08lx\n",
> + ImageContext->PdbPointer,
> (long unsigned int)(ImageContext->ImageAddress + ImageContext-
> >SizeOfHeaders)
> );
> fclose (GdbTempFile);
> -
> +
> //
> // Target for gdb breakpoint in a script that uses gGdbWorkingFileName
> to set a breakpoint.
> // Hey what can you say scripting in gdb is not that great....
> @@ -1225,7 +1225,7 @@ GdbScriptRemoveImage (
> return;
> }
>
> - if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
> + if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
> //
> // Write the file we need for the gdb script
> //
> @@ -1256,7 +1256,7 @@ GdbScriptRemoveImage (
> SecGdbScriptBreak (ImageContext->PdbPointer, strlen (ImageContext-
> >PdbPointer) + 1, 0, 0);
> } else {
> ASSERT (FALSE);
> - }
> + }
> }
> }
>
> diff --git a/EmulatorPkg/Unix/Host/Host.h b/EmulatorPkg/Unix/Host/Host.h
> index 66c7c8df12..f7db46cdcd 100644
> --- a/EmulatorPkg/Unix/Host/Host.h
> +++ b/EmulatorPkg/Unix/Host/Host.h
> @@ -82,7 +82,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY
> KIND, EITHER EXPRESS OR IMPLIED.
> #undef NTOHS
> #undef HTONS
> #undef B0
> -#undef CR3
> +#undef CR3
>
> #include <PiPei.h>
> #include <Uefi.h>
> diff --git a/EmulatorPkg/Unix/Host/Ia32/Gasket.S
> b/EmulatorPkg/Unix/Host/Ia32/Gasket.S
> index aa90ea8095..5664cc54b4 100644
> --- a/EmulatorPkg/Unix/Host/Ia32/Gasket.S
> +++ b/EmulatorPkg/Unix/Host/Ia32/Gasket.S
> @@ -1,1492 +1,1492 @@
> -#------------------------------------------------------------------------------
> -#
> -# Manage differenced between UNIX ABI and EFI/Windows ABI
> -#
> -# For IA-32 the only difference is Mac OS X requires a 16-byte aligned stack.
> -# For Linux this stack adjustment is a no-op, but we may as well make the
> -# the code common.
> -#
> -# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> -# This program and the accompanying materials
> -# are licensed and made available under the terms and conditions of the BSD
> License
> -# which accompanies this distribution. The full text of the license may be
> found at
> -# http://opensource.org/licenses/bsd-license.php
> -#
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -#
> -#------------------------------------------------------------------------------
> -
> -
> -
> - .text
> -
> -//
> -// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
> -//
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
> -ASM_PFX(GasketSecWriteStdErr):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecWriteStdErr)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
> -ASM_PFX(GasketSecConfigStdIn):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecConfigStdIn)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
> -ASM_PFX(GasketSecWriteStdOut):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecWriteStdOut)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
> -ASM_PFX(GasketSecReadStdIn):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecReadStdIn)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
> -ASM_PFX(GasketSecPollStdIn):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecPollStdIn)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecMalloc)
> -ASM_PFX(GasketSecMalloc):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecMalloc)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecValloc)
> -ASM_PFX(GasketSecValloc):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecValloc)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecFree)
> -ASM_PFX(GasketSecFree):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecFree)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
> -ASM_PFX(GasketSecSetTimer):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 8(%ebp), %eax
> - movl 12(%ebp), %edx
> - movl %edx, 4(%esp)
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecSetTimer)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
> -ASM_PFX(GasketSecEnableInterrupt):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(SecEnableInterrupt)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
> -ASM_PFX(GasketSecDisableInterrupt):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(SecDisableInterrupt)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
> -ASM_PFX(GasketQueryPerformanceFrequency):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(QueryPerformanceFrequency)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
> -ASM_PFX(GasketQueryPerformanceCounter):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(QueryPerformanceCounter)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSleep)
> -ASM_PFX(GasketSecSleep):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl 12(%ebp), %ecx
> - movl %ecx, 4(%esp)
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecSleep)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
> -ASM_PFX(GasketSecCpuSleep):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(SecCpuSleep)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecExit)
> -ASM_PFX(GasketSecExit):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI
> world
> -LDEAD_LOOP:
> - jmp LDEAD_LOOP // _exit should never return
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecGetTime)
> -ASM_PFX(GasketSecGetTime):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecGetTime)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSetTime)
> -ASM_PFX(GasketSecSetTime):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecSetTime)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
> -ASM_PFX(GasketSecGetNextProtocol):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecGetNextProtocol)
> -
> - leave
> - ret
> -
> -// PPIs produced by SEC
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
> -ASM_PFX(GasketSecPeCoffGetEntryPoint):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecPeCoffGetEntryPoint)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
> -ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecPeCoffRelocateImageExtraAction)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
> -ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecPeCoffUnloadImageExtraAction)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
> -ASM_PFX(GasketSecEmuThunkAddress):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(SecEmuThunkAddress)
> -
> - leave
> - ret
> -
> -//
> -// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
> -//
> -
> -ASM_GLOBAL ASM_PFX(GasketX11Size)
> -ASM_PFX(GasketX11Size):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11Size)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
> -ASM_PFX(GasketX11CheckKey):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11CheckKey)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GetKey)
> -ASM_PFX(GasketX11GetKey):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11GetKey)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
> -ASM_PFX(GasketX11KeySetState):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11KeySetState)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
> -ASM_PFX(GasketX11RegisterKeyNotify):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11RegisterKeyNotify)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11Blt)
> -ASM_PFX(GasketX11Blt):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11Blt)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
> -ASM_PFX(GasketX11CheckPointer):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11CheckPointer)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
> -ASM_PFX(GasketX11GetPointerState):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11GetPointerState)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
> -ASM_PFX(GasketX11GraphicsWindowOpen):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11GraphicsWindowOpen)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
> -ASM_PFX(GasketX11GraphicsWindowClose):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11GraphicsWindowClose)
> -
> - leave
> - ret
> -
> -
> -// Pthreads
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
> -ASM_PFX(GasketPthreadMutexLock):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadMutexLock)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
> -ASM_PFX(GasketPthreadMutexUnLock):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadMutexUnLock)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
> -ASM_PFX(GasketPthreadMutexTryLock):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadMutexTryLock)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
> -ASM_PFX(GasketPthreadMutexInit):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(PthreadMutexInit)
> -
> - leave
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
> -ASM_PFX(GasketPthreadMutexDestroy):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadMutexDestroy)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
> -ASM_PFX(GasketPthreadCreate):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadCreate)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadExit)
> -ASM_PFX(GasketPthreadExit):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadExit)
> -
> - leave
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
> -ASM_PFX(GasketPthreadSelf):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(PthreadSelf)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
> -ASM_PFX(GasketPthreadOpen):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadOpen)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadClose)
> -ASM_PFX(GasketPthreadClose):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadClose)
> -
> - leave
> - ret
> -
> -
> -
> -
> -//
> -// UNIX ABI to EFI ABI call
> -//
> -// UINTN
> -// ReverseGasketUint64 (
> -// void *Api,
> -// UINTN Arg1
> -// );
> -ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
> -ASM_PFX(ReverseGasketUint64):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $8, %esp
> - movl 16(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, (%esp)
> - calll *8(%ebp)
> - addl $8, %esp
> - popl %ebp
> - ret
> -
> -
> -
> -//
> -// UNIX ABI to EFI ABI call
> -//
> -// UINTN
> -// ReverseGasketUint64Uint64 (
> -// void *Api,
> -// UINTN Arg1
> -// UINTN Arg2
> -// );
> -ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
> -ASM_PFX(ReverseGasketUint64Uint64):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp
> - movl 24(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 20(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, (%esp)
> - calll *8(%ebp)
> - addl $24, %esp
> - popl %ebp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
> -ASM_PFX(GasketSecUnixPeiAutoScan):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecUnixPeiAutoScan)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
> -ASM_PFX(GasketSecUnixFdAddress):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecUnixFdAddress)
> -
> - leave
> - ret
> -
> -
> -// EmuIoThunk SimpleFileSystem
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
> -ASM_PFX(GasketPosixOpenVolume):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixOpenVolume)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
> -ASM_PFX(GasketPosixFileOpen):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $56, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 28(%ebp), %eax
> - movl 32(%ebp), %ecx
> - movl %ecx, 24(%esp)
> - movl %eax, 20(%esp)
> - movl 20(%ebp), %eax
> - movl 24(%ebp), %ecx
> - movl %ecx, 16(%esp)
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileOpen)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
> -ASM_PFX(GasketPosixFileCLose):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileCLose)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
> -ASM_PFX(GasketPosixFileDelete):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileDelete)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
> -ASM_PFX(GasketPosixFileRead):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileRead)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
> -ASM_PFX(GasketPosixFileWrite):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileWrite)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
> -ASM_PFX(GasketPosixFileSetPossition):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl 16(%ebp), %ecx
> - movl %ecx, 8(%esp)
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileSetPossition)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
> -ASM_PFX(GasketPosixFileGetPossition):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileGetPossition)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
> -ASM_PFX(GasketPosixFileGetInfo):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileGetInfo)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
> -ASM_PFX(GasketPosixFileSetInfo):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileSetInfo)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
> -ASM_PFX(GasketPosixFileFlush):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileFlush)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
> -ASM_PFX(GasketPosixFileSystmeThunkOpen):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileSystmeThunkOpen)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
> -ASM_PFX(GasketPosixFileSystmeThunkClose):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileSystmeThunkClose)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
> -ASM_PFX(GasketEmuBlockIoReset):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuBlockIoReset)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
> -ASM_PFX(GasketEmuBlockIoReadBlocks):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $56, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 32(%ebp), %eax
> - movl %eax, 24(%esp)
> - movl 28(%ebp), %eax
> - movl %eax, 20(%esp)
> - movl 24(%ebp), %eax
> - movl %eax, 16(%esp)
> - movl 16(%ebp), %eax
> - movl 20(%ebp), %edx
> - movl %edx, 12(%esp)
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuBlockIoReadBlocks)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
> -ASM_PFX(GasketEmuBlockIoWriteBlocks):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $56, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 32(%ebp), %eax
> - movl %eax, 24(%esp)
> - movl 28(%ebp), %eax
> - movl %eax, 20(%esp)
> - movl 24(%ebp), %eax
> - movl %eax, 16(%esp)
> - movl 16(%ebp), %eax
> - movl 20(%ebp), %edx
> - movl %edx, 12(%esp)
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuBlockIoWriteBlocks)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
> -ASM_PFX(GasketEmuBlockIoFlushBlocks): pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> -
> - call ASM_PFX(EmuBlockIoFlushBlocks)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
> -ASM_PFX(GasketEmuBlockIoCreateMapping):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuBlockIoCreateMapping)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
> -ASM_PFX(GasketBlockIoThunkOpen):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuBlockIoThunkOpen)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
> -ASM_PFX(GasketBlockIoThunkClose):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuBlockIoThunkClose)
> -
> - leave
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
> -ASM_PFX(GasketSnpCreateMapping):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpCreateMapping)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStart)
> -ASM_PFX(GasketSnpStart):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpStart)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStop)
> -ASM_PFX(GasketSnpStop):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpStop)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
> -ASM_PFX(GasketSnpInitialize):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpInitialize)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReset)
> -ASM_PFX(GasketSnpReset):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpReset)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
> -ASM_PFX(GasketSnpShutdown):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpShutdown)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
> -ASM_PFX(GasketSnpReceiveFilters):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 28(%ebp), %eax
> - movl %eax, 20(%esp)
> - movl 24(%ebp), %eax
> - movl %eax, 16(%esp)
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpReceiveFilters)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
> -ASM_PFX(GasketSnpStationAddress):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - leave
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
> -ASM_PFX(GasketSnpStatistics):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpStatistics)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
> -ASM_PFX(GasketSnpMCastIpToMac):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpMCastIpToMac)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpNvData)
> -ASM_PFX(GasketSnpNvData):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 24(%ebp), %eax
> - movl %eax, 16(%esp)
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpNvData)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
> -ASM_PFX(GasketSnpGetStatus):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpGetStatus)
> -
> - leave
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
> -ASM_PFX(GasketSnpTransmit):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $56, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 32(%ebp), %eax
> - movl %eax, 24(%esp)
> - movl 28(%ebp), %eax
> - movl %eax, 20(%esp)
> - movl 24(%ebp), %eax
> - movl %eax, 16(%esp)
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpTransmit)
> -
> - leave
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReceive)
> -ASM_PFX(GasketSnpReceive):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $56, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 32(%ebp), %eax
> - movl %eax, 24(%esp)
> - movl 28(%ebp), %eax
> - movl %eax, 20(%esp)
> - movl 24(%ebp), %eax
> - movl %eax, 16(%esp)
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpReceive)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
> -ASM_PFX(GasketSnpThunkOpen):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpThunkOpen)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
> -ASM_PFX(GasketSnpThunkClose):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpThunkClose)
> -
> - leave
> - ret
> -
> -
> +#------------------------------------------------------------------------------
> +#
> +# Manage differenced between UNIX ABI and EFI/Windows ABI
> +#
> +# For IA-32 the only difference is Mac OS X requires a 16-byte aligned stack.
> +# For Linux this stack adjustment is a no-op, but we may as well make the
> +# the code common.
> +#
> +# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD
> License
> +# which accompanies this distribution. The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +#
> +#------------------------------------------------------------------------------
> +
> +
> +
> + .text
> +
> +//
> +// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
> +//
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
> +ASM_PFX(GasketSecWriteStdErr):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecWriteStdErr)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
> +ASM_PFX(GasketSecConfigStdIn):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecConfigStdIn)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
> +ASM_PFX(GasketSecWriteStdOut):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecWriteStdOut)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
> +ASM_PFX(GasketSecReadStdIn):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecReadStdIn)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
> +ASM_PFX(GasketSecPollStdIn):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecPollStdIn)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecMalloc)
> +ASM_PFX(GasketSecMalloc):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecMalloc)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecValloc)
> +ASM_PFX(GasketSecValloc):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecValloc)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecFree)
> +ASM_PFX(GasketSecFree):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecFree)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
> +ASM_PFX(GasketSecSetTimer):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 8(%ebp), %eax
> + movl 12(%ebp), %edx
> + movl %edx, 4(%esp)
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecSetTimer)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
> +ASM_PFX(GasketSecEnableInterrupt):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(SecEnableInterrupt)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
> +ASM_PFX(GasketSecDisableInterrupt):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(SecDisableInterrupt)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
> +ASM_PFX(GasketQueryPerformanceFrequency):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(QueryPerformanceFrequency)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
> +ASM_PFX(GasketQueryPerformanceCounter):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(QueryPerformanceCounter)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSleep)
> +ASM_PFX(GasketSecSleep):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl 12(%ebp), %ecx
> + movl %ecx, 4(%esp)
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecSleep)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
> +ASM_PFX(GasketSecCpuSleep):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(SecCpuSleep)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecExit)
> +ASM_PFX(GasketSecExit):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI
> world
> +LDEAD_LOOP:
> + jmp LDEAD_LOOP // _exit should never return
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecGetTime)
> +ASM_PFX(GasketSecGetTime):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecGetTime)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSetTime)
> +ASM_PFX(GasketSecSetTime):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecSetTime)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
> +ASM_PFX(GasketSecGetNextProtocol):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecGetNextProtocol)
> +
> + leave
> + ret
> +
> +// PPIs produced by SEC
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
> +ASM_PFX(GasketSecPeCoffGetEntryPoint):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecPeCoffGetEntryPoint)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
> +ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecPeCoffRelocateImageExtraAction)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
> +ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecPeCoffUnloadImageExtraAction)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
> +ASM_PFX(GasketSecEmuThunkAddress):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(SecEmuThunkAddress)
> +
> + leave
> + ret
> +
> +//
> +// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
> +//
> +
> +ASM_GLOBAL ASM_PFX(GasketX11Size)
> +ASM_PFX(GasketX11Size):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11Size)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
> +ASM_PFX(GasketX11CheckKey):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11CheckKey)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GetKey)
> +ASM_PFX(GasketX11GetKey):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11GetKey)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
> +ASM_PFX(GasketX11KeySetState):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11KeySetState)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
> +ASM_PFX(GasketX11RegisterKeyNotify):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11RegisterKeyNotify)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11Blt)
> +ASM_PFX(GasketX11Blt):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11Blt)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
> +ASM_PFX(GasketX11CheckPointer):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11CheckPointer)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
> +ASM_PFX(GasketX11GetPointerState):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11GetPointerState)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
> +ASM_PFX(GasketX11GraphicsWindowOpen):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11GraphicsWindowOpen)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
> +ASM_PFX(GasketX11GraphicsWindowClose):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11GraphicsWindowClose)
> +
> + leave
> + ret
> +
> +
> +// Pthreads
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
> +ASM_PFX(GasketPthreadMutexLock):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadMutexLock)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
> +ASM_PFX(GasketPthreadMutexUnLock):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadMutexUnLock)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
> +ASM_PFX(GasketPthreadMutexTryLock):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadMutexTryLock)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
> +ASM_PFX(GasketPthreadMutexInit):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(PthreadMutexInit)
> +
> + leave
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
> +ASM_PFX(GasketPthreadMutexDestroy):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadMutexDestroy)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
> +ASM_PFX(GasketPthreadCreate):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadCreate)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadExit)
> +ASM_PFX(GasketPthreadExit):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadExit)
> +
> + leave
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
> +ASM_PFX(GasketPthreadSelf):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(PthreadSelf)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
> +ASM_PFX(GasketPthreadOpen):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadOpen)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadClose)
> +ASM_PFX(GasketPthreadClose):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadClose)
> +
> + leave
> + ret
> +
> +
> +
> +
> +//
> +// UNIX ABI to EFI ABI call
> +//
> +// UINTN
> +// ReverseGasketUint64 (
> +// void *Api,
> +// UINTN Arg1
> +// );
> +ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
> +ASM_PFX(ReverseGasketUint64):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $8, %esp
> + movl 16(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, (%esp)
> + calll *8(%ebp)
> + addl $8, %esp
> + popl %ebp
> + ret
> +
> +
> +
> +//
> +// UNIX ABI to EFI ABI call
> +//
> +// UINTN
> +// ReverseGasketUint64Uint64 (
> +// void *Api,
> +// UINTN Arg1
> +// UINTN Arg2
> +// );
> +ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
> +ASM_PFX(ReverseGasketUint64Uint64):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp
> + movl 24(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 20(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, (%esp)
> + calll *8(%ebp)
> + addl $24, %esp
> + popl %ebp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
> +ASM_PFX(GasketSecUnixPeiAutoScan):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecUnixPeiAutoScan)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
> +ASM_PFX(GasketSecUnixFdAddress):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecUnixFdAddress)
> +
> + leave
> + ret
> +
> +
> +// EmuIoThunk SimpleFileSystem
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
> +ASM_PFX(GasketPosixOpenVolume):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixOpenVolume)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
> +ASM_PFX(GasketPosixFileOpen):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $56, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 28(%ebp), %eax
> + movl 32(%ebp), %ecx
> + movl %ecx, 24(%esp)
> + movl %eax, 20(%esp)
> + movl 20(%ebp), %eax
> + movl 24(%ebp), %ecx
> + movl %ecx, 16(%esp)
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileOpen)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
> +ASM_PFX(GasketPosixFileCLose):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileCLose)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
> +ASM_PFX(GasketPosixFileDelete):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileDelete)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
> +ASM_PFX(GasketPosixFileRead):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileRead)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
> +ASM_PFX(GasketPosixFileWrite):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileWrite)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
> +ASM_PFX(GasketPosixFileSetPossition):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl 16(%ebp), %ecx
> + movl %ecx, 8(%esp)
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileSetPossition)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
> +ASM_PFX(GasketPosixFileGetPossition):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileGetPossition)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
> +ASM_PFX(GasketPosixFileGetInfo):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileGetInfo)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
> +ASM_PFX(GasketPosixFileSetInfo):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileSetInfo)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
> +ASM_PFX(GasketPosixFileFlush):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileFlush)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
> +ASM_PFX(GasketPosixFileSystmeThunkOpen):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileSystmeThunkOpen)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
> +ASM_PFX(GasketPosixFileSystmeThunkClose):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileSystmeThunkClose)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
> +ASM_PFX(GasketEmuBlockIoReset):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuBlockIoReset)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
> +ASM_PFX(GasketEmuBlockIoReadBlocks):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $56, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 32(%ebp), %eax
> + movl %eax, 24(%esp)
> + movl 28(%ebp), %eax
> + movl %eax, 20(%esp)
> + movl 24(%ebp), %eax
> + movl %eax, 16(%esp)
> + movl 16(%ebp), %eax
> + movl 20(%ebp), %edx
> + movl %edx, 12(%esp)
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuBlockIoReadBlocks)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
> +ASM_PFX(GasketEmuBlockIoWriteBlocks):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $56, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 32(%ebp), %eax
> + movl %eax, 24(%esp)
> + movl 28(%ebp), %eax
> + movl %eax, 20(%esp)
> + movl 24(%ebp), %eax
> + movl %eax, 16(%esp)
> + movl 16(%ebp), %eax
> + movl 20(%ebp), %edx
> + movl %edx, 12(%esp)
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuBlockIoWriteBlocks)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
> +ASM_PFX(GasketEmuBlockIoFlushBlocks): pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> +
> + call ASM_PFX(EmuBlockIoFlushBlocks)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
> +ASM_PFX(GasketEmuBlockIoCreateMapping):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuBlockIoCreateMapping)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
> +ASM_PFX(GasketBlockIoThunkOpen):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuBlockIoThunkOpen)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
> +ASM_PFX(GasketBlockIoThunkClose):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuBlockIoThunkClose)
> +
> + leave
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
> +ASM_PFX(GasketSnpCreateMapping):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpCreateMapping)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStart)
> +ASM_PFX(GasketSnpStart):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpStart)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStop)
> +ASM_PFX(GasketSnpStop):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpStop)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
> +ASM_PFX(GasketSnpInitialize):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpInitialize)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReset)
> +ASM_PFX(GasketSnpReset):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpReset)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
> +ASM_PFX(GasketSnpShutdown):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpShutdown)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
> +ASM_PFX(GasketSnpReceiveFilters):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 28(%ebp), %eax
> + movl %eax, 20(%esp)
> + movl 24(%ebp), %eax
> + movl %eax, 16(%esp)
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpReceiveFilters)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
> +ASM_PFX(GasketSnpStationAddress):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + leave
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
> +ASM_PFX(GasketSnpStatistics):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpStatistics)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
> +ASM_PFX(GasketSnpMCastIpToMac):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpMCastIpToMac)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpNvData)
> +ASM_PFX(GasketSnpNvData):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 24(%ebp), %eax
> + movl %eax, 16(%esp)
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpNvData)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
> +ASM_PFX(GasketSnpGetStatus):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpGetStatus)
> +
> + leave
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
> +ASM_PFX(GasketSnpTransmit):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $56, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 32(%ebp), %eax
> + movl %eax, 24(%esp)
> + movl 28(%ebp), %eax
> + movl %eax, 20(%esp)
> + movl 24(%ebp), %eax
> + movl %eax, 16(%esp)
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpTransmit)
> +
> + leave
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReceive)
> +ASM_PFX(GasketSnpReceive):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $56, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 32(%ebp), %eax
> + movl %eax, 24(%esp)
> + movl 28(%ebp), %eax
> + movl %eax, 20(%esp)
> + movl 24(%ebp), %eax
> + movl %eax, 16(%esp)
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpReceive)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
> +ASM_PFX(GasketSnpThunkOpen):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpThunkOpen)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
> +ASM_PFX(GasketSnpThunkClose):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpThunkClose)
> +
> + leave
> + ret
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
> b/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
> index 118083f4b5..79baeaf1f2 100644
> --- a/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
> +++ b/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
> @@ -1,74 +1,74 @@
> -/*++
> -
> -Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -
> ---*/
> -
> -#include "Host.h"
> -
> -
> -/**
> - Transfers control to a function starting with a new stack.
> -
> - Transfers control to the function specified by EntryPoint using the new stack
> - specified by NewStack and passing in the parameters specified by Context1
> and
> - Context2. Context1 and Context2 are optional and may be NULL. The function
> - EntryPoint must never return.
> -
> - If EntryPoint is NULL, then ASSERT().
> - If NewStack is NULL, then ASSERT().
> -
> - @param EntryPoint A pointer to function to call with the new stack.
> - @param Context1 A pointer to the context to pass into the EntryPoint
> - function.
> - @param Context2 A pointer to the context to pass into the EntryPoint
> - function.
> - @param NewStack A pointer to the new stack to use for the EntryPoint
> - function.
> -
> -**/
> -VOID
> -EFIAPI
> -PeiSwitchStacks (
> - IN SWITCH_STACK_ENTRY_POINT EntryPoint,
> - IN VOID *Context1, OPTIONAL
> - IN VOID *Context2, OPTIONAL
> - IN VOID *NewStack
> - )
> -{
> - BASE_LIBRARY_JUMP_BUFFER JumpBuffer;
> -
> - ASSERT (EntryPoint != NULL);
> - ASSERT (NewStack != NULL);
> -
> - //
> - // Stack should be aligned with CPU_STACK_ALIGNMENT
> - //
> - ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
> -
> - JumpBuffer.Eip = (UINTN)EntryPoint;
> - JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
> - JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
> - ((VOID**)JumpBuffer.Esp)[1] = Context1;
> - ((VOID**)JumpBuffer.Esp)[2] = Context2;
> -
> - LongJump (&JumpBuffer, (UINTN)-1);
> -
> -
> - //
> - // PeiSwitchStacks () will never return
> - //
> - ASSERT (FALSE);
> -}
> -
> -
> -
> +/*++
> +
> +Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +
> +--*/
> +
> +#include "Host.h"
> +
> +
> +/**
> + Transfers control to a function starting with a new stack.
> +
> + Transfers control to the function specified by EntryPoint using the new stack
> + specified by NewStack and passing in the parameters specified by Context1
> and
> + Context2. Context1 and Context2 are optional and may be NULL. The
> function
> + EntryPoint must never return.
> +
> + If EntryPoint is NULL, then ASSERT().
> + If NewStack is NULL, then ASSERT().
> +
> + @param EntryPoint A pointer to function to call with the new stack.
> + @param Context1 A pointer to the context to pass into the EntryPoint
> + function.
> + @param Context2 A pointer to the context to pass into the EntryPoint
> + function.
> + @param NewStack A pointer to the new stack to use for the EntryPoint
> + function.
> +
> +**/
> +VOID
> +EFIAPI
> +PeiSwitchStacks (
> + IN SWITCH_STACK_ENTRY_POINT EntryPoint,
> + IN VOID *Context1, OPTIONAL
> + IN VOID *Context2, OPTIONAL
> + IN VOID *NewStack
> + )
> +{
> + BASE_LIBRARY_JUMP_BUFFER JumpBuffer;
> +
> + ASSERT (EntryPoint != NULL);
> + ASSERT (NewStack != NULL);
> +
> + //
> + // Stack should be aligned with CPU_STACK_ALIGNMENT
> + //
> + ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
> +
> + JumpBuffer.Eip = (UINTN)EntryPoint;
> + JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
> + JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
> + ((VOID**)JumpBuffer.Esp)[1] = Context1;
> + ((VOID**)JumpBuffer.Esp)[2] = Context2;
> +
> + LongJump (&JumpBuffer, (UINTN)-1);
> +
> +
> + //
> + // PeiSwitchStacks () will never return
> + //
> + ASSERT (FALSE);
> +}
> +
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
> b/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
> index 9db91b83d9..df39358e2a 100644
> --- a/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
> +++ b/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
> @@ -1,145 +1,145 @@
> -/*++ @file
> -
> - Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
> -
> - This program and the accompanying materials
> - are licensed and made available under the terms and conditions of the BSD
> License
> - which accompanies this distribution. The full text of the license may be found
> at
> - http://opensource.org/licenses/bsd-license.php
> -
> - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -
> -**/
> -
> -#include "Base.h"
> -#include "Library/BaseMemoryLib.h"
> -#include "Library/MemoryAllocationLib.h"
> -
> -#include <stdlib.h>
> -
> -/**
> - Allocates a buffer of type EfiBootServicesData.
> -
> - Allocates the number bytes specified by AllocationSize of type
> EfiBootServicesData and returns a
> - pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0
> size is
> - returned. If there is not enough memory remaining to satisfy the request,
> then NULL is returned.
> -
> - @param AllocationSize The number of bytes to allocate.
> -
> - @return A pointer to the allocated buffer or NULL if allocation fails.
> -
> -**/
> -VOID *
> -EFIAPI
> -AllocatePool (
> - IN UINTN AllocationSize
> - )
> -{
> - return (VOID*) malloc (AllocationSize);
> -}
> -
> -
> -/**
> - Allocates and zeros a buffer of type EfiBootServicesData.
> -
> - Allocates the number bytes specified by AllocationSize of type
> EfiBootServicesData, clears the
> - buffer with zeros, and returns a pointer to the allocated buffer. If
> AllocationSize is 0, then a
> - valid buffer of 0 size is returned. If there is not enough memory remaining to
> satisfy the
> - request, then NULL is returned.
> -
> - @param AllocationSize The number of bytes to allocate and zero.
> -
> - @return A pointer to the allocated buffer or NULL if allocation fails.
> -
> -**/
> -VOID *
> -EFIAPI
> -AllocateZeroPool (
> - IN UINTN AllocationSize
> - )
> -{
> - VOID *Buffer;
> -
> - Buffer = AllocatePool (AllocationSize);
> - if (Buffer == NULL) {
> - return NULL;
> - }
> -
> - ZeroMem (Buffer, AllocationSize);
> -
> - return Buffer;
> -}
> -
> -
> -/**
> - Reallocates a buffer of type EfiBootServicesData.
> -
> - Allocates and zeros the number bytes specified by NewSize from memory of
> type
> - EfiBootServicesData. If OldBuffer is not NULL, then the smaller of OldSize
> and
> - NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
> - OldBuffer is freed. A pointer to the newly allocated buffer is returned.
> - If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
> - enough memory remaining to satisfy the request, then NULL is returned.
> -
> - If the allocation of the new buffer is successful and the smaller of NewSize
> and OldSize
> - is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
> -
> - @param OldSize The size, in bytes, of OldBuffer.
> - @param NewSize The size, in bytes, of the buffer to reallocate.
> - @param OldBuffer The buffer to copy to the allocated buffer. This is an
> optional
> - parameter that may be NULL.
> -
> - @return A pointer to the allocated buffer or NULL if allocation fails.
> -
> -**/
> -VOID *
> -EFIAPI
> -ReallocatePool (
> - IN UINTN OldSize,
> - IN UINTN NewSize,
> - IN VOID *OldBuffer OPTIONAL
> - )
> -{
> - VOID *NewBuffer;
> -
> - NewBuffer = AllocatePool (NewSize);
> - if (NewBuffer == NULL) {
> - return NULL;
> - }
> -
> - if (OldBuffer != NULL) {
> - if (OldSize > 0) {
> - CopyMem (NewBuffer, OldBuffer, OldSize);
> - }
> -
> - FreePool (OldBuffer);
> - }
> -
> - return NewBuffer;
> -}
> -
> -
> -/**
> - Frees a buffer that was previously allocated with one of the pool allocation
> functions in the
> - Memory Allocation Library.
> -
> - Frees the buffer specified by Buffer. Buffer must have been allocated on a
> previous call to the
> - pool allocation services of the Memory Allocation Library. If it is not possible
> to free pool
> - resources, then this function will perform no actions.
> -
> - If Buffer was not allocated with a pool allocation function in the Memory
> Allocation Library,
> - then ASSERT().
> -
> - @param Buffer Pointer to the buffer to free.
> -
> -**/
> -VOID
> -EFIAPI
> -FreePool (
> - IN VOID *Buffer
> - )
> -{
> - free ((void *) Buffer);
> -}
> -
> +/*++ @file
> +
> + Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD
> License
> + which accompanies this distribution. The full text of the license may be
> found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include "Base.h"
> +#include "Library/BaseMemoryLib.h"
> +#include "Library/MemoryAllocationLib.h"
> +
> +#include <stdlib.h>
> +
> +/**
> + Allocates a buffer of type EfiBootServicesData.
> +
> + Allocates the number bytes specified by AllocationSize of type
> EfiBootServicesData and returns a
> + pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0
> size is
> + returned. If there is not enough memory remaining to satisfy the request,
> then NULL is returned.
> +
> + @param AllocationSize The number of bytes to allocate.
> +
> + @return A pointer to the allocated buffer or NULL if allocation fails.
> +
> +**/
> +VOID *
> +EFIAPI
> +AllocatePool (
> + IN UINTN AllocationSize
> + )
> +{
> + return (VOID*) malloc (AllocationSize);
> +}
> +
> +
> +/**
> + Allocates and zeros a buffer of type EfiBootServicesData.
> +
> + Allocates the number bytes specified by AllocationSize of type
> EfiBootServicesData, clears the
> + buffer with zeros, and returns a pointer to the allocated buffer. If
> AllocationSize is 0, then a
> + valid buffer of 0 size is returned. If there is not enough memory remaining
> to satisfy the
> + request, then NULL is returned.
> +
> + @param AllocationSize The number of bytes to allocate and zero.
> +
> + @return A pointer to the allocated buffer or NULL if allocation fails.
> +
> +**/
> +VOID *
> +EFIAPI
> +AllocateZeroPool (
> + IN UINTN AllocationSize
> + )
> +{
> + VOID *Buffer;
> +
> + Buffer = AllocatePool (AllocationSize);
> + if (Buffer == NULL) {
> + return NULL;
> + }
> +
> + ZeroMem (Buffer, AllocationSize);
> +
> + return Buffer;
> +}
> +
> +
> +/**
> + Reallocates a buffer of type EfiBootServicesData.
> +
> + Allocates and zeros the number bytes specified by NewSize from memory of
> type
> + EfiBootServicesData. If OldBuffer is not NULL, then the smaller of OldSize
> and
> + NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
> + OldBuffer is freed. A pointer to the newly allocated buffer is returned.
> + If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
> + enough memory remaining to satisfy the request, then NULL is returned.
> +
> + If the allocation of the new buffer is successful and the smaller of NewSize
> and OldSize
> + is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
> +
> + @param OldSize The size, in bytes, of OldBuffer.
> + @param NewSize The size, in bytes, of the buffer to reallocate.
> + @param OldBuffer The buffer to copy to the allocated buffer. This is an
> optional
> + parameter that may be NULL.
> +
> + @return A pointer to the allocated buffer or NULL if allocation fails.
> +
> +**/
> +VOID *
> +EFIAPI
> +ReallocatePool (
> + IN UINTN OldSize,
> + IN UINTN NewSize,
> + IN VOID *OldBuffer OPTIONAL
> + )
> +{
> + VOID *NewBuffer;
> +
> + NewBuffer = AllocatePool (NewSize);
> + if (NewBuffer == NULL) {
> + return NULL;
> + }
> +
> + if (OldBuffer != NULL) {
> + if (OldSize > 0) {
> + CopyMem (NewBuffer, OldBuffer, OldSize);
> + }
> +
> + FreePool (OldBuffer);
> + }
> +
> + return NewBuffer;
> +}
> +
> +
> +/**
> + Frees a buffer that was previously allocated with one of the pool allocation
> functions in the
> + Memory Allocation Library.
> +
> + Frees the buffer specified by Buffer. Buffer must have been allocated on a
> previous call to the
> + pool allocation services of the Memory Allocation Library. If it is not possible
> to free pool
> + resources, then this function will perform no actions.
> +
> + If Buffer was not allocated with a pool allocation function in the Memory
> Allocation Library,
> + then ASSERT().
> +
> + @param Buffer Pointer to the buffer to free.
> +
> +**/
> +VOID
> +EFIAPI
> +FreePool (
> + IN VOID *Buffer
> + )
> +{
> + free ((void *) Buffer);
> +}
> +
> diff --git a/EmulatorPkg/Unix/Host/PosixFileSystem.c
> b/EmulatorPkg/Unix/Host/PosixFileSystem.c
> index 98e8c894eb..529543d6eb 100644
> --- a/EmulatorPkg/Unix/Host/PosixFileSystem.c
> +++ b/EmulatorPkg/Unix/Host/PosixFileSystem.c
> @@ -1,1556 +1,1556 @@
> -/*++ @file
> - POSIX Pthreads to emulate APs and implement threads
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -
> -**/
> -
> -#include "Host.h"
> -
> -
> -#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E',
> 'P', 'f', 's')
> -
> -typedef struct {
> - UINTN Signature;
> - EMU_IO_THUNK_PROTOCOL *Thunk;
> - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;
> - CHAR8 *FilePath;
> - CHAR16 *VolumeLabel;
> - BOOLEAN FileHandlesOpen;
> -} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;
> -
> -#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \
> - CR (a, \
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE, \
> - SimpleFileSystem, \
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \
> - )
> -
> -
> -#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 'i')
> -
> -typedef struct {
> - UINTN Signature;
> - EMU_IO_THUNK_PROTOCOL *Thunk;
> - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
> - EFI_FILE_PROTOCOL EfiFile;
> - int fd;
> - DIR *Dir;
> - BOOLEAN IsRootDirectory;
> - BOOLEAN IsDirectoryPath;
> - BOOLEAN IsOpenedByRead;
> - char *FileName;
> - struct dirent *Dirent;
> -} EMU_EFI_FILE_PRIVATE;
> -
> -#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \
> - CR (a, \
> - EMU_EFI_FILE_PRIVATE, \
> - EfiFile, \
> - EMU_EFI_FILE_PRIVATE_SIGNATURE \
> - )
> -
> -EFI_STATUS
> -PosixFileGetInfo (
> - IN EFI_FILE_PROTOCOL *This,
> - IN EFI_GUID *InformationType,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - );
> -
> -EFI_STATUS
> -PosixFileSetInfo (
> - IN EFI_FILE_PROTOCOL *This,
> - IN EFI_GUID *InformationType,
> - IN UINTN BufferSize,
> - IN VOID *Buffer
> - );
> -
> -
> -EFI_FILE_PROTOCOL gPosixFileProtocol = {
> - EFI_FILE_REVISION,
> - GasketPosixFileOpen,
> - GasketPosixFileCLose,
> - GasketPosixFileDelete,
> - GasketPosixFileRead,
> - GasketPosixFileWrite,
> - GasketPosixFileGetPossition,
> - GasketPosixFileSetPossition,
> - GasketPosixFileGetInfo,
> - GasketPosixFileSetInfo,
> - GasketPosixFileFlush
> -};
> -
> -EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {
> - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
> - GasketPosixOpenVolume,
> -};
> -
> -
> -/**
> - Open the root directory on a volume.
> -
> - @param This Protocol instance pointer.
> - @param Root Returns an Open file handle for the root directory
> -
> - @retval EFI_SUCCESS The device was opened.
> - @retval EFI_UNSUPPORTED This volume does not support the file system.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_ACCESS_DENIED The service denied access to the file.
> - @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
> resources.
> -
> -**/
> -EFI_STATUS
> -PosixOpenVolume (
> - IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
> - OUT EFI_FILE_PROTOCOL **Root
> - )
> -{
> - EFI_STATUS Status;
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> -
> - Private = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);
> -
> - Status = EFI_OUT_OF_RESOURCES;
> - PrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
> - if (PrivateFile == NULL) {
> - goto Done;
> - }
> -
> - PrivateFile->FileName = malloc (AsciiStrSize (Private->FilePath));
> - if (PrivateFile->FileName == NULL) {
> - goto Done;
> - }
> - AsciiStrCpy (PrivateFile->FileName, Private->FilePath);
> -
> - PrivateFile->Signature = EMU_EFI_FILE_PRIVATE_SIGNATURE;
> - PrivateFile->Thunk = Private->Thunk;
> - PrivateFile->SimpleFileSystem = This;
> - PrivateFile->IsRootDirectory = TRUE;
> - PrivateFile->IsDirectoryPath = TRUE;
> - PrivateFile->IsOpenedByRead = TRUE;
> -
> - CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof
> (EFI_FILE_PROTOCOL));
> -
> - PrivateFile->fd = -1;
> - PrivateFile->Dir = NULL;
> - PrivateFile->Dirent = NULL;
> -
> - *Root = &PrivateFile->EfiFile;
> -
> - PrivateFile->Dir = opendir (PrivateFile->FileName);
> - if (PrivateFile->Dir == NULL) {
> - Status = EFI_ACCESS_DENIED;
> - } else {
> - Status = EFI_SUCCESS;
> - }
> -
> -Done:
> - if (EFI_ERROR (Status)) {
> - if (PrivateFile != NULL) {
> - if (PrivateFile->FileName != NULL) {
> - free (PrivateFile->FileName);
> - }
> -
> - free (PrivateFile);
> - }
> -
> - *Root = NULL;
> - }
> -
> - return Status;
> -}
> -
> -
> -EFI_STATUS
> -ErrnoToEfiStatus ()
> -{
> - switch (errno) {
> - case EACCES:
> - return EFI_ACCESS_DENIED;
> -
> - case EDQUOT:
> - case ENOSPC:
> - return EFI_VOLUME_FULL;
> -
> - default:
> - return EFI_DEVICE_ERROR;
> - }
> -}
> -
> -VOID
> -CutPrefix (
> - IN CHAR8 *Str,
> - IN UINTN Count
> - )
> -{
> - CHAR8 *Pointer;
> -
> - if (AsciiStrLen (Str) < Count) {
> - ASSERT (0);
> - }
> -
> - for (Pointer = Str; *(Pointer + Count); Pointer++) {
> - *Pointer = *(Pointer + Count);
> - }
> -
> - *Pointer = *(Pointer + Count);
> -}
> -
> -
> -VOID
> -PosixSystemTimeToEfiTime (
> - IN time_t SystemTime,
> - OUT EFI_TIME *Time
> - )
> -{
> - struct tm *tm;
> -
> - tm = gmtime (&SystemTime);
> - Time->Year = tm->tm_year;
> - Time->Month = tm->tm_mon + 1;
> - Time->Day = tm->tm_mday;
> - Time->Hour = tm->tm_hour;
> - Time->Minute = tm->tm_min;
> - Time->Second = tm->tm_sec;
> - Time->Nanosecond = 0;
> -
> - Time->TimeZone = timezone;
> - Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) | (tm-
> >tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
> -}
> -
> -
> -EFI_STATUS
> -UnixSimpleFileSystemFileInfo (
> - EMU_EFI_FILE_PRIVATE *PrivateFile,
> - IN CHAR8 *FileName,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - )
> -{
> - EFI_STATUS Status;
> - UINTN Size;
> - UINTN NameSize;
> - UINTN ResultSize;
> - EFI_FILE_INFO *Info;
> - CHAR8 *RealFileName;
> - CHAR8 *TempPointer;
> - CHAR16 *BufferFileName;
> - struct stat buf;
> -
> - if (FileName != NULL) {
> - RealFileName = FileName;
> - } else if (PrivateFile->IsRootDirectory) {
> - RealFileName = "";
> - } else {
> - RealFileName = PrivateFile->FileName;
> - }
> -
> - TempPointer = RealFileName;
> - while (*TempPointer) {
> - if (*TempPointer == '/') {
> - RealFileName = TempPointer + 1;
> - }
> -
> - TempPointer++;
> - }
> -
> - Size = SIZE_OF_EFI_FILE_INFO;
> - NameSize = AsciiStrSize (RealFileName) * 2;
> - ResultSize = Size + NameSize;
> -
> - if (*BufferSize < ResultSize) {
> - *BufferSize = ResultSize;
> - return EFI_BUFFER_TOO_SMALL;
> - }
> - if (stat (FileName == NULL ? PrivateFile->FileName : FileName, &buf) < 0) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - Status = EFI_SUCCESS;
> -
> - Info = Buffer;
> - ZeroMem (Info, ResultSize);
> -
> - Info->Size = ResultSize;
> - Info->FileSize = buf.st_size;
> - Info->PhysicalSize = MultU64x32 (buf.st_blocks, buf.st_blksize);
> -
> - PosixSystemTimeToEfiTime (buf.st_ctime, &Info->CreateTime);
> - PosixSystemTimeToEfiTime (buf.st_atime, &Info->LastAccessTime);
> - PosixSystemTimeToEfiTime (buf.st_mtime, &Info->ModificationTime);
> -
> - if (!(buf.st_mode & S_IWUSR)) {
> - Info->Attribute |= EFI_FILE_READ_ONLY;
> - }
> -
> - if (S_ISDIR(buf.st_mode)) {
> - Info->Attribute |= EFI_FILE_DIRECTORY;
> - }
> -
> -
> - BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);
> - while (*RealFileName) {
> - *BufferFileName++ = *RealFileName++;
> - }
> - *BufferFileName = 0;
> -
> - *BufferSize = ResultSize;
> - return Status;
> -}
> -
> -BOOLEAN
> -IsZero (
> - IN VOID *Buffer,
> - IN UINTN Length
> - )
> -{
> - if (Buffer == NULL || Length == 0) {
> - return FALSE;
> - }
> -
> - if (*(UINT8 *) Buffer != 0) {
> - return FALSE;
> - }
> -
> - if (Length > 1) {
> - if (!CompareMem (Buffer, (UINT8 *) Buffer + 1, Length - 1)) {
> - return FALSE;
> - }
> - }
> -
> - return TRUE;
> -}
> -
> -
> -
> -/**
> - Opens a new file relative to the source file's location.
> -
> - @param This The protocol instance pointer.
> - @param NewHandle Returns File Handle for FileName.
> - @param FileName Null terminated string. "\", ".", and ".." are supported.
> - @param OpenMode Open mode for file.
> - @param Attributes Only used for EFI_FILE_MODE_CREATE.
> -
> - @retval EFI_SUCCESS The device was opened.
> - @retval EFI_NOT_FOUND The specified file could not be found on the
> device.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_MEDIA_CHANGED The media has changed.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_ACCESS_DENIED The service denied access to the file.
> - @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
> resources.
> - @retval EFI_VOLUME_FULL The volume is full.
> -
> -**/
> -EFI_STATUS
> -PosixFileOpen (
> - IN EFI_FILE_PROTOCOL *This,
> - OUT EFI_FILE_PROTOCOL **NewHandle,
> - IN CHAR16 *FileName,
> - IN UINT64 OpenMode,
> - IN UINT64 Attributes
> - )
> -{
> - EFI_FILE_PROTOCOL *Root;
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> - EMU_EFI_FILE_PRIVATE *NewPrivateFile;
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
> - EFI_STATUS Status;
> - CHAR16 *Src;
> - char *Dst;
> - CHAR8 *RealFileName;
> - char *ParseFileName;
> - char *GuardPointer;
> - CHAR8 TempChar;
> - UINTN Count;
> - BOOLEAN TrailingDash;
> - BOOLEAN LoopFinish;
> - UINTN InfoSize;
> - EFI_FILE_INFO *Info;
> - struct stat finfo;
> - int res;
> -
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> - PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> - NewPrivateFile = NULL;
> - Status = EFI_OUT_OF_RESOURCES;
> -
> - //
> - // BUGBUG: assume an open of root
> - // if current location, return current data
> - //
> - TrailingDash = FALSE;
> - if ((StrCmp (FileName, L"\\") == 0) ||
> - (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {
> -OpenRoot:
> - Status = PosixOpenVolume (PrivateFile->SimpleFileSystem, &Root);
> - NewPrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);
> - goto Done;
> - }
> -
> - if (FileName[StrLen (FileName) - 1] == L'\\') {
> - TrailingDash = TRUE;
> - FileName[StrLen (FileName) - 1] = 0;
> - }
> -
> - //
> - // Attempt to open the file
> - //
> - NewPrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
> - if (NewPrivateFile == NULL) {
> - goto Done;
> - }
> -
> - CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE));
> -
> - NewPrivateFile->FileName = malloc (AsciiStrSize (PrivateFile->FileName) + 1
> + StrLen (FileName) + 1);
> - if (NewPrivateFile->FileName == NULL) {
> - goto Done;
> - }
> -
> - if (*FileName == L'\\') {
> - AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);
> - // Skip first '\'.
> - Src = FileName + 1;
> - } else {
> - AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);
> - Src = FileName;
> - }
> - Dst = NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileName);
> - GuardPointer = NewPrivateFile->FileName + AsciiStrLen (PrivateRoot-
> >FilePath);
> - *Dst++ = '/';
> - // Convert unicode to ascii and '\' to '/'
> - while (*Src) {
> - if (*Src == '\\') {
> - *Dst++ = '/';
> - } else {
> - *Dst++ = *Src;
> - }
> - Src++;
> - }
> - *Dst = 0;
> -
> -
> - //
> - // Get rid of . and .., except leading . or ..
> - //
> -
> - //
> - // GuardPointer protect simplefilesystem root path not be destroyed
> - //
> -
> - LoopFinish = FALSE;
> - while (!LoopFinish) {
> - LoopFinish = TRUE;
> -
> - for (ParseFileName = GuardPointer; *ParseFileName; ParseFileName++) {
> - if (*ParseFileName == '.' &&
> - (*(ParseFileName + 1) == 0 || *(ParseFileName + 1) == '/') &&
> - *(ParseFileName - 1) == '/'
> - ) {
> -
> - //
> - // cut /.
> - //
> - CutPrefix (ParseFileName - 1, 2);
> - LoopFinish = FALSE;
> - break;
> - }
> -
> - if (*ParseFileName == '.' &&
> - *(ParseFileName + 1) == '.' &&
> - (*(ParseFileName + 2) == 0 || *(ParseFileName + 2) == '/') &&
> - *(ParseFileName - 1) == '/'
> - ) {
> -
> - ParseFileName--;
> - Count = 3;
> -
> - while (ParseFileName != GuardPointer) {
> - ParseFileName--;
> - Count++;
> - if (*ParseFileName == '/') {
> - break;
> - }
> - }
> -
> - //
> - // cut /.. and its left directory
> - //
> - CutPrefix (ParseFileName, Count);
> - LoopFinish = FALSE;
> - break;
> - }
> - }
> - }
> -
> - if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {
> - NewPrivateFile->IsRootDirectory = TRUE;
> - free (NewPrivateFile->FileName);
> - free (NewPrivateFile);
> - goto OpenRoot;
> - }
> -
> - RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile-
> >FileName) - 1;
> - while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/') {
> - RealFileName--;
> - }
> -
> - TempChar = *(RealFileName - 1);
> - *(RealFileName - 1) = 0;
> - *(RealFileName - 1) = TempChar;
> -
> -
> - //
> - // Test whether file or directory
> - //
> - NewPrivateFile->IsRootDirectory = FALSE;
> - NewPrivateFile->fd = -1;
> - NewPrivateFile->Dir = NULL;
> - if (OpenMode & EFI_FILE_MODE_CREATE) {
> - if (Attributes & EFI_FILE_DIRECTORY) {
> - NewPrivateFile->IsDirectoryPath = TRUE;
> - } else {
> - NewPrivateFile->IsDirectoryPath = FALSE;
> - }
> - } else {
> - res = stat (NewPrivateFile->FileName, &finfo);
> - if (res == 0 && S_ISDIR(finfo.st_mode)) {
> - NewPrivateFile->IsDirectoryPath = TRUE;
> - } else {
> - NewPrivateFile->IsDirectoryPath = FALSE;
> - }
> - }
> -
> - if (OpenMode & EFI_FILE_MODE_WRITE) {
> - NewPrivateFile->IsOpenedByRead = FALSE;
> - } else {
> - NewPrivateFile->IsOpenedByRead = TRUE;
> - }
> -
> - Status = EFI_SUCCESS;
> -
> - //
> - // deal with directory
> - //
> - if (NewPrivateFile->IsDirectoryPath) {
> - if ((OpenMode & EFI_FILE_MODE_CREATE)) {
> - //
> - // Create a directory
> - //
> - if (mkdir (NewPrivateFile->FileName, 0777) != 0) {
> - if (errno != EEXIST) {
> - //free (TempFileName);
> - Status = EFI_ACCESS_DENIED;
> - goto Done;
> - }
> - }
> - }
> -
> - NewPrivateFile->Dir = opendir (NewPrivateFile->FileName);
> - if (NewPrivateFile->Dir == NULL) {
> - if (errno == EACCES) {
> - Status = EFI_ACCESS_DENIED;
> - } else {
> - Status = EFI_NOT_FOUND;
> - }
> -
> - goto Done;
> - }
> -
> - } else {
> - //
> - // deal with file
> - //
> - NewPrivateFile->fd = open (
> - NewPrivateFile->FileName,
> - ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0) |
> (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),
> - 0666
> - );
> - if (NewPrivateFile->fd < 0) {
> - if (errno == ENOENT) {
> - Status = EFI_NOT_FOUND;
> - } else {
> - Status = EFI_ACCESS_DENIED;
> - }
> - }
> - }
> -
> - if ((OpenMode & EFI_FILE_MODE_CREATE) && Status == EFI_SUCCESS) {
> - //
> - // Set the attribute
> - //
> - InfoSize = 0;
> - Info = NULL;
> - Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid,
> &InfoSize, Info);
> - if (Status != EFI_BUFFER_TOO_SMALL) {
> - Status = EFI_DEVICE_ERROR;
> - goto Done;
> - }
> -
> - Info = malloc (InfoSize);
> - if (Info == NULL) {
> - goto Done;
> - }
> -
> - Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid,
> &InfoSize, Info);
> - if (EFI_ERROR (Status)) {
> - goto Done;
> - }
> -
> - Info->Attribute = Attributes;
> - PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);
> -
> - free (Info);
> - }
> -
> -Done: ;
> - if (TrailingDash) {
> - FileName[StrLen (FileName) + 1] = 0;
> - FileName[StrLen (FileName)] = L'\\';
> - }
> -
> - if (EFI_ERROR (Status)) {
> - if (NewPrivateFile) {
> - if (NewPrivateFile->FileName) {
> - free (NewPrivateFile->FileName);
> - }
> -
> - free (NewPrivateFile);
> - }
> - } else {
> - *NewHandle = &NewPrivateFile->EfiFile;
> - }
> -
> - return Status;
> -}
> -
> -
> -
> -/**
> - Close the file handle
> -
> - @param This Protocol instance pointer.
> -
> - @retval EFI_SUCCESS The device was opened.
> -
> -**/
> -EFI_STATUS
> -PosixFileCLose (
> - IN EFI_FILE_PROTOCOL *This
> - )
> -{
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (PrivateFile->fd >= 0) {
> - close (PrivateFile->fd);
> - }
> - if (PrivateFile->Dir != NULL) {
> - closedir (PrivateFile->Dir);
> - }
> -
> - PrivateFile->fd = -1;
> - PrivateFile->Dir = NULL;
> -
> - if (PrivateFile->FileName) {
> - free (PrivateFile->FileName);
> - }
> -
> - free (PrivateFile);
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Close and delete the file handle.
> -
> - @param This Protocol instance pointer.
> -
> - @retval EFI_SUCCESS The device was opened.
> - @retval EFI_WARN_DELETE_FAILURE The handle was closed but the file was
> not deleted.
> -
> -**/
> -EFI_STATUS
> -PosixFileDelete (
> - IN EFI_FILE_PROTOCOL *This
> - )
> -{
> - EFI_STATUS Status;
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> - Status = EFI_WARN_DELETE_FAILURE;
> -
> - if (PrivateFile->IsDirectoryPath) {
> - if (PrivateFile->Dir != NULL) {
> - closedir (PrivateFile->Dir);
> - PrivateFile->Dir = NULL;
> - }
> -
> - if (rmdir (PrivateFile->FileName) == 0) {
> - Status = EFI_SUCCESS;
> - }
> - } else {
> - close (PrivateFile->fd);
> - PrivateFile->fd = -1;
> -
> - if (!PrivateFile->IsOpenedByRead) {
> - if (!unlink (PrivateFile->FileName)) {
> - Status = EFI_SUCCESS;
> - }
> - }
> - }
> -
> - free (PrivateFile->FileName);
> - free (PrivateFile);
> -
> - return Status;
> -}
> -
> -
> -/**
> - Read data from the file.
> -
> - @param This Protocol instance pointer.
> - @param BufferSize On input size of buffer, on output amount of data in
> buffer.
> - @param Buffer The buffer in which data is read.
> -
> - @retval EFI_SUCCESS Data was read.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_BUFFER_TO_SMALL BufferSize is too small. BufferSize contains
> required size.
> -
> -**/
> -EFI_STATUS
> -PosixFileRead (
> - IN EFI_FILE_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - )
> -{
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> - EFI_STATUS Status;
> - int Res;
> - UINTN Size;
> - UINTN NameSize;
> - UINTN ResultSize;
> - CHAR8 *FullFileName;
> -
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (!PrivateFile->IsDirectoryPath) {
> - if (PrivateFile->fd < 0) {
> - Status = EFI_DEVICE_ERROR;
> - goto Done;
> - }
> -
> - Res = read (PrivateFile->fd, Buffer, *BufferSize);
> - if (Res < 0) {
> - Status = EFI_DEVICE_ERROR;
> - goto Done;
> - }
> - *BufferSize = Res;
> - Status = EFI_SUCCESS;
> - goto Done;
> - }
> -
> - //
> - // Read on a directory.
> - //
> - if (PrivateFile->Dir == NULL) {
> - Status = EFI_DEVICE_ERROR;
> - goto Done;
> - }
> -
> - if (PrivateFile->Dirent == NULL) {
> - PrivateFile->Dirent = readdir (PrivateFile->Dir);
> - if (PrivateFile->Dirent == NULL) {
> - *BufferSize = 0;
> - Status = EFI_SUCCESS;
> - goto Done;
> - }
> - }
> -
> - Size = SIZE_OF_EFI_FILE_INFO;
> - NameSize = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;
> - ResultSize = Size + 2 * NameSize;
> -
> - if (*BufferSize < ResultSize) {
> - *BufferSize = ResultSize;
> - Status = EFI_BUFFER_TOO_SMALL;
> - goto Done;
> - }
> - Status = EFI_SUCCESS;
> -
> - *BufferSize = ResultSize;
> -
> - FullFileName = malloc (AsciiStrLen(PrivateFile->FileName) + 1 + NameSize);
> - if (FullFileName == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto Done;
> - }
> -
> - AsciiStrCpy (FullFileName, PrivateFile->FileName);
> - AsciiStrCat (FullFileName, "/");
> - AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name);
> - Status = UnixSimpleFileSystemFileInfo (
> - PrivateFile,
> - FullFileName,
> - BufferSize,
> - Buffer
> - );
> - free (FullFileName);
> -
> - PrivateFile->Dirent = NULL;
> -
> -Done:
> - return Status;
> -}
> -
> -
> -
> -/**
> - Write data to a file.
> -
> - @param This Protocol instance pointer.
> - @param BufferSize On input size of buffer, on output amount of data in
> buffer.
> - @param Buffer The buffer in which data to write.
> -
> - @retval EFI_SUCCESS Data was written.
> - @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_DEVICE_ERROR An attempt was made to write to a deleted
> file.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_WRITE_PROTECTED The device is write protected.
> - @retval EFI_ACCESS_DENIED The file was open for read only.
> - @retval EFI_VOLUME_FULL The volume is full.
> -
> -**/
> -EFI_STATUS
> -PosixFileWrite (
> - IN EFI_FILE_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - IN VOID *Buffer
> - )
> -{
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> - int Res;
> -
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (PrivateFile->fd < 0) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - if (PrivateFile->IsDirectoryPath) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - if (PrivateFile->IsOpenedByRead) {
> - return EFI_ACCESS_DENIED;
> - }
> -
> - Res = write (PrivateFile->fd, Buffer, *BufferSize);
> - if (Res == (UINTN)-1) {
> - return ErrnoToEfiStatus ();
> - }
> -
> - *BufferSize = Res;
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -/**
> - Set a files current position
> -
> - @param This Protocol instance pointer.
> - @param Position Byte position from the start of the file.
> -
> - @retval EFI_SUCCESS Data was written.
> - @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
> -
> -**/
> -EFI_STATUS
> -PosixFileSetPossition (
> - IN EFI_FILE_PROTOCOL *This,
> - IN UINT64 Position
> - )
> -{
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> - off_t Pos;
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (PrivateFile->IsDirectoryPath) {
> - if (Position != 0) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - if (PrivateFile->Dir == NULL) {
> - return EFI_DEVICE_ERROR;
> - }
> - rewinddir (PrivateFile->Dir);
> - return EFI_SUCCESS;
> - } else {
> - if (Position == (UINT64) -1) {
> - Pos = lseek (PrivateFile->fd, 0, SEEK_END);
> - } else {
> - Pos = lseek (PrivateFile->fd, Position, SEEK_SET);
> - }
> - if (Pos == (off_t)-1) {
> - return ErrnoToEfiStatus ();
> - }
> - return EFI_SUCCESS;
> - }
> -}
> -
> -
> -
> -/**
> - Get a file's current position
> -
> - @param This Protocol instance pointer.
> - @param Position Byte position from the start of the file.
> -
> - @retval EFI_SUCCESS Data was written.
> - @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..
> -
> -**/
> -EFI_STATUS
> -PosixFileGetPossition (
> - IN EFI_FILE_PROTOCOL *This,
> - OUT UINT64 *Position
> - )
> -{
> - EFI_STATUS Status;
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (PrivateFile->IsDirectoryPath) {
> - Status = EFI_UNSUPPORTED;
> - } else {
> - *Position = (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR);
> - Status = (*Position == (UINT64) -1) ? ErrnoToEfiStatus () : EFI_SUCCESS;
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - Get information about a file.
> -
> - @param This Protocol instance pointer.
> - @param InformationType Type of information to return in Buffer.
> - @param BufferSize On input size of buffer, on output amount of data in
> buffer.
> - @param Buffer The buffer to return data.
> -
> - @retval EFI_SUCCESS Data was returned.
> - @retval EFI_UNSUPPORTED InformationType is not supported.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_WRITE_PROTECTED The device is write protected.
> - @retval EFI_ACCESS_DENIED The file was open for read only.
> - @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size
> returned in BufferSize.
> -
> -**/
> -EFI_STATUS
> -PosixFileGetInfo (
> - IN EFI_FILE_PROTOCOL *This,
> - IN EFI_GUID *InformationType,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - )
> -{
> - EFI_STATUS Status;
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> - EFI_FILE_SYSTEM_INFO *FileSystemInfoBuffer;
> - int UnixStatus;
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
> - struct statfs buf;
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> - PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> -
> - Status = EFI_SUCCESS;
> - if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {
> - Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);
> - } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
> - if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel)) {
> - *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel);
> - return EFI_BUFFER_TOO_SMALL;
> - }
> -
> - UnixStatus = statfs (PrivateFile->FileName, &buf);
> - if (UnixStatus < 0) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - FileSystemInfoBuffer = (EFI_FILE_SYSTEM_INFO *) Buffer;
> - FileSystemInfoBuffer->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize
> (PrivateRoot->VolumeLabel);
> - FileSystemInfoBuffer->ReadOnly = FALSE;
> -
> - //
> - // Succeeded
> - //
> - FileSystemInfoBuffer->VolumeSize = MultU64x32 (buf.f_blocks, buf.f_bsize);
> - FileSystemInfoBuffer->FreeSpace = MultU64x32 (buf.f_bavail, buf.f_bsize);
> - FileSystemInfoBuffer->BlockSize = buf.f_bsize;
> -
> -
> - StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot-
> >VolumeLabel);
> - *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel);
> -
> - } else if (CompareGuid (InformationType,
> &gEfiFileSystemVolumeLabelInfoIdGuid)) {
> - if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
> - *BufferSize = StrSize (PrivateRoot->VolumeLabel);
> - return EFI_BUFFER_TOO_SMALL;
> - }
> -
> - StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);
> - *BufferSize = StrSize (PrivateRoot->VolumeLabel);
> -
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - Set information about a file
> -
> - @param File Protocol instance pointer.
> - @param InformationType Type of information in Buffer.
> - @param BufferSize Size of buffer.
> - @param Buffer The data to write.
> -
> - @retval EFI_SUCCESS Data was returned.
> - @retval EFI_UNSUPPORTED InformationType is not supported.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_WRITE_PROTECTED The device is write protected.
> - @retval EFI_ACCESS_DENIED The file was open for read only.
> -
> -**/
> -EFI_STATUS
> -PosixFileSetInfo (
> - IN EFI_FILE_PROTOCOL *This,
> - IN EFI_GUID *InformationType,
> - IN UINTN BufferSize,
> - IN VOID *Buffer
> - )
> -{
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> - EFI_FILE_INFO *OldFileInfo;
> - EFI_FILE_INFO *NewFileInfo;
> - EFI_STATUS Status;
> - UINTN OldInfoSize;
> - mode_t NewAttr;
> - struct stat OldAttr;
> - CHAR8 *OldFileName;
> - CHAR8 *NewFileName;
> - CHAR8 *CharPointer;
> - BOOLEAN AttrChangeFlag;
> - BOOLEAN NameChangeFlag;
> - BOOLEAN SizeChangeFlag;
> - BOOLEAN TimeChangeFlag;
> - struct tm NewLastAccessSystemTime;
> - struct tm NewLastWriteSystemTime;
> - EFI_FILE_SYSTEM_INFO *NewFileSystemInfo;
> - CHAR8 *AsciiFilePtr;
> - CHAR16 *UnicodeFilePtr;
> - int UnixStatus;
> - struct utimbuf Utime;
> -
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> - PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> - errno = 0;
> - Status = EFI_UNSUPPORTED;
> - OldFileInfo = NewFileInfo = NULL;
> - OldFileName = NewFileName = NULL;
> - AttrChangeFlag = NameChangeFlag = SizeChangeFlag = TimeChangeFlag =
> FALSE;
> -
> - //
> - // Set file system information.
> - //
> - if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
> - if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel))) {
> - Status = EFI_BAD_BUFFER_SIZE;
> - goto Done;
> - }
> -
> - NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;
> -
> - free (PrivateRoot->VolumeLabel);
> -
> - PrivateRoot->VolumeLabel = malloc (StrSize (NewFileSystemInfo-
> >VolumeLabel));
> - if (PrivateRoot->VolumeLabel == NULL) {
> - goto Done;
> - }
> -
> - StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);
> -
> - Status = EFI_SUCCESS;
> - goto Done;
> - }
> -
> - //
> - // Set volume label information.
> - //
> - if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid))
> {
> - if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
> - Status = EFI_BAD_BUFFER_SIZE;
> - goto Done;
> - }
> -
> - StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);
> -
> - Status = EFI_SUCCESS;
> - goto Done;
> - }
> -
> - if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {
> - Status = EFI_UNSUPPORTED;
> - goto Done;
> - }
> -
> - if (BufferSize < SIZE_OF_EFI_FILE_INFO) {
> - Status = EFI_BAD_BUFFER_SIZE;
> - goto Done;
> - }
> -
> - //
> - // Set file/directory information.
> - //
> -
> - //
> - // Check for invalid set file information parameters.
> - //
> - NewFileInfo = (EFI_FILE_INFO *) Buffer;
> - if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||
> - (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||
> - (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)
> - ) {
> - Status = EFI_INVALID_PARAMETER;
> - goto Done;
> - }
> -
> - //
> - // Get current file information so we can determine what kind
> - // of change request this is.
> - //
> - OldInfoSize = 0;
> - Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, NULL);
> - if (Status != EFI_BUFFER_TOO_SMALL) {
> - Status = EFI_DEVICE_ERROR;
> - goto Done;
> - }
> -
> - OldFileInfo = malloc (OldInfoSize);
> - if (OldFileInfo == NULL) {
> - goto Done;
> - }
> -
> - Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize,
> OldFileInfo);
> - if (EFI_ERROR (Status)) {
> - goto Done;
> - }
> -
> - OldFileName = malloc (AsciiStrSize (PrivateFile->FileName));
> - if (OldFileInfo == NULL) {
> - goto Done;
> - }
> -
> - AsciiStrCpy (OldFileName, PrivateFile->FileName);
> -
> - //
> - // Make full pathname from new filename and rootpath.
> - //
> - if (NewFileInfo->FileName[0] == '\\') {
> - NewFileName = malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + StrLen
> (NewFileInfo->FileName) + 1);
> - if (NewFileName == NULL) {
> - goto Done;
> - }
> -
> - AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
> - AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
> - UnicodeFilePtr = NewFileInfo->FileName + 1;
> - *AsciiFilePtr++ ='/';
> - } else {
> - NewFileName = malloc (AsciiStrLen (PrivateFile->FileName) + 2 + StrLen
> (NewFileInfo->FileName) + 1);
> - if (NewFileName == NULL) {
> - goto Done;
> - }
> -
> - AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
> - AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
> - if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {
> - // make sure there is a / between Root FilePath and NewFileInfo Filename
> - AsciiFilePtr[0] = '/';
> - AsciiFilePtr[1] = '\0';
> - AsciiFilePtr++;
> - }
> - UnicodeFilePtr = NewFileInfo->FileName;
> - }
> - // Convert to ascii.
> - while (*UnicodeFilePtr) {
> - *AsciiFilePtr++ = *UnicodeFilePtr++;
> - }
> - *AsciiFilePtr = 0;
> -
> - //
> - // Is there an attribute change request?
> - //
> - if (NewFileInfo->Attribute != OldFileInfo->Attribute) {
> - if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) != (OldFileInfo-
> >Attribute & EFI_FILE_DIRECTORY)) {
> - Status = EFI_INVALID_PARAMETER;
> - goto Done;
> - }
> -
> - AttrChangeFlag = TRUE;
> - }
> -
> - //
> - // Is there a name change request?
> - // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL
> - //
> - if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) {
> - NameChangeFlag = TRUE;
> - }
> -
> - //
> - // Is there a size change request?
> - //
> - if (NewFileInfo->FileSize != OldFileInfo->FileSize) {
> - SizeChangeFlag = TRUE;
> - }
> -
> - //
> - // Is there a time stamp change request?
> - //
> - if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) &&
> - CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime,
> sizeof (EFI_TIME))
> - ) {
> - TimeChangeFlag = TRUE;
> - } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &&
> - CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo-
> >LastAccessTime, sizeof (EFI_TIME))
> - ) {
> - TimeChangeFlag = TRUE;
> - } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME)) &&
> - CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo-
> >ModificationTime, sizeof (EFI_TIME))
> - ) {
> - TimeChangeFlag = TRUE;
> - }
> -
> - //
> - // All done if there are no change requests being made.
> - //
> - if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag ||
> TimeChangeFlag)) {
> - Status = EFI_SUCCESS;
> - goto Done;
> - }
> -
> - //
> - // Set file or directory information.
> - //
> - if (stat (OldFileName, &OldAttr) != 0) {
> - Status = ErrnoToEfiStatus ();
> - goto Done;
> - }
> -
> - //
> - // Name change.
> - //
> - if (NameChangeFlag) {
> - //
> - // Close the handles first
> - //
> - if (PrivateFile->IsOpenedByRead) {
> - Status = EFI_ACCESS_DENIED;
> - goto Done;
> - }
> -
> - for (CharPointer = NewFileName; *CharPointer != 0 && *CharPointer != L'/';
> CharPointer++) {
> - }
> -
> - if (*CharPointer != 0) {
> - Status = EFI_ACCESS_DENIED;
> - goto Done;
> - }
> -
> - UnixStatus = rename (OldFileName, NewFileName);
> - if (UnixStatus == 0) {
> - //
> - // modify file name
> - //
> - free (PrivateFile->FileName);
> -
> - PrivateFile->FileName = malloc (AsciiStrSize (NewFileName));
> - if (PrivateFile->FileName == NULL) {
> - goto Done;
> - }
> -
> - AsciiStrCpy (PrivateFile->FileName, NewFileName);
> - } else {
> - Status = EFI_DEVICE_ERROR;
> - goto Done;
> - }
> - }
> -
> - //
> - // Size change
> - //
> - if (SizeChangeFlag) {
> - if (PrivateFile->IsDirectoryPath) {
> - Status = EFI_UNSUPPORTED;
> - goto Done;
> - }
> -
> - if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute &
> EFI_FILE_READ_ONLY) {
> - Status = EFI_ACCESS_DENIED;
> - goto Done;
> - }
> -
> - if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) != 0) {
> - Status = ErrnoToEfiStatus ();
> - goto Done;
> - }
> -
> - }
> -
> - //
> - // Time change
> - //
> - if (TimeChangeFlag) {
> - NewLastAccessSystemTime.tm_year = NewFileInfo->LastAccessTime.Year;
> - NewLastAccessSystemTime.tm_mon = NewFileInfo-
> >LastAccessTime.Month;
> - NewLastAccessSystemTime.tm_mday = NewFileInfo->LastAccessTime.Day;
> - NewLastAccessSystemTime.tm_hour = NewFileInfo->LastAccessTime.Hour;
> - NewLastAccessSystemTime.tm_min = NewFileInfo-
> >LastAccessTime.Minute;
> - NewLastAccessSystemTime.tm_sec = NewFileInfo-
> >LastAccessTime.Second;
> - NewLastAccessSystemTime.tm_isdst = 0;
> -
> - Utime.actime = mktime (&NewLastAccessSystemTime);
> -
> - NewLastWriteSystemTime.tm_year = NewFileInfo->ModificationTime.Year;
> - NewLastWriteSystemTime.tm_mon = NewFileInfo-
> >ModificationTime.Month;
> - NewLastWriteSystemTime.tm_mday = NewFileInfo-
> >ModificationTime.Day;
> - NewLastWriteSystemTime.tm_hour = NewFileInfo-
> >ModificationTime.Hour;
> - NewLastWriteSystemTime.tm_min = NewFileInfo-
> >ModificationTime.Minute;
> - NewLastWriteSystemTime.tm_sec = NewFileInfo-
> >ModificationTime.Second;
> - NewLastWriteSystemTime.tm_isdst = 0;
> -
> - Utime.modtime = mktime (&NewLastWriteSystemTime);
> -
> - if (Utime.actime == (time_t)-1 || Utime.modtime == (time_t)-1) {
> - goto Done;
> - }
> -
> - if (utime (PrivateFile->FileName, &Utime) == -1) {
> - Status = ErrnoToEfiStatus ();
> - goto Done;
> - }
> - }
> -
> - //
> - // No matter about AttrChangeFlag, Attribute must be set.
> - // Because operation before may cause attribute change.
> - //
> - NewAttr = OldAttr.st_mode;
> -
> - if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {
> - NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);
> - } else {
> - NewAttr |= S_IRUSR;
> - }
> -
> - if (chmod (NewFileName, NewAttr) != 0) {
> - Status = ErrnoToEfiStatus ();
> - }
> -
> -Done:
> - if (OldFileInfo != NULL) {
> - free (OldFileInfo);
> - }
> -
> - if (OldFileName != NULL) {
> - free (OldFileName);
> - }
> -
> - if (NewFileName != NULL) {
> - free (NewFileName);
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - Flush data back for the file handle.
> -
> - @param This Protocol instance pointer.
> -
> - @retval EFI_SUCCESS Data was written.
> - @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_WRITE_PROTECTED The device is write protected.
> - @retval EFI_ACCESS_DENIED The file was open for read only.
> - @retval EFI_VOLUME_FULL The volume is full.
> -
> -**/
> -EFI_STATUS
> -PosixFileFlush (
> - IN EFI_FILE_PROTOCOL *This
> - )
> -{
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> -
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (PrivateFile->IsDirectoryPath) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - if (PrivateFile->IsOpenedByRead) {
> - return EFI_ACCESS_DENIED;
> - }
> -
> - if (PrivateFile->fd < 0) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - if (fsync (PrivateFile->fd) != 0) {
> - return ErrnoToEfiStatus ();
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -EFI_STATUS
> -PosixFileSystmeThunkOpen (
> - IN EMU_IO_THUNK_PROTOCOL *This
> - )
> -{
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
> - UINTN i;
> -
> - if (This->Private != NULL) {
> - return EFI_ALREADY_STARTED;
> - }
> -
> - if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Private = malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));
> - if (Private == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Private->FilePath = malloc (StrLen (This->ConfigString) + 1);
> - if (Private->FilePath == NULL) {
> - free (Private);
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - // Convert Unicode to Ascii
> - for (i = 0; This->ConfigString[i] != 0; i++) {
> - Private->FilePath[i] = This->ConfigString[i];
> - }
> - Private->FilePath[i] = 0;
> -
> -
> - Private->VolumeLabel = malloc (StrSize (L"EFI_EMULATED"));
> - if (Private->VolumeLabel == NULL) {
> - free (Private->FilePath);
> - free (Private);
> - return EFI_OUT_OF_RESOURCES;
> - }
> - StrCpy (Private->VolumeLabel, L"EFI_EMULATED");
> -
> - Private->Signature = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;
> - Private->Thunk = This;
> - CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof
> (Private->SimpleFileSystem));
> - Private->FileHandlesOpen = FALSE;
> -
> - This->Interface = &Private->SimpleFileSystem;
> - This->Private = Private;
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -PosixFileSystmeThunkClose (
> - IN EMU_IO_THUNK_PROTOCOL *This
> - )
> -{
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
> -
> - if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Private = This->Private;
> -
> - if (Private->FileHandlesOpen) {
> - //
> - // Close only supported if all the EFI_FILE_HANDLEs have been closed.
> - //
> - return EFI_NOT_READY;
> - }
> -
> - if (This->Private != NULL) {
> - if (Private->VolumeLabel != NULL) {
> - free (Private->VolumeLabel);
> - }
> - free (This->Private);
> - This->Private = NULL;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
> - &gEfiSimpleFileSystemProtocolGuid,
> - NULL,
> - NULL,
> - 0,
> - GasketPosixFileSystmeThunkOpen,
> - GasketPosixFileSystmeThunkClose,
> - NULL
> -};
> -
> -
> +/*++ @file
> + POSIX Pthreads to emulate APs and implement threads
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +
> +**/
> +
> +#include "Host.h"
> +
> +
> +#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E',
> 'P', 'f', 's')
> +
> +typedef struct {
> + UINTN Signature;
> + EMU_IO_THUNK_PROTOCOL *Thunk;
> + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;
> + CHAR8 *FilePath;
> + CHAR16 *VolumeLabel;
> + BOOLEAN FileHandlesOpen;
> +} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;
> +
> +#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \
> + CR (a, \
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE, \
> + SimpleFileSystem, \
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \
> + )
> +
> +
> +#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 'i')
> +
> +typedef struct {
> + UINTN Signature;
> + EMU_IO_THUNK_PROTOCOL *Thunk;
> + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
> + EFI_FILE_PROTOCOL EfiFile;
> + int fd;
> + DIR *Dir;
> + BOOLEAN IsRootDirectory;
> + BOOLEAN IsDirectoryPath;
> + BOOLEAN IsOpenedByRead;
> + char *FileName;
> + struct dirent *Dirent;
> +} EMU_EFI_FILE_PRIVATE;
> +
> +#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \
> + CR (a, \
> + EMU_EFI_FILE_PRIVATE, \
> + EfiFile, \
> + EMU_EFI_FILE_PRIVATE_SIGNATURE \
> + )
> +
> +EFI_STATUS
> +PosixFileGetInfo (
> + IN EFI_FILE_PROTOCOL *This,
> + IN EFI_GUID *InformationType,
> + IN OUT UINTN *BufferSize,
> + OUT VOID *Buffer
> + );
> +
> +EFI_STATUS
> +PosixFileSetInfo (
> + IN EFI_FILE_PROTOCOL *This,
> + IN EFI_GUID *InformationType,
> + IN UINTN BufferSize,
> + IN VOID *Buffer
> + );
> +
> +
> +EFI_FILE_PROTOCOL gPosixFileProtocol = {
> + EFI_FILE_REVISION,
> + GasketPosixFileOpen,
> + GasketPosixFileCLose,
> + GasketPosixFileDelete,
> + GasketPosixFileRead,
> + GasketPosixFileWrite,
> + GasketPosixFileGetPossition,
> + GasketPosixFileSetPossition,
> + GasketPosixFileGetInfo,
> + GasketPosixFileSetInfo,
> + GasketPosixFileFlush
> +};
> +
> +EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {
> + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
> + GasketPosixOpenVolume,
> +};
> +
> +
> +/**
> + Open the root directory on a volume.
> +
> + @param This Protocol instance pointer.
> + @param Root Returns an Open file handle for the root directory
> +
> + @retval EFI_SUCCESS The device was opened.
> + @retval EFI_UNSUPPORTED This volume does not support the file system.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_ACCESS_DENIED The service denied access to the file.
> + @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
> resources.
> +
> +**/
> +EFI_STATUS
> +PosixOpenVolume (
> + IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
> + OUT EFI_FILE_PROTOCOL **Root
> + )
> +{
> + EFI_STATUS Status;
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> +
> + Private = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);
> +
> + Status = EFI_OUT_OF_RESOURCES;
> + PrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
> + if (PrivateFile == NULL) {
> + goto Done;
> + }
> +
> + PrivateFile->FileName = malloc (AsciiStrSize (Private->FilePath));
> + if (PrivateFile->FileName == NULL) {
> + goto Done;
> + }
> + AsciiStrCpy (PrivateFile->FileName, Private->FilePath);
> +
> + PrivateFile->Signature = EMU_EFI_FILE_PRIVATE_SIGNATURE;
> + PrivateFile->Thunk = Private->Thunk;
> + PrivateFile->SimpleFileSystem = This;
> + PrivateFile->IsRootDirectory = TRUE;
> + PrivateFile->IsDirectoryPath = TRUE;
> + PrivateFile->IsOpenedByRead = TRUE;
> +
> + CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof
> (EFI_FILE_PROTOCOL));
> +
> + PrivateFile->fd = -1;
> + PrivateFile->Dir = NULL;
> + PrivateFile->Dirent = NULL;
> +
> + *Root = &PrivateFile->EfiFile;
> +
> + PrivateFile->Dir = opendir (PrivateFile->FileName);
> + if (PrivateFile->Dir == NULL) {
> + Status = EFI_ACCESS_DENIED;
> + } else {
> + Status = EFI_SUCCESS;
> + }
> +
> +Done:
> + if (EFI_ERROR (Status)) {
> + if (PrivateFile != NULL) {
> + if (PrivateFile->FileName != NULL) {
> + free (PrivateFile->FileName);
> + }
> +
> + free (PrivateFile);
> + }
> +
> + *Root = NULL;
> + }
> +
> + return Status;
> +}
> +
> +
> +EFI_STATUS
> +ErrnoToEfiStatus ()
> +{
> + switch (errno) {
> + case EACCES:
> + return EFI_ACCESS_DENIED;
> +
> + case EDQUOT:
> + case ENOSPC:
> + return EFI_VOLUME_FULL;
> +
> + default:
> + return EFI_DEVICE_ERROR;
> + }
> +}
> +
> +VOID
> +CutPrefix (
> + IN CHAR8 *Str,
> + IN UINTN Count
> + )
> +{
> + CHAR8 *Pointer;
> +
> + if (AsciiStrLen (Str) < Count) {
> + ASSERT (0);
> + }
> +
> + for (Pointer = Str; *(Pointer + Count); Pointer++) {
> + *Pointer = *(Pointer + Count);
> + }
> +
> + *Pointer = *(Pointer + Count);
> +}
> +
> +
> +VOID
> +PosixSystemTimeToEfiTime (
> + IN time_t SystemTime,
> + OUT EFI_TIME *Time
> + )
> +{
> + struct tm *tm;
> +
> + tm = gmtime (&SystemTime);
> + Time->Year = tm->tm_year;
> + Time->Month = tm->tm_mon + 1;
> + Time->Day = tm->tm_mday;
> + Time->Hour = tm->tm_hour;
> + Time->Minute = tm->tm_min;
> + Time->Second = tm->tm_sec;
> + Time->Nanosecond = 0;
> +
> + Time->TimeZone = timezone;
> + Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) | (tm-
> >tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
> +}
> +
> +
> +EFI_STATUS
> +UnixSimpleFileSystemFileInfo (
> + EMU_EFI_FILE_PRIVATE *PrivateFile,
> + IN CHAR8 *FileName,
> + IN OUT UINTN *BufferSize,
> + OUT VOID *Buffer
> + )
> +{
> + EFI_STATUS Status;
> + UINTN Size;
> + UINTN NameSize;
> + UINTN ResultSize;
> + EFI_FILE_INFO *Info;
> + CHAR8 *RealFileName;
> + CHAR8 *TempPointer;
> + CHAR16 *BufferFileName;
> + struct stat buf;
> +
> + if (FileName != NULL) {
> + RealFileName = FileName;
> + } else if (PrivateFile->IsRootDirectory) {
> + RealFileName = "";
> + } else {
> + RealFileName = PrivateFile->FileName;
> + }
> +
> + TempPointer = RealFileName;
> + while (*TempPointer) {
> + if (*TempPointer == '/') {
> + RealFileName = TempPointer + 1;
> + }
> +
> + TempPointer++;
> + }
> +
> + Size = SIZE_OF_EFI_FILE_INFO;
> + NameSize = AsciiStrSize (RealFileName) * 2;
> + ResultSize = Size + NameSize;
> +
> + if (*BufferSize < ResultSize) {
> + *BufferSize = ResultSize;
> + return EFI_BUFFER_TOO_SMALL;
> + }
> + if (stat (FileName == NULL ? PrivateFile->FileName : FileName, &buf) < 0) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + Status = EFI_SUCCESS;
> +
> + Info = Buffer;
> + ZeroMem (Info, ResultSize);
> +
> + Info->Size = ResultSize;
> + Info->FileSize = buf.st_size;
> + Info->PhysicalSize = MultU64x32 (buf.st_blocks, buf.st_blksize);
> +
> + PosixSystemTimeToEfiTime (buf.st_ctime, &Info->CreateTime);
> + PosixSystemTimeToEfiTime (buf.st_atime, &Info->LastAccessTime);
> + PosixSystemTimeToEfiTime (buf.st_mtime, &Info->ModificationTime);
> +
> + if (!(buf.st_mode & S_IWUSR)) {
> + Info->Attribute |= EFI_FILE_READ_ONLY;
> + }
> +
> + if (S_ISDIR(buf.st_mode)) {
> + Info->Attribute |= EFI_FILE_DIRECTORY;
> + }
> +
> +
> + BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);
> + while (*RealFileName) {
> + *BufferFileName++ = *RealFileName++;
> + }
> + *BufferFileName = 0;
> +
> + *BufferSize = ResultSize;
> + return Status;
> +}
> +
> +BOOLEAN
> +IsZero (
> + IN VOID *Buffer,
> + IN UINTN Length
> + )
> +{
> + if (Buffer == NULL || Length == 0) {
> + return FALSE;
> + }
> +
> + if (*(UINT8 *) Buffer != 0) {
> + return FALSE;
> + }
> +
> + if (Length > 1) {
> + if (!CompareMem (Buffer, (UINT8 *) Buffer + 1, Length - 1)) {
> + return FALSE;
> + }
> + }
> +
> + return TRUE;
> +}
> +
> +
> +
> +/**
> + Opens a new file relative to the source file's location.
> +
> + @param This The protocol instance pointer.
> + @param NewHandle Returns File Handle for FileName.
> + @param FileName Null terminated string. "\", ".", and ".." are supported.
> + @param OpenMode Open mode for file.
> + @param Attributes Only used for EFI_FILE_MODE_CREATE.
> +
> + @retval EFI_SUCCESS The device was opened.
> + @retval EFI_NOT_FOUND The specified file could not be found on the
> device.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_MEDIA_CHANGED The media has changed.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_ACCESS_DENIED The service denied access to the file.
> + @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
> resources.
> + @retval EFI_VOLUME_FULL The volume is full.
> +
> +**/
> +EFI_STATUS
> +PosixFileOpen (
> + IN EFI_FILE_PROTOCOL *This,
> + OUT EFI_FILE_PROTOCOL **NewHandle,
> + IN CHAR16 *FileName,
> + IN UINT64 OpenMode,
> + IN UINT64 Attributes
> + )
> +{
> + EFI_FILE_PROTOCOL *Root;
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> + EMU_EFI_FILE_PRIVATE *NewPrivateFile;
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
> + EFI_STATUS Status;
> + CHAR16 *Src;
> + char *Dst;
> + CHAR8 *RealFileName;
> + char *ParseFileName;
> + char *GuardPointer;
> + CHAR8 TempChar;
> + UINTN Count;
> + BOOLEAN TrailingDash;
> + BOOLEAN LoopFinish;
> + UINTN InfoSize;
> + EFI_FILE_INFO *Info;
> + struct stat finfo;
> + int res;
> +
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> + PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> + NewPrivateFile = NULL;
> + Status = EFI_OUT_OF_RESOURCES;
> +
> + //
> + // BUGBUG: assume an open of root
> + // if current location, return current data
> + //
> + TrailingDash = FALSE;
> + if ((StrCmp (FileName, L"\\") == 0) ||
> + (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {
> +OpenRoot:
> + Status = PosixOpenVolume (PrivateFile->SimpleFileSystem, &Root);
> + NewPrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);
> + goto Done;
> + }
> +
> + if (FileName[StrLen (FileName) - 1] == L'\\') {
> + TrailingDash = TRUE;
> + FileName[StrLen (FileName) - 1] = 0;
> + }
> +
> + //
> + // Attempt to open the file
> + //
> + NewPrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
> + if (NewPrivateFile == NULL) {
> + goto Done;
> + }
> +
> + CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE));
> +
> + NewPrivateFile->FileName = malloc (AsciiStrSize (PrivateFile->FileName) + 1
> + StrLen (FileName) + 1);
> + if (NewPrivateFile->FileName == NULL) {
> + goto Done;
> + }
> +
> + if (*FileName == L'\\') {
> + AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);
> + // Skip first '\'.
> + Src = FileName + 1;
> + } else {
> + AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);
> + Src = FileName;
> + }
> + Dst = NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileName);
> + GuardPointer = NewPrivateFile->FileName + AsciiStrLen (PrivateRoot-
> >FilePath);
> + *Dst++ = '/';
> + // Convert unicode to ascii and '\' to '/'
> + while (*Src) {
> + if (*Src == '\\') {
> + *Dst++ = '/';
> + } else {
> + *Dst++ = *Src;
> + }
> + Src++;
> + }
> + *Dst = 0;
> +
> +
> + //
> + // Get rid of . and .., except leading . or ..
> + //
> +
> + //
> + // GuardPointer protect simplefilesystem root path not be destroyed
> + //
> +
> + LoopFinish = FALSE;
> + while (!LoopFinish) {
> + LoopFinish = TRUE;
> +
> + for (ParseFileName = GuardPointer; *ParseFileName; ParseFileName++) {
> + if (*ParseFileName == '.' &&
> + (*(ParseFileName + 1) == 0 || *(ParseFileName + 1) == '/') &&
> + *(ParseFileName - 1) == '/'
> + ) {
> +
> + //
> + // cut /.
> + //
> + CutPrefix (ParseFileName - 1, 2);
> + LoopFinish = FALSE;
> + break;
> + }
> +
> + if (*ParseFileName == '.' &&
> + *(ParseFileName + 1) == '.' &&
> + (*(ParseFileName + 2) == 0 || *(ParseFileName + 2) == '/') &&
> + *(ParseFileName - 1) == '/'
> + ) {
> +
> + ParseFileName--;
> + Count = 3;
> +
> + while (ParseFileName != GuardPointer) {
> + ParseFileName--;
> + Count++;
> + if (*ParseFileName == '/') {
> + break;
> + }
> + }
> +
> + //
> + // cut /.. and its left directory
> + //
> + CutPrefix (ParseFileName, Count);
> + LoopFinish = FALSE;
> + break;
> + }
> + }
> + }
> +
> + if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {
> + NewPrivateFile->IsRootDirectory = TRUE;
> + free (NewPrivateFile->FileName);
> + free (NewPrivateFile);
> + goto OpenRoot;
> + }
> +
> + RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile-
> >FileName) - 1;
> + while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/') {
> + RealFileName--;
> + }
> +
> + TempChar = *(RealFileName - 1);
> + *(RealFileName - 1) = 0;
> + *(RealFileName - 1) = TempChar;
> +
> +
> + //
> + // Test whether file or directory
> + //
> + NewPrivateFile->IsRootDirectory = FALSE;
> + NewPrivateFile->fd = -1;
> + NewPrivateFile->Dir = NULL;
> + if (OpenMode & EFI_FILE_MODE_CREATE) {
> + if (Attributes & EFI_FILE_DIRECTORY) {
> + NewPrivateFile->IsDirectoryPath = TRUE;
> + } else {
> + NewPrivateFile->IsDirectoryPath = FALSE;
> + }
> + } else {
> + res = stat (NewPrivateFile->FileName, &finfo);
> + if (res == 0 && S_ISDIR(finfo.st_mode)) {
> + NewPrivateFile->IsDirectoryPath = TRUE;
> + } else {
> + NewPrivateFile->IsDirectoryPath = FALSE;
> + }
> + }
> +
> + if (OpenMode & EFI_FILE_MODE_WRITE) {
> + NewPrivateFile->IsOpenedByRead = FALSE;
> + } else {
> + NewPrivateFile->IsOpenedByRead = TRUE;
> + }
> +
> + Status = EFI_SUCCESS;
> +
> + //
> + // deal with directory
> + //
> + if (NewPrivateFile->IsDirectoryPath) {
> + if ((OpenMode & EFI_FILE_MODE_CREATE)) {
> + //
> + // Create a directory
> + //
> + if (mkdir (NewPrivateFile->FileName, 0777) != 0) {
> + if (errno != EEXIST) {
> + //free (TempFileName);
> + Status = EFI_ACCESS_DENIED;
> + goto Done;
> + }
> + }
> + }
> +
> + NewPrivateFile->Dir = opendir (NewPrivateFile->FileName);
> + if (NewPrivateFile->Dir == NULL) {
> + if (errno == EACCES) {
> + Status = EFI_ACCESS_DENIED;
> + } else {
> + Status = EFI_NOT_FOUND;
> + }
> +
> + goto Done;
> + }
> +
> + } else {
> + //
> + // deal with file
> + //
> + NewPrivateFile->fd = open (
> + NewPrivateFile->FileName,
> + ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0) |
> (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),
> + 0666
> + );
> + if (NewPrivateFile->fd < 0) {
> + if (errno == ENOENT) {
> + Status = EFI_NOT_FOUND;
> + } else {
> + Status = EFI_ACCESS_DENIED;
> + }
> + }
> + }
> +
> + if ((OpenMode & EFI_FILE_MODE_CREATE) && Status == EFI_SUCCESS) {
> + //
> + // Set the attribute
> + //
> + InfoSize = 0;
> + Info = NULL;
> + Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid,
> &InfoSize, Info);
> + if (Status != EFI_BUFFER_TOO_SMALL) {
> + Status = EFI_DEVICE_ERROR;
> + goto Done;
> + }
> +
> + Info = malloc (InfoSize);
> + if (Info == NULL) {
> + goto Done;
> + }
> +
> + Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid,
> &InfoSize, Info);
> + if (EFI_ERROR (Status)) {
> + goto Done;
> + }
> +
> + Info->Attribute = Attributes;
> + PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);
> +
> + free (Info);
> + }
> +
> +Done: ;
> + if (TrailingDash) {
> + FileName[StrLen (FileName) + 1] = 0;
> + FileName[StrLen (FileName)] = L'\\';
> + }
> +
> + if (EFI_ERROR (Status)) {
> + if (NewPrivateFile) {
> + if (NewPrivateFile->FileName) {
> + free (NewPrivateFile->FileName);
> + }
> +
> + free (NewPrivateFile);
> + }
> + } else {
> + *NewHandle = &NewPrivateFile->EfiFile;
> + }
> +
> + return Status;
> +}
> +
> +
> +
> +/**
> + Close the file handle
> +
> + @param This Protocol instance pointer.
> +
> + @retval EFI_SUCCESS The device was opened.
> +
> +**/
> +EFI_STATUS
> +PosixFileCLose (
> + IN EFI_FILE_PROTOCOL *This
> + )
> +{
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (PrivateFile->fd >= 0) {
> + close (PrivateFile->fd);
> + }
> + if (PrivateFile->Dir != NULL) {
> + closedir (PrivateFile->Dir);
> + }
> +
> + PrivateFile->fd = -1;
> + PrivateFile->Dir = NULL;
> +
> + if (PrivateFile->FileName) {
> + free (PrivateFile->FileName);
> + }
> +
> + free (PrivateFile);
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +/**
> + Close and delete the file handle.
> +
> + @param This Protocol instance pointer.
> +
> + @retval EFI_SUCCESS The device was opened.
> + @retval EFI_WARN_DELETE_FAILURE The handle was closed but the file was
> not deleted.
> +
> +**/
> +EFI_STATUS
> +PosixFileDelete (
> + IN EFI_FILE_PROTOCOL *This
> + )
> +{
> + EFI_STATUS Status;
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> + Status = EFI_WARN_DELETE_FAILURE;
> +
> + if (PrivateFile->IsDirectoryPath) {
> + if (PrivateFile->Dir != NULL) {
> + closedir (PrivateFile->Dir);
> + PrivateFile->Dir = NULL;
> + }
> +
> + if (rmdir (PrivateFile->FileName) == 0) {
> + Status = EFI_SUCCESS;
> + }
> + } else {
> + close (PrivateFile->fd);
> + PrivateFile->fd = -1;
> +
> + if (!PrivateFile->IsOpenedByRead) {
> + if (!unlink (PrivateFile->FileName)) {
> + Status = EFI_SUCCESS;
> + }
> + }
> + }
> +
> + free (PrivateFile->FileName);
> + free (PrivateFile);
> +
> + return Status;
> +}
> +
> +
> +/**
> + Read data from the file.
> +
> + @param This Protocol instance pointer.
> + @param BufferSize On input size of buffer, on output amount of data in
> buffer.
> + @param Buffer The buffer in which data is read.
> +
> + @retval EFI_SUCCESS Data was read.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_BUFFER_TO_SMALL BufferSize is too small. BufferSize contains
> required size.
> +
> +**/
> +EFI_STATUS
> +PosixFileRead (
> + IN EFI_FILE_PROTOCOL *This,
> + IN OUT UINTN *BufferSize,
> + OUT VOID *Buffer
> + )
> +{
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> + EFI_STATUS Status;
> + int Res;
> + UINTN Size;
> + UINTN NameSize;
> + UINTN ResultSize;
> + CHAR8 *FullFileName;
> +
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (!PrivateFile->IsDirectoryPath) {
> + if (PrivateFile->fd < 0) {
> + Status = EFI_DEVICE_ERROR;
> + goto Done;
> + }
> +
> + Res = read (PrivateFile->fd, Buffer, *BufferSize);
> + if (Res < 0) {
> + Status = EFI_DEVICE_ERROR;
> + goto Done;
> + }
> + *BufferSize = Res;
> + Status = EFI_SUCCESS;
> + goto Done;
> + }
> +
> + //
> + // Read on a directory.
> + //
> + if (PrivateFile->Dir == NULL) {
> + Status = EFI_DEVICE_ERROR;
> + goto Done;
> + }
> +
> + if (PrivateFile->Dirent == NULL) {
> + PrivateFile->Dirent = readdir (PrivateFile->Dir);
> + if (PrivateFile->Dirent == NULL) {
> + *BufferSize = 0;
> + Status = EFI_SUCCESS;
> + goto Done;
> + }
> + }
> +
> + Size = SIZE_OF_EFI_FILE_INFO;
> + NameSize = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;
> + ResultSize = Size + 2 * NameSize;
> +
> + if (*BufferSize < ResultSize) {
> + *BufferSize = ResultSize;
> + Status = EFI_BUFFER_TOO_SMALL;
> + goto Done;
> + }
> + Status = EFI_SUCCESS;
> +
> + *BufferSize = ResultSize;
> +
> + FullFileName = malloc (AsciiStrLen(PrivateFile->FileName) + 1 + NameSize);
> + if (FullFileName == NULL) {
> + Status = EFI_OUT_OF_RESOURCES;
> + goto Done;
> + }
> +
> + AsciiStrCpy (FullFileName, PrivateFile->FileName);
> + AsciiStrCat (FullFileName, "/");
> + AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name);
> + Status = UnixSimpleFileSystemFileInfo (
> + PrivateFile,
> + FullFileName,
> + BufferSize,
> + Buffer
> + );
> + free (FullFileName);
> +
> + PrivateFile->Dirent = NULL;
> +
> +Done:
> + return Status;
> +}
> +
> +
> +
> +/**
> + Write data to a file.
> +
> + @param This Protocol instance pointer.
> + @param BufferSize On input size of buffer, on output amount of data in
> buffer.
> + @param Buffer The buffer in which data to write.
> +
> + @retval EFI_SUCCESS Data was written.
> + @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_DEVICE_ERROR An attempt was made to write to a deleted
> file.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_WRITE_PROTECTED The device is write protected.
> + @retval EFI_ACCESS_DENIED The file was open for read only.
> + @retval EFI_VOLUME_FULL The volume is full.
> +
> +**/
> +EFI_STATUS
> +PosixFileWrite (
> + IN EFI_FILE_PROTOCOL *This,
> + IN OUT UINTN *BufferSize,
> + IN VOID *Buffer
> + )
> +{
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> + int Res;
> +
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (PrivateFile->fd < 0) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + if (PrivateFile->IsDirectoryPath) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + if (PrivateFile->IsOpenedByRead) {
> + return EFI_ACCESS_DENIED;
> + }
> +
> + Res = write (PrivateFile->fd, Buffer, *BufferSize);
> + if (Res == (UINTN)-1) {
> + return ErrnoToEfiStatus ();
> + }
> +
> + *BufferSize = Res;
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +/**
> + Set a files current position
> +
> + @param This Protocol instance pointer.
> + @param Position Byte position from the start of the file.
> +
> + @retval EFI_SUCCESS Data was written.
> + @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
> +
> +**/
> +EFI_STATUS
> +PosixFileSetPossition (
> + IN EFI_FILE_PROTOCOL *This,
> + IN UINT64 Position
> + )
> +{
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> + off_t Pos;
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (PrivateFile->IsDirectoryPath) {
> + if (Position != 0) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + if (PrivateFile->Dir == NULL) {
> + return EFI_DEVICE_ERROR;
> + }
> + rewinddir (PrivateFile->Dir);
> + return EFI_SUCCESS;
> + } else {
> + if (Position == (UINT64) -1) {
> + Pos = lseek (PrivateFile->fd, 0, SEEK_END);
> + } else {
> + Pos = lseek (PrivateFile->fd, Position, SEEK_SET);
> + }
> + if (Pos == (off_t)-1) {
> + return ErrnoToEfiStatus ();
> + }
> + return EFI_SUCCESS;
> + }
> +}
> +
> +
> +
> +/**
> + Get a file's current position
> +
> + @param This Protocol instance pointer.
> + @param Position Byte position from the start of the file.
> +
> + @retval EFI_SUCCESS Data was written.
> + @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..
> +
> +**/
> +EFI_STATUS
> +PosixFileGetPossition (
> + IN EFI_FILE_PROTOCOL *This,
> + OUT UINT64 *Position
> + )
> +{
> + EFI_STATUS Status;
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (PrivateFile->IsDirectoryPath) {
> + Status = EFI_UNSUPPORTED;
> + } else {
> + *Position = (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR);
> + Status = (*Position == (UINT64) -1) ? ErrnoToEfiStatus () : EFI_SUCCESS;
> + }
> +
> + return Status;
> +}
> +
> +
> +/**
> + Get information about a file.
> +
> + @param This Protocol instance pointer.
> + @param InformationType Type of information to return in Buffer.
> + @param BufferSize On input size of buffer, on output amount of data in
> buffer.
> + @param Buffer The buffer to return data.
> +
> + @retval EFI_SUCCESS Data was returned.
> + @retval EFI_UNSUPPORTED InformationType is not supported.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_WRITE_PROTECTED The device is write protected.
> + @retval EFI_ACCESS_DENIED The file was open for read only.
> + @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size
> returned in BufferSize.
> +
> +**/
> +EFI_STATUS
> +PosixFileGetInfo (
> + IN EFI_FILE_PROTOCOL *This,
> + IN EFI_GUID *InformationType,
> + IN OUT UINTN *BufferSize,
> + OUT VOID *Buffer
> + )
> +{
> + EFI_STATUS Status;
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> + EFI_FILE_SYSTEM_INFO *FileSystemInfoBuffer;
> + int UnixStatus;
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
> + struct statfs buf;
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> + PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> +
> + Status = EFI_SUCCESS;
> + if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {
> + Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);
> + } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
> + if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel)) {
> + *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel);
> + return EFI_BUFFER_TOO_SMALL;
> + }
> +
> + UnixStatus = statfs (PrivateFile->FileName, &buf);
> + if (UnixStatus < 0) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + FileSystemInfoBuffer = (EFI_FILE_SYSTEM_INFO *) Buffer;
> + FileSystemInfoBuffer->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize
> (PrivateRoot->VolumeLabel);
> + FileSystemInfoBuffer->ReadOnly = FALSE;
> +
> + //
> + // Succeeded
> + //
> + FileSystemInfoBuffer->VolumeSize = MultU64x32 (buf.f_blocks, buf.f_bsize);
> + FileSystemInfoBuffer->FreeSpace = MultU64x32 (buf.f_bavail, buf.f_bsize);
> + FileSystemInfoBuffer->BlockSize = buf.f_bsize;
> +
> +
> + StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot-
> >VolumeLabel);
> + *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel);
> +
> + } else if (CompareGuid (InformationType,
> &gEfiFileSystemVolumeLabelInfoIdGuid)) {
> + if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
> + *BufferSize = StrSize (PrivateRoot->VolumeLabel);
> + return EFI_BUFFER_TOO_SMALL;
> + }
> +
> + StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);
> + *BufferSize = StrSize (PrivateRoot->VolumeLabel);
> +
> + }
> +
> + return Status;
> +}
> +
> +
> +/**
> + Set information about a file
> +
> + @param File Protocol instance pointer.
> + @param InformationType Type of information in Buffer.
> + @param BufferSize Size of buffer.
> + @param Buffer The data to write.
> +
> + @retval EFI_SUCCESS Data was returned.
> + @retval EFI_UNSUPPORTED InformationType is not supported.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_WRITE_PROTECTED The device is write protected.
> + @retval EFI_ACCESS_DENIED The file was open for read only.
> +
> +**/
> +EFI_STATUS
> +PosixFileSetInfo (
> + IN EFI_FILE_PROTOCOL *This,
> + IN EFI_GUID *InformationType,
> + IN UINTN BufferSize,
> + IN VOID *Buffer
> + )
> +{
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> + EFI_FILE_INFO *OldFileInfo;
> + EFI_FILE_INFO *NewFileInfo;
> + EFI_STATUS Status;
> + UINTN OldInfoSize;
> + mode_t NewAttr;
> + struct stat OldAttr;
> + CHAR8 *OldFileName;
> + CHAR8 *NewFileName;
> + CHAR8 *CharPointer;
> + BOOLEAN AttrChangeFlag;
> + BOOLEAN NameChangeFlag;
> + BOOLEAN SizeChangeFlag;
> + BOOLEAN TimeChangeFlag;
> + struct tm NewLastAccessSystemTime;
> + struct tm NewLastWriteSystemTime;
> + EFI_FILE_SYSTEM_INFO *NewFileSystemInfo;
> + CHAR8 *AsciiFilePtr;
> + CHAR16 *UnicodeFilePtr;
> + int UnixStatus;
> + struct utimbuf Utime;
> +
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> + PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> + errno = 0;
> + Status = EFI_UNSUPPORTED;
> + OldFileInfo = NewFileInfo = NULL;
> + OldFileName = NewFileName = NULL;
> + AttrChangeFlag = NameChangeFlag = SizeChangeFlag = TimeChangeFlag =
> FALSE;
> +
> + //
> + // Set file system information.
> + //
> + if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
> + if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel))) {
> + Status = EFI_BAD_BUFFER_SIZE;
> + goto Done;
> + }
> +
> + NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;
> +
> + free (PrivateRoot->VolumeLabel);
> +
> + PrivateRoot->VolumeLabel = malloc (StrSize (NewFileSystemInfo-
> >VolumeLabel));
> + if (PrivateRoot->VolumeLabel == NULL) {
> + goto Done;
> + }
> +
> + StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);
> +
> + Status = EFI_SUCCESS;
> + goto Done;
> + }
> +
> + //
> + // Set volume label information.
> + //
> + if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid))
> {
> + if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
> + Status = EFI_BAD_BUFFER_SIZE;
> + goto Done;
> + }
> +
> + StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);
> +
> + Status = EFI_SUCCESS;
> + goto Done;
> + }
> +
> + if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {
> + Status = EFI_UNSUPPORTED;
> + goto Done;
> + }
> +
> + if (BufferSize < SIZE_OF_EFI_FILE_INFO) {
> + Status = EFI_BAD_BUFFER_SIZE;
> + goto Done;
> + }
> +
> + //
> + // Set file/directory information.
> + //
> +
> + //
> + // Check for invalid set file information parameters.
> + //
> + NewFileInfo = (EFI_FILE_INFO *) Buffer;
> + if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||
> + (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||
> + (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)
> + ) {
> + Status = EFI_INVALID_PARAMETER;
> + goto Done;
> + }
> +
> + //
> + // Get current file information so we can determine what kind
> + // of change request this is.
> + //
> + OldInfoSize = 0;
> + Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize,
> NULL);
> + if (Status != EFI_BUFFER_TOO_SMALL) {
> + Status = EFI_DEVICE_ERROR;
> + goto Done;
> + }
> +
> + OldFileInfo = malloc (OldInfoSize);
> + if (OldFileInfo == NULL) {
> + goto Done;
> + }
> +
> + Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize,
> OldFileInfo);
> + if (EFI_ERROR (Status)) {
> + goto Done;
> + }
> +
> + OldFileName = malloc (AsciiStrSize (PrivateFile->FileName));
> + if (OldFileInfo == NULL) {
> + goto Done;
> + }
> +
> + AsciiStrCpy (OldFileName, PrivateFile->FileName);
> +
> + //
> + // Make full pathname from new filename and rootpath.
> + //
> + if (NewFileInfo->FileName[0] == '\\') {
> + NewFileName = malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + StrLen
> (NewFileInfo->FileName) + 1);
> + if (NewFileName == NULL) {
> + goto Done;
> + }
> +
> + AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
> + AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
> + UnicodeFilePtr = NewFileInfo->FileName + 1;
> + *AsciiFilePtr++ ='/';
> + } else {
> + NewFileName = malloc (AsciiStrLen (PrivateFile->FileName) + 2 + StrLen
> (NewFileInfo->FileName) + 1);
> + if (NewFileName == NULL) {
> + goto Done;
> + }
> +
> + AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
> + AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
> + if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {
> + // make sure there is a / between Root FilePath and NewFileInfo Filename
> + AsciiFilePtr[0] = '/';
> + AsciiFilePtr[1] = '\0';
> + AsciiFilePtr++;
> + }
> + UnicodeFilePtr = NewFileInfo->FileName;
> + }
> + // Convert to ascii.
> + while (*UnicodeFilePtr) {
> + *AsciiFilePtr++ = *UnicodeFilePtr++;
> + }
> + *AsciiFilePtr = 0;
> +
> + //
> + // Is there an attribute change request?
> + //
> + if (NewFileInfo->Attribute != OldFileInfo->Attribute) {
> + if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) != (OldFileInfo-
> >Attribute & EFI_FILE_DIRECTORY)) {
> + Status = EFI_INVALID_PARAMETER;
> + goto Done;
> + }
> +
> + AttrChangeFlag = TRUE;
> + }
> +
> + //
> + // Is there a name change request?
> + // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL
> + //
> + if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) {
> + NameChangeFlag = TRUE;
> + }
> +
> + //
> + // Is there a size change request?
> + //
> + if (NewFileInfo->FileSize != OldFileInfo->FileSize) {
> + SizeChangeFlag = TRUE;
> + }
> +
> + //
> + // Is there a time stamp change request?
> + //
> + if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) &&
> + CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime,
> sizeof (EFI_TIME))
> + ) {
> + TimeChangeFlag = TRUE;
> + } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &&
> + CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo-
> >LastAccessTime, sizeof (EFI_TIME))
> + ) {
> + TimeChangeFlag = TRUE;
> + } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME)) &&
> + CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo-
> >ModificationTime, sizeof (EFI_TIME))
> + ) {
> + TimeChangeFlag = TRUE;
> + }
> +
> + //
> + // All done if there are no change requests being made.
> + //
> + if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag ||
> TimeChangeFlag)) {
> + Status = EFI_SUCCESS;
> + goto Done;
> + }
> +
> + //
> + // Set file or directory information.
> + //
> + if (stat (OldFileName, &OldAttr) != 0) {
> + Status = ErrnoToEfiStatus ();
> + goto Done;
> + }
> +
> + //
> + // Name change.
> + //
> + if (NameChangeFlag) {
> + //
> + // Close the handles first
> + //
> + if (PrivateFile->IsOpenedByRead) {
> + Status = EFI_ACCESS_DENIED;
> + goto Done;
> + }
> +
> + for (CharPointer = NewFileName; *CharPointer != 0 && *CharPointer != L'/';
> CharPointer++) {
> + }
> +
> + if (*CharPointer != 0) {
> + Status = EFI_ACCESS_DENIED;
> + goto Done;
> + }
> +
> + UnixStatus = rename (OldFileName, NewFileName);
> + if (UnixStatus == 0) {
> + //
> + // modify file name
> + //
> + free (PrivateFile->FileName);
> +
> + PrivateFile->FileName = malloc (AsciiStrSize (NewFileName));
> + if (PrivateFile->FileName == NULL) {
> + goto Done;
> + }
> +
> + AsciiStrCpy (PrivateFile->FileName, NewFileName);
> + } else {
> + Status = EFI_DEVICE_ERROR;
> + goto Done;
> + }
> + }
> +
> + //
> + // Size change
> + //
> + if (SizeChangeFlag) {
> + if (PrivateFile->IsDirectoryPath) {
> + Status = EFI_UNSUPPORTED;
> + goto Done;
> + }
> +
> + if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute &
> EFI_FILE_READ_ONLY) {
> + Status = EFI_ACCESS_DENIED;
> + goto Done;
> + }
> +
> + if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) != 0) {
> + Status = ErrnoToEfiStatus ();
> + goto Done;
> + }
> +
> + }
> +
> + //
> + // Time change
> + //
> + if (TimeChangeFlag) {
> + NewLastAccessSystemTime.tm_year = NewFileInfo->LastAccessTime.Year;
> + NewLastAccessSystemTime.tm_mon = NewFileInfo-
> >LastAccessTime.Month;
> + NewLastAccessSystemTime.tm_mday = NewFileInfo->LastAccessTime.Day;
> + NewLastAccessSystemTime.tm_hour = NewFileInfo->LastAccessTime.Hour;
> + NewLastAccessSystemTime.tm_min = NewFileInfo-
> >LastAccessTime.Minute;
> + NewLastAccessSystemTime.tm_sec = NewFileInfo-
> >LastAccessTime.Second;
> + NewLastAccessSystemTime.tm_isdst = 0;
> +
> + Utime.actime = mktime (&NewLastAccessSystemTime);
> +
> + NewLastWriteSystemTime.tm_year = NewFileInfo-
> >ModificationTime.Year;
> + NewLastWriteSystemTime.tm_mon = NewFileInfo-
> >ModificationTime.Month;
> + NewLastWriteSystemTime.tm_mday = NewFileInfo-
> >ModificationTime.Day;
> + NewLastWriteSystemTime.tm_hour = NewFileInfo-
> >ModificationTime.Hour;
> + NewLastWriteSystemTime.tm_min = NewFileInfo-
> >ModificationTime.Minute;
> + NewLastWriteSystemTime.tm_sec = NewFileInfo-
> >ModificationTime.Second;
> + NewLastWriteSystemTime.tm_isdst = 0;
> +
> + Utime.modtime = mktime (&NewLastWriteSystemTime);
> +
> + if (Utime.actime == (time_t)-1 || Utime.modtime == (time_t)-1) {
> + goto Done;
> + }
> +
> + if (utime (PrivateFile->FileName, &Utime) == -1) {
> + Status = ErrnoToEfiStatus ();
> + goto Done;
> + }
> + }
> +
> + //
> + // No matter about AttrChangeFlag, Attribute must be set.
> + // Because operation before may cause attribute change.
> + //
> + NewAttr = OldAttr.st_mode;
> +
> + if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {
> + NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);
> + } else {
> + NewAttr |= S_IRUSR;
> + }
> +
> + if (chmod (NewFileName, NewAttr) != 0) {
> + Status = ErrnoToEfiStatus ();
> + }
> +
> +Done:
> + if (OldFileInfo != NULL) {
> + free (OldFileInfo);
> + }
> +
> + if (OldFileName != NULL) {
> + free (OldFileName);
> + }
> +
> + if (NewFileName != NULL) {
> + free (NewFileName);
> + }
> +
> + return Status;
> +}
> +
> +
> +/**
> + Flush data back for the file handle.
> +
> + @param This Protocol instance pointer.
> +
> + @retval EFI_SUCCESS Data was written.
> + @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_WRITE_PROTECTED The device is write protected.
> + @retval EFI_ACCESS_DENIED The file was open for read only.
> + @retval EFI_VOLUME_FULL The volume is full.
> +
> +**/
> +EFI_STATUS
> +PosixFileFlush (
> + IN EFI_FILE_PROTOCOL *This
> + )
> +{
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> +
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (PrivateFile->IsDirectoryPath) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + if (PrivateFile->IsOpenedByRead) {
> + return EFI_ACCESS_DENIED;
> + }
> +
> + if (PrivateFile->fd < 0) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + if (fsync (PrivateFile->fd) != 0) {
> + return ErrnoToEfiStatus ();
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +EFI_STATUS
> +PosixFileSystmeThunkOpen (
> + IN EMU_IO_THUNK_PROTOCOL *This
> + )
> +{
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
> + UINTN i;
> +
> + if (This->Private != NULL) {
> + return EFI_ALREADY_STARTED;
> + }
> +
> + if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + Private = malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));
> + if (Private == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + Private->FilePath = malloc (StrLen (This->ConfigString) + 1);
> + if (Private->FilePath == NULL) {
> + free (Private);
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + // Convert Unicode to Ascii
> + for (i = 0; This->ConfigString[i] != 0; i++) {
> + Private->FilePath[i] = This->ConfigString[i];
> + }
> + Private->FilePath[i] = 0;
> +
> +
> + Private->VolumeLabel = malloc (StrSize (L"EFI_EMULATED"));
> + if (Private->VolumeLabel == NULL) {
> + free (Private->FilePath);
> + free (Private);
> + return EFI_OUT_OF_RESOURCES;
> + }
> + StrCpy (Private->VolumeLabel, L"EFI_EMULATED");
> +
> + Private->Signature = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;
> + Private->Thunk = This;
> + CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof
> (Private->SimpleFileSystem));
> + Private->FileHandlesOpen = FALSE;
> +
> + This->Interface = &Private->SimpleFileSystem;
> + This->Private = Private;
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +PosixFileSystmeThunkClose (
> + IN EMU_IO_THUNK_PROTOCOL *This
> + )
> +{
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
> +
> + if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + Private = This->Private;
> +
> + if (Private->FileHandlesOpen) {
> + //
> + // Close only supported if all the EFI_FILE_HANDLEs have been closed.
> + //
> + return EFI_NOT_READY;
> + }
> +
> + if (This->Private != NULL) {
> + if (Private->VolumeLabel != NULL) {
> + free (Private->VolumeLabel);
> + }
> + free (This->Private);
> + This->Private = NULL;
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
> + &gEfiSimpleFileSystemProtocolGuid,
> + NULL,
> + NULL,
> + 0,
> + GasketPosixFileSystmeThunkOpen,
> + GasketPosixFileSystmeThunkClose,
> + NULL
> +};
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/Pthreads.c
> b/EmulatorPkg/Unix/Host/Pthreads.c
> index c60c298099..cb9ffeea84 100644
> --- a/EmulatorPkg/Unix/Host/Pthreads.c
> +++ b/EmulatorPkg/Unix/Host/Pthreads.c
> @@ -1,235 +1,235 @@
> -/*++ @file
> - POSIX Pthreads to emulate APs and implement threads
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.
> -Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
> -
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -
> -**/
> -
> -#include "Host.h"
> -#include <pthread.h>
> -
> -
> -UINTN
> -EFIAPI
> -PthreadMutexLock (
> - IN VOID *Mutex
> - )
> -{
> - return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
> -}
> -
> -
> -
> -UINTN
> -EFIAPI
> -PthreadMutexUnLock (
> - IN VOID *Mutex
> - )
> -{
> - return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
> -}
> -
> -
> -UINTN
> -EFIAPI
> -PthreadMutexTryLock (
> - IN VOID *Mutex
> - )
> -{
> - return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
> -}
> -
> -
> -VOID *
> -PthreadMutexInit (
> - IN VOID
> - )
> -{
> - pthread_mutex_t *Mutex;
> - int err;
> -
> - Mutex = malloc (sizeof (pthread_mutex_t));
> - err = pthread_mutex_init (Mutex, NULL);
> - if (err == 0) {
> - return Mutex;
> - }
> -
> - return NULL;
> -}
> -
> -
> -UINTN
> -PthreadMutexDestroy (
> - IN VOID *Mutex
> - )
> -{
> - if (Mutex != NULL) {
> - return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);
> - }
> -
> - return -1;
> -}
> -
> -// Can't store this data on PthreadCreate stack so we need a global
> -typedef struct {
> - pthread_mutex_t Mutex;
> - THREAD_THUNK_THREAD_ENTRY Start;
> -} THREAD_MANGLE;
> -
> -THREAD_MANGLE mThreadMangle = {
> - PTHREAD_MUTEX_INITIALIZER,
> - NULL
> -};
> -
> -VOID *
> -SecFakePthreadStart (
> - VOID *Context
> - )
> -{
> - THREAD_THUNK_THREAD_ENTRY Start;
> - sigset_t SigMask;
> -
> - // Save global on the stack before we unlock
> - Start = mThreadMangle.Start;
> - pthread_mutex_unlock (&mThreadMangle.Mutex);
> -
> - // Mask all signals to the APs
> - sigfillset (&SigMask);
> - pthread_sigmask (SIG_BLOCK, &SigMask, NULL);
> -
> - //
> - // We have to start the thread in SEC as we need to follow
> - // OS X calling conventions. We can then call back into
> - // to the callers Start.
> - //
> - // This is a great example of how all problems in computer
> - // science can be solved by adding another level of indirection
> - //
> - return (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);
> -}
> -
> -UINTN
> -PthreadCreate (
> - IN VOID *Thread,
> - IN VOID *Attribute,
> - IN THREAD_THUNK_THREAD_ENTRY Start,
> - IN VOID *Context
> - )
> -{
> - int err;
> - BOOLEAN EnabledOnEntry;
> -
> - //
> - // Threads inherit interrupt state so disable interrupts before we start thread
> - //
> - if (SecInterruptEanbled ()) {
> - SecDisableInterrupt ();
> - EnabledOnEntry = TRUE;
> - } else {
> - EnabledOnEntry = FALSE;
> - }
> -
> - // Aquire lock for global, SecFakePthreadStart runs in a different thread.
> - pthread_mutex_lock (&mThreadMangle.Mutex);
> - mThreadMangle.Start = Start;
> -
> - err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
> - if (err != 0) {
> - // Thread failed to launch so release the lock;
> - pthread_mutex_unlock (&mThreadMangle.Mutex);
> - }
> -
> - if (EnabledOnEntry) {
> - // Restore interrupt state
> - SecEnableInterrupt ();
> - }
> -
> - return err;
> -}
> -
> -
> -VOID
> -PthreadExit (
> - IN VOID *ValuePtr
> - )
> -{
> - pthread_exit (ValuePtr);
> - return;
> -}
> -
> -
> -UINTN
> -PthreadSelf (
> - VOID
> - )
> -{
> - // POSIX currently allows pthread_t to be a structure or arithmetic type.
> - // Check out sys/types.h to make sure this will work if you are porting.
> - // On OS X (Darwin) pthread_t is a pointer to a structure so this code works.
> - return (UINTN)pthread_self ();
> -}
> -
> -
> -EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
> - GasketPthreadMutexLock,
> - GasketPthreadMutexUnLock,
> - GasketPthreadMutexTryLock,
> - GasketPthreadMutexInit,
> - GasketPthreadMutexDestroy,
> - GasketPthreadCreate,
> - GasketPthreadExit,
> - GasketPthreadSelf
> -};
> -
> -
> -EFI_STATUS
> -PthreadOpen (
> - IN EMU_IO_THUNK_PROTOCOL *This
> - )
> -{
> - if (This->Instance != 0) {
> - // Only single instance is supported
> - return EFI_NOT_FOUND;
> - }
> -
> - if (This->ConfigString[0] == L'0') {
> - // If AP count is zero no need for threads
> - return EFI_NOT_FOUND;
> - }
> -
> - This->Interface = &gPthreadThunk;
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -PthreadClose (
> - IN EMU_IO_THUNK_PROTOCOL *This
> - )
> -{
> - return EFI_SUCCESS;
> -}
> -
> -
> -EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
> - &gEmuThreadThunkProtocolGuid,
> - NULL,
> - NULL,
> - 0,
> - GasketPthreadOpen,
> - GasketPthreadClose,
> - NULL
> -};
> -
> -
> +/*++ @file
> + POSIX Pthreads to emulate APs and implement threads
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.
> +Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
> +
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +
> +**/
> +
> +#include "Host.h"
> +#include <pthread.h>
> +
> +
> +UINTN
> +EFIAPI
> +PthreadMutexLock (
> + IN VOID *Mutex
> + )
> +{
> + return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
> +}
> +
> +
> +
> +UINTN
> +EFIAPI
> +PthreadMutexUnLock (
> + IN VOID *Mutex
> + )
> +{
> + return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
> +}
> +
> +
> +UINTN
> +EFIAPI
> +PthreadMutexTryLock (
> + IN VOID *Mutex
> + )
> +{
> + return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
> +}
> +
> +
> +VOID *
> +PthreadMutexInit (
> + IN VOID
> + )
> +{
> + pthread_mutex_t *Mutex;
> + int err;
> +
> + Mutex = malloc (sizeof (pthread_mutex_t));
> + err = pthread_mutex_init (Mutex, NULL);
> + if (err == 0) {
> + return Mutex;
> + }
> +
> + return NULL;
> +}
> +
> +
> +UINTN
> +PthreadMutexDestroy (
> + IN VOID *Mutex
> + )
> +{
> + if (Mutex != NULL) {
> + return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);
> + }
> +
> + return -1;
> +}
> +
> +// Can't store this data on PthreadCreate stack so we need a global
> +typedef struct {
> + pthread_mutex_t Mutex;
> + THREAD_THUNK_THREAD_ENTRY Start;
> +} THREAD_MANGLE;
> +
> +THREAD_MANGLE mThreadMangle = {
> + PTHREAD_MUTEX_INITIALIZER,
> + NULL
> +};
> +
> +VOID *
> +SecFakePthreadStart (
> + VOID *Context
> + )
> +{
> + THREAD_THUNK_THREAD_ENTRY Start;
> + sigset_t SigMask;
> +
> + // Save global on the stack before we unlock
> + Start = mThreadMangle.Start;
> + pthread_mutex_unlock (&mThreadMangle.Mutex);
> +
> + // Mask all signals to the APs
> + sigfillset (&SigMask);
> + pthread_sigmask (SIG_BLOCK, &SigMask, NULL);
> +
> + //
> + // We have to start the thread in SEC as we need to follow
> + // OS X calling conventions. We can then call back into
> + // to the callers Start.
> + //
> + // This is a great example of how all problems in computer
> + // science can be solved by adding another level of indirection
> + //
> + return (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);
> +}
> +
> +UINTN
> +PthreadCreate (
> + IN VOID *Thread,
> + IN VOID *Attribute,
> + IN THREAD_THUNK_THREAD_ENTRY Start,
> + IN VOID *Context
> + )
> +{
> + int err;
> + BOOLEAN EnabledOnEntry;
> +
> + //
> + // Threads inherit interrupt state so disable interrupts before we start thread
> + //
> + if (SecInterruptEanbled ()) {
> + SecDisableInterrupt ();
> + EnabledOnEntry = TRUE;
> + } else {
> + EnabledOnEntry = FALSE;
> + }
> +
> + // Aquire lock for global, SecFakePthreadStart runs in a different thread.
> + pthread_mutex_lock (&mThreadMangle.Mutex);
> + mThreadMangle.Start = Start;
> +
> + err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
> + if (err != 0) {
> + // Thread failed to launch so release the lock;
> + pthread_mutex_unlock (&mThreadMangle.Mutex);
> + }
> +
> + if (EnabledOnEntry) {
> + // Restore interrupt state
> + SecEnableInterrupt ();
> + }
> +
> + return err;
> +}
> +
> +
> +VOID
> +PthreadExit (
> + IN VOID *ValuePtr
> + )
> +{
> + pthread_exit (ValuePtr);
> + return;
> +}
> +
> +
> +UINTN
> +PthreadSelf (
> + VOID
> + )
> +{
> + // POSIX currently allows pthread_t to be a structure or arithmetic type.
> + // Check out sys/types.h to make sure this will work if you are porting.
> + // On OS X (Darwin) pthread_t is a pointer to a structure so this code works.
> + return (UINTN)pthread_self ();
> +}
> +
> +
> +EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
> + GasketPthreadMutexLock,
> + GasketPthreadMutexUnLock,
> + GasketPthreadMutexTryLock,
> + GasketPthreadMutexInit,
> + GasketPthreadMutexDestroy,
> + GasketPthreadCreate,
> + GasketPthreadExit,
> + GasketPthreadSelf
> +};
> +
> +
> +EFI_STATUS
> +PthreadOpen (
> + IN EMU_IO_THUNK_PROTOCOL *This
> + )
> +{
> + if (This->Instance != 0) {
> + // Only single instance is supported
> + return EFI_NOT_FOUND;
> + }
> +
> + if (This->ConfigString[0] == L'0') {
> + // If AP count is zero no need for threads
> + return EFI_NOT_FOUND;
> + }
> +
> + This->Interface = &gPthreadThunk;
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +PthreadClose (
> + IN EMU_IO_THUNK_PROTOCOL *This
> + )
> +{
> + return EFI_SUCCESS;
> +}
> +
> +
> +EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
> + &gEmuThreadThunkProtocolGuid,
> + NULL,
> + NULL,
> + 0,
> + GasketPthreadOpen,
> + GasketPthreadClose,
> + NULL
> +};
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
> b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
> index adb9b2b830..a3cc28c223 100644
> --- a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
> +++ b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
> @@ -1,1028 +1,1028 @@
> -/*++ @file
> -
> -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> -
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#include "Host.h"
> -
> -#include <sys/ipc.h>
> -#include <sys/shm.h>
> -
> -#include <X11/Xlib.h>
> -#include <X11/Xutil.h>
> -#include <X11/Xos.h>
> -#include <X11/extensions/XShm.h>
> -#include <X11/keysym.h>
> -#include <X11/cursorfont.h>
> -
> -#define KEYSYM_LOWER 0
> -#define KEYSYM_UPPER 1
> -
> -
> -struct uga_drv_shift_mask {
> - unsigned char shift;
> - unsigned char size;
> - unsigned char csize;
> -};
> -
> -#define NBR_KEYS 32
> -typedef struct {
> - EMU_GRAPHICS_WINDOW_PROTOCOL GraphicsIo;
> -
> - Display *display;
> - int screen; // values for window_size in main
> - Window win;
> - GC gc;
> - Visual *visual;
> -
> - int depth;
> - unsigned int width;
> - unsigned int height;
> - unsigned int line_bytes;
> - unsigned int pixel_shift;
> - unsigned char *image_data;
> -
> - struct uga_drv_shift_mask r, g, b;
> -
> - int use_shm;
> - XShmSegmentInfo xshm_info;
> - XImage *image;
> - char *Title;
> -
> - unsigned int key_rd;
> - unsigned int key_wr;
> - unsigned int key_count;
> - EFI_KEY_DATA keys[NBR_KEYS];
> -
> - EFI_KEY_STATE KeyState;
> -
> - EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeRegisterdKeyCallback;
> - EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakRegisterdKeyCallback;
> - VOID *RegisterdKeyCallbackContext;
> -
> - int previous_x;
> - int previous_y;
> - EFI_SIMPLE_POINTER_STATE pointer_state;
> - int pointer_state_changed;
> -} GRAPHICS_IO_PRIVATE;
> -
> -void
> -HandleEvents(
> - IN GRAPHICS_IO_PRIVATE *Drv
> - );
> -
> -void
> -fill_shift_mask (
> - IN struct uga_drv_shift_mask *sm,
> - IN unsigned long mask
> - )
> -{
> - sm->shift = 0;
> - sm->size = 0;
> - while ((mask & 1) == 0) {
> - mask >>= 1;
> - sm->shift++;
> - }
> - while (mask & 1) {
> - sm->size++;
> - mask >>= 1;
> - }
> - sm->csize = 8 - sm->size;
> -}
> -
> -int
> -TryCreateShmImage (
> - IN GRAPHICS_IO_PRIVATE *Drv
> - )
> -{
> - Drv->image = XShmCreateImage (
> - Drv->display, Drv->visual,
> - Drv->depth, ZPixmap, NULL, &Drv->xshm_info,
> - Drv->width, Drv->height
> - );
> - if (Drv->image == NULL) {
> - return 0;
> - }
> -
> - switch (Drv->image->bitmap_unit) {
> - case 32:
> - Drv->pixel_shift = 2;
> - break;
> - case 16:
> - Drv->pixel_shift = 1;
> - break;
> - case 8:
> - Drv->pixel_shift = 0;
> - break;
> - }
> -
> - Drv->xshm_info.shmid = shmget (
> - IPC_PRIVATE, Drv->image->bytes_per_line * Drv->image-
> >height,
> - IPC_CREAT | 0777
> - );
> - if (Drv->xshm_info.shmid < 0) {
> - XDestroyImage(Drv->image);
> - return 0;
> - }
> -
> - Drv->image_data = shmat (Drv->xshm_info.shmid, NULL, 0);
> - if(!Drv->image_data) {
> - shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> - XDestroyImage(Drv->image);
> - return 0;
> - }
> -
> -#ifndef __APPLE__
> - //
> - // This closes shared memory in real time on OS X. Only closes after folks quit
> using
> - // it on Linux.
> - //
> - shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> -#endif
> -
> - Drv->xshm_info.shmaddr = (char*)Drv->image_data;
> - Drv->image->data = (char*)Drv->image_data;
> -
> - if (!XShmAttach (Drv->display, &Drv->xshm_info)) {
> - shmdt (Drv->image_data);
> - XDestroyImage(Drv->image);
> - return 0;
> - }
> - return 1;
> -}
> -
> -
> -EFI_STATUS
> -X11Size (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> - IN UINT32 Width,
> - IN UINT32 Height
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> - XSizeHints size_hints;
> -
> - // Destroy current buffer if created.
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> - if (Drv->image != NULL) {
> - // Before destroy buffer, need to make sure the buffer available for access.
> - XDestroyImage (Drv->image);
> -
> - if (Drv->use_shm) {
> - shmdt (Drv->image_data);
> - }
> -
> - Drv->image_data = NULL;
> - Drv->image = NULL;
> - }
> -
> - Drv->width = Width;
> - Drv->height = Height;
> - XResizeWindow (Drv->display, Drv->win, Width, Height);
> -
> - // Allocate image.
> - if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) {
> - Drv->use_shm = 1;
> - } else {
> - Drv->use_shm = 0;
> - if (Drv->depth > 16) {
> - Drv->pixel_shift = 2;
> - } else if (Drv->depth > 8) {
> - Drv->pixel_shift = 1;
> - } else {
> - Drv->pixel_shift = 0;
> - }
> -
> - Drv->image_data = malloc ((Drv->width * Drv->height) << Drv->pixel_shift);
> - Drv->image = XCreateImage (
> - Drv->display, Drv->visual, Drv->depth,
> - ZPixmap, 0, (char *)Drv->image_data,
> - Drv->width, Drv->height,
> - 8 << Drv->pixel_shift, 0
> - );
> - }
> -
> - Drv->line_bytes = Drv->image->bytes_per_line;
> -
> - fill_shift_mask (&Drv->r, Drv->image->red_mask);
> - fill_shift_mask (&Drv->g, Drv->image->green_mask);
> - fill_shift_mask (&Drv->b, Drv->image->blue_mask);
> -
> - // Set WM hints.
> - size_hints.flags = PSize | PMinSize | PMaxSize;
> - size_hints.min_width = size_hints.max_width = size_hints.base_width = Width;
> - size_hints.min_height = size_hints.max_height = size_hints.base_height =
> Height;
> - XSetWMNormalHints (Drv->display, Drv->win, &size_hints);
> -
> - XMapWindow (Drv->display, Drv->win);
> - HandleEvents (Drv);
> - return EFI_SUCCESS;
> -}
> -
> -void
> -handleKeyEvent (
> - IN GRAPHICS_IO_PRIVATE *Drv,
> - IN XEvent *ev,
> - IN BOOLEAN Make
> - )
> -{
> - KeySym *KeySym;
> - EFI_KEY_DATA KeyData;
> - int KeySymArraySize;
> -
> - if (Make) {
> - if (Drv->key_count == NBR_KEYS) {
> - return;
> - }
> - }
> -
> - // keycode is a physical key on the keyboard
> - // KeySym is a mapping of a physical key
> - // KeyboardMapping is the array of KeySym for a given keycode. key, shifted
> key, option key, command key, ...
> - //
> - // Returns an array of KeySymArraySize of KeySym for the keycode. [0] is
> lower case, [1] is upper case,
> - // [2] and [3] are based on option and command modifiers. The problem we
> have is command V
> - // could be mapped to a crazy Unicode character so the old scheme of
> returning a string.
> - //
> - KeySym = XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1,
> &KeySymArraySize);
> -
> - KeyData.Key.ScanCode = 0;
> - KeyData.Key.UnicodeChar = 0;
> - KeyData.KeyState.KeyShiftState = 0;
> -
> - //
> - // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they
> are not on Macs
> - //
> - if ((ev->xkey.state & LockMask) == 0) {
> - Drv->KeyState.KeyToggleState &= ~EFI_CAPS_LOCK_ACTIVE;
> - } else {
> - if (Make) {
> - Drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;
> - }
> - }
> -
> - // Skipping EFI_MENU_KEY_PRESSED and EFI_SYS_REQ_PRESSED
> -
> - switch (*KeySym) {
> - case XK_Control_R:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_RIGHT_CONTROL_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_CONTROL_PRESSED;
> - }
> - break;
> - case XK_Control_L:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_LEFT_CONTROL_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_LEFT_CONTROL_PRESSED;
> - }
> - break;
> -
> - case XK_Shift_R:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_RIGHT_SHIFT_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_SHIFT_PRESSED;
> - }
> - break;
> - case XK_Shift_L:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_LEFT_SHIFT_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_LEFT_SHIFT_PRESSED;
> - }
> - break;
> -
> - case XK_Mode_switch:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_LEFT_ALT_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_LEFT_ALT_PRESSED;
> - }
> - break;
> -
> - case XK_Meta_R:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_RIGHT_LOGO_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_LOGO_PRESSED;
> - }
> - break;
> - case XK_Meta_L:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_LEFT_LOGO_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_LEFT_LOGO_PRESSED;
> - }
> - break;
> -
> - case XK_KP_Home:
> - case XK_Home: KeyData.Key.ScanCode = SCAN_HOME; break;
> -
> - case XK_KP_End:
> - case XK_End: KeyData.Key.ScanCode = SCAN_END; break;
> -
> - case XK_KP_Left:
> - case XK_Left: KeyData.Key.ScanCode = SCAN_LEFT; break;
> -
> - case XK_KP_Right:
> - case XK_Right: KeyData.Key.ScanCode = SCAN_RIGHT; break;
> -
> - case XK_KP_Up:
> - case XK_Up: KeyData.Key.ScanCode = SCAN_UP; break;
> -
> - case XK_KP_Down:
> - case XK_Down: KeyData.Key.ScanCode = SCAN_DOWN; break;
> -
> - case XK_KP_Delete:
> - case XK_Delete: KeyData.Key.ScanCode = SCAN_DELETE; break;
> -
> - case XK_KP_Insert:
> - case XK_Insert: KeyData.Key.ScanCode = SCAN_INSERT; break;
> -
> - case XK_KP_Page_Up:
> - case XK_Page_Up: KeyData.Key.ScanCode = SCAN_PAGE_UP; break;
> -
> - case XK_KP_Page_Down:
> - case XK_Page_Down: KeyData.Key.ScanCode = SCAN_PAGE_DOWN; break;
> -
> - case XK_Escape: KeyData.Key.ScanCode = SCAN_ESC; break;
> -
> - case XK_Pause: KeyData.Key.ScanCode = SCAN_PAUSE; break;
> -
> - case XK_KP_F1:
> - case XK_F1: KeyData.Key.ScanCode = SCAN_F1; break;
> -
> - case XK_KP_F2:
> - case XK_F2: KeyData.Key.ScanCode = SCAN_F2; break;
> -
> - case XK_KP_F3:
> - case XK_F3: KeyData.Key.ScanCode = SCAN_F3; break;
> -
> - case XK_KP_F4:
> - case XK_F4: KeyData.Key.ScanCode = SCAN_F4; break;
> -
> - case XK_F5: KeyData.Key.ScanCode = SCAN_F5; break;
> - case XK_F6: KeyData.Key.ScanCode = SCAN_F6; break;
> - case XK_F7: KeyData.Key.ScanCode = SCAN_F7; break;
> -
> - // Don't map into X11 by default on a Mac
> - // System Preferences->Keyboard->Keyboard Shortcuts can be configured
> - // to not use higher function keys as shortcuts and the will show up
> - // in X11.
> - case XK_F8: KeyData.Key.ScanCode = SCAN_F8; break;
> - case XK_F9: KeyData.Key.ScanCode = SCAN_F9; break;
> - case XK_F10: KeyData.Key.ScanCode = SCAN_F10; break;
> -
> - case XK_F11: KeyData.Key.ScanCode = SCAN_F11; break;
> - case XK_F12: KeyData.Key.ScanCode = SCAN_F12; break;
> -
> - case XK_F13: KeyData.Key.ScanCode = SCAN_F13; break;
> - case XK_F14: KeyData.Key.ScanCode = SCAN_F14; break;
> - case XK_F15: KeyData.Key.ScanCode = SCAN_F15; break;
> - case XK_F16: KeyData.Key.ScanCode = SCAN_F16; break;
> - case XK_F17: KeyData.Key.ScanCode = SCAN_F17; break;
> - case XK_F18: KeyData.Key.ScanCode = SCAN_F18; break;
> - case XK_F19: KeyData.Key.ScanCode = SCAN_F19; break;
> - case XK_F20: KeyData.Key.ScanCode = SCAN_F20; break;
> - case XK_F21: KeyData.Key.ScanCode = SCAN_F21; break;
> - case XK_F22: KeyData.Key.ScanCode = SCAN_F22; break;
> - case XK_F23: KeyData.Key.ScanCode = SCAN_F23; break;
> - case XK_F24: KeyData.Key.ScanCode = SCAN_F24; break;
> -
> - // No mapping in X11
> - //case XK_: KeyData.Key.ScanCode = SCAN_MUTE; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_UP; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_DOWN; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_UP; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_DOWN; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_SUSPEND; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_HIBERNATE; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_TOGGLE_DISPLAY; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_RECOVERY; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_EJECT; break;
> -
> - case XK_BackSpace: KeyData.Key.UnicodeChar = 0x0008; break;
> -
> - case XK_KP_Tab:
> - case XK_Tab: KeyData.Key.UnicodeChar = 0x0009; break;
> -
> - case XK_Linefeed: KeyData.Key.UnicodeChar = 0x000a; break;
> -
> - case XK_KP_Enter:
> - case XK_Return: KeyData.Key.UnicodeChar = 0x000d; break;
> -
> - case XK_KP_Equal : KeyData.Key.UnicodeChar = L'='; break;
> - case XK_KP_Multiply : KeyData.Key.UnicodeChar = L'*'; break;
> - case XK_KP_Add : KeyData.Key.UnicodeChar = L'+'; break;
> - case XK_KP_Separator : KeyData.Key.UnicodeChar = L'~'; break;
> - case XK_KP_Subtract : KeyData.Key.UnicodeChar = L'-'; break;
> - case XK_KP_Decimal : KeyData.Key.UnicodeChar = L'.'; break;
> - case XK_KP_Divide : KeyData.Key.UnicodeChar = L'/'; break;
> -
> - case XK_KP_0 : KeyData.Key.UnicodeChar = L'0'; break;
> - case XK_KP_1 : KeyData.Key.UnicodeChar = L'1'; break;
> - case XK_KP_2 : KeyData.Key.UnicodeChar = L'2'; break;
> - case XK_KP_3 : KeyData.Key.UnicodeChar = L'3'; break;
> - case XK_KP_4 : KeyData.Key.UnicodeChar = L'4'; break;
> - case XK_KP_5 : KeyData.Key.UnicodeChar = L'5'; break;
> - case XK_KP_6 : KeyData.Key.UnicodeChar = L'6'; break;
> - case XK_KP_7 : KeyData.Key.UnicodeChar = L'7'; break;
> - case XK_KP_8 : KeyData.Key.UnicodeChar = L'8'; break;
> - case XK_KP_9 : KeyData.Key.UnicodeChar = L'9'; break;
> -
> - default:
> - ;
> - }
> -
> - // The global state is our state
> - KeyData.KeyState.KeyShiftState = Drv->KeyState.KeyShiftState;
> - KeyData.KeyState.KeyToggleState = Drv->KeyState.KeyToggleState;
> -
> - if (*KeySym < XK_BackSpace) {
> - if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED |
> EFI_RIGHT_SHIFT_PRESSED)) != 0) ||
> - ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) != 0) ) {
> -
> - KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_UPPER];
> -
> - // Per UEFI spec since we converted the Unicode clear the shift bits we
> pass up
> - KeyData.KeyState.KeyShiftState &= ~(EFI_LEFT_SHIFT_PRESSED |
> EFI_RIGHT_SHIFT_PRESSED);
> - } else {
> - KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_LOWER];
> - }
> - } else {
> - // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? keys we
> process in this file
> - ;
> - }
> -
> - if (Make) {
> - memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));
> - Drv->key_wr = (Drv->key_wr + 1) % NBR_KEYS;
> - Drv->key_count++;
> - if (Drv->MakeRegisterdKeyCallback != NULL) {
> - ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv-
> >RegisterdKeyCallbackContext, &KeyData);
> - }
> - } else {
> - if (Drv->BreakRegisterdKeyCallback != NULL) {
> - ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv-
> >RegisterdKeyCallbackContext, &KeyData);
> - }
> - }
> -}
> -
> -
> -void
> -handleMouseMoved(
> - IN GRAPHICS_IO_PRIVATE *Drv,
> - IN XEvent *ev
> - )
> -{
> - if (ev->xmotion.x != Drv->previous_x) {
> - Drv->pointer_state.RelativeMovementX += ( ev->xmotion.x - Drv-
> >previous_x );
> - Drv->previous_x = ev->xmotion.x;
> - Drv->pointer_state_changed = 1;
> - }
> -
> - if (ev->xmotion.y != Drv->previous_y) {
> - Drv->pointer_state.RelativeMovementY += ( ev->xmotion.y - Drv-
> >previous_y );
> - Drv->previous_y = ev->xmotion.y;
> - Drv->pointer_state_changed = 1;
> - }
> -
> - Drv->pointer_state.RelativeMovementZ = 0;
> -}
> -
> -void
> -handleMouseDown (
> - IN GRAPHICS_IO_PRIVATE *Drv,
> - IN XEvent *ev,
> - IN BOOLEAN Pressed
> - )
> -{
> - if (ev->xbutton.button == Button1) {
> - Drv->pointer_state_changed = (Drv->pointer_state.LeftButton != Pressed);
> - Drv->pointer_state.LeftButton = Pressed;
> - }
> - if ( ev->xbutton.button == Button2 ) {
> - Drv->pointer_state_changed = (Drv->pointer_state.RightButton != Pressed);
> - Drv->pointer_state.RightButton = Pressed;
> - }
> -}
> -
> -void
> -Redraw (
> - IN GRAPHICS_IO_PRIVATE *Drv,
> - IN UINTN X,
> - IN UINTN Y,
> - IN UINTN Width,
> - IN UINTN Height
> - )
> -{
> - if (Drv->use_shm) {
> - XShmPutImage (
> - Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height,
> False
> - );
> - } else {
> - XPutImage (
> - Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height
> - );
> - }
> - XFlush(Drv->display);
> -}
> -
> -void
> -HandleEvent(GRAPHICS_IO_PRIVATE *Drv, XEvent *ev)
> -{
> - switch (ev->type) {
> - case Expose:
> - Redraw (Drv, ev->xexpose.x, ev->xexpose.y,
> - ev->xexpose.width, ev->xexpose.height);
> - break;
> - case GraphicsExpose:
> - Redraw (Drv, ev->xgraphicsexpose.x, ev->xgraphicsexpose.y,
> - ev->xgraphicsexpose.width, ev->xgraphicsexpose.height);
> - break;
> - case KeyPress:
> - handleKeyEvent (Drv, ev, TRUE);
> - break;
> - case KeyRelease:
> - handleKeyEvent (Drv, ev, FALSE);
> - break;
> - case MappingNotify:
> - XRefreshKeyboardMapping (&ev->xmapping);
> - break;
> - case MotionNotify:
> - handleMouseMoved (Drv, ev);
> - break;
> - case ButtonPress:
> - handleMouseDown (Drv, ev, TRUE);
> - break;
> - case ButtonRelease:
> - handleMouseDown (Drv, ev, FALSE);
> - break;
> -#if 0
> - case DestroyNotify:
> - XCloseDisplay (Drv->display);
> - exit (1);
> - break;
> -#endif
> - case NoExpose:
> - default:
> - break;
> - }
> -}
> -
> -void
> -HandleEvents (
> - IN GRAPHICS_IO_PRIVATE *Drv
> - )
> -{
> - XEvent ev;
> -
> - while (XPending (Drv->display) != 0) {
> - XNextEvent (Drv->display, &ev);
> - HandleEvent (Drv, &ev);
> - }
> -}
> -
> -unsigned long
> -X11PixelToColor (
> - IN GRAPHICS_IO_PRIVATE *Drv,
> - IN EFI_UGA_PIXEL pixel
> - )
> -{
> - return ((pixel.Red >> Drv->r.csize) << Drv->r.shift)
> - | ((pixel.Green >> Drv->g.csize) << Drv->g.shift)
> - | ((pixel.Blue >> Drv->b.csize) << Drv->b.shift);
> -}
> -
> -EFI_UGA_PIXEL
> -X11ColorToPixel (
> - IN GRAPHICS_IO_PRIVATE *Drv,
> - IN unsigned long val
> - )
> -{
> - EFI_UGA_PIXEL Pixel;
> -
> - memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL));
> -
> - // Truncation not an issue since X11 and EFI are both using 8 bits per color
> - Pixel.Red = (val >> Drv->r.shift) << Drv->r.csize;
> - Pixel.Green = (val >> Drv->g.shift) << Drv->g.csize;
> - Pixel.Blue = (val >> Drv->b.shift) << Drv->b.csize;
> -
> - return Pixel;
> -}
> -
> -
> -EFI_STATUS
> -X11CheckKey (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> - HandleEvents (Drv);
> -
> - if (Drv->key_count != 0) {
> - return EFI_SUCCESS;
> - }
> -
> - return EFI_NOT_READY;
> -}
> -
> -EFI_STATUS
> -X11GetKey (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> - IN EFI_KEY_DATA *KeyData
> - )
> -{
> - EFI_STATUS EfiStatus;
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> - EfiStatus = X11CheckKey (GraphicsIo);
> - if (EFI_ERROR (EfiStatus)) {
> - return EfiStatus;
> - }
> -
> - CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA));
> - Drv->key_rd = (Drv->key_rd + 1) % NBR_KEYS;
> - Drv->key_count--;
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11KeySetState (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> - IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> - if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) {
> - if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) {
> - //
> - // We could create an XKeyEvent and send a XK_Caps_Lock to
> - // the UGA/GOP Window
> - //
> - }
> - }
> -
> - Drv->KeyState.KeyToggleState = *KeyToggleState;
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11RegisterKeyNotify (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> - IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeCallBack,
> - IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakCallBack,
> - IN VOID *Context
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> - Drv->MakeRegisterdKeyCallback = MakeCallBack;
> - Drv->BreakRegisterdKeyCallback = BreakCallBack;
> - Drv->RegisterdKeyCallbackContext = Context;
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11Blt (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
> - IN EFI_UGA_BLT_OPERATION BltOperation,
> - IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Private;
> - UINTN DstY;
> - UINTN SrcY;
> - UINTN DstX;
> - UINTN SrcX;
> - UINTN Index;
> - EFI_UGA_PIXEL *Blt;
> - UINT8 *Dst;
> - UINT8 *Src;
> - UINTN Nbr;
> - unsigned long Color;
> - XEvent ev;
> -
> - Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> -
> - //
> - // Check bounds
> - //
> - if (BltOperation == EfiUgaVideoToBltBuffer
> - || BltOperation == EfiUgaVideoToVideo) {
> - //
> - // Source is Video.
> - //
> - if (Args->SourceY + Args->Height > Private->height) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (Args->SourceX + Args->Width > Private->width) {
> - return EFI_INVALID_PARAMETER;
> - }
> - }
> -
> - if (BltOperation == EfiUgaBltBufferToVideo
> - || BltOperation == EfiUgaVideoToVideo
> - || BltOperation == EfiUgaVideoFill) {
> - //
> - // Destination is Video
> - //
> - if (Args->DestinationY + Args->Height > Private->height) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (Args->DestinationX + Args->Width > Private->width) {
> - return EFI_INVALID_PARAMETER;
> - }
> - }
> -
> - switch (BltOperation) {
> - case EfiUgaVideoToBltBuffer:
> - Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args-
> >Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL));
> - Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
> - for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) {
> - for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) {
> - *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX, SrcY));
> - }
> - Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
> - }
> - break;
> - case EfiUgaBltBufferToVideo:
> - Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta)
> + Args->SourceX * sizeof (EFI_UGA_PIXEL));
> - Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
> - for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY);
> DstY++) {
> - for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX);
> DstX++) {
> - XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *Blt));
> - Blt++;
> - }
> - Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
> - }
> - break;
> - case EfiUgaVideoToVideo:
> - Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift)
> - + Args->DestinationY * Private->line_bytes;
> - Src = Private->image_data + (Args->SourceX << Private->pixel_shift)
> - + Args->SourceY * Private->line_bytes;
> - Nbr = Args->Width << Private->pixel_shift;
> - if (Args->DestinationY < Args->SourceY) {
> - for (Index = 0; Index < Args->Height; Index++) {
> - memcpy (Dst, Src, Nbr);
> - Dst += Private->line_bytes;
> - Src += Private->line_bytes;
> - }
> - } else {
> - Dst += (Args->Height - 1) * Private->line_bytes;
> - Src += (Args->Height - 1) * Private->line_bytes;
> - for (Index = 0; Index < Args->Height; Index++) {
> - //
> - // Source and Destination Y may be equal, therefore Dst and Src may
> - // overlap.
> - //
> - memmove (Dst, Src, Nbr);
> - Dst -= Private->line_bytes;
> - Src -= Private->line_bytes;
> - }
> - }
> - break;
> - case EfiUgaVideoFill:
> - Color = X11PixelToColor(Private, *BltBuffer);
> - for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY);
> DstY++) {
> - for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX);
> DstX++) {
> - XPutPixel(Private->image, DstX, DstY, Color);
> - }
> - }
> - break;
> - default:
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - //
> - // Refresh screen.
> - //
> - switch (BltOperation) {
> - case EfiUgaVideoToVideo:
> - XCopyArea(
> - Private->display, Private->win, Private->win, Private->gc,
> - Args->SourceX, Args->SourceY, Args->Width, Args->Height,
> - Args->DestinationX, Args->DestinationY
> - );
> -
> - while (1) {
> - XNextEvent (Private->display, &ev);
> - HandleEvent (Private, &ev);
> - if (ev.type == NoExpose || ev.type == GraphicsExpose) {
> - break;
> - }
> - }
> - break;
> - case EfiUgaVideoFill:
> - Color = X11PixelToColor (Private, *BltBuffer);
> - XSetForeground (Private->display, Private->gc, Color);
> - XFillRectangle (
> - Private->display, Private->win, Private->gc,
> - Args->DestinationX, Args->DestinationY, Args->Width, Args->Height
> - );
> - XFlush (Private->display);
> - break;
> - case EfiUgaBltBufferToVideo:
> - Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width,
> Args->Height);
> - break;
> - default:
> - break;
> - }
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11CheckPointer (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> - HandleEvents (Drv);
> - if (Drv->pointer_state_changed != 0) {
> - return EFI_SUCCESS;
> - }
> -
> - return EFI_NOT_READY;
> -}
> -
> -
> -EFI_STATUS
> -X11GetPointerState (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> - IN EFI_SIMPLE_POINTER_STATE *State
> - )
> -{
> - EFI_STATUS EfiStatus;
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> - EfiStatus = X11CheckPointer (GraphicsIo);
> - if (EfiStatus != EFI_SUCCESS) {
> - return EfiStatus;
> - }
> -
> - memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE));
> -
> - Drv->pointer_state.RelativeMovementX = 0;
> - Drv->pointer_state.RelativeMovementY = 0;
> - Drv->pointer_state.RelativeMovementZ = 0;
> - Drv->pointer_state_changed = 0;
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -EFI_STATUS
> -X11GraphicsWindowOpen (
> - IN EMU_IO_THUNK_PROTOCOL *This
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> - unsigned int border_width = 0;
> - char *display_name = NULL;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE));
> - if (Drv == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Drv->GraphicsIo.Size = GasketX11Size;
> - Drv->GraphicsIo.CheckKey = GasketX11CheckKey;
> - Drv->GraphicsIo.GetKey = GasketX11GetKey;
> - Drv->GraphicsIo.KeySetState = GasketX11KeySetState;
> - Drv->GraphicsIo.RegisterKeyNotify = GasketX11RegisterKeyNotify;
> - Drv->GraphicsIo.Blt = GasketX11Blt;
> - Drv->GraphicsIo.CheckPointer = GasketX11CheckPointer;
> - Drv->GraphicsIo.GetPointerState = GasketX11GetPointerState;
> -
> -
> - Drv->key_count = 0;
> - Drv->key_rd = 0;
> - Drv->key_wr = 0;
> - Drv->KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;
> - Drv->KeyState.KeyToggleState = EFI_TOGGLE_STATE_VALID;
> - Drv->MakeRegisterdKeyCallback = NULL;
> - Drv->BreakRegisterdKeyCallback = NULL;
> - Drv->RegisterdKeyCallbackContext = NULL;
> -
> -
> - Drv->display = XOpenDisplay (display_name);
> - if (Drv->display == NULL) {
> - fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName
> (display_name));
> - free (Drv);
> - return EFI_DEVICE_ERROR;
> - }
> - Drv->screen = DefaultScreen (Drv->display);
> - Drv->visual = DefaultVisual (Drv->display, Drv->screen);
> - Drv->win = XCreateSimpleWindow (
> - Drv->display, RootWindow (Drv->display, Drv->screen),
> - 0, 0, 4, 4, border_width,
> - WhitePixel (Drv->display, Drv->screen),
> - BlackPixel (Drv->display, Drv->screen)
> - );
> -
> - Drv->depth = DefaultDepth (Drv->display, Drv->screen);
> - XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display,
> XC_pirate));
> -
> - Drv->Title = malloc (StrSize (This->ConfigString));
> - UnicodeStrToAsciiStr (This->ConfigString, Drv->Title);
> - XStoreName (Drv->display, Drv->win, Drv->Title);
> -
> -// XAutoRepeatOff (Drv->display);
> - XSelectInput (
> - Drv->display, Drv->win,
> - ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask |
> ButtonPressMask | ButtonReleaseMask
> - );
> - Drv->gc = DefaultGC (Drv->display, Drv->screen);
> -
> - This->Private = (VOID *)Drv;
> - This->Interface = (VOID *)Drv;
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11GraphicsWindowClose (
> - IN EMU_IO_THUNK_PROTOCOL *This
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)This->Private;
> -
> - if (Drv == NULL) {
> - return EFI_SUCCESS;
> - }
> -
> - if (Drv->image != NULL) {
> - XDestroyImage(Drv->image);
> -
> - if (Drv->use_shm) {
> - shmdt (Drv->image_data);
> - }
> -
> - Drv->image_data = NULL;
> - Drv->image = NULL;
> - }
> - XDestroyWindow (Drv->display, Drv->win);
> - XCloseDisplay (Drv->display);
> -
> -#ifdef __APPLE__
> - // Free up the shared memory
> - shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> -#endif
> -
> - free (Drv);
> - return EFI_SUCCESS;
> -}
> -
> -
> -EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
> - &gEmuGraphicsWindowProtocolGuid,
> - NULL,
> - NULL,
> - 0,
> - GasketX11GraphicsWindowOpen,
> - GasketX11GraphicsWindowClose,
> - NULL
> -};
> -
> -
> +/*++ @file
> +
> +Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> +
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include "Host.h"
> +
> +#include <sys/ipc.h>
> +#include <sys/shm.h>
> +
> +#include <X11/Xlib.h>
> +#include <X11/Xutil.h>
> +#include <X11/Xos.h>
> +#include <X11/extensions/XShm.h>
> +#include <X11/keysym.h>
> +#include <X11/cursorfont.h>
> +
> +#define KEYSYM_LOWER 0
> +#define KEYSYM_UPPER 1
> +
> +
> +struct uga_drv_shift_mask {
> + unsigned char shift;
> + unsigned char size;
> + unsigned char csize;
> +};
> +
> +#define NBR_KEYS 32
> +typedef struct {
> + EMU_GRAPHICS_WINDOW_PROTOCOL GraphicsIo;
> +
> + Display *display;
> + int screen; // values for window_size in main
> + Window win;
> + GC gc;
> + Visual *visual;
> +
> + int depth;
> + unsigned int width;
> + unsigned int height;
> + unsigned int line_bytes;
> + unsigned int pixel_shift;
> + unsigned char *image_data;
> +
> + struct uga_drv_shift_mask r, g, b;
> +
> + int use_shm;
> + XShmSegmentInfo xshm_info;
> + XImage *image;
> + char *Title;
> +
> + unsigned int key_rd;
> + unsigned int key_wr;
> + unsigned int key_count;
> + EFI_KEY_DATA keys[NBR_KEYS];
> +
> + EFI_KEY_STATE KeyState;
> +
> + EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeRegisterdKeyCallback;
> + EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakRegisterdKeyCallback;
> + VOID *RegisterdKeyCallbackContext;
> +
> + int previous_x;
> + int previous_y;
> + EFI_SIMPLE_POINTER_STATE pointer_state;
> + int pointer_state_changed;
> +} GRAPHICS_IO_PRIVATE;
> +
> +void
> +HandleEvents(
> + IN GRAPHICS_IO_PRIVATE *Drv
> + );
> +
> +void
> +fill_shift_mask (
> + IN struct uga_drv_shift_mask *sm,
> + IN unsigned long mask
> + )
> +{
> + sm->shift = 0;
> + sm->size = 0;
> + while ((mask & 1) == 0) {
> + mask >>= 1;
> + sm->shift++;
> + }
> + while (mask & 1) {
> + sm->size++;
> + mask >>= 1;
> + }
> + sm->csize = 8 - sm->size;
> +}
> +
> +int
> +TryCreateShmImage (
> + IN GRAPHICS_IO_PRIVATE *Drv
> + )
> +{
> + Drv->image = XShmCreateImage (
> + Drv->display, Drv->visual,
> + Drv->depth, ZPixmap, NULL, &Drv->xshm_info,
> + Drv->width, Drv->height
> + );
> + if (Drv->image == NULL) {
> + return 0;
> + }
> +
> + switch (Drv->image->bitmap_unit) {
> + case 32:
> + Drv->pixel_shift = 2;
> + break;
> + case 16:
> + Drv->pixel_shift = 1;
> + break;
> + case 8:
> + Drv->pixel_shift = 0;
> + break;
> + }
> +
> + Drv->xshm_info.shmid = shmget (
> + IPC_PRIVATE, Drv->image->bytes_per_line * Drv->image-
> >height,
> + IPC_CREAT | 0777
> + );
> + if (Drv->xshm_info.shmid < 0) {
> + XDestroyImage(Drv->image);
> + return 0;
> + }
> +
> + Drv->image_data = shmat (Drv->xshm_info.shmid, NULL, 0);
> + if(!Drv->image_data) {
> + shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> + XDestroyImage(Drv->image);
> + return 0;
> + }
> +
> +#ifndef __APPLE__
> + //
> + // This closes shared memory in real time on OS X. Only closes after folks
> quit using
> + // it on Linux.
> + //
> + shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> +#endif
> +
> + Drv->xshm_info.shmaddr = (char*)Drv->image_data;
> + Drv->image->data = (char*)Drv->image_data;
> +
> + if (!XShmAttach (Drv->display, &Drv->xshm_info)) {
> + shmdt (Drv->image_data);
> + XDestroyImage(Drv->image);
> + return 0;
> + }
> + return 1;
> +}
> +
> +
> +EFI_STATUS
> +X11Size (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> + IN UINT32 Width,
> + IN UINT32 Height
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> + XSizeHints size_hints;
> +
> + // Destroy current buffer if created.
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> + if (Drv->image != NULL) {
> + // Before destroy buffer, need to make sure the buffer available for access.
> + XDestroyImage (Drv->image);
> +
> + if (Drv->use_shm) {
> + shmdt (Drv->image_data);
> + }
> +
> + Drv->image_data = NULL;
> + Drv->image = NULL;
> + }
> +
> + Drv->width = Width;
> + Drv->height = Height;
> + XResizeWindow (Drv->display, Drv->win, Width, Height);
> +
> + // Allocate image.
> + if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) {
> + Drv->use_shm = 1;
> + } else {
> + Drv->use_shm = 0;
> + if (Drv->depth > 16) {
> + Drv->pixel_shift = 2;
> + } else if (Drv->depth > 8) {
> + Drv->pixel_shift = 1;
> + } else {
> + Drv->pixel_shift = 0;
> + }
> +
> + Drv->image_data = malloc ((Drv->width * Drv->height) << Drv->pixel_shift);
> + Drv->image = XCreateImage (
> + Drv->display, Drv->visual, Drv->depth,
> + ZPixmap, 0, (char *)Drv->image_data,
> + Drv->width, Drv->height,
> + 8 << Drv->pixel_shift, 0
> + );
> + }
> +
> + Drv->line_bytes = Drv->image->bytes_per_line;
> +
> + fill_shift_mask (&Drv->r, Drv->image->red_mask);
> + fill_shift_mask (&Drv->g, Drv->image->green_mask);
> + fill_shift_mask (&Drv->b, Drv->image->blue_mask);
> +
> + // Set WM hints.
> + size_hints.flags = PSize | PMinSize | PMaxSize;
> + size_hints.min_width = size_hints.max_width = size_hints.base_width = Width;
> + size_hints.min_height = size_hints.max_height = size_hints.base_height =
> Height;
> + XSetWMNormalHints (Drv->display, Drv->win, &size_hints);
> +
> + XMapWindow (Drv->display, Drv->win);
> + HandleEvents (Drv);
> + return EFI_SUCCESS;
> +}
> +
> +void
> +handleKeyEvent (
> + IN GRAPHICS_IO_PRIVATE *Drv,
> + IN XEvent *ev,
> + IN BOOLEAN Make
> + )
> +{
> + KeySym *KeySym;
> + EFI_KEY_DATA KeyData;
> + int KeySymArraySize;
> +
> + if (Make) {
> + if (Drv->key_count == NBR_KEYS) {
> + return;
> + }
> + }
> +
> + // keycode is a physical key on the keyboard
> + // KeySym is a mapping of a physical key
> + // KeyboardMapping is the array of KeySym for a given keycode. key, shifted
> key, option key, command key, ...
> + //
> + // Returns an array of KeySymArraySize of KeySym for the keycode. [0] is
> lower case, [1] is upper case,
> + // [2] and [3] are based on option and command modifiers. The problem we
> have is command V
> + // could be mapped to a crazy Unicode character so the old scheme of
> returning a string.
> + //
> + KeySym = XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1,
> &KeySymArraySize);
> +
> + KeyData.Key.ScanCode = 0;
> + KeyData.Key.UnicodeChar = 0;
> + KeyData.KeyState.KeyShiftState = 0;
> +
> + //
> + // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they
> are not on Macs
> + //
> + if ((ev->xkey.state & LockMask) == 0) {
> + Drv->KeyState.KeyToggleState &= ~EFI_CAPS_LOCK_ACTIVE;
> + } else {
> + if (Make) {
> + Drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;
> + }
> + }
> +
> + // Skipping EFI_MENU_KEY_PRESSED and EFI_SYS_REQ_PRESSED
> +
> + switch (*KeySym) {
> + case XK_Control_R:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_RIGHT_CONTROL_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_CONTROL_PRESSED;
> + }
> + break;
> + case XK_Control_L:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_LEFT_CONTROL_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_LEFT_CONTROL_PRESSED;
> + }
> + break;
> +
> + case XK_Shift_R:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_RIGHT_SHIFT_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_SHIFT_PRESSED;
> + }
> + break;
> + case XK_Shift_L:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_LEFT_SHIFT_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_LEFT_SHIFT_PRESSED;
> + }
> + break;
> +
> + case XK_Mode_switch:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_LEFT_ALT_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_LEFT_ALT_PRESSED;
> + }
> + break;
> +
> + case XK_Meta_R:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_RIGHT_LOGO_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_LOGO_PRESSED;
> + }
> + break;
> + case XK_Meta_L:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_LEFT_LOGO_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_LEFT_LOGO_PRESSED;
> + }
> + break;
> +
> + case XK_KP_Home:
> + case XK_Home: KeyData.Key.ScanCode = SCAN_HOME; break;
> +
> + case XK_KP_End:
> + case XK_End: KeyData.Key.ScanCode = SCAN_END; break;
> +
> + case XK_KP_Left:
> + case XK_Left: KeyData.Key.ScanCode = SCAN_LEFT; break;
> +
> + case XK_KP_Right:
> + case XK_Right: KeyData.Key.ScanCode = SCAN_RIGHT; break;
> +
> + case XK_KP_Up:
> + case XK_Up: KeyData.Key.ScanCode = SCAN_UP; break;
> +
> + case XK_KP_Down:
> + case XK_Down: KeyData.Key.ScanCode = SCAN_DOWN; break;
> +
> + case XK_KP_Delete:
> + case XK_Delete: KeyData.Key.ScanCode = SCAN_DELETE; break;
> +
> + case XK_KP_Insert:
> + case XK_Insert: KeyData.Key.ScanCode = SCAN_INSERT; break;
> +
> + case XK_KP_Page_Up:
> + case XK_Page_Up: KeyData.Key.ScanCode = SCAN_PAGE_UP; break;
> +
> + case XK_KP_Page_Down:
> + case XK_Page_Down: KeyData.Key.ScanCode = SCAN_PAGE_DOWN; break;
> +
> + case XK_Escape: KeyData.Key.ScanCode = SCAN_ESC; break;
> +
> + case XK_Pause: KeyData.Key.ScanCode = SCAN_PAUSE; break;
> +
> + case XK_KP_F1:
> + case XK_F1: KeyData.Key.ScanCode = SCAN_F1; break;
> +
> + case XK_KP_F2:
> + case XK_F2: KeyData.Key.ScanCode = SCAN_F2; break;
> +
> + case XK_KP_F3:
> + case XK_F3: KeyData.Key.ScanCode = SCAN_F3; break;
> +
> + case XK_KP_F4:
> + case XK_F4: KeyData.Key.ScanCode = SCAN_F4; break;
> +
> + case XK_F5: KeyData.Key.ScanCode = SCAN_F5; break;
> + case XK_F6: KeyData.Key.ScanCode = SCAN_F6; break;
> + case XK_F7: KeyData.Key.ScanCode = SCAN_F7; break;
> +
> + // Don't map into X11 by default on a Mac
> + // System Preferences->Keyboard->Keyboard Shortcuts can be configured
> + // to not use higher function keys as shortcuts and the will show up
> + // in X11.
> + case XK_F8: KeyData.Key.ScanCode = SCAN_F8; break;
> + case XK_F9: KeyData.Key.ScanCode = SCAN_F9; break;
> + case XK_F10: KeyData.Key.ScanCode = SCAN_F10; break;
> +
> + case XK_F11: KeyData.Key.ScanCode = SCAN_F11; break;
> + case XK_F12: KeyData.Key.ScanCode = SCAN_F12; break;
> +
> + case XK_F13: KeyData.Key.ScanCode = SCAN_F13; break;
> + case XK_F14: KeyData.Key.ScanCode = SCAN_F14; break;
> + case XK_F15: KeyData.Key.ScanCode = SCAN_F15; break;
> + case XK_F16: KeyData.Key.ScanCode = SCAN_F16; break;
> + case XK_F17: KeyData.Key.ScanCode = SCAN_F17; break;
> + case XK_F18: KeyData.Key.ScanCode = SCAN_F18; break;
> + case XK_F19: KeyData.Key.ScanCode = SCAN_F19; break;
> + case XK_F20: KeyData.Key.ScanCode = SCAN_F20; break;
> + case XK_F21: KeyData.Key.ScanCode = SCAN_F21; break;
> + case XK_F22: KeyData.Key.ScanCode = SCAN_F22; break;
> + case XK_F23: KeyData.Key.ScanCode = SCAN_F23; break;
> + case XK_F24: KeyData.Key.ScanCode = SCAN_F24; break;
> +
> + // No mapping in X11
> + //case XK_: KeyData.Key.ScanCode = SCAN_MUTE; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_UP; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_DOWN; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_UP; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_DOWN; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_SUSPEND; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_HIBERNATE; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_TOGGLE_DISPLAY; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_RECOVERY; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_EJECT; break;
> +
> + case XK_BackSpace: KeyData.Key.UnicodeChar = 0x0008; break;
> +
> + case XK_KP_Tab:
> + case XK_Tab: KeyData.Key.UnicodeChar = 0x0009; break;
> +
> + case XK_Linefeed: KeyData.Key.UnicodeChar = 0x000a; break;
> +
> + case XK_KP_Enter:
> + case XK_Return: KeyData.Key.UnicodeChar = 0x000d; break;
> +
> + case XK_KP_Equal : KeyData.Key.UnicodeChar = L'='; break;
> + case XK_KP_Multiply : KeyData.Key.UnicodeChar = L'*'; break;
> + case XK_KP_Add : KeyData.Key.UnicodeChar = L'+'; break;
> + case XK_KP_Separator : KeyData.Key.UnicodeChar = L'~'; break;
> + case XK_KP_Subtract : KeyData.Key.UnicodeChar = L'-'; break;
> + case XK_KP_Decimal : KeyData.Key.UnicodeChar = L'.'; break;
> + case XK_KP_Divide : KeyData.Key.UnicodeChar = L'/'; break;
> +
> + case XK_KP_0 : KeyData.Key.UnicodeChar = L'0'; break;
> + case XK_KP_1 : KeyData.Key.UnicodeChar = L'1'; break;
> + case XK_KP_2 : KeyData.Key.UnicodeChar = L'2'; break;
> + case XK_KP_3 : KeyData.Key.UnicodeChar = L'3'; break;
> + case XK_KP_4 : KeyData.Key.UnicodeChar = L'4'; break;
> + case XK_KP_5 : KeyData.Key.UnicodeChar = L'5'; break;
> + case XK_KP_6 : KeyData.Key.UnicodeChar = L'6'; break;
> + case XK_KP_7 : KeyData.Key.UnicodeChar = L'7'; break;
> + case XK_KP_8 : KeyData.Key.UnicodeChar = L'8'; break;
> + case XK_KP_9 : KeyData.Key.UnicodeChar = L'9'; break;
> +
> + default:
> + ;
> + }
> +
> + // The global state is our state
> + KeyData.KeyState.KeyShiftState = Drv->KeyState.KeyShiftState;
> + KeyData.KeyState.KeyToggleState = Drv->KeyState.KeyToggleState;
> +
> + if (*KeySym < XK_BackSpace) {
> + if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED |
> EFI_RIGHT_SHIFT_PRESSED)) != 0) ||
> + ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) != 0) ) {
> +
> + KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_UPPER];
> +
> + // Per UEFI spec since we converted the Unicode clear the shift bits we
> pass up
> + KeyData.KeyState.KeyShiftState &= ~(EFI_LEFT_SHIFT_PRESSED |
> EFI_RIGHT_SHIFT_PRESSED);
> + } else {
> + KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_LOWER];
> + }
> + } else {
> + // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? keys
> we process in this file
> + ;
> + }
> +
> + if (Make) {
> + memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));
> + Drv->key_wr = (Drv->key_wr + 1) % NBR_KEYS;
> + Drv->key_count++;
> + if (Drv->MakeRegisterdKeyCallback != NULL) {
> + ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv-
> >RegisterdKeyCallbackContext, &KeyData);
> + }
> + } else {
> + if (Drv->BreakRegisterdKeyCallback != NULL) {
> + ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv-
> >RegisterdKeyCallbackContext, &KeyData);
> + }
> + }
> +}
> +
> +
> +void
> +handleMouseMoved(
> + IN GRAPHICS_IO_PRIVATE *Drv,
> + IN XEvent *ev
> + )
> +{
> + if (ev->xmotion.x != Drv->previous_x) {
> + Drv->pointer_state.RelativeMovementX += ( ev->xmotion.x - Drv-
> >previous_x );
> + Drv->previous_x = ev->xmotion.x;
> + Drv->pointer_state_changed = 1;
> + }
> +
> + if (ev->xmotion.y != Drv->previous_y) {
> + Drv->pointer_state.RelativeMovementY += ( ev->xmotion.y - Drv-
> >previous_y );
> + Drv->previous_y = ev->xmotion.y;
> + Drv->pointer_state_changed = 1;
> + }
> +
> + Drv->pointer_state.RelativeMovementZ = 0;
> +}
> +
> +void
> +handleMouseDown (
> + IN GRAPHICS_IO_PRIVATE *Drv,
> + IN XEvent *ev,
> + IN BOOLEAN Pressed
> + )
> +{
> + if (ev->xbutton.button == Button1) {
> + Drv->pointer_state_changed = (Drv->pointer_state.LeftButton != Pressed);
> + Drv->pointer_state.LeftButton = Pressed;
> + }
> + if ( ev->xbutton.button == Button2 ) {
> + Drv->pointer_state_changed = (Drv->pointer_state.RightButton != Pressed);
> + Drv->pointer_state.RightButton = Pressed;
> + }
> +}
> +
> +void
> +Redraw (
> + IN GRAPHICS_IO_PRIVATE *Drv,
> + IN UINTN X,
> + IN UINTN Y,
> + IN UINTN Width,
> + IN UINTN Height
> + )
> +{
> + if (Drv->use_shm) {
> + XShmPutImage (
> + Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height,
> False
> + );
> + } else {
> + XPutImage (
> + Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height
> + );
> + }
> + XFlush(Drv->display);
> +}
> +
> +void
> +HandleEvent(GRAPHICS_IO_PRIVATE *Drv, XEvent *ev)
> +{
> + switch (ev->type) {
> + case Expose:
> + Redraw (Drv, ev->xexpose.x, ev->xexpose.y,
> + ev->xexpose.width, ev->xexpose.height);
> + break;
> + case GraphicsExpose:
> + Redraw (Drv, ev->xgraphicsexpose.x, ev->xgraphicsexpose.y,
> + ev->xgraphicsexpose.width, ev->xgraphicsexpose.height);
> + break;
> + case KeyPress:
> + handleKeyEvent (Drv, ev, TRUE);
> + break;
> + case KeyRelease:
> + handleKeyEvent (Drv, ev, FALSE);
> + break;
> + case MappingNotify:
> + XRefreshKeyboardMapping (&ev->xmapping);
> + break;
> + case MotionNotify:
> + handleMouseMoved (Drv, ev);
> + break;
> + case ButtonPress:
> + handleMouseDown (Drv, ev, TRUE);
> + break;
> + case ButtonRelease:
> + handleMouseDown (Drv, ev, FALSE);
> + break;
> +#if 0
> + case DestroyNotify:
> + XCloseDisplay (Drv->display);
> + exit (1);
> + break;
> +#endif
> + case NoExpose:
> + default:
> + break;
> + }
> +}
> +
> +void
> +HandleEvents (
> + IN GRAPHICS_IO_PRIVATE *Drv
> + )
> +{
> + XEvent ev;
> +
> + while (XPending (Drv->display) != 0) {
> + XNextEvent (Drv->display, &ev);
> + HandleEvent (Drv, &ev);
> + }
> +}
> +
> +unsigned long
> +X11PixelToColor (
> + IN GRAPHICS_IO_PRIVATE *Drv,
> + IN EFI_UGA_PIXEL pixel
> + )
> +{
> + return ((pixel.Red >> Drv->r.csize) << Drv->r.shift)
> + | ((pixel.Green >> Drv->g.csize) << Drv->g.shift)
> + | ((pixel.Blue >> Drv->b.csize) << Drv->b.shift);
> +}
> +
> +EFI_UGA_PIXEL
> +X11ColorToPixel (
> + IN GRAPHICS_IO_PRIVATE *Drv,
> + IN unsigned long val
> + )
> +{
> + EFI_UGA_PIXEL Pixel;
> +
> + memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL));
> +
> + // Truncation not an issue since X11 and EFI are both using 8 bits per color
> + Pixel.Red = (val >> Drv->r.shift) << Drv->r.csize;
> + Pixel.Green = (val >> Drv->g.shift) << Drv->g.csize;
> + Pixel.Blue = (val >> Drv->b.shift) << Drv->b.csize;
> +
> + return Pixel;
> +}
> +
> +
> +EFI_STATUS
> +X11CheckKey (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> + HandleEvents (Drv);
> +
> + if (Drv->key_count != 0) {
> + return EFI_SUCCESS;
> + }
> +
> + return EFI_NOT_READY;
> +}
> +
> +EFI_STATUS
> +X11GetKey (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> + IN EFI_KEY_DATA *KeyData
> + )
> +{
> + EFI_STATUS EfiStatus;
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> + EfiStatus = X11CheckKey (GraphicsIo);
> + if (EFI_ERROR (EfiStatus)) {
> + return EfiStatus;
> + }
> +
> + CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA));
> + Drv->key_rd = (Drv->key_rd + 1) % NBR_KEYS;
> + Drv->key_count--;
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11KeySetState (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> + IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> + if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) {
> + if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) {
> + //
> + // We could create an XKeyEvent and send a XK_Caps_Lock to
> + // the UGA/GOP Window
> + //
> + }
> + }
> +
> + Drv->KeyState.KeyToggleState = *KeyToggleState;
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11RegisterKeyNotify (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> + IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeCallBack,
> + IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakCallBack,
> + IN VOID *Context
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> + Drv->MakeRegisterdKeyCallback = MakeCallBack;
> + Drv->BreakRegisterdKeyCallback = BreakCallBack;
> + Drv->RegisterdKeyCallbackContext = Context;
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11Blt (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> + IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
> + IN EFI_UGA_BLT_OPERATION BltOperation,
> + IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Private;
> + UINTN DstY;
> + UINTN SrcY;
> + UINTN DstX;
> + UINTN SrcX;
> + UINTN Index;
> + EFI_UGA_PIXEL *Blt;
> + UINT8 *Dst;
> + UINT8 *Src;
> + UINTN Nbr;
> + unsigned long Color;
> + XEvent ev;
> +
> + Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> +
> + //
> + // Check bounds
> + //
> + if (BltOperation == EfiUgaVideoToBltBuffer
> + || BltOperation == EfiUgaVideoToVideo) {
> + //
> + // Source is Video.
> + //
> + if (Args->SourceY + Args->Height > Private->height) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (Args->SourceX + Args->Width > Private->width) {
> + return EFI_INVALID_PARAMETER;
> + }
> + }
> +
> + if (BltOperation == EfiUgaBltBufferToVideo
> + || BltOperation == EfiUgaVideoToVideo
> + || BltOperation == EfiUgaVideoFill) {
> + //
> + // Destination is Video
> + //
> + if (Args->DestinationY + Args->Height > Private->height) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (Args->DestinationX + Args->Width > Private->width) {
> + return EFI_INVALID_PARAMETER;
> + }
> + }
> +
> + switch (BltOperation) {
> + case EfiUgaVideoToBltBuffer:
> + Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args-
> >Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL));
> + Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
> + for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) {
> + for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) {
> + *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX,
> SrcY));
> + }
> + Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
> + }
> + break;
> + case EfiUgaBltBufferToVideo:
> + Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta)
> + Args->SourceX * sizeof (EFI_UGA_PIXEL));
> + Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
> + for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY);
> DstY++) {
> + for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX);
> DstX++) {
> + XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *Blt));
> + Blt++;
> + }
> + Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
> + }
> + break;
> + case EfiUgaVideoToVideo:
> + Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift)
> + + Args->DestinationY * Private->line_bytes;
> + Src = Private->image_data + (Args->SourceX << Private->pixel_shift)
> + + Args->SourceY * Private->line_bytes;
> + Nbr = Args->Width << Private->pixel_shift;
> + if (Args->DestinationY < Args->SourceY) {
> + for (Index = 0; Index < Args->Height; Index++) {
> + memcpy (Dst, Src, Nbr);
> + Dst += Private->line_bytes;
> + Src += Private->line_bytes;
> + }
> + } else {
> + Dst += (Args->Height - 1) * Private->line_bytes;
> + Src += (Args->Height - 1) * Private->line_bytes;
> + for (Index = 0; Index < Args->Height; Index++) {
> + //
> + // Source and Destination Y may be equal, therefore Dst and Src may
> + // overlap.
> + //
> + memmove (Dst, Src, Nbr);
> + Dst -= Private->line_bytes;
> + Src -= Private->line_bytes;
> + }
> + }
> + break;
> + case EfiUgaVideoFill:
> + Color = X11PixelToColor(Private, *BltBuffer);
> + for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY);
> DstY++) {
> + for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX);
> DstX++) {
> + XPutPixel(Private->image, DstX, DstY, Color);
> + }
> + }
> + break;
> + default:
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + //
> + // Refresh screen.
> + //
> + switch (BltOperation) {
> + case EfiUgaVideoToVideo:
> + XCopyArea(
> + Private->display, Private->win, Private->win, Private->gc,
> + Args->SourceX, Args->SourceY, Args->Width, Args->Height,
> + Args->DestinationX, Args->DestinationY
> + );
> +
> + while (1) {
> + XNextEvent (Private->display, &ev);
> + HandleEvent (Private, &ev);
> + if (ev.type == NoExpose || ev.type == GraphicsExpose) {
> + break;
> + }
> + }
> + break;
> + case EfiUgaVideoFill:
> + Color = X11PixelToColor (Private, *BltBuffer);
> + XSetForeground (Private->display, Private->gc, Color);
> + XFillRectangle (
> + Private->display, Private->win, Private->gc,
> + Args->DestinationX, Args->DestinationY, Args->Width, Args->Height
> + );
> + XFlush (Private->display);
> + break;
> + case EfiUgaBltBufferToVideo:
> + Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width,
> Args->Height);
> + break;
> + default:
> + break;
> + }
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11CheckPointer (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> + HandleEvents (Drv);
> + if (Drv->pointer_state_changed != 0) {
> + return EFI_SUCCESS;
> + }
> +
> + return EFI_NOT_READY;
> +}
> +
> +
> +EFI_STATUS
> +X11GetPointerState (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> + IN EFI_SIMPLE_POINTER_STATE *State
> + )
> +{
> + EFI_STATUS EfiStatus;
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> + EfiStatus = X11CheckPointer (GraphicsIo);
> + if (EfiStatus != EFI_SUCCESS) {
> + return EfiStatus;
> + }
> +
> + memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE));
> +
> + Drv->pointer_state.RelativeMovementX = 0;
> + Drv->pointer_state.RelativeMovementY = 0;
> + Drv->pointer_state.RelativeMovementZ = 0;
> + Drv->pointer_state_changed = 0;
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +EFI_STATUS
> +X11GraphicsWindowOpen (
> + IN EMU_IO_THUNK_PROTOCOL *This
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> + unsigned int border_width = 0;
> + char *display_name = NULL;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE));
> + if (Drv == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + Drv->GraphicsIo.Size = GasketX11Size;
> + Drv->GraphicsIo.CheckKey = GasketX11CheckKey;
> + Drv->GraphicsIo.GetKey = GasketX11GetKey;
> + Drv->GraphicsIo.KeySetState = GasketX11KeySetState;
> + Drv->GraphicsIo.RegisterKeyNotify = GasketX11RegisterKeyNotify;
> + Drv->GraphicsIo.Blt = GasketX11Blt;
> + Drv->GraphicsIo.CheckPointer = GasketX11CheckPointer;
> + Drv->GraphicsIo.GetPointerState = GasketX11GetPointerState;
> +
> +
> + Drv->key_count = 0;
> + Drv->key_rd = 0;
> + Drv->key_wr = 0;
> + Drv->KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;
> + Drv->KeyState.KeyToggleState = EFI_TOGGLE_STATE_VALID;
> + Drv->MakeRegisterdKeyCallback = NULL;
> + Drv->BreakRegisterdKeyCallback = NULL;
> + Drv->RegisterdKeyCallbackContext = NULL;
> +
> +
> + Drv->display = XOpenDisplay (display_name);
> + if (Drv->display == NULL) {
> + fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName
> (display_name));
> + free (Drv);
> + return EFI_DEVICE_ERROR;
> + }
> + Drv->screen = DefaultScreen (Drv->display);
> + Drv->visual = DefaultVisual (Drv->display, Drv->screen);
> + Drv->win = XCreateSimpleWindow (
> + Drv->display, RootWindow (Drv->display, Drv->screen),
> + 0, 0, 4, 4, border_width,
> + WhitePixel (Drv->display, Drv->screen),
> + BlackPixel (Drv->display, Drv->screen)
> + );
> +
> + Drv->depth = DefaultDepth (Drv->display, Drv->screen);
> + XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display,
> XC_pirate));
> +
> + Drv->Title = malloc (StrSize (This->ConfigString));
> + UnicodeStrToAsciiStr (This->ConfigString, Drv->Title);
> + XStoreName (Drv->display, Drv->win, Drv->Title);
> +
> +// XAutoRepeatOff (Drv->display);
> + XSelectInput (
> + Drv->display, Drv->win,
> + ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask |
> ButtonPressMask | ButtonReleaseMask
> + );
> + Drv->gc = DefaultGC (Drv->display, Drv->screen);
> +
> + This->Private = (VOID *)Drv;
> + This->Interface = (VOID *)Drv;
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11GraphicsWindowClose (
> + IN EMU_IO_THUNK_PROTOCOL *This
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)This->Private;
> +
> + if (Drv == NULL) {
> + return EFI_SUCCESS;
> + }
> +
> + if (Drv->image != NULL) {
> + XDestroyImage(Drv->image);
> +
> + if (Drv->use_shm) {
> + shmdt (Drv->image_data);
> + }
> +
> + Drv->image_data = NULL;
> + Drv->image = NULL;
> + }
> + XDestroyWindow (Drv->display, Drv->win);
> + XCloseDisplay (Drv->display);
> +
> +#ifdef __APPLE__
> + // Free up the shared memory
> + shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> +#endif
> +
> + free (Drv);
> + return EFI_SUCCESS;
> +}
> +
> +
> +EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
> + &gEmuGraphicsWindowProtocolGuid,
> + NULL,
> + NULL,
> + 0,
> + GasketX11GraphicsWindowOpen,
> + GasketX11GraphicsWindowClose,
> + NULL
> +};
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/X64/Gasket.S
> b/EmulatorPkg/Unix/Host/X64/Gasket.S
> index c339461cd8..118a218818 100644
> --- a/EmulatorPkg/Unix/Host/X64/Gasket.S
> +++ b/EmulatorPkg/Unix/Host/X64/Gasket.S
> @@ -1,1631 +1,1631 @@
> -#------------------------------------------------------------------------------
> -#
> -# Manage differenced between UNIX ABI and EFI/Windows ABI
> -#
> -# EFI Arg passing: RCX, RDX, R8, R9
> -# Callee allocates 32 bytes on stack to spill registers
> -# UNIX Arg passing: RDI, RSI, RDX, RCX, R8, R9
> -# RSI, RDI calle-save on EFI, scatch on UNIX callign
> -#
> -# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> -# This program and the accompanying materials
> -# are licensed and made available under the terms and conditions of the BSD
> License
> -# which accompanies this distribution. The full text of the license may be
> found at
> -# http://opensource.org/licenses/bsd-license.php
> -#
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -#
> -#------------------------------------------------------------------------------
> -
> -//
> -// Gaskets are EFI ABI to UNIX ABI calls
> -// EFI ABI code will sub 40 (0x28) from %rsp before calling a function
> -// This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16
> byte boundry.
> -//
> - .text
> -
> -// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry
> -// Any call with 0 - 4 arguments allocates 40 bytes on the stack.
> -// For more than 4 args you always have to increase in quanta of 16 so 5 or 6
> args is 56,
> -// 7 or 8 args is 72, and 9 or 10 args is 88
> -
> -
> -
> - .text
> -
> -//
> -// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
> -//
> -
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
> -ASM_PFX(GasketSecWriteStdErr):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecWriteStdErr)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
> -ASM_PFX(GasketSecConfigStdIn):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - call ASM_PFX(SecConfigStdIn)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
> -ASM_PFX(GasketSecWriteStdOut):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecWriteStdOut)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
> -ASM_PFX(GasketSecReadStdIn):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecReadStdIn)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
> -ASM_PFX(GasketSecPollStdIn):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - call ASM_PFX(SecPollStdIn)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecMalloc)
> -ASM_PFX(GasketSecMalloc):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(SecMalloc)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecValloc)
> -ASM_PFX(GasketSecValloc):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(SecValloc)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecFree)
> -ASM_PFX(GasketSecFree):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(SecFree)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
> -ASM_PFX(GasketSecSetTimer):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecSetTimer)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
> -ASM_PFX(GasketSecEnableInterrupt):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - call ASM_PFX(SecEnableInterrupt)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
> -ASM_PFX(GasketSecDisableInterrupt):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - call ASM_PFX(SecDisableInterrupt)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
> -ASM_PFX(GasketQueryPerformanceFrequency):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - call ASM_PFX(QueryPerformanceFrequency)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
> -ASM_PFX(GasketQueryPerformanceCounter):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - call ASM_PFX(QueryPerformanceCounter)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSleep)
> -ASM_PFX(GasketSecSleep):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(SecSleep)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
> -ASM_PFX(GasketSecCpuSleep):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - call ASM_PFX(SecCpuSleep)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecExit)
> -ASM_PFX(GasketSecExit):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - movq %rcx, %rdi // Swizzle args
> - call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI
> world
> -LDEAD_LOOP:
> - jmp LDEAD_LOOP // _exit should never return
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecGetTime)
> -ASM_PFX(GasketSecGetTime):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecGetTime)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSetTime)
> -ASM_PFX(GasketSecSetTime):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecSetTime)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
> -ASM_PFX(GasketSecGetNextProtocol):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(SecGetNextProtocol)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -// PPIs produced by SEC
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
> -ASM_PFX(GasketSecPeCoffGetEntryPoint):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecPeCoffGetEntryPoint)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
> -ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(SecPeCoffRelocateImageExtraAction)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
> -ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(SecPeCoffUnloadImageExtraAction)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
> -ASM_PFX(GasketSecEmuThunkAddress):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - call ASM_PFX(SecEmuThunkAddress)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -//
> -// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
> -//
> -
> -ASM_GLOBAL ASM_PFX(GasketX11Size)
> -ASM_PFX(GasketX11Size):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(X11Size)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
> -ASM_PFX(GasketX11CheckKey):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(X11CheckKey)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GetKey)
> -ASM_PFX(GasketX11GetKey):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(X11GetKey)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
> -ASM_PFX(GasketX11KeySetState):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(X11KeySetState)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
> -ASM_PFX(GasketX11RegisterKeyNotify):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(X11RegisterKeyNotify)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11Blt)
> -ASM_PFX(GasketX11Blt):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(X11Blt)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
> -ASM_PFX(GasketX11CheckPointer):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(X11CheckPointer)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
> -ASM_PFX(GasketX11GetPointerState):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(X11GetPointerState)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
> -ASM_PFX(GasketX11GraphicsWindowOpen):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(X11GraphicsWindowOpen)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
> -ASM_PFX(GasketX11GraphicsWindowClose):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %r9, %rcx
> -
> - call ASM_PFX(X11GraphicsWindowClose)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -// Pthreads
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
> -ASM_PFX(GasketPthreadMutexLock):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadMutexLock)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
> -ASM_PFX(GasketPthreadMutexUnLock):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadMutexUnLock)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
> -ASM_PFX(GasketPthreadMutexTryLock):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadMutexTryLock)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
> -ASM_PFX(GasketPthreadMutexInit):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> -
> - call ASM_PFX(PthreadMutexInit)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
> -ASM_PFX(GasketPthreadMutexDestroy):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadMutexDestroy)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
> -ASM_PFX(GasketPthreadCreate):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(PthreadCreate)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadExit)
> -ASM_PFX(GasketPthreadExit):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadExit)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
> -ASM_PFX(GasketPthreadSelf):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> -
> - call ASM_PFX(PthreadSelf)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
> -ASM_PFX(GasketPthreadOpen):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadOpen)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadClose)
> -ASM_PFX(GasketPthreadClose):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadClose)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -
> -//
> -// UNIX ABI to EFI ABI call
> -//
> -// UINTN
> -// ReverseGasketUint64 (
> -// void *Api,
> -// UINTN Arg1
> -// );
> -ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
> -ASM_PFX(ReverseGasketUint64):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - movq %rdi, %rax // Swizzle args
> - movq %rsi, %rcx
> -
> - subq $32, %rsp // 32-byte shadow space
> - call *%rax
> - addq $32, %rsp
> -
> - popq %rbp
> - ret
> -
> -//
> -// UNIX ABI to EFI ABI call
> -//
> -// UINTN
> -// ReverseGasketUint64Uint64 (
> -// void *Api,
> -// UINTN Arg1
> -// UINTN Arg2
> -// );
> -ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
> -ASM_PFX(ReverseGasketUint64Uint64):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - movq %rdi, %rax // Swizzle args
> - movq %rsi, %rcx
> -
> - subq $32, %rsp // 32-byte shadow space
> - call *%rax
> - addq $32, %rsp
> -
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
> -ASM_PFX(GasketSecUnixPeiAutoScan):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> -
> - call ASM_PFX(SecUnixPeiAutoScan)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
> -ASM_PFX(GasketSecUnixFdAddress):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(SecUnixFdAddress)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -// EmuIoThunk SimpleFileSystem
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
> -ASM_PFX(GasketPosixOpenVolume):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(PosixOpenVolume)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
> -ASM_PFX(GasketPosixFileOpen):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> -
> - call ASM_PFX(PosixFileOpen)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
> -ASM_PFX(GasketPosixFileCLose):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PosixFileCLose)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
> -ASM_PFX(GasketPosixFileDelete):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PosixFileDelete)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
> -ASM_PFX(GasketPosixFileRead):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> -
> - call ASM_PFX(PosixFileRead)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
> -ASM_PFX(GasketPosixFileWrite):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> -
> - call ASM_PFX(PosixFileWrite)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
> -ASM_PFX(GasketPosixFileSetPossition):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(PosixFileSetPossition)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
> -ASM_PFX(GasketPosixFileGetPossition):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(PosixFileGetPossition)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
> -ASM_PFX(GasketPosixFileGetInfo):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(PosixFileGetInfo)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
> -ASM_PFX(GasketPosixFileSetInfo):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(PosixFileSetInfo)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
> -ASM_PFX(GasketPosixFileFlush):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PosixFileFlush)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
> -ASM_PFX(GasketPosixFileSystmeThunkOpen):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PosixFileSystmeThunkOpen)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
> -ASM_PFX(GasketPosixFileSystmeThunkClose):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PosixFileSystmeThunkClose)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
> -ASM_PFX(GasketEmuBlockIoReset):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(EmuBlockIoReset)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
> -ASM_PFX(GasketEmuBlockIoReadBlocks):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> - movq 56(%rbp), %r9
> -
> - call ASM_PFX(EmuBlockIoReadBlocks)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
> -ASM_PFX(GasketEmuBlockIoWriteBlocks):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> - movq 56(%rbp), %r9
> -
> - call ASM_PFX(EmuBlockIoWriteBlocks)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
> -ASM_PFX(GasketEmuBlockIoFlushBlocks):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(EmuBlockIoFlushBlocks)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
> -ASM_PFX(GasketEmuBlockIoCreateMapping):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(EmuBlockIoCreateMapping)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
> -ASM_PFX(GasketBlockIoThunkOpen):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuBlockIoThunkOpen)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
> -ASM_PFX(GasketBlockIoThunkClose):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuBlockIoThunkClose)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
> -ASM_PFX(GasketSnpCreateMapping):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(EmuSnpCreateMapping)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStart)
> -ASM_PFX(GasketSnpStart):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuSnpStart)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStop)
> -ASM_PFX(GasketSnpStop):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuSnpStop)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
> -ASM_PFX(GasketSnpInitialize):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> -
> - call ASM_PFX(EmuSnpInitialize)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReset)
> -ASM_PFX(GasketSnpReset):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(EmuSnpReset)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
> -ASM_PFX(GasketSnpShutdown):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuSnpShutdown)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
> -ASM_PFX(GasketSnpReceiveFilters):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> - movq 56(%rbp), %r9
> -
> - call ASM_PFX(EmuSnpReceiveFilters)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
> -ASM_PFX(GasketSnpStationAddress):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> -
> - call ASM_PFX(EmuSnpStationAddress)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
> -ASM_PFX(GasketSnpStatistics):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(EmuSnpStatistics)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
> -ASM_PFX(GasketSnpMCastIpToMac):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(EmuSnpMCastIpToMac)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpNvData)
> -ASM_PFX(GasketSnpNvData):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> -
> - call ASM_PFX(EmuSnpNvData)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
> -ASM_PFX(GasketSnpGetStatus):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> -
> - call ASM_PFX(EmuSnpGetStatus)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
> -ASM_PFX(GasketSnpTransmit):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> - subq $16, %rsp // Allocate space for args on the stack
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> - movq 56(%rbp), %r9
> - movq 64(%rbp), %rax
> - movq %rax, (%rsp)
> -
> - call ASM_PFX(EmuSnpTransmit)
> - addq $16, %rsp
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReceive)
> -ASM_PFX(GasketSnpReceive):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> - subq $16, %rsp // Allocate space for args on the stack
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> - movq 56(%rbp), %r9
> - movq 64(%rbp), %rax
> - movq %rax, (%rsp)
> -
> - call ASM_PFX(EmuSnpReceive)
> - addq $16, %rsp
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
> -ASM_PFX(GasketSnpThunkOpen):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuSnpThunkOpen)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
> -ASM_PFX(GasketSnpThunkClose):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuSnpThunkClose)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> +#------------------------------------------------------------------------------
> +#
> +# Manage differenced between UNIX ABI and EFI/Windows ABI
> +#
> +# EFI Arg passing: RCX, RDX, R8, R9
> +# Callee allocates 32 bytes on stack to spill registers
> +# UNIX Arg passing: RDI, RSI, RDX, RCX, R8, R9
> +# RSI, RDI calle-save on EFI, scatch on UNIX callign
> +#
> +# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD
> License
> +# which accompanies this distribution. The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +#
> +#------------------------------------------------------------------------------
> +
> +//
> +// Gaskets are EFI ABI to UNIX ABI calls
> +// EFI ABI code will sub 40 (0x28) from %rsp before calling a function
> +// This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16
> byte boundry.
> +//
> + .text
> +
> +// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry
> +// Any call with 0 - 4 arguments allocates 40 bytes on the stack.
> +// For more than 4 args you always have to increase in quanta of 16 so 5 or 6
> args is 56,
> +// 7 or 8 args is 72, and 9 or 10 args is 88
> +
> +
> +
> + .text
> +
> +//
> +// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
> +//
> +
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
> +ASM_PFX(GasketSecWriteStdErr):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecWriteStdErr)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
> +ASM_PFX(GasketSecConfigStdIn):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(SecConfigStdIn)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
> +ASM_PFX(GasketSecWriteStdOut):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecWriteStdOut)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
> +ASM_PFX(GasketSecReadStdIn):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecReadStdIn)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
> +ASM_PFX(GasketSecPollStdIn):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(SecPollStdIn)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecMalloc)
> +ASM_PFX(GasketSecMalloc):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(SecMalloc)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecValloc)
> +ASM_PFX(GasketSecValloc):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(SecValloc)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecFree)
> +ASM_PFX(GasketSecFree):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(SecFree)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
> +ASM_PFX(GasketSecSetTimer):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecSetTimer)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
> +ASM_PFX(GasketSecEnableInterrupt):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(SecEnableInterrupt)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
> +ASM_PFX(GasketSecDisableInterrupt):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(SecDisableInterrupt)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
> +ASM_PFX(GasketQueryPerformanceFrequency):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(QueryPerformanceFrequency)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
> +ASM_PFX(GasketQueryPerformanceCounter):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(QueryPerformanceCounter)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSleep)
> +ASM_PFX(GasketSecSleep):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(SecSleep)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
> +ASM_PFX(GasketSecCpuSleep):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(SecCpuSleep)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecExit)
> +ASM_PFX(GasketSecExit):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + movq %rcx, %rdi // Swizzle args
> + call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI
> world
> +LDEAD_LOOP:
> + jmp LDEAD_LOOP // _exit should never return
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecGetTime)
> +ASM_PFX(GasketSecGetTime):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecGetTime)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSetTime)
> +ASM_PFX(GasketSecSetTime):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecSetTime)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
> +ASM_PFX(GasketSecGetNextProtocol):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(SecGetNextProtocol)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +// PPIs produced by SEC
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
> +ASM_PFX(GasketSecPeCoffGetEntryPoint):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecPeCoffGetEntryPoint)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
> +ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(SecPeCoffRelocateImageExtraAction)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
> +ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(SecPeCoffUnloadImageExtraAction)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
> +ASM_PFX(GasketSecEmuThunkAddress):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(SecEmuThunkAddress)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +//
> +// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
> +//
> +
> +ASM_GLOBAL ASM_PFX(GasketX11Size)
> +ASM_PFX(GasketX11Size):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(X11Size)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
> +ASM_PFX(GasketX11CheckKey):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(X11CheckKey)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GetKey)
> +ASM_PFX(GasketX11GetKey):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(X11GetKey)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
> +ASM_PFX(GasketX11KeySetState):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(X11KeySetState)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
> +ASM_PFX(GasketX11RegisterKeyNotify):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(X11RegisterKeyNotify)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11Blt)
> +ASM_PFX(GasketX11Blt):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(X11Blt)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
> +ASM_PFX(GasketX11CheckPointer):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(X11CheckPointer)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
> +ASM_PFX(GasketX11GetPointerState):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(X11GetPointerState)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
> +ASM_PFX(GasketX11GraphicsWindowOpen):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(X11GraphicsWindowOpen)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
> +ASM_PFX(GasketX11GraphicsWindowClose):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %r9, %rcx
> +
> + call ASM_PFX(X11GraphicsWindowClose)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +// Pthreads
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
> +ASM_PFX(GasketPthreadMutexLock):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadMutexLock)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
> +ASM_PFX(GasketPthreadMutexUnLock):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadMutexUnLock)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
> +ASM_PFX(GasketPthreadMutexTryLock):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadMutexTryLock)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
> +ASM_PFX(GasketPthreadMutexInit):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> +
> + call ASM_PFX(PthreadMutexInit)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
> +ASM_PFX(GasketPthreadMutexDestroy):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadMutexDestroy)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
> +ASM_PFX(GasketPthreadCreate):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(PthreadCreate)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadExit)
> +ASM_PFX(GasketPthreadExit):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadExit)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
> +ASM_PFX(GasketPthreadSelf):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> +
> + call ASM_PFX(PthreadSelf)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
> +ASM_PFX(GasketPthreadOpen):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadOpen)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadClose)
> +ASM_PFX(GasketPthreadClose):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadClose)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +
> +//
> +// UNIX ABI to EFI ABI call
> +//
> +// UINTN
> +// ReverseGasketUint64 (
> +// void *Api,
> +// UINTN Arg1
> +// );
> +ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
> +ASM_PFX(ReverseGasketUint64):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + movq %rdi, %rax // Swizzle args
> + movq %rsi, %rcx
> +
> + subq $32, %rsp // 32-byte shadow space
> + call *%rax
> + addq $32, %rsp
> +
> + popq %rbp
> + ret
> +
> +//
> +// UNIX ABI to EFI ABI call
> +//
> +// UINTN
> +// ReverseGasketUint64Uint64 (
> +// void *Api,
> +// UINTN Arg1
> +// UINTN Arg2
> +// );
> +ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
> +ASM_PFX(ReverseGasketUint64Uint64):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + movq %rdi, %rax // Swizzle args
> + movq %rsi, %rcx
> +
> + subq $32, %rsp // 32-byte shadow space
> + call *%rax
> + addq $32, %rsp
> +
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
> +ASM_PFX(GasketSecUnixPeiAutoScan):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> +
> + call ASM_PFX(SecUnixPeiAutoScan)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
> +ASM_PFX(GasketSecUnixFdAddress):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(SecUnixFdAddress)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +// EmuIoThunk SimpleFileSystem
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
> +ASM_PFX(GasketPosixOpenVolume):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(PosixOpenVolume)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
> +ASM_PFX(GasketPosixFileOpen):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> +
> + call ASM_PFX(PosixFileOpen)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
> +ASM_PFX(GasketPosixFileCLose):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PosixFileCLose)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
> +ASM_PFX(GasketPosixFileDelete):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PosixFileDelete)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
> +ASM_PFX(GasketPosixFileRead):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> +
> + call ASM_PFX(PosixFileRead)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
> +ASM_PFX(GasketPosixFileWrite):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> +
> + call ASM_PFX(PosixFileWrite)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
> +ASM_PFX(GasketPosixFileSetPossition):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(PosixFileSetPossition)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
> +ASM_PFX(GasketPosixFileGetPossition):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(PosixFileGetPossition)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
> +ASM_PFX(GasketPosixFileGetInfo):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(PosixFileGetInfo)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
> +ASM_PFX(GasketPosixFileSetInfo):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(PosixFileSetInfo)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
> +ASM_PFX(GasketPosixFileFlush):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PosixFileFlush)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
> +ASM_PFX(GasketPosixFileSystmeThunkOpen):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PosixFileSystmeThunkOpen)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
> +ASM_PFX(GasketPosixFileSystmeThunkClose):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PosixFileSystmeThunkClose)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
> +ASM_PFX(GasketEmuBlockIoReset):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(EmuBlockIoReset)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
> +ASM_PFX(GasketEmuBlockIoReadBlocks):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> + movq 56(%rbp), %r9
> +
> + call ASM_PFX(EmuBlockIoReadBlocks)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
> +ASM_PFX(GasketEmuBlockIoWriteBlocks):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> + movq 56(%rbp), %r9
> +
> + call ASM_PFX(EmuBlockIoWriteBlocks)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
> +ASM_PFX(GasketEmuBlockIoFlushBlocks):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(EmuBlockIoFlushBlocks)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
> +ASM_PFX(GasketEmuBlockIoCreateMapping):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(EmuBlockIoCreateMapping)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
> +ASM_PFX(GasketBlockIoThunkOpen):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuBlockIoThunkOpen)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
> +ASM_PFX(GasketBlockIoThunkClose):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuBlockIoThunkClose)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
> +ASM_PFX(GasketSnpCreateMapping):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(EmuSnpCreateMapping)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStart)
> +ASM_PFX(GasketSnpStart):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuSnpStart)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStop)
> +ASM_PFX(GasketSnpStop):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuSnpStop)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
> +ASM_PFX(GasketSnpInitialize):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> +
> + call ASM_PFX(EmuSnpInitialize)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReset)
> +ASM_PFX(GasketSnpReset):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(EmuSnpReset)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
> +ASM_PFX(GasketSnpShutdown):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuSnpShutdown)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
> +ASM_PFX(GasketSnpReceiveFilters):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> + movq 56(%rbp), %r9
> +
> + call ASM_PFX(EmuSnpReceiveFilters)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
> +ASM_PFX(GasketSnpStationAddress):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> +
> + call ASM_PFX(EmuSnpStationAddress)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
> +ASM_PFX(GasketSnpStatistics):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(EmuSnpStatistics)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
> +ASM_PFX(GasketSnpMCastIpToMac):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(EmuSnpMCastIpToMac)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpNvData)
> +ASM_PFX(GasketSnpNvData):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> +
> + call ASM_PFX(EmuSnpNvData)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
> +ASM_PFX(GasketSnpGetStatus):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> +
> + call ASM_PFX(EmuSnpGetStatus)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
> +ASM_PFX(GasketSnpTransmit):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> + subq $16, %rsp // Allocate space for args on the stack
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> + movq 56(%rbp), %r9
> + movq 64(%rbp), %rax
> + movq %rax, (%rsp)
> +
> + call ASM_PFX(EmuSnpTransmit)
> + addq $16, %rsp
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReceive)
> +ASM_PFX(GasketSnpReceive):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> + subq $16, %rsp // Allocate space for args on the stack
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> + movq 56(%rbp), %r9
> + movq 64(%rbp), %rax
> + movq %rax, (%rsp)
> +
> + call ASM_PFX(EmuSnpReceive)
> + addq $16, %rsp
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
> +ASM_PFX(GasketSnpThunkOpen):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuSnpThunkOpen)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
> +ASM_PFX(GasketSnpThunkClose):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuSnpThunkClose)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> diff --git a/EmulatorPkg/Unix/lldbefi.py b/EmulatorPkg/Unix/lldbefi.py
> index 64549ce3ec..a130cbee5c 100755
> --- a/EmulatorPkg/Unix/lldbefi.py
> +++ b/EmulatorPkg/Unix/lldbefi.py
> @@ -1,540 +1,540 @@
> -#!/usr/bin/python
> -
> -#
> -# Copyright 2014 Apple Inc. All righes reserved.
> -#
> -# This program and the accompanying materials
> -# are licensed and made available under the terms and conditions of the BSD
> License
> -# which accompanies this distribution. The full text of the license may be
> found at
> -# http://opensource.org/licenses/bsd-license.php.
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -#
> -
> -import lldb
> -import os
> -import uuid
> -import string
> -import commands
> -import optparse
> -import shlex
> -
> -guid_dict = {}
> -
> -
> -def EFI_GUID_TypeSummary (valobj,internal_dict):
> - """ Type summary for EFI GUID, print C Name if known
> - """
> - # typedef struct {
> - # UINT32 Data1;
> - # UINT16 Data2;
> - # UINT16 Data3;
> - # UINT8 Data4[8];
> - # } EFI_GUID;
> - SBError = lldb.SBError()
> -
> - data1_val = valobj.GetChildMemberWithName('Data1')
> - data1 = data1_val.GetValueAsUnsigned(0)
> - data2_val = valobj.GetChildMemberWithName('Data2')
> - data2 = data2_val.GetValueAsUnsigned(0)
> - data3_val = valobj.GetChildMemberWithName('Data3')
> - data3 = data3_val.GetValueAsUnsigned(0)
> - str = "%x-%x-%x-" % (data1, data2, data3)
> -
> - data4_val = valobj.GetChildMemberWithName('Data4')
> - for i in range (data4_val.num_children):
> - if i == 2:
> - str +='-'
> - str += "%02x" %
> data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
> -
> - return guid_dict.get (str.upper(), '')
> -
> -
> -
> -EFI_STATUS_Dict = {
> - (0x8000000000000000 | 1): "Load Error",
> - (0x8000000000000000 | 2): "Invalid Parameter",
> - (0x8000000000000000 | 3): "Unsupported",
> - (0x8000000000000000 | 4): "Bad Buffer Size",
> - (0x8000000000000000 | 5): "Buffer Too Small",
> - (0x8000000000000000 | 6): "Not Ready",
> - (0x8000000000000000 | 7): "Device Error",
> - (0x8000000000000000 | 8): "Write Protected",
> - (0x8000000000000000 | 9): "Out of Resources",
> - (0x8000000000000000 | 10): "Volume Corrupt",
> - (0x8000000000000000 | 11): "Volume Full",
> - (0x8000000000000000 | 12): "No Media",
> - (0x8000000000000000 | 13): "Media changed",
> - (0x8000000000000000 | 14): "Not Found",
> - (0x8000000000000000 | 15): "Access Denied",
> - (0x8000000000000000 | 16): "No Response",
> - (0x8000000000000000 | 17): "No mapping",
> - (0x8000000000000000 | 18): "Time out",
> - (0x8000000000000000 | 19): "Not started",
> - (0x8000000000000000 | 20): "Already started",
> - (0x8000000000000000 | 21): "Aborted",
> - (0x8000000000000000 | 22): "ICMP Error",
> - (0x8000000000000000 | 23): "TFTP Error",
> - (0x8000000000000000 | 24): "Protocol Error",
> -
> - 0 : "Success",
> - 1 : "Warning Unknown Glyph",
> - 2 : "Warning Delete Failure",
> - 3 : "Warning Write Failure",
> - 4 : "Warning Buffer Too Small",
> -
> - (0x80000000 | 1): "Load Error",
> - (0x80000000 | 2): "Invalid Parameter",
> - (0x80000000 | 3): "Unsupported",
> - (0x80000000 | 4): "Bad Buffer Size",
> - (0x80000000 | 5): "Buffer Too Small",
> - (0x80000000 | 6): "Not Ready",
> - (0x80000000 | 7): "Device Error",
> - (0x80000000 | 8): "Write Protected",
> - (0x80000000 | 9): "Out of Resources",
> - (0x80000000 | 10): "Volume Corrupt",
> - (0x80000000 | 11): "Volume Full",
> - (0x80000000 | 12): "No Media",
> - (0x80000000 | 13): "Media changed",
> - (0x80000000 | 14): "Not Found",
> - (0x80000000 | 15): "Access Denied",
> - (0x80000000 | 16): "No Response",
> - (0x80000000 | 17): "No mapping",
> - (0x80000000 | 18): "Time out",
> - (0x80000000 | 19): "Not started",
> - (0x80000000 | 20): "Already started",
> - (0x80000000 | 21): "Aborted",
> - (0x80000000 | 22): "ICMP Error",
> - (0x80000000 | 23): "TFTP Error",
> - (0x80000000 | 24): "Protocol Error",
> -}
> -
> -def EFI_STATUS_TypeSummary (valobj,internal_dict):
> - #
> - # Return summary string for EFI_STATUS from dictionary
> - #
> - Status = valobj.GetValueAsUnsigned(0)
> - return EFI_STATUS_Dict.get (Status, '')
> -
> -
> -def EFI_TPL_TypeSummary (valobj,internal_dict):
> - #
> - # Return TPL values
> - #
> -
> - if valobj.TypeIsPointerType():
> - return ""
> -
> - Tpl = valobj.GetValueAsUnsigned(0)
> - if Tpl < 4:
> - Str = "%d" % Tpl
> - elif Tpl == 6:
> - Str = "TPL_DRIVER (Obsolete Concept in edk2)"
> - elif Tpl < 8:
> - Str = "TPL_APPLICATION"
> - if Tpl - 4 > 0:
> - Str += " + " + "%d" % (Tpl - 4)
> - elif Tpl < 16:
> - Str = "TPL_CALLBACK"
> - if Tpl - 8 > 0:
> - Str += " + " + "%d" % (Tpl - 4)
> - elif Tpl < 31:
> - Str = "TPL_NOTIFY"
> - if Tpl - 16 > 0:
> - Str += " + " + "%d" % (Tpl - 4)
> - elif Tpl == 31:
> - Str = "TPL_HIGH_LEVEL"
> - else:
> - Str = "Invalid TPL"
> -
> - return Str
> -
> -
> -def CHAR16_TypeSummary (valobj,internal_dict):
> - #
> - # Display EFI CHAR16 'unsigned short' as string
> - #
> - SBError = lldb.SBError()
> - Str = ''
> - if valobj.TypeIsPointerType():
> - if valobj.GetValueAsUnsigned () == 0:
> - return "NULL"
> -
> - # CHAR16 * max string size 1024
> - for i in range (1024):
> - Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)
> - if SBError.fail or Char == 0:
> - break
> - Str += unichr (Char)
> - Str = 'L"' + Str + '"'
> - return Str.encode ('utf-8', 'replace')
> -
> - if valobj.num_children == 0:
> - # CHAR16
> - if chr (valobj.unsigned) in string.printable:
> - Str = "L'" + unichr (valobj.unsigned) + "'"
> - return Str.encode ('utf-8', 'replace')
> - else:
> - # CHAR16 []
> - for i in range (valobj.num_children):
> - Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)
> - if Char == 0:
> - break
> - Str += unichr (Char)
> - Str = 'L"' + Str + '"'
> - return Str.encode ('utf-8', 'replace')
> -
> - return Str
> -
> -def CHAR8_TypeSummary (valobj,internal_dict):
> - #
> - # Display EFI CHAR8 'signed char' as string
> - # unichr() is used as a junk string can produce an error message like this:
> - # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in
> position 1: ordinal not in range(128)
> - #
> - SBError = lldb.SBError()
> - Str = ''
> - if valobj.TypeIsPointerType():
> - if valobj.GetValueAsUnsigned () == 0:
> - return "NULL"
> -
> - # CHAR8 * max string size 1024
> - for i in range (1024):
> - Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)
> - if SBError.fail or Char == 0:
> - break
> - Str += unichr (Char)
> - Str = '"' + Str + '"'
> - return Str.encode ('utf-8', 'replace')
> -
> - if valobj.num_children == 0:
> - # CHAR8
> - if chr (valobj.unsigned) in string.printable:
> - Str = '"' + unichr (valobj.unsigned) + '"'
> - return Str.encode ('utf-8', 'replace')
> - else:
> - # CHAR8 []
> - for i in range (valobj.num_children):
> - Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
> - if Char == 0:
> - break
> - Str += unichr (Char)
> - Str = '"' + Str + '"'
> - return Str.encode ('utf-8', 'replace')
> -
> - return Str
> -
> -device_path_dict = {
> - (0x01, 0x01): "PCI_DEVICE_PATH",
> - (0x01, 0x02): "PCCARD_DEVICE_PATH",
> - (0x01, 0x03): "MEMMAP_DEVICE_PATH",
> - (0x01, 0x04): "VENDOR_DEVICE_PATH",
> - (0x01, 0x05): "CONTROLLER_DEVICE_PATH",
> - (0x02, 0x01): "ACPI_HID_DEVICE_PATH",
> - (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",
> - (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",
> - (0x03, 0x01): "ATAPI_DEVICE_PATH",
> - (0x03, 0x12): "SATA_DEVICE_PATH",
> - (0x03, 0x02): "SCSI_DEVICE_PATH",
> - (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",
> - (0x03, 0x04): "F1394_DEVICE_PATH",
> - (0x03, 0x05): "USB_DEVICE_PATH",
> - (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",
> - (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",
> - (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",
> - (0x03, 0x06): "I2O_DEVICE_PATH",
> - (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",
> - (0x03, 0x0c): "IPv4_DEVICE_PATH",
> - (0x03, 0x09): "INFINIBAND_DEVICE_PATH",
> - (0x03, 0x0e): "UART_DEVICE_PATH",
> - (0x03, 0x0a): "VENDOR_DEVICE_PATH",
> - (0x03, 0x13): "ISCSI_DEVICE_PATH",
> - (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",
> - (0x04, 0x02): "CDROM_DEVICE_PATH",
> - (0x04, 0x03): "VENDOR_DEVICE_PATH",
> - (0x04, 0x04): "FILEPATH_DEVICE_PATH",
> - (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",
> - (0x05, 0x01): "BBS_BBS_DEVICE_PATH",
> - (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
> - (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
> -}
> -
> -def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):
> - #
> - #
> - #
> - if valobj.TypeIsPointerType():
> - # EFI_DEVICE_PATH_PROTOCOL *
> - return ""
> -
> - Str = ""
> - if valobj.num_children == 3:
> - # EFI_DEVICE_PATH_PROTOCOL
> - Type = valobj.GetChildMemberWithName('Type').unsigned
> - SubType = valobj.GetChildMemberWithName('SubType').unsigned
> - if (Type, SubType) in device_path_dict:
> - TypeStr = device_path_dict[Type, SubType]
> - else:
> - TypeStr = ""
> -
> - LenLow =
> valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned
> - LenHigh =
> valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned
> - Len = LenLow + (LenHigh >> 8)
> -
> - Address = long ("%d" % valobj.addr)
> - if (Address == lldb.LLDB_INVALID_ADDRESS):
> - # Need to reserach this, it seems to be the nested struct case
> - ExprStr = ""
> - elif (Type & 0x7f == 0x7f):
> - ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"
> - else:
> - ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address)
> -
> - Str = " {\n"
> - Str += " (UINT8) Type = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f
> == 0x7f) else "")
> - Str += " (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)
> - Str += " (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)
> - Str += " (UINT8) [0] = 0x%02x\n" % LenLow
> - Str += " (UINT8) [1] = 0x%02x\n" % LenHigh
> - Str += " }\n"
> - if (Type & 0x7f == 0x7f) and (SubType == 0xff):
> - pass
> - elif ExprStr != "":
> - NextNode = Address + Len
> - Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" %
> NextNode
> -
> - return Str
> -
> -
> -
> -def TypePrintFormating(debugger):
> - #
> - # Set the default print formating for EFI types in lldb.
> - # seems lldb defaults to decimal.
> - #
> - category = debugger.GetDefaultCategory()
> - FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"),
> FormatBool)
> -
> - FormatHex = lldb.SBTypeFormat(lldb.eFormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)
> -
> -
> category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"),
> FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"),
> FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"),
> FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"),
> FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"),
> FormatHex)
> -
> - #
> - # Smart type printing for EFI
> - #
> - debugger.HandleCommand("type summary add EFI_GUID --python-function
> lldbefi.EFI_GUID_TypeSummary")
> - debugger.HandleCommand("type summary add EFI_STATUS --python-
> function lldbefi.EFI_STATUS_TypeSummary")
> - debugger.HandleCommand("type summary add EFI_TPL --python-function
> lldbefi.EFI_TPL_TypeSummary")
> - debugger.HandleCommand("type summary add
> EFI_DEVICE_PATH_PROTOCOL --python-function
> lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")
> -
> - debugger.HandleCommand("type summary add CHAR16 --python-function
> lldbefi.CHAR16_TypeSummary")
> - debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]"
> --python-function lldbefi.CHAR16_TypeSummary')
> - debugger.HandleCommand("type summary add CHAR8 --python-function
> lldbefi.CHAR8_TypeSummary")
> - debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" -
> -python-function lldbefi.CHAR8_TypeSummary')
> -
> -
> -gEmulatorBreakWorkaroundNeeded = True
> -
> -def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):
> - #
> - # This is an lldb breakpoint script, and assumes the breakpoint is on a
> - # function with the same prototype as SecGdbScriptBreak(). The
> - # argument names are important as lldb looks them up.
> - #
> - # VOID
> - # SecGdbScriptBreak (
> - # char *FileName,
> - # int FileNameLength,
> - # long unsigned int LoadAddress,
> - # int AddSymbolFlag
> - # )
> - # {
> - # return;
> - # }
> - #
> - # When the emulator loads a PE/COFF image, it calls the stub function with
> - # the filename of the symbol file, the length of the FileName, the
> - # load address and a flag to indicate if this is a load or unload operation
> - #
> - global gEmulatorBreakWorkaroundNeeded
> -
> - if gEmulatorBreakWorkaroundNeeded:
> - # turn off lldb debug prints on SIGALRM (EFI timer tick)
> - frame.thread.process.target.debugger.HandleCommand("process handle
> SIGALRM -n false")
> - gEmulatorBreakWorkaroundNeeded = False
> -
> - # Convert C string to Python string
> - Error = lldb.SBError()
> - FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()
> - FileNameLen = frame.FindVariable
> ("FileNameLength").GetValueAsUnsigned()
> - FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr,
> FileNameLen, Error)
> - if not Error.Success():
> - print "!ReadCStringFromMemory() did not find a %d byte C string at %x" %
> (FileNameLen, FileNamePtr)
> - # make breakpoint command contiue
> - frame.GetThread().GetProcess().Continue()
> -
> - debugger = frame.thread.process.target.debugger
> - if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:
> - LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned()
> -
> - debugger.HandleCommand ("target modules add %s" % FileName)
> - print "target modules load --slid 0x%x %s" % (LoadAddress, FileName)
> - debugger.HandleCommand ("target modules load --slide 0x%x --file %s" %
> (LoadAddress, FileName))
> - else:
> - target = debugger.GetSelectedTarget()
> - for SBModule in target.module_iter():
> - ModuleName = SBModule.GetFileSpec().GetDirectory() + '/'
> - ModuleName += SBModule.GetFileSpec().GetFilename()
> - if FileName == ModuleName or FileName ==
> SBModule.GetFileSpec().GetFilename():
> - target.ClearModuleLoadAddress (SBModule)
> - if not target.RemoveModule (SBModule):
> - print "!lldb.target.RemoveModule (%s) FAILED" % SBModule
> -
> - # make breakpoint command contiue
> - frame.thread.process.Continue()
> -
> -def GuidToCStructStr (guid, Name=False):
> - #
> - # Convert a 16-byte bytesarry (or bytearray compat object) to C guid string
> - # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34,
> 0x7C } }
> - #
> - # Name=True means lookup name in GuidNameDict and us it if you find it
> - #
> -
> - if not isinstance (guid, bytearray):
> - # convert guid object to UUID, and UUID to bytearray
> - Uuid = uuid.UUID(guid)
> - guid = bytearray (Uuid.bytes_le)
> -
> - return "{ 0x%02.2X%02.2X%02.2X%02.2X, 0x%02.2X%02.2X, 0x%02.2X%02.2X,
> { 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X,
> 0x%02.2X } }" % \
> - (guid[3], guid[2], guid[1], guid[0], guid[5], guid[4], guid[7], guid[6],
> guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], guid[15])
> -
> -def ParseGuidString(GuidStr):
> - #
> - # Error check and convert C Guid init to string
> - # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")
> - # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7,
> 0x8A, 0x35, 0x46, 0xD1 } }")
> - #
> -
> - if "{" in GuidStr :
> - # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7,
> 0x8A, 0x35, 0x46, 0xD1 } }"
> - # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1
> - # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C', '0x9E',
> '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']
> - Hex = ''.join(x for x in GuidStr if x not in '{,}').split()
> - Str = "%08X-%04X-%04X-%02.2X%02.2X-
> %02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \
> - (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0),
> \
> - int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0),
> int(Hex[10], 0))
> - elif GuidStr.count('-') == 4:
> - # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form
> - Check = "%s" % str(uuid.UUID(GuidStr)).upper()
> - if GuidStr.upper() == Check:
> - Str = GuidStr.upper()
> - else:
> - Ste = ""
> - else:
> - Str = ""
> -
> - return Str
> -
> -
> -def create_guid_options():
> - usage = "usage: %prog [data]"
> - description='''lookup EFI_GUID by CName, C struct, or GUID string and print
> out all three.
> - '''
> - parser = optparse.OptionParser(description=description,
> prog='guid',usage=usage)
> - return parser
> -
> -def efi_guid_command(debugger, command, result, dict):
> - # Use the Shell Lexer to properly parse up command options just like a
> - # shell would
> - command_args = shlex.split(command)
> - parser = create_guid_options()
> - try:
> - (options, args) = parser.parse_args(command_args)
> - if len(args) >= 1:
> - if args[0] == "{":
> - # caller forgot to quote the string"
> - # mark arg[0] a string containing all args[n]
> - args[0] = ' '.join(args)
> - GuidStr = ParseGuidString (args[0])
> - if GuidStr == "":
> - # return Key of GuidNameDict for value args[0]
> - GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value ==
> args[0]][0]
> - GuidStr = GuidStr.upper()
> - except:
> - # if you don't handle exceptions, passing an incorrect argument to the
> OptionParser will cause LLDB to exit
> - # (courtesy of OptParse dealing with argument errors by throwing
> SystemExit)
> - result.SetError ("option parsing failed")
> - return
> -
> -
> - if len(args) >= 1:
> - if GuidStr in guid_dict:
> - print "%s = %s" % (guid_dict[GuidStr], GuidStr)
> - print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr))
> - else:
> - print GuidStr
> - else:
> - # dump entire dictionary
> - width = max(len(v) for k,v in guid_dict.iteritems())
> - for value in sorted(guid_dict, key=guid_dict.get):
> - print '%-*s %s %s' % (width, guid_dict[value], value,
> GuidToCStructStr(value))
> -
> - return
> -
> -
> -#
> -########## Code that runs when this script is imported into LLDB
> ###########
> -#
> -def __lldb_init_module (debugger, internal_dict):
> - # This initializer is being run from LLDB in the embedded command
> interpreter
> - # Make the options so we can generate the help text for the new LLDB
> - # command line command prior to registering it with LLDB below
> -
> - global guid_dict
> -
> - # Source Guid.xref file if we can find it
> - inputfile = os.getcwd()
> - inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'
> - with open(inputfile) as f:
> - for line in f:
> - data = line.split(' ')
> - if len(data) >= 2:
> - guid_dict[data[0].upper()] = data[1].strip('\n')
> -
> - # init EFI specific type formaters
> - TypePrintFormating (debugger)
> -
> -
> - # add guid command
> - parser = create_guid_options()
> - efi_guid_command.__doc__ = parser.format_help()
> - debugger.HandleCommand('command script add -f
> lldbefi.efi_guid_command guid')
> -
> -
> - Target = debugger.GetTargetAtIndex(0)
> - if Target:
> - Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')
> - if Breakpoint.GetNumLocations() == 1:
> - # Set the emulator breakpoints, if we are in the emulator
> - debugger.HandleCommand("breakpoint command add -s python -F
> lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))
> - print 'Type r to run emulator. SecLldbScriptBreak armed. EFI modules
> should now get source level debugging in the emulator.'
> +#!/usr/bin/python
> +
> +#
> +# Copyright 2014 Apple Inc. All righes reserved.
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD
> License
> +# which accompanies this distribution. The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php.
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +#
> +
> +import lldb
> +import os
> +import uuid
> +import string
> +import commands
> +import optparse
> +import shlex
> +
> +guid_dict = {}
> +
> +
> +def EFI_GUID_TypeSummary (valobj,internal_dict):
> + """ Type summary for EFI GUID, print C Name if known
> + """
> + # typedef struct {
> + # UINT32 Data1;
> + # UINT16 Data2;
> + # UINT16 Data3;
> + # UINT8 Data4[8];
> + # } EFI_GUID;
> + SBError = lldb.SBError()
> +
> + data1_val = valobj.GetChildMemberWithName('Data1')
> + data1 = data1_val.GetValueAsUnsigned(0)
> + data2_val = valobj.GetChildMemberWithName('Data2')
> + data2 = data2_val.GetValueAsUnsigned(0)
> + data3_val = valobj.GetChildMemberWithName('Data3')
> + data3 = data3_val.GetValueAsUnsigned(0)
> + str = "%x-%x-%x-" % (data1, data2, data3)
> +
> + data4_val = valobj.GetChildMemberWithName('Data4')
> + for i in range (data4_val.num_children):
> + if i == 2:
> + str +='-'
> + str += "%02x" %
> data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
> +
> + return guid_dict.get (str.upper(), '')
> +
> +
> +
> +EFI_STATUS_Dict = {
> + (0x8000000000000000 | 1): "Load Error",
> + (0x8000000000000000 | 2): "Invalid Parameter",
> + (0x8000000000000000 | 3): "Unsupported",
> + (0x8000000000000000 | 4): "Bad Buffer Size",
> + (0x8000000000000000 | 5): "Buffer Too Small",
> + (0x8000000000000000 | 6): "Not Ready",
> + (0x8000000000000000 | 7): "Device Error",
> + (0x8000000000000000 | 8): "Write Protected",
> + (0x8000000000000000 | 9): "Out of Resources",
> + (0x8000000000000000 | 10): "Volume Corrupt",
> + (0x8000000000000000 | 11): "Volume Full",
> + (0x8000000000000000 | 12): "No Media",
> + (0x8000000000000000 | 13): "Media changed",
> + (0x8000000000000000 | 14): "Not Found",
> + (0x8000000000000000 | 15): "Access Denied",
> + (0x8000000000000000 | 16): "No Response",
> + (0x8000000000000000 | 17): "No mapping",
> + (0x8000000000000000 | 18): "Time out",
> + (0x8000000000000000 | 19): "Not started",
> + (0x8000000000000000 | 20): "Already started",
> + (0x8000000000000000 | 21): "Aborted",
> + (0x8000000000000000 | 22): "ICMP Error",
> + (0x8000000000000000 | 23): "TFTP Error",
> + (0x8000000000000000 | 24): "Protocol Error",
> +
> + 0 : "Success",
> + 1 : "Warning Unknown Glyph",
> + 2 : "Warning Delete Failure",
> + 3 : "Warning Write Failure",
> + 4 : "Warning Buffer Too Small",
> +
> + (0x80000000 | 1): "Load Error",
> + (0x80000000 | 2): "Invalid Parameter",
> + (0x80000000 | 3): "Unsupported",
> + (0x80000000 | 4): "Bad Buffer Size",
> + (0x80000000 | 5): "Buffer Too Small",
> + (0x80000000 | 6): "Not Ready",
> + (0x80000000 | 7): "Device Error",
> + (0x80000000 | 8): "Write Protected",
> + (0x80000000 | 9): "Out of Resources",
> + (0x80000000 | 10): "Volume Corrupt",
> + (0x80000000 | 11): "Volume Full",
> + (0x80000000 | 12): "No Media",
> + (0x80000000 | 13): "Media changed",
> + (0x80000000 | 14): "Not Found",
> + (0x80000000 | 15): "Access Denied",
> + (0x80000000 | 16): "No Response",
> + (0x80000000 | 17): "No mapping",
> + (0x80000000 | 18): "Time out",
> + (0x80000000 | 19): "Not started",
> + (0x80000000 | 20): "Already started",
> + (0x80000000 | 21): "Aborted",
> + (0x80000000 | 22): "ICMP Error",
> + (0x80000000 | 23): "TFTP Error",
> + (0x80000000 | 24): "Protocol Error",
> +}
> +
> +def EFI_STATUS_TypeSummary (valobj,internal_dict):
> + #
> + # Return summary string for EFI_STATUS from dictionary
> + #
> + Status = valobj.GetValueAsUnsigned(0)
> + return EFI_STATUS_Dict.get (Status, '')
> +
> +
> +def EFI_TPL_TypeSummary (valobj,internal_dict):
> + #
> + # Return TPL values
> + #
> +
> + if valobj.TypeIsPointerType():
> + return ""
> +
> + Tpl = valobj.GetValueAsUnsigned(0)
> + if Tpl < 4:
> + Str = "%d" % Tpl
> + elif Tpl == 6:
> + Str = "TPL_DRIVER (Obsolete Concept in edk2)"
> + elif Tpl < 8:
> + Str = "TPL_APPLICATION"
> + if Tpl - 4 > 0:
> + Str += " + " + "%d" % (Tpl - 4)
> + elif Tpl < 16:
> + Str = "TPL_CALLBACK"
> + if Tpl - 8 > 0:
> + Str += " + " + "%d" % (Tpl - 4)
> + elif Tpl < 31:
> + Str = "TPL_NOTIFY"
> + if Tpl - 16 > 0:
> + Str += " + " + "%d" % (Tpl - 4)
> + elif Tpl == 31:
> + Str = "TPL_HIGH_LEVEL"
> + else:
> + Str = "Invalid TPL"
> +
> + return Str
> +
> +
> +def CHAR16_TypeSummary (valobj,internal_dict):
> + #
> + # Display EFI CHAR16 'unsigned short' as string
> + #
> + SBError = lldb.SBError()
> + Str = ''
> + if valobj.TypeIsPointerType():
> + if valobj.GetValueAsUnsigned () == 0:
> + return "NULL"
> +
> + # CHAR16 * max string size 1024
> + for i in range (1024):
> + Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)
> + if SBError.fail or Char == 0:
> + break
> + Str += unichr (Char)
> + Str = 'L"' + Str + '"'
> + return Str.encode ('utf-8', 'replace')
> +
> + if valobj.num_children == 0:
> + # CHAR16
> + if chr (valobj.unsigned) in string.printable:
> + Str = "L'" + unichr (valobj.unsigned) + "'"
> + return Str.encode ('utf-8', 'replace')
> + else:
> + # CHAR16 []
> + for i in range (valobj.num_children):
> + Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)
> + if Char == 0:
> + break
> + Str += unichr (Char)
> + Str = 'L"' + Str + '"'
> + return Str.encode ('utf-8', 'replace')
> +
> + return Str
> +
> +def CHAR8_TypeSummary (valobj,internal_dict):
> + #
> + # Display EFI CHAR8 'signed char' as string
> + # unichr() is used as a junk string can produce an error message like this:
> + # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in
> position 1: ordinal not in range(128)
> + #
> + SBError = lldb.SBError()
> + Str = ''
> + if valobj.TypeIsPointerType():
> + if valobj.GetValueAsUnsigned () == 0:
> + return "NULL"
> +
> + # CHAR8 * max string size 1024
> + for i in range (1024):
> + Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)
> + if SBError.fail or Char == 0:
> + break
> + Str += unichr (Char)
> + Str = '"' + Str + '"'
> + return Str.encode ('utf-8', 'replace')
> +
> + if valobj.num_children == 0:
> + # CHAR8
> + if chr (valobj.unsigned) in string.printable:
> + Str = '"' + unichr (valobj.unsigned) + '"'
> + return Str.encode ('utf-8', 'replace')
> + else:
> + # CHAR8 []
> + for i in range (valobj.num_children):
> + Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
> + if Char == 0:
> + break
> + Str += unichr (Char)
> + Str = '"' + Str + '"'
> + return Str.encode ('utf-8', 'replace')
> +
> + return Str
> +
> +device_path_dict = {
> + (0x01, 0x01): "PCI_DEVICE_PATH",
> + (0x01, 0x02): "PCCARD_DEVICE_PATH",
> + (0x01, 0x03): "MEMMAP_DEVICE_PATH",
> + (0x01, 0x04): "VENDOR_DEVICE_PATH",
> + (0x01, 0x05): "CONTROLLER_DEVICE_PATH",
> + (0x02, 0x01): "ACPI_HID_DEVICE_PATH",
> + (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",
> + (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",
> + (0x03, 0x01): "ATAPI_DEVICE_PATH",
> + (0x03, 0x12): "SATA_DEVICE_PATH",
> + (0x03, 0x02): "SCSI_DEVICE_PATH",
> + (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",
> + (0x03, 0x04): "F1394_DEVICE_PATH",
> + (0x03, 0x05): "USB_DEVICE_PATH",
> + (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",
> + (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",
> + (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",
> + (0x03, 0x06): "I2O_DEVICE_PATH",
> + (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",
> + (0x03, 0x0c): "IPv4_DEVICE_PATH",
> + (0x03, 0x09): "INFINIBAND_DEVICE_PATH",
> + (0x03, 0x0e): "UART_DEVICE_PATH",
> + (0x03, 0x0a): "VENDOR_DEVICE_PATH",
> + (0x03, 0x13): "ISCSI_DEVICE_PATH",
> + (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",
> + (0x04, 0x02): "CDROM_DEVICE_PATH",
> + (0x04, 0x03): "VENDOR_DEVICE_PATH",
> + (0x04, 0x04): "FILEPATH_DEVICE_PATH",
> + (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",
> + (0x05, 0x01): "BBS_BBS_DEVICE_PATH",
> + (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
> + (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
> +}
> +
> +def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):
> + #
> + #
> + #
> + if valobj.TypeIsPointerType():
> + # EFI_DEVICE_PATH_PROTOCOL *
> + return ""
> +
> + Str = ""
> + if valobj.num_children == 3:
> + # EFI_DEVICE_PATH_PROTOCOL
> + Type = valobj.GetChildMemberWithName('Type').unsigned
> + SubType = valobj.GetChildMemberWithName('SubType').unsigned
> + if (Type, SubType) in device_path_dict:
> + TypeStr = device_path_dict[Type, SubType]
> + else:
> + TypeStr = ""
> +
> + LenLow =
> valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned
> + LenHigh =
> valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned
> + Len = LenLow + (LenHigh >> 8)
> +
> + Address = long ("%d" % valobj.addr)
> + if (Address == lldb.LLDB_INVALID_ADDRESS):
> + # Need to reserach this, it seems to be the nested struct case
> + ExprStr = ""
> + elif (Type & 0x7f == 0x7f):
> + ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"
> + else:
> + ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address)
> +
> + Str = " {\n"
> + Str += " (UINT8) Type = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f
> == 0x7f) else "")
> + Str += " (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)
> + Str += " (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)
> + Str += " (UINT8) [0] = 0x%02x\n" % LenLow
> + Str += " (UINT8) [1] = 0x%02x\n" % LenHigh
> + Str += " }\n"
> + if (Type & 0x7f == 0x7f) and (SubType == 0xff):
> + pass
> + elif ExprStr != "":
> + NextNode = Address + Len
> + Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" %
> NextNode
> +
> + return Str
> +
> +
> +
> +def TypePrintFormating(debugger):
> + #
> + # Set the default print formating for EFI types in lldb.
> + # seems lldb defaults to decimal.
> + #
> + category = debugger.GetDefaultCategory()
> + FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"),
> FormatBool)
> +
> + FormatHex = lldb.SBTypeFormat(lldb.eFormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)
> +
> +
> category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"),
> FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"),
> FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"),
> FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"),
> FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"),
> FormatHex)
> +
> + #
> + # Smart type printing for EFI
> + #
> + debugger.HandleCommand("type summary add EFI_GUID --python-function
> lldbefi.EFI_GUID_TypeSummary")
> + debugger.HandleCommand("type summary add EFI_STATUS --python-
> function lldbefi.EFI_STATUS_TypeSummary")
> + debugger.HandleCommand("type summary add EFI_TPL --python-function
> lldbefi.EFI_TPL_TypeSummary")
> + debugger.HandleCommand("type summary add
> EFI_DEVICE_PATH_PROTOCOL --python-function
> lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")
> +
> + debugger.HandleCommand("type summary add CHAR16 --python-function
> lldbefi.CHAR16_TypeSummary")
> + debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]"
> --python-function lldbefi.CHAR16_TypeSummary')
> + debugger.HandleCommand("type summary add CHAR8 --python-function
> lldbefi.CHAR8_TypeSummary")
> + debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" -
> -python-function lldbefi.CHAR8_TypeSummary')
> +
> +
> +gEmulatorBreakWorkaroundNeeded = True
> +
> +def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):
> + #
> + # This is an lldb breakpoint script, and assumes the breakpoint is on a
> + # function with the same prototype as SecGdbScriptBreak(). The
> + # argument names are important as lldb looks them up.
> + #
> + # VOID
> + # SecGdbScriptBreak (
> + # char *FileName,
> + # int FileNameLength,
> + # long unsigned int LoadAddress,
> + # int AddSymbolFlag
> + # )
> + # {
> + # return;
> + # }
> + #
> + # When the emulator loads a PE/COFF image, it calls the stub function with
> + # the filename of the symbol file, the length of the FileName, the
> + # load address and a flag to indicate if this is a load or unload operation
> + #
> + global gEmulatorBreakWorkaroundNeeded
> +
> + if gEmulatorBreakWorkaroundNeeded:
> + # turn off lldb debug prints on SIGALRM (EFI timer tick)
> + frame.thread.process.target.debugger.HandleCommand("process handle
> SIGALRM -n false")
> + gEmulatorBreakWorkaroundNeeded = False
> +
> + # Convert C string to Python string
> + Error = lldb.SBError()
> + FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()
> + FileNameLen = frame.FindVariable
> ("FileNameLength").GetValueAsUnsigned()
> + FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr,
> FileNameLen, Error)
> + if not Error.Success():
> + print "!ReadCStringFromMemory() did not find a %d byte C string at %x" %
> (FileNameLen, FileNamePtr)
> + # make breakpoint command contiue
> + frame.GetThread().GetProcess().Continue()
> +
> + debugger = frame.thread.process.target.debugger
> + if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:
> + LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned()
> +
> + debugger.HandleCommand ("target modules add %s" % FileName)
> + print "target modules load --slid 0x%x %s" % (LoadAddress, FileName)
> + debugger.HandleCommand ("target modules load --slide 0x%x --file %s" %
> (LoadAddress, FileName))
> + else:
> + target = debugger.GetSelectedTarget()
> + for SBModule in target.module_iter():
> + ModuleName = SBModule.GetFileSpec().GetDirectory() + '/'
> + ModuleName += SBModule.GetFileSpec().GetFilename()
> + if FileName == ModuleName or FileName ==
> SBModule.GetFileSpec().GetFilename():
> + target.ClearModuleLoadAddress (SBModule)
> + if not target.RemoveModule (SBModule):
> + print "!lldb.target.RemoveModule (%s) FAILED" % SBModule
> +
> + # make breakpoint command contiue
> + frame.thread.process.Continue()
> +
> +def GuidToCStructStr (guid, Name=False):
> + #
> + # Convert a 16-byte bytesarry (or bytearray compat object) to C guid string
> + # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34,
> 0x7C } }
> + #
> + # Name=True means lookup name in GuidNameDict and us it if you find it
> + #
> +
> + if not isinstance (guid, bytearray):
> + # convert guid object to UUID, and UUID to bytearray
> + Uuid = uuid.UUID(guid)
> + guid = bytearray (Uuid.bytes_le)
> +
> + return "{ 0x%02.2X%02.2X%02.2X%02.2X, 0x%02.2X%02.2X, 0x%02.2X%02.2X,
> { 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X,
> 0x%02.2X } }" % \
> + (guid[3], guid[2], guid[1], guid[0], guid[5], guid[4], guid[7], guid[6],
> guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], guid[15])
> +
> +def ParseGuidString(GuidStr):
> + #
> + # Error check and convert C Guid init to string
> + # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")
> + # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7,
> 0x8A, 0x35, 0x46, 0xD1 } }")
> + #
> +
> + if "{" in GuidStr :
> + # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7,
> 0x8A, 0x35, 0x46, 0xD1 } }"
> + # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1
> + # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C',
> '0x9E', '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']
> + Hex = ''.join(x for x in GuidStr if x not in '{,}').split()
> + Str = "%08X-%04X-%04X-%02.2X%02.2X-
> %02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \
> + (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0),
> \
> + int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0),
> int(Hex[10], 0))
> + elif GuidStr.count('-') == 4:
> + # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form
> + Check = "%s" % str(uuid.UUID(GuidStr)).upper()
> + if GuidStr.upper() == Check:
> + Str = GuidStr.upper()
> + else:
> + Ste = ""
> + else:
> + Str = ""
> +
> + return Str
> +
> +
> +def create_guid_options():
> + usage = "usage: %prog [data]"
> + description='''lookup EFI_GUID by CName, C struct, or GUID string and print
> out all three.
> + '''
> + parser = optparse.OptionParser(description=description,
> prog='guid',usage=usage)
> + return parser
> +
> +def efi_guid_command(debugger, command, result, dict):
> + # Use the Shell Lexer to properly parse up command options just like a
> + # shell would
> + command_args = shlex.split(command)
> + parser = create_guid_options()
> + try:
> + (options, args) = parser.parse_args(command_args)
> + if len(args) >= 1:
> + if args[0] == "{":
> + # caller forgot to quote the string"
> + # mark arg[0] a string containing all args[n]
> + args[0] = ' '.join(args)
> + GuidStr = ParseGuidString (args[0])
> + if GuidStr == "":
> + # return Key of GuidNameDict for value args[0]
> + GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value ==
> args[0]][0]
> + GuidStr = GuidStr.upper()
> + except:
> + # if you don't handle exceptions, passing an incorrect argument to the
> OptionParser will cause LLDB to exit
> + # (courtesy of OptParse dealing with argument errors by throwing
> SystemExit)
> + result.SetError ("option parsing failed")
> + return
> +
> +
> + if len(args) >= 1:
> + if GuidStr in guid_dict:
> + print "%s = %s" % (guid_dict[GuidStr], GuidStr)
> + print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr))
> + else:
> + print GuidStr
> + else:
> + # dump entire dictionary
> + width = max(len(v) for k,v in guid_dict.iteritems())
> + for value in sorted(guid_dict, key=guid_dict.get):
> + print '%-*s %s %s' % (width, guid_dict[value], value,
> GuidToCStructStr(value))
> +
> + return
> +
> +
> +#
> +########## Code that runs when this script is imported into LLDB
> ###########
> +#
> +def __lldb_init_module (debugger, internal_dict):
> + # This initializer is being run from LLDB in the embedded command
> interpreter
> + # Make the options so we can generate the help text for the new LLDB
> + # command line command prior to registering it with LLDB below
> +
> + global guid_dict
> +
> + # Source Guid.xref file if we can find it
> + inputfile = os.getcwd()
> + inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'
> + with open(inputfile) as f:
> + for line in f:
> + data = line.split(' ')
> + if len(data) >= 2:
> + guid_dict[data[0].upper()] = data[1].strip('\n')
> +
> + # init EFI specific type formaters
> + TypePrintFormating (debugger)
> +
> +
> + # add guid command
> + parser = create_guid_options()
> + efi_guid_command.__doc__ = parser.format_help()
> + debugger.HandleCommand('command script add -f
> lldbefi.efi_guid_command guid')
> +
> +
> + Target = debugger.GetTargetAtIndex(0)
> + if Target:
> + Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')
> + if Breakpoint.GetNumLocations() == 1:
> + # Set the emulator breakpoints, if we are in the emulator
> + debugger.HandleCommand("breakpoint command add -s python -F
> lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))
> + print 'Type r to run emulator. SecLldbScriptBreak armed. EFI modules
> should now get source level debugging in the emulator.'
> diff --git a/EmulatorPkg/Win/Host/WinBlockIo.c
> b/EmulatorPkg/Win/Host/WinBlockIo.c
> index 14491a6e90..d5944c4227 100644
> --- a/EmulatorPkg/Win/Host/WinBlockIo.c
> +++ b/EmulatorPkg/Win/Host/WinBlockIo.c
> @@ -270,7 +270,7 @@ WinNtSignalToken (
> @param[in] MediaId Id of the media, changes every time the media is
> replaced.
> @param[in] Lba The starting Logical Block Address to read from.
> - @param[in, out] Token A pointer to the token associated with the
> transaction.
> + @param[in, out] Token A pointer to the token associated with the
> transaction.
> @param[in] BufferSize Size of Buffer, must be a multiple of device block
> size.
> @param[out] Buffer A pointer to the destination buffer for the data.
> The
> caller is responsible for either having implicit or
> diff --git a/EmulatorPkg/Win/Host/WinHost.h
> b/EmulatorPkg/Win/Host/WinHost.h
> index 6f1f1a2dd3..991da1c15b 100644
> --- a/EmulatorPkg/Win/Host/WinHost.h
> +++ b/EmulatorPkg/Win/Host/WinHost.h
> @@ -206,4 +206,4 @@ extern EMU_THUNK_PROTOCOL gEmuThunkProtocol;
> extern EMU_IO_THUNK_PROTOCOL mWinNtWndThunkIo;
> extern EMU_IO_THUNK_PROTOCOL mWinNtFileSystemThunkIo;
> extern EMU_IO_THUNK_PROTOCOL mWinNtBlockIoThunkIo;
> -#endif
> \ No newline at end of file
> +#endif
> --
> 2.16.1.windows.1
prev parent reply other threads:[~2018-08-29 5:06 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-29 3:39 [PATCH] EmulatorPkg: formalize line endings Ruiyu Ni
2018-08-29 5:06 ` Wu, Hao A [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=B80AF82E9BFB8E4FBD8C89DA810C6A0931E3CEAB@SHSMSX104.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox