0, // ProcessorXModel: 4;\r
0, // ProcessorXFamily: 8;\r
0, // ProcessorReserved2: 4;\r
- }, \r
+ },\r
{ // PROCESSOR_FEATURE_FLAGS\r
0, // ProcessorFpu :1;\r
0, // ProcessorVme :1;\r
},\r
3, // ProcessorVersion String;\r
{ // Voltage;\r
- 1, // ProcessorVoltageCapability5V :1; \r
- 1, // ProcessorVoltageCapability3_3V :1; \r
- 1, // ProcessorVoltageCapability2_9V :1; \r
+ 1, // ProcessorVoltageCapability5V :1;\r
+ 1, // ProcessorVoltageCapability3_3V :1;\r
+ 1, // ProcessorVoltageCapability2_9V :1;\r
0, // ProcessorVoltageCapabilityReserved :1; ///< Bit 3, must be zero.\r
0, // ProcessorVoltageReserved :3; ///< Bits 4-6, must be zero.\r
0 // ProcessorVoltageIndicateLegacy :1;\r
- }, \r
+ },\r
0, // ExternalClock;\r
0, // MaxSpeed;\r
0, // CurrentSpeed;\r
"Not Found",\r
NULL\r
};\r
- \r
+\r
...\r
LogSmbiosData (\r
- (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12, \r
+ (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,\r
gSmbiosType12Strings\r
);\r
\r
@param Template Fixed SMBIOS structure, required.\r
- @param StringArray Array of strings to convert to an SMBIOS string pack. \r
+ @param StringArray Array of strings to convert to an SMBIOS string pack.\r
NULL is OK.\r
\r
**/\r
EFI_STATUS\r
LogSmbiosData (\r
IN EFI_SMBIOS_TABLE_HEADER *Template,\r
- IN CHAR8 **StringPack \r
+ IN CHAR8 **StringPack\r
)\r
{\r
EFI_STATUS Status;\r
- EFI_SMBIOS_PROTOCOL *Smbios; \r
+ EFI_SMBIOS_PROTOCOL *Smbios;\r
EFI_SMBIOS_HANDLE SmbiosHandle;\r
EFI_SMBIOS_TABLE_HEADER *Record;\r
UINTN Index;\r
Str += StringSize;\r
}\r
*Str = 0;\r
- \r
+\r
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
Status = Smbios->Add (\r
Smbios,\r
Record\r
);\r
ASSERT_EFI_ERROR (Status);\r
- \r
+\r
FreePool (Record);\r
return Status;\r
}\r
@param[in] MediaId Id of the media, changes every time the media is\r
replaced.\r
@param[in] Lba The starting Logical Block Address to read from.\r
- @param[in, out] Token A pointer to the token associated with the transaction.\r
+ @param[in, out] Token A pointer to the token associated with the transaction.\r
@param[in] BufferSize Size of Buffer, must be a multiple of device block size.\r
@param[out] Buffer A pointer to the destination buffer for the data. The\r
caller is responsible for either having implicit or\r
-/*++ @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\r
+\r
+Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __UGA_H_\r
+#define __UGA_H_\r
+\r
+#include <PiDxe.h>\r
+\r
+#include <Protocol/GraphicsOutput.h>\r
+#include <Protocol/SimpleTextIn.h>\r
+#include <Protocol/SimpleTextInEx.h>\r
+#include <Protocol/SimplePointer.h>\r
+#include <Protocol/EmuIoThunk.h>\r
+#include <Protocol/EmuGraphicsWindow.h>\r
+\r
+#include <Guid/EventGroup.h>\r
+\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/KeyMapLib.h>\r
+\r
+\r
+#define MAX_Q 256\r
+\r
+typedef struct {\r
+ UINTN Front;\r
+ UINTN Rear;\r
+ UINTN Count;\r
+ EFI_INPUT_KEY Q[MAX_Q];\r
+} GOP_QUEUE_FIXED;\r
+\r
+#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('U', 'g', 'S', 'n')\r
+typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {\r
+ UINTN Signature;\r
+ EFI_HANDLE NotifyHandle;\r
+ EFI_KEY_DATA KeyData;\r
+ EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;\r
+ EFI_EVENT Event;\r
+ LIST_ENTRY NotifyEntry;\r
+} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;\r
+\r
+#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff\r
+\r
+typedef struct {\r
+ UINT32 HorizontalResolution;\r
+ UINT32 VerticalResolution;\r
+ UINT32 ColorDepth;\r
+ UINT32 RefreshRate;\r
+} GOP_MODE_DATA;\r
+\r
+\r
+\r
+extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;\r
+extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;\r
+\r
+#define EMU_UGA_CLASS_NAME L"EmuGopWindow"\r
+\r
+#define GOP_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('G', 'o', 'p', 'N')\r
+typedef struct {\r
+ UINT64 Signature;\r
+\r
+ EFI_HANDLE Handle;\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;\r
+ EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;\r
+ EFI_SIMPLE_POINTER_PROTOCOL SimplePointer;\r
+\r
+ EMU_IO_THUNK_PROTOCOL *EmuIoThunk;\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *EmuGraphicsWindow;\r
+\r
+ EFI_UNICODE_STRING_TABLE *ControllerNameTable;\r
+\r
+ EFI_SIMPLE_POINTER_MODE PointerMode;\r
+ //\r
+ // GOP Private Data for QueryMode ()\r
+ //\r
+ GOP_MODE_DATA *ModeData;\r
+\r
+\r
+ //\r
+ // UGA Private Data knowing when to start hardware\r
+ //\r
+ BOOLEAN HardwareNeedsStarting;\r
+\r
+ CHAR16 *WindowName;\r
+\r
+ GOP_QUEUE_FIXED Queue;\r
+\r
+ EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;\r
+ EFI_KEY_STATE KeyState;\r
+ LIST_ENTRY NotifyList;\r
+} GOP_PRIVATE_DATA;\r
+\r
+\r
+#define GOP_PRIVATE_DATA_FROM_THIS(a) \\r
+ CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE)\r
+\r
+#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a) \\r
+ CR(a, GOP_PRIVATE_DATA, SimpleTextIn, GOP_PRIVATE_DATA_SIGNATURE)\r
+\r
+#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a) \\r
+ CR(a, GOP_PRIVATE_DATA, SimpleTextInEx, GOP_PRIVATE_DATA_SIGNATURE)\r
+\r
+#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a) \\r
+ CR(a, GOP_PRIVATE_DATA, SimplePointer, GOP_PRIVATE_DATA_SIGNATURE)\r
+\r
+\r
+//\r
+// Global Protocol Variables\r
+//\r
+extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;\r
+extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;\r
+extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;\r
+\r
+//\r
+// Gop Hardware abstraction internal worker functions\r
+//\r
+EFI_STATUS\r
+EmuGopSupported (\r
+ IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk\r
+ );\r
+\r
+EFI_STATUS\r
+EmuGopConstructor (\r
+ IN GOP_PRIVATE_DATA *Private\r
+ );\r
+\r
+EFI_STATUS\r
+EmuGopDestructor (\r
+ IN GOP_PRIVATE_DATA *Private\r
+ );\r
+\r
+\r
+EFI_STATUS\r
+GopPrivateAddQ (\r
+ IN GOP_PRIVATE_DATA *Private,\r
+ IN EFI_INPUT_KEY Key\r
+ );\r
+\r
+EFI_STATUS\r
+EmuGopInitializeSimpleTextInForWindow (\r
+ IN GOP_PRIVATE_DATA *Private\r
+ );\r
+\r
+EFI_STATUS\r
+EmuGopInitializeSimplePointerForWindow (\r
+ IN GOP_PRIVATE_DATA *Private\r
+ );\r
+\r
+EFI_STATUS\r
+EmuGopStartWindow (\r
+ IN GOP_PRIVATE_DATA *Private,\r
+ IN UINT32 HorizontalResolution,\r
+ IN UINT32 VerticalResolution,\r
+ IN UINT32 ColorDepth,\r
+ IN UINT32 RefreshRate\r
+ );\r
+\r
+VOID\r
+EFIAPI\r
+ShutdownGopEvent (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ );\r
+\r
+VOID\r
+EFIAPI\r
+GopPrivateMakeCallbackFunction (\r
+ IN VOID *Context,\r
+ IN EFI_KEY_DATA *KeyData\r
+ );\r
+\r
+VOID\r
+EFIAPI\r
+GopPrivateBreakCallbackFunction (\r
+ IN VOID *Context,\r
+ IN EFI_KEY_DATA *KeyData\r
+ );\r
+\r
+#endif\r
-/*++ @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\r
+\r
+Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+\r
+**/\r
+\r
+#include "Gop.h"\r
+\r
+\r
+BOOLEAN\r
+GopPrivateIsKeyRegistered (\r
+ IN EFI_KEY_DATA *RegsiteredData,\r
+ IN EFI_KEY_DATA *InputData\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+ RegsiteredData - A pointer to a buffer that is filled in with the keystroke\r
+ state data for the key that was registered.\r
+ InputData - A pointer to a buffer that is filled in with the keystroke\r
+ state data for the key that was pressed.\r
+\r
+Returns:\r
+ TRUE - Key be pressed matches a registered key.\r
+ FLASE - Match failed.\r
+\r
+**/\r
+{\r
+ ASSERT (RegsiteredData != NULL && InputData != NULL);\r
+\r
+ if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||\r
+ (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {\r
+ return FALSE;\r
+ }\r
+\r
+ //\r
+ // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.\r
+ //\r
+ if (RegsiteredData->KeyState.KeyShiftState != 0 &&\r
+ RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState) {\r
+ return FALSE;\r
+ }\r
+ if (RegsiteredData->KeyState.KeyToggleState != 0 &&\r
+ RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState) {\r
+ return FALSE;\r
+ }\r
+\r
+ return TRUE;\r
+\r
+}\r
+\r
+\r
+VOID\r
+EFIAPI\r
+GopPrivateMakeCallbackFunction (\r
+ IN VOID *Context,\r
+ IN EFI_KEY_DATA *KeyData\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;\r
+ GOP_PRIVATE_DATA *Private = (GOP_PRIVATE_DATA *)Context;\r
+\r
+ KeyMapMake (KeyData);\r
+\r
+ for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {\r
+ CurrentNotify = CR (\r
+ Link,\r
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,\r
+ NotifyEntry,\r
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE\r
+ );\r
+ if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {\r
+ // We could be called at a high TPL so signal an event to call the registered function\r
+ // at a lower TPL.\r
+ gBS->SignalEvent (CurrentNotify->Event);\r
+ }\r
+ }\r
+}\r
+\r
+\r
+VOID\r
+EFIAPI\r
+GopPrivateBreakCallbackFunction (\r
+ IN VOID *Context,\r
+ IN EFI_KEY_DATA *KeyData\r
+ )\r
+{\r
+ KeyMapBreak (KeyData);\r
+}\r
+\r
+\r
+\r
+//\r
+// Simple Text In implementation.\r
+//\r
+\r
+/**\r
+ Reset the input device and optionally run diagnostics\r
+\r
+ @param This Protocol instance pointer.\r
+ @param ExtendedVerification Driver may perform diagnostics on reset.\r
+\r
+ @retval EFI_SUCCESS The device was reset.\r
+ @retval EFI_DEVICE_ERROR The device is not functioning properly and could not be reset.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInReset (\r
+ IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,\r
+ IN BOOLEAN ExtendedVerification\r
+ )\r
+{\r
+ GOP_PRIVATE_DATA *Private;\r
+ EFI_KEY_DATA KeyData;\r
+ EFI_TPL OldTpl;\r
+\r
+ Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);\r
+ if (Private->EmuGraphicsWindow == NULL) {\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ //\r
+ // Enter critical section\r
+ //\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+ //\r
+ // A reset is draining the Queue\r
+ //\r
+ while (Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)\r
+ ;\r
+\r
+ //\r
+ // Leave critical section and return\r
+ //\r
+ gBS->RestoreTPL (OldTpl);\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+ Reads the next keystroke from the input device. The WaitForKey Event can\r
+ be used to test for existence of a keystroke via WaitForEvent () call.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param Key A pointer to a buffer that is filled in with the keystroke\r
+ information for the key that was pressed.\r
+\r
+ @retval EFI_SUCCESS The keystroke information was returned.\r
+ @retval EFI_NOT_READY There was no keystroke data available.\r
+ @retval EFI_DEVICE_ERROR The keystroke information was not returned due to\r
+ hardware errors.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInReadKeyStroke (\r
+ IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,\r
+ OUT EFI_INPUT_KEY *Key\r
+ )\r
+{\r
+ GOP_PRIVATE_DATA *Private;\r
+ EFI_STATUS Status;\r
+ EFI_TPL OldTpl;\r
+ EFI_KEY_DATA KeyData;\r
+\r
+ Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);\r
+ if (Private->EmuGraphicsWindow == NULL) {\r
+ return EFI_NOT_READY;\r
+ }\r
+\r
+ //\r
+ // Enter critical section\r
+ //\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+ Status = Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData);\r
+ if (!EFI_ERROR (Status)) {\r
+ if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {\r
+ // Modifier key was pressed\r
+ Status = EFI_NOT_READY;\r
+ } else {\r
+ CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));\r
+ }\r
+ }\r
+\r
+ //\r
+ // Leave critical section and return\r
+ //\r
+ gBS->RestoreTPL (OldTpl);\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+ SimpleTextIn and SimpleTextInEx Notify Wait Event\r
+\r
+ @param Event Event whose notification function is being invoked.\r
+ @param Context Pointer to GOP_PRIVATE_DATA.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EmuGopSimpleTextInWaitForKey (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ GOP_PRIVATE_DATA *Private;\r
+ EFI_STATUS Status;\r
+ EFI_TPL OldTpl;\r
+\r
+ Private = (GOP_PRIVATE_DATA *) Context;\r
+ if (Private->EmuGraphicsWindow == NULL) {\r
+ return;\r
+ }\r
+\r
+ //\r
+ // Enter critical section\r
+ //\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+ Status = Private->EmuGraphicsWindow->CheckKey (Private->EmuGraphicsWindow);\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // If a there is a key in the queue signal our event.\r
+ //\r
+ gBS->SignalEvent (Event);\r
+ }\r
+ //\r
+ // Leave critical section and return\r
+ //\r
+ gBS->RestoreTPL (OldTpl);\r
+}\r
+\r
+\r
+//\r
+// Simple Text Input Ex protocol functions\r
+//\r
+\r
+\r
+/**\r
+ The Reset() function resets the input device hardware. As part\r
+ of initialization process, the firmware/device will make a quick\r
+ but reasonable attempt to verify that the device is functioning.\r
+ If the ExtendedVerification flag is TRUE the firmware may take\r
+ an extended amount of time to verify the device is operating on\r
+ reset. Otherwise the reset operation is to occur as quickly as\r
+ possible. The hardware verification process is not defined by\r
+ this specification and is left up to the platform firmware or\r
+ driver to implement.\r
+\r
+ @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.\r
+\r
+ @param ExtendedVerification Indicates that the driver may\r
+ perform a more exhaustive\r
+ verification operation of the\r
+ device during reset.\r
+\r
+\r
+ @retval EFI_SUCCESS The device was reset.\r
+\r
+ @retval EFI_DEVICE_ERROR The device is not functioning\r
+ correctly and could not be reset.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInExResetEx (\r
+ IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,\r
+ IN BOOLEAN ExtendedVerification\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Reset the input device and optionaly run diagnostics\r
+\r
+ Arguments:\r
+ This - Protocol instance pointer.\r
+ ExtendedVerification - Driver may perform diagnostics on reset.\r
+\r
+ Returns:\r
+ EFI_SUCCESS - The device was reset.\r
+\r
+**/\r
+{\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+/**\r
+ The function reads the next keystroke from the input device. If\r
+ there is no pending keystroke the function returns\r
+ EFI_NOT_READY. If there is a pending keystroke, then\r
+ KeyData.Key.ScanCode is the EFI scan code defined in Error!\r
+ Reference source not found. The KeyData.Key.UnicodeChar is the\r
+ actual printable character or is zero if the key does not\r
+ represent a printable character (control key, function key,\r
+ etc.). The KeyData.KeyState is shift state for the character\r
+ reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .\r
+ When interpreting the data from this function, it should be\r
+ noted that if a class of printable characters that are\r
+ normally adjusted by shift modifiers (e.g. Shift Key + "f"\r
+ key) would be presented solely as a KeyData.Key.UnicodeChar\r
+ without the associated shift state. So in the previous example\r
+ of a Shift Key + "f" key being pressed, the only pertinent\r
+ data returned would be KeyData.Key.UnicodeChar with the value\r
+ of "F". This of course would not typically be the case for\r
+ non-printable characters such as the pressing of the Right\r
+ Shift Key + F10 key since the corresponding returned data\r
+ would be reflected both in the KeyData.KeyState.KeyShiftState\r
+ and KeyData.Key.ScanCode values. UEFI drivers which implement\r
+ the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return\r
+ KeyData.Key and KeyData.KeyState values. These drivers must\r
+ always return the most current state of\r
+ KeyData.KeyState.KeyShiftState and\r
+ KeyData.KeyState.KeyToggleState. It should also be noted that\r
+ certain input devices may not be able to produce shift or toggle\r
+ state information, and in those cases the high order bit in the\r
+ respective Toggle and Shift state fields should not be active.\r
+\r
+\r
+ @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.\r
+\r
+ @param KeyData A pointer to a buffer that is filled in with\r
+ the keystroke state data for the key that was\r
+ pressed.\r
+\r
+\r
+ @retval EFI_SUCCESS The keystroke information was\r
+ returned.\r
+\r
+ @retval EFI_NOT_READY There was no keystroke data available.\r
+ EFI_DEVICE_ERROR The keystroke\r
+ information was not returned due to\r
+ hardware errors.\r
+\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInExReadKeyStrokeEx (\r
+ IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,\r
+ OUT EFI_KEY_DATA *KeyData\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Reads the next keystroke from the input device. The WaitForKey Event can\r
+ be used to test for existance of a keystroke via WaitForEvent () call.\r
+\r
+ Arguments:\r
+ This - Protocol instance pointer.\r
+ KeyData - A pointer to a buffer that is filled in with the keystroke\r
+ state data for the key that was pressed.\r
+\r
+ Returns:\r
+ EFI_SUCCESS - The keystroke information was returned.\r
+ EFI_NOT_READY - There was no keystroke data availiable.\r
+ EFI_DEVICE_ERROR - The keystroke information was not returned due to\r
+ hardware errors.\r
+ EFI_INVALID_PARAMETER - KeyData is NULL.\r
+\r
+**/\r
+{\r
+ EFI_STATUS Status;\r
+ GOP_PRIVATE_DATA *Private;\r
+ EFI_TPL OldTpl;\r
+\r
+\r
+ if (KeyData == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);\r
+ if (Private->EmuGraphicsWindow == NULL) {\r
+ return EFI_NOT_READY;\r
+ }\r
+\r
+ //\r
+ // Enter critical section\r
+ //\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+ Status = Private->EmuGraphicsWindow->GetKey(Private->EmuGraphicsWindow, KeyData);\r
+\r
+ //\r
+ // Leave critical section and return\r
+ //\r
+ gBS->RestoreTPL (OldTpl);\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+ The SetState() function allows the input device hardware to\r
+ have state settings adjusted.\r
+\r
+ @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.\r
+\r
+ @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to\r
+ set the state for the input device.\r
+\r
+\r
+ @retval EFI_SUCCESS The device state was set appropriately.\r
+\r
+ @retval EFI_DEVICE_ERROR The device is not functioning\r
+ correctly and could not have the\r
+ setting adjusted.\r
+\r
+ @retval EFI_UNSUPPORTED The device does not support the\r
+ ability to have its state set.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInExSetState (\r
+ IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,\r
+ IN EFI_KEY_TOGGLE_STATE *KeyToggleState\r
+ )\r
+{\r
+ GOP_PRIVATE_DATA *Private;\r
+ EFI_STATUS Status;\r
+ EFI_TPL OldTpl;\r
+\r
+ Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);\r
+ if (Private->EmuGraphicsWindow == NULL) {\r
+ return EFI_NOT_READY;\r
+ }\r
+\r
+ //\r
+ // Enter critical section\r
+ //\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+ Status = Private->EmuGraphicsWindow->KeySetState (Private->EmuGraphicsWindow, KeyToggleState);\r
+ //\r
+ // Leave critical section and return\r
+ //\r
+ gBS->RestoreTPL (OldTpl);\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ SimpleTextIn and SimpleTextInEx Notify Wait Event\r
+\r
+ @param Event Event whose notification function is being invoked.\r
+ @param Context Pointer to GOP_PRIVATE_DATA.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EmuGopRegisterKeyCallback (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;\r
+\r
+ ExNotify->KeyNotificationFn (&ExNotify->KeyData);\r
+}\r
+\r
+\r
+\r
+/**\r
+ The RegisterKeystrokeNotify() function registers a function\r
+ which will be called when a specified keystroke will occur.\r
+\r
+ @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.\r
+\r
+ @param KeyData A pointer to a buffer that is filled in with\r
+ the keystroke information for the key that was\r
+ pressed.\r
+\r
+ @param KeyNotificationFunction Points to the function to be\r
+ called when the key sequence\r
+ is typed specified by KeyData.\r
+\r
+\r
+ @param NotifyHandle Points to the unique handle assigned to\r
+ the registered notification.\r
+\r
+ @retval EFI_SUCCESS The device state was set\r
+ appropriately.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary\r
+ data structures.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInExRegisterKeyNotify (\r
+ IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,\r
+ IN EFI_KEY_DATA *KeyData,\r
+ IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,\r
+ OUT EFI_HANDLE *NotifyHandle\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ GOP_PRIVATE_DATA *Private;\r
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;\r
+ LIST_ENTRY *Link;\r
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NewNotify;\r
+\r
+ if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);\r
+\r
+ //\r
+ // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already registered.\r
+ //\r
+ for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {\r
+ CurrentNotify = CR (\r
+ Link,\r
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,\r
+ NotifyEntry,\r
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE\r
+ );\r
+ if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {\r
+ if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {\r
+ *NotifyHandle = CurrentNotify->NotifyHandle;\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
+ // Allocate resource to save the notification function\r
+ //\r
+ NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));\r
+ if (NewNotify == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ NewNotify->Signature = EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;\r
+ NewNotify->KeyNotificationFn = KeyNotificationFunction;\r
+ NewNotify->NotifyHandle = (EFI_HANDLE) NewNotify;\r
+ CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));\r
+ InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);\r
+\r
+ Status = gBS->CreateEvent (\r
+ EVT_NOTIFY_SIGNAL,\r
+ TPL_NOTIFY,\r
+ EmuGopRegisterKeyCallback,\r
+ NewNotify,\r
+ &NewNotify->Event\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+\r
+ *NotifyHandle = NewNotify->NotifyHandle;\r
+\r
+ return EFI_SUCCESS;\r
+\r
+}\r
+\r
+\r
+/**\r
+ The UnregisterKeystrokeNotify() function removes the\r
+ notification which was previously registered.\r
+\r
+ @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.\r
+\r
+ @param NotificationHandle The handle of the notification\r
+ function being unregistered.\r
+\r
+ @retval EFI_SUCCESS The device state was set appropriately.\r
+\r
+ @retval EFI_INVALID_PARAMETER The NotificationHandle is\r
+ invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInExUnregisterKeyNotify (\r
+ IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,\r
+ IN EFI_HANDLE NotificationHandle\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Remove a registered notification function from a particular keystroke.\r
+\r
+ Arguments:\r
+ This - Protocol instance pointer.\r
+ NotificationHandle - The handle of the notification function being unregistered.\r
+\r
+ Returns:\r
+ EFI_SUCCESS - The notification function was unregistered successfully.\r
+ EFI_INVALID_PARAMETER - The NotificationHandle is invalid.\r
+\r
+**/\r
+{\r
+ GOP_PRIVATE_DATA *Private;\r
+ LIST_ENTRY *Link;\r
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;\r
+\r
+ if (NotificationHandle == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)->Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);\r
+\r
+ for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {\r
+ CurrentNotify = CR (\r
+ Link,\r
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,\r
+ NotifyEntry,\r
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE\r
+ );\r
+ if (CurrentNotify->NotifyHandle == NotificationHandle) {\r
+ //\r
+ // Remove the notification function from NotifyList and free resources\r
+ //\r
+ RemoveEntryList (&CurrentNotify->NotifyEntry);\r
+\r
+ gBS->CloseEvent (CurrentNotify->Event);\r
+\r
+ gBS->FreePool (CurrentNotify);\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Can not find the specified Notification Handle\r
+ //\r
+ return EFI_INVALID_PARAMETER;\r
+}\r
+\r
+\r
+\r
+/**\r
+ Initialize SimplelTextIn and SimpleTextInEx protocols in the Private\r
+ context structure.\r
+\r
+ @param Private Context structure to fill in.\r
+\r
+ @return EFI_SUCCESS Initialization was a success\r
+\r
+**/\r
+EFI_STATUS\r
+EmuGopInitializeSimpleTextInForWindow (\r
+ IN GOP_PRIVATE_DATA *Private\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // Initialize Simple Text In protoocol\r
+ //\r
+ Private->SimpleTextIn.Reset = EmuGopSimpleTextInReset;\r
+ Private->SimpleTextIn.ReadKeyStroke = EmuGopSimpleTextInReadKeyStroke;\r
+\r
+ Status = gBS->CreateEvent (\r
+ EVT_NOTIFY_WAIT,\r
+ TPL_NOTIFY,\r
+ EmuGopSimpleTextInWaitForKey,\r
+ Private,\r
+ &Private->SimpleTextIn.WaitForKey\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+\r
+ //\r
+ // Initialize Simple Text In Ex\r
+ //\r
+\r
+ Private->SimpleTextInEx.Reset = EmuGopSimpleTextInExResetEx;\r
+ Private->SimpleTextInEx.ReadKeyStrokeEx = EmuGopSimpleTextInExReadKeyStrokeEx;\r
+ Private->SimpleTextInEx.SetState = EmuGopSimpleTextInExSetState;\r
+ Private->SimpleTextInEx.RegisterKeyNotify = EmuGopSimpleTextInExRegisterKeyNotify;\r
+ Private->SimpleTextInEx.UnregisterKeyNotify = EmuGopSimpleTextInExUnregisterKeyNotify;\r
+\r
+ Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE);\r
+\r
+ InitializeListHead (&Private->NotifyList);\r
+\r
+ Status = gBS->CreateEvent (\r
+ EVT_NOTIFY_WAIT,\r
+ TPL_NOTIFY,\r
+ EmuGopSimpleTextInWaitForKey,\r
+ Private,\r
+ &Private->SimpleTextInEx.WaitForKeyEx\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+//\r
+// Simple Pointer implementation.\r
+//\r
+\r
+\r
+/**\r
+ Resets the pointer device hardware.\r
+\r
+ @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL\r
+ instance.\r
+ @param ExtendedVerification Indicates that the driver may perform a more exhaustive\r
+ verification operation of the device during reset.\r
+\r
+ @retval EFI_SUCCESS The device was reset.\r
+ @retval EFI_DEVICE_ERROR The device is not functioning correctly and could not be reset.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimplePointerReset (\r
+ IN EFI_SIMPLE_POINTER_PROTOCOL *This,\r
+ IN BOOLEAN ExtendedVerification\r
+ )\r
+{\r
+ GOP_PRIVATE_DATA *Private;\r
+ EFI_SIMPLE_POINTER_STATE State;\r
+ EFI_TPL OldTpl;\r
+\r
+ Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);\r
+ if (Private->EmuGraphicsWindow == NULL) {\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ //\r
+ // Enter critical section\r
+ //\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+ //\r
+ // A reset is draining the Queue\r
+ //\r
+ while (Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, &State) == EFI_SUCCESS)\r
+ ;\r
+\r
+ //\r
+ // Leave critical section and return\r
+ //\r
+ gBS->RestoreTPL (OldTpl);\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+ Retrieves the current state of a pointer device.\r
+\r
+ @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL\r
+ instance.\r
+ @param State A pointer to the state information on the pointer device.\r
+\r
+ @retval EFI_SUCCESS The state of the pointer device was returned in State.\r
+ @retval EFI_NOT_READY The state of the pointer device has not changed since the last call to\r
+ GetState().\r
+ @retval EFI_DEVICE_ERROR A device error occurred while attempting to retrieve the pointer device's\r
+ current state.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimplePointerGetState (\r
+ IN EFI_SIMPLE_POINTER_PROTOCOL *This,\r
+ IN OUT EFI_SIMPLE_POINTER_STATE *State\r
+ )\r
+{\r
+ GOP_PRIVATE_DATA *Private;\r
+ EFI_STATUS Status;\r
+ EFI_TPL OldTpl;\r
+\r
+ Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);\r
+ if (Private->EmuGraphicsWindow == NULL) {\r
+ return EFI_NOT_READY;\r
+ }\r
+\r
+ //\r
+ // Enter critical section\r
+ //\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+ Status = Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, State);\r
+ //\r
+ // Leave critical section and return\r
+ //\r
+ gBS->RestoreTPL (OldTpl);\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ SimplePointer Notify Wait Event\r
+\r
+ @param Event Event whose notification function is being invoked.\r
+ @param Context Pointer to GOP_PRIVATE_DATA.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EmuGopSimplePointerWaitForInput (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ GOP_PRIVATE_DATA *Private;\r
+ EFI_STATUS Status;\r
+ EFI_TPL OldTpl;\r
+\r
+ Private = (GOP_PRIVATE_DATA *) Context;\r
+ if (Private->EmuGraphicsWindow == NULL) {\r
+ return;\r
+ }\r
+\r
+ //\r
+ // Enter critical section\r
+ //\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+ Status = Private->EmuGraphicsWindow->CheckPointer (Private->EmuGraphicsWindow);\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // If the pointer state has changed, signal our event.\r
+ //\r
+ gBS->SignalEvent (Event);\r
+ }\r
+ //\r
+ // Leave critical section and return\r
+ //\r
+ gBS->RestoreTPL (OldTpl);\r
+}\r
+\r
+\r
+/**\r
+ SimplePointer constructor\r
+\r
+ @param Private Context structure to fill in.\r
+\r
+ @retval EFI_SUCCESS Constructor had success\r
+\r
+**/\r
+EFI_STATUS\r
+EmuGopInitializeSimplePointerForWindow (\r
+ IN GOP_PRIVATE_DATA *Private\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // Initialize Simple Pointer protoocol\r
+ //\r
+ Private->PointerMode.ResolutionX = 1;\r
+ Private->PointerMode.ResolutionY = 1;\r
+ Private->PointerMode.ResolutionZ = 1;\r
+ Private->PointerMode.LeftButton = TRUE;\r
+ Private->PointerMode.RightButton = TRUE;\r
+\r
+ Private->SimplePointer.Reset = EmuGopSimplePointerReset;\r
+ Private->SimplePointer.GetState = EmuGopSimplePointerGetState;\r
+ Private->SimplePointer.Mode = &Private->PointerMode;\r
+\r
+ Status = gBS->CreateEvent (\r
+ EVT_NOTIFY_WAIT,\r
+ TPL_NOTIFY,\r
+ EmuGopSimplePointerWaitForInput,\r
+ Private,\r
+ &Private->SimplePointer.WaitForInput\r
+ );\r
+\r
+ return Status;\r
+}\r
-/*++ @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\r
+\r
+Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+ EmuGopScreen.c\r
+\r
+Abstract:\r
+\r
+ This file produces the graphics abstration of UGA. It is called by\r
+ EmuGopDriver.c file which deals with the EFI 1.1 driver model.\r
+ This file just does graphics.\r
+\r
+**/\r
+\r
+#include "Gop.h"\r
+\r
+\r
+EFI_EVENT mGopScreenExitBootServicesEvent;\r
+\r
+GOP_MODE_DATA mGopModeData[] = {\r
+ { 800, 600, 0, 0 },\r
+ { 640, 480, 0, 0 },\r
+ { 720, 400, 0, 0 },\r
+ {1024, 768, 0, 0 },\r
+ {1280, 1024, 0, 0 }\r
+ };\r
+\r
+\r
+/**\r
+ Returns information for an available graphics mode that the graphics device\r
+ and the set of active video output devices supports.\r
+\r
+ @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.\r
+ @param ModeNumber The mode number to return information on.\r
+ @param SizeOfInfo A pointer to the size, in bytes, of the Info buffer.\r
+ @param Info A pointer to callee allocated buffer that returns information about ModeNumber.\r
+\r
+ @retval EFI_SUCCESS Mode information returned.\r
+ @retval EFI_BUFFER_TOO_SMALL The Info buffer was too small.\r
+ @retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve the video mode.\r
+ @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()\r
+ @retval EFI_INVALID_PARAMETER One of the input args was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopQuerytMode (\r
+ IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,\r
+ IN UINT32 ModeNumber,\r
+ OUT UINTN *SizeOfInfo,\r
+ OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info\r
+ )\r
+{\r
+ GOP_PRIVATE_DATA *Private;\r
+\r
+ Private = GOP_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This->Mode->MaxMode) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
+ if (*Info == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
+\r
+ (*Info)->Version = 0;\r
+ (*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;\r
+ (*Info)->VerticalResolution = Private->ModeData[ModeNumber].VerticalResolution;\r
+ (*Info)->PixelFormat = PixelBltOnly;\r
+ (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+/**\r
+ Set the video device into the specified mode and clears the visible portions of\r
+ the output display to black.\r
+\r
+ @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.\r
+ @param ModeNumber Abstraction that defines the current video mode.\r
+\r
+ @retval EFI_SUCCESS The graphics mode specified by ModeNumber was selected.\r
+ @retval EFI_DEVICE_ERROR The device had an error and could not complete the request.\r
+ @retval EFI_UNSUPPORTED ModeNumber is not supported by this device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSetMode (\r
+ IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,\r
+ IN UINT32 ModeNumber\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ GOP_PRIVATE_DATA *Private;\r
+ GOP_MODE_DATA *ModeData;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;\r
+\r
+ Private = GOP_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ if (ModeNumber >= This->Mode->MaxMode) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ ModeData = &Private->ModeData[ModeNumber];\r
+ This->Mode->Mode = ModeNumber;\r
+ Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;\r
+ Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData->VerticalResolution;\r
+ Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;\r
+\r
+ if (Private->HardwareNeedsStarting) {\r
+ Status = EmuGopStartWindow (\r
+ Private,\r
+ ModeData->HorizontalResolution,\r
+ ModeData->VerticalResolution,\r
+ ModeData->ColorDepth,\r
+ ModeData->RefreshRate\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+\r
+ Private->HardwareNeedsStarting = FALSE;\r
+ }\r
+\r
+\r
+ Status = Private->EmuGraphicsWindow->Size(\r
+ Private->EmuGraphicsWindow,\r
+ ModeData->HorizontalResolution,\r
+ ModeData->VerticalResolution\r
+ );\r
+\r
+\r
+ Fill.Red = 0x7f;\r
+ Fill.Green = 0x7F;\r
+ Fill.Blue = 0x7f;\r
+ This->Blt (\r
+ This,\r
+ &Fill,\r
+ EfiBltVideoFill,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ ModeData->HorizontalResolution,\r
+ ModeData->VerticalResolution,\r
+ ModeData->HorizontalResolution * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+ );\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+/**\r
+ Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param BltBuffer Buffer containing data to blit into video buffer. This\r
+ buffer has a size of Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+ @param BltOperation Operation to perform on BlitBuffer and video memory\r
+ @param SourceX X coordinate of source for the BltBuffer.\r
+ @param SourceY Y coordinate of source for the BltBuffer.\r
+ @param DestinationX X coordinate of destination for the BltBuffer.\r
+ @param DestinationY Y coordinate of destination for the BltBuffer.\r
+ @param Width Width of rectangle in BltBuffer in pixels.\r
+ @param Height Hight of rectangle in BltBuffer in pixels.\r
+ @param Delta OPTIONAL\r
+\r
+ @retval EFI_SUCCESS The Blt operation completed.\r
+ @retval EFI_INVALID_PARAMETER BltOperation is not valid.\r
+ @retval EFI_DEVICE_ERROR A hardware error occured writting to the video buffer.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopBlt (\r
+ IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,\r
+ IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL\r
+ IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,\r
+ IN UINTN SourceX,\r
+ IN UINTN SourceY,\r
+ IN UINTN DestinationX,\r
+ IN UINTN DestinationY,\r
+ IN UINTN Width,\r
+ IN UINTN Height,\r
+ IN UINTN Delta OPTIONAL\r
+ )\r
+{\r
+ GOP_PRIVATE_DATA *Private;\r
+ EFI_TPL OriginalTPL;\r
+ EFI_STATUS Status;\r
+ EMU_GRAPHICS_WINDOWS__BLT_ARGS GopBltArgs;\r
+\r
+ Private = GOP_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (Width == 0 || Height == 0) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ //\r
+ // If Delta is zero, then the entire BltBuffer is being used, so Delta\r
+ // is the number of bytes in each row of BltBuffer. Since BltBuffer is Width pixels size,\r
+ // the number of bytes in each row can be computed.\r
+ //\r
+ if (Delta == 0) {\r
+ Delta = Width * sizeof (EFI_UGA_PIXEL);\r
+ }\r
+\r
+ //\r
+ // We have to raise to TPL Notify, so we make an atomic write the frame buffer.\r
+ // We would not want a timer based event (Cursor, ...) to come in while we are\r
+ // doing this operation.\r
+ //\r
+ OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+ //\r
+ // Pack UGA Draw protocol parameters to EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to\r
+ // GopBlt() API of Unix UGA IO protocol.\r
+ //\r
+ GopBltArgs.DestinationX = DestinationX;\r
+ GopBltArgs.DestinationY = DestinationY;\r
+ GopBltArgs.Height = Height;\r
+ GopBltArgs.Width = Width;\r
+ GopBltArgs.SourceX = SourceX;\r
+ GopBltArgs.SourceY = SourceY;\r
+ GopBltArgs.Delta = Delta;\r
+ Status = Private->EmuGraphicsWindow->Blt (\r
+ Private->EmuGraphicsWindow,\r
+ (EFI_UGA_PIXEL *)BltBuffer,\r
+ (EFI_UGA_BLT_OPERATION)BltOperation,\r
+ &GopBltArgs\r
+ );\r
+\r
+ gBS->RestoreTPL (OriginalTPL);\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+//\r
+// Construction and Destruction functions\r
+//\r
+\r
+EFI_STATUS\r
+EmuGopSupported (\r
+ IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk\r
+ )\r
+{\r
+ //\r
+ // Check to see if the IO abstraction represents a device type we support.\r
+ //\r
+ // This would be replaced a check of PCI subsystem ID, etc.\r
+ //\r
+ if (!CompareGuid (EmuIoThunk->Protocol, &gEmuGraphicsWindowProtocolGuid)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+EmuGopStartWindow (\r
+ IN GOP_PRIVATE_DATA *Private,\r
+ IN UINT32 HorizontalResolution,\r
+ IN UINT32 VerticalResolution,\r
+ IN UINT32 ColorDepth,\r
+ IN UINT32 RefreshRate\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // Register to be notified on exit boot services so we can destroy the window.\r
+ //\r
+ Status = gBS->CreateEvent (\r
+ EVT_SIGNAL_EXIT_BOOT_SERVICES,\r
+ TPL_CALLBACK,\r
+ ShutdownGopEvent,\r
+ Private,\r
+ &mGopScreenExitBootServicesEvent\r
+ );\r
+\r
+ Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);\r
+ if (!EFI_ERROR (Status)) {\r
+ Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;\r
+\r
+ // Register callback to support RegisterKeyNotify()\r
+ Status = Private->EmuGraphicsWindow->RegisterKeyNotify (\r
+ Private->EmuGraphicsWindow,\r
+ GopPrivateMakeCallbackFunction,\r
+ GopPrivateBreakCallbackFunction,\r
+ Private\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+ return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EmuGopConstructor (\r
+ GOP_PRIVATE_DATA *Private\r
+ )\r
+{\r
+ Private->ModeData = mGopModeData;\r
+\r
+ Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;\r
+ Private->GraphicsOutput.SetMode = EmuGopSetMode;\r
+ Private->GraphicsOutput.Blt = EmuGopBlt;\r
+\r
+ //\r
+ // Allocate buffer for Graphics Output Protocol mode information\r
+ //\r
+ Private->GraphicsOutput.Mode = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));\r
+ if (Private->GraphicsOutput.Mode == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
+ if (Private->GraphicsOutput.Mode->Info == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) / sizeof(GOP_MODE_DATA);\r
+ //\r
+ // Till now, we have no idea about the window size.\r
+ //\r
+ Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;\r
+ Private->GraphicsOutput.Mode->Info->Version = 0;\r
+ Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;\r
+ Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;\r
+ Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;\r
+ Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
+ Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;\r
+ Private->GraphicsOutput.Mode->FrameBufferSize = 0;\r
+\r
+ Private->HardwareNeedsStarting = TRUE;\r
+ Private->EmuGraphicsWindow = NULL;\r
+\r
+ EmuGopInitializeSimpleTextInForWindow (Private);\r
+\r
+ EmuGopInitializeSimplePointerForWindow (Private);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+EFI_STATUS\r
+EmuGopDestructor (\r
+ GOP_PRIVATE_DATA *Private\r
+ )\r
+{\r
+ if (!Private->HardwareNeedsStarting) {\r
+ Private->EmuIoThunk->Close (Private->EmuIoThunk);\r
+ Private->EmuGraphicsWindow = NULL;\r
+ }\r
+\r
+ //\r
+ // Free graphics output protocol occupied resource\r
+ //\r
+ if (Private->GraphicsOutput.Mode != NULL) {\r
+ if (Private->GraphicsOutput.Mode->Info != NULL) {\r
+ FreePool (Private->GraphicsOutput.Mode->Info);\r
+ }\r
+ FreePool (Private->GraphicsOutput.Mode);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+VOID\r
+EFIAPI\r
+ShutdownGopEvent (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ This is the UGA screen's callback notification function for exit-boot-services.\r
+ All we do here is call EmuGopDestructor().\r
+\r
+Arguments:\r
+\r
+ Event - not used\r
+ Context - pointer to the Private structure.\r
+\r
+Returns:\r
+\r
+ None.\r
+\r
+**/\r
+{\r
+ EmuGopDestructor (Context);\r
+}\r
+\r
NULL // Mode\r
};\r
\r
-EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = { \r
+EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {\r
EfiSimpleNetworkStopped, // State\r
NET_ETHER_ADDR_LEN, // HwAddressSize\r
NET_ETHER_HEADER_SIZE, // MediaHeaderSize\r
-/*++ @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\r
+The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a magic page\r
+of memory that is like SRAM on an embedded system. This file defines what goes\r
+where in the magic page.\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __EMU_MAGIC_PAGE_LIB_H__\r
+#define __EMU_MAGIC_PAGE_LIB_H__\r
+\r
+#include <PiPei.h>\r
+#include <Library/PcdLib.h>\r
+#include <Protocol/EmuThunk.h>\r
+\r
+typedef struct {\r
+ // Used by PEI Core and PEIMs to store the PEI Services pointer.\r
+ // Privilege issues prevent using the PI mechanism in the emulator.\r
+ CONST EFI_PEI_SERVICES **PeiServicesTablePointer;\r
+\r
+ // Used by SecPeiServicesLib\r
+ EFI_PEI_PPI_DESCRIPTOR *PpiList;\r
+\r
+ // Needed by PEI PEI PeCoffLoaderExtraActionLib\r
+ EMU_THUNK_PROTOCOL *Thunk;\r
+} EMU_MAGIC_PAGE_LAYOUT;\r
+\r
+#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))\r
+\r
+#endif\r
-/*++ @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\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __EMU_THUNK_LIB_H__\r
+#define __EMU_THUNK_LIB_H__\r
+\r
+#include <Protocol/EmuThunk.h>\r
+\r
+\r
+extern EMU_THUNK_PROTOCOL *gEmuThunk;\r
+\r
+\r
+/**\r
+ Serach the EMU IO Thunk database for a matching EMU IO Thunk\r
+ Protocol instance.\r
+\r
+ @param Protocol Protocol to search for.\r
+ @param Instance Instance of protocol to search for.\r
+\r
+ @retval NULL Protocol and Instance not found.\r
+ @retval other EMU IO Thunk protocol that matched.\r
+\r
+**/\r
+EMU_IO_THUNK_PROTOCOL *\r
+EFIAPI\r
+GetIoThunkInstance (\r
+ IN EFI_GUID *Protocol,\r
+ IN UINTN Instance\r
+ );\r
+\r
+\r
+#endif\r
-/*++ @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\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __PPI_LIST_LIB_H__\r
+#define __PPI_LIST_LIB_H__\r
+\r
+\r
+extern CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList;\r
+\r
+\r
+#endif\r
-/** @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\r
+ Provides library functions for common SMBIOS operations. Only available to DXE\r
+ and UEFI module types.\r
+\r
+\r
+Copyright (c) 2012, Apple Inc. All rights reserved.\r
+Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials are licensed and made available under\r
+the terms and conditions of the BSD License that accompanies this distribution.\r
+The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php.\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _SMBIOS_LIB_H__\r
+#define _SMBIOS_LIB_H__\r
+\r
+#include <IndustryStandard/SmBios.h>\r
+#include <Protocol/Smbios.h>\r
+\r
+\r
+///\r
+/// Cache copy of the SMBIOS Protocol pointer\r
+///\r
+extern EFI_SMBIOS_PROTOCOL *gSmbios;\r
+\r
+\r
+///\r
+/// Template for SMBIOS table initialization.\r
+/// The SMBIOS_TABLE_STRING types in the formated area must match the\r
+/// StringArray sequene.\r
+///\r
+typedef struct {\r
+ //\r
+ // formatted area of a given SMBIOS record\r
+ //\r
+ SMBIOS_STRUCTURE *Entry;\r
+ //\r
+ // NULL terminated array of ASCII strings to be added to the SMBIOS record.\r
+ //\r
+ CHAR8 **StringArray;\r
+} SMBIOS_TEMPLATE_ENTRY;\r
+\r
+\r
+/**\r
+ Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY\r
+ entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.\r
+\r
+ @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.\r
+\r
+ @retval EFI_SUCCESS New SMBIOS tables were created.\r
+ @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibInitializeFromTemplate (\r
+ IN SMBIOS_TEMPLATE_ENTRY *Template\r
+ );\r
+\r
+\r
+\r
+/**\r
+ Create SMBIOS record.\r
+\r
+ Converts a fixed SMBIOS structure and an array of pointers to strings into\r
+ an SMBIOS record where the strings are cat'ed on the end of the fixed record\r
+ and terminated via a double NULL and add to SMBIOS table.\r
+\r
+ SMBIOS_TABLE_TYPE32 gSmbiosType12 = {\r
+ { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },\r
+ 1 // StringCount\r
+ };\r
+ CHAR8 *gSmbiosType12Strings[] = {\r
+ "Not Found",\r
+ NULL\r
+ };\r
+\r
+ ...\r
+ AddSmbiosEntryFromTemplate (\r
+ (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,\r
+ gSmbiosType12Strings\r
+ );\r
+\r
+ @param SmbiosEntry Fixed SMBIOS structure\r
+ @param StringArray Array of strings to convert to an SMBIOS string pack.\r
+ NULL is OK.\r
+\r
+ @retval EFI_SUCCESS New SmbiosEntry was added to SMBIOS table.\r
+ @retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibCreateEntry (\r
+ IN SMBIOS_STRUCTURE *SmbiosEntry,\r
+ IN CHAR8 **StringArray\r
+ );\r
+\r
+\r
+/**\r
+ Update the string associated with an existing SMBIOS record.\r
+\r
+ This function allows the update of specific SMBIOS strings. The number of valid strings for any\r
+ SMBIOS record is defined by how many strings were present when Add() was called.\r
+\r
+ @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.\r
+ @param[in] StringNumber The non-zero string number of the string to update.\r
+ @param[in] String Update the StringNumber string with String.\r
+\r
+ @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.\r
+ @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.\r
+ @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.\r
+ @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibUpdateString (\r
+ IN EFI_SMBIOS_HANDLE SmbiosHandle,\r
+ IN SMBIOS_TABLE_STRING StringNumber,\r
+ IN CHAR8 *String\r
+ );\r
+\r
+/**\r
+ Update the string associated with an existing SMBIOS record.\r
+\r
+ This function allows the update of specific SMBIOS strings. The number of valid strings for any\r
+ SMBIOS record is defined by how many strings were present when Add() was called.\r
+\r
+ @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.\r
+ @param[in] StringNumber The non-zero string number of the string to update.\r
+ @param[in] String Update the StringNumber string with String.\r
+\r
+ @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.\r
+ @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.\r
+ @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.\r
+ @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibUpdateUnicodeString (\r
+ IN EFI_SMBIOS_HANDLE SmbiosHandle,\r
+ IN SMBIOS_TABLE_STRING StringNumber,\r
+ IN CHAR16 *String\r
+ );\r
+\r
+/**\r
+ Allow caller to read a specific SMBIOS string\r
+\r
+ @param[in] Header SMBIOS record that contains the string.\r
+ @param[in[ StringNumber Instance of SMBIOS string 1 - N.\r
+\r
+ @retval NULL Instance of Type SMBIOS string was not found.\r
+ @retval Other Pointer to matching SMBIOS string.\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+SmbiosLibReadString (\r
+ IN SMBIOS_STRUCTURE *Header,\r
+ IN EFI_SMBIOS_STRING StringNumber\r
+ );\r
+\r
+\r
+/**\r
+ Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.\r
+\r
+ @param[in] Type Type of the next SMBIOS record to return.\r
+ @param[in[ Instance Instance of SMBIOS record 0 - N-1.\r
+ @param[out] SmbiosHandle Returns SMBIOS handle for the matching record.\r
+\r
+ @retval NULL Instance of Type SMBIOS record was not found.\r
+ @retval Other Pointer to matching SMBIOS record.\r
+**/\r
+SMBIOS_STRUCTURE *\r
+EFIAPI\r
+SmbiosLibGetRecord (\r
+ IN EFI_SMBIOS_TYPE Type,\r
+ IN UINTN Instance,\r
+ OUT EFI_SMBIOS_HANDLE *SmbiosHandle\r
+ );\r
+\r
+/**\r
+ Remove an SMBIOS record.\r
+\r
+ This function removes an SMBIOS record using the handle specified by SmbiosHandle.\r
+\r
+ @param[in] SmbiosHandle The handle of the SMBIOS record to remove.\r
+\r
+ @retval EFI_SUCCESS SMBIOS record was removed.\r
+ @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibRemove (\r
+ OUT EFI_SMBIOS_HANDLE SmbiosHandle\r
+ );\r
+\r
+\r
+\r
+\r
+#endif\r
@param[in] MediaId Id of the media, changes every time the media is\r
replaced.\r
@param[in] Lba The starting Logical Block Address to read from.\r
- @param[in, out] Token A pointer to the token associated with the transaction.\r
+ @param[in, out] Token A pointer to the token associated with the transaction.\r
@param[in] BufferSize Size of Buffer, must be a multiple of device block size.\r
@param[out] Buffer A pointer to the destination buffer for the data. The\r
caller is responsible for either having implicit or\r
-/** @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\r
+ SimpleFileSystem protocol as defined in the UEFI 2.0 specification.\r
+\r
+ The SimpleFileSystem protocol is the programmatic access to the FAT (12,16,32)\r
+ file system specified in UEFI 2.0. It can also be used to abstract a file\r
+ system other than FAT.\r
+\r
+ UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.\r
+\r
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2011, Apple Inc. All rights reserved.\r
+This program and the accompanying materials are licensed and made available under\r
+the terms and conditions of the BSD License that accompanies this distribution.\r
+The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php.\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _EMU_UGA_IO_H_\r
+#define _EMU_UGA_IO_H_\r
+\r
+#include <Protocol/SimplePointer.h>\r
+#include <Protocol/SimpleTextIn.h>\r
+#include <Protocol/SimpleTextInEx.h>\r
+#include <Protocol/UgaDraw.h>\r
+\r
+#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \\r
+ { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }\r
+\r
+typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,\r
+ UINT32 Width,\r
+ UINT32 Height\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,\r
+ EFI_KEY_DATA *key\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,\r
+ IN EFI_KEY_TOGGLE_STATE *KeyToggleState\r
+ );\r
+\r
+\r
+typedef\r
+VOID\r
+(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (\r
+ IN VOID *Context,\r
+ IN EFI_KEY_DATA *KeyData\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,\r
+ IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK CallBack,\r
+ IN VOID *Context\r
+ );\r
+\r
+\r
+typedef struct {\r
+ UINTN SourceX;\r
+ UINTN SourceY;\r
+ UINTN DestinationX;\r
+ UINTN DestinationY;\r
+ UINTN Width;\r
+ UINTN Height;\r
+ UINTN Delta;\r
+} EMU_GRAPHICS_WINDOWS__BLT_ARGS;\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,\r
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,\r
+ IN EFI_UGA_BLT_OPERATION BltOperation,\r
+ IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args\r
+ );\r
+\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,\r
+ IN EFI_KEY_DATA *KeyData\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,\r
+ EFI_SIMPLE_POINTER_STATE *state\r
+ );\r
+\r
+struct _EMU_GRAPHICS_WINDOW_PROTOCOL {\r
+ EMU_GRAPHICS_WINDOWS_SIZE Size;\r
+ EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;\r
+ EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;\r
+ EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;\r
+ EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;\r
+ EMU_GRAPHICS_WINDOWS_BLT Blt;\r
+ EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;\r
+ EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;\r
+ EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;\r
+};\r
+\r
+\r
+extern EFI_GUID gEmuGraphicsWindowProtocolGuid;\r
+\r
+#endif\r
-/*++ @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\r
+\r
+Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>\r
+Portitions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the\r
+BSD License which accompanies this distribution. The full text of the\r
+license may be found at http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _EMU_UGA_IO_H_\r
+#define _EMU_UGA_IO_H_\r
+\r
+#include <Protocol/SimplePointer.h>\r
+#include <Protocol/SimpleTextIn.h>\r
+#include <Protocol/SimpleTextInEx.h>\r
+#include <Protocol/UgaDraw.h>\r
+\r
+#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \\r
+ { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }\r
+\r
+typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,\r
+ UINT32 Width,\r
+ UINT32 Height\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,\r
+ EFI_KEY_DATA *key\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,\r
+ IN EFI_KEY_TOGGLE_STATE *KeyToggleState\r
+ );\r
+\r
+\r
+typedef\r
+VOID\r
+(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (\r
+ IN VOID *Context,\r
+ IN EFI_KEY_DATA *KeyData\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,\r
+ IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,\r
+ IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,\r
+ IN VOID *Context\r
+ );\r
+\r
+\r
+typedef struct {\r
+ UINTN SourceX;\r
+ UINTN SourceY;\r
+ UINTN DestinationX;\r
+ UINTN DestinationY;\r
+ UINTN Width;\r
+ UINTN Height;\r
+ UINTN Delta;\r
+} EMU_GRAPHICS_WINDOWS__BLT_ARGS;\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,\r
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,\r
+ IN EFI_UGA_BLT_OPERATION BltOperation,\r
+ IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args\r
+ );\r
+\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,\r
+ IN EFI_KEY_DATA *KeyData\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,\r
+ EFI_SIMPLE_POINTER_STATE *state\r
+ );\r
+\r
+struct _EMU_GRAPHICS_WINDOW_PROTOCOL {\r
+ EMU_GRAPHICS_WINDOWS_SIZE Size;\r
+ EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;\r
+ EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;\r
+ EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;\r
+ EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;\r
+ EMU_GRAPHICS_WINDOWS_BLT Blt;\r
+ EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;\r
+ EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;\r
+ EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;\r
+};\r
+\r
+\r
+extern EFI_GUID gEmuGraphicsWindowProtocolGuid;\r
+\r
+#endif\r
DevicePathFromTextAddFilter (L"EmuThread", DevPathFromTextEmuThread);\r
DevicePathFromTextAddFilter (L"EmuFs", DevPathFromTextEmuFs);\r
return EFI_SUCCESS;\r
-}
\ No newline at end of file
+}\r
gEmuGraphicsWindowProtocolGuid\r
gEfiSimpleFileSystemProtocolGuid\r
gEmuBlockIoProtocolGuid\r
- gEmuThreadThunkProtocolGuid
\ No newline at end of file
+ gEmuThreadThunkProtocolGuid\r
}\r
\r
return NULL;\r
-}
\ No newline at end of file
+}\r
-## @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\r
+# PeCoff extra action libary for DXE phase that run Emu emulator.\r
+#\r
+# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+# Portions copyright (c) 2011, Apple Inc. All rights reserved.\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+#\r
+#\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = DxeEmuPeCoffExtraActionLib\r
+ FILE_GUID = 68FCD487-D230-6846-95B1-5E1F2EF942C4\r
+ MODULE_TYPE = DXE_DRIVER\r
+ VERSION_STRING = 1.0\r
+ LIBRARY_CLASS = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER\r
+\r
+ CONSTRUCTOR = DxeEmuPeCoffLibExtraActionConstructor\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+# VALID_ARCHITECTURES = IA32\r
+#\r
+\r
+[Sources]\r
+ DxeEmuPeCoffExtraActionLib.c\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ EmulatorPkg/EmulatorPkg.dec\r
+\r
+[LibraryClasses]\r
+ DebugLib\r
+ HobLib\r
+ BaseMemoryLib\r
+\r
+[Protocols]\r
+ gEmuThunkProtocolGuid # PROTOCOL ALWAYS_CONSUMED\r
+\r
if (gEmuThunk == NULL) {\r
return NumberOfBytes;\r
}\r
- \r
+\r
return gEmuThunk->WriteStdErr (Buffer, NumberOfBytes);\r
}\r
\r
)\r
{\r
return EFI_SUCCESS;\r
-}
\ No newline at end of file
+}\r
}\r
\r
/**\r
- Perform CPU specific actions required to migrate the PEI Services Table \r
+ Perform CPU specific actions required to migrate the PEI Services Table\r
pointer from temporary RAM to permanent RAM.\r
\r
- For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes \r
+ For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes\r
immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
- For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes \r
+ For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes\r
immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in\r
- a dedicated CPU register. This means that there is no memory storage \r
- associated with storing the PEI Services Table pointer, so no additional \r
+ a dedicated CPU register. This means that there is no memory storage\r
+ associated with storing the PEI Services Table pointer, so no additional\r
migration actions are required for Itanium or ARM CPUs.\r
\r
**/\r
)\r
{\r
//\r
- // PEI Services Table pointer is cached in the global variable. No additional \r
+ // PEI Services Table pointer is cached in the global variable. No additional\r
// migration actions are required.\r
//\r
return;\r
-## @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\r
+# PeCoff extra action libary for Pei phase that run Emu emulator.\r
+#\r
+# Lib to provide memory journal status code reporting Routines\r
+# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+# Portions copyright (c) 2011, Apple Inc. All rights reserved.\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+#\r
+#\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = PeiEmuPeCoffExtraActionLib\r
+ FILE_GUID = 79C4E72A-730B-F040-8129-95877B3A97A8\r
+ MODULE_TYPE = PEIM\r
+ VERSION_STRING = 1.0\r
+ LIBRARY_CLASS = PeCoffExtraActionLib|PEI_CORE PEIM\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+# VALID_ARCHITECTURES = IA32\r
+#\r
+\r
+[Sources]\r
+ PeiEmuPeCoffExtraActionLib.c\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ EmulatorPkg/EmulatorPkg.dec\r
+\r
+[LibraryClasses]\r
+ BaseLib\r
+ PeiServicesLib\r
+ DebugLib\r
+\r
+[Ppis]\r
+ gEmuThunkPpiGuid # PPI ALWAYS_CONSUMED\r
+\r
+[Pcd]\r
+ gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage\r
}\r
\r
/**\r
- Perform CPU specific actions required to migrate the PEI Services Table \r
+ Perform CPU specific actions required to migrate the PEI Services Table\r
pointer from temporary RAM to permanent RAM.\r
\r
- For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes \r
+ For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes\r
immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
- For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes \r
+ For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes\r
immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in\r
- a dedicated CPU register. This means that there is no memory storage \r
- associated with storing the PEI Services Table pointer, so no additional \r
+ a dedicated CPU register. This means that there is no memory storage\r
+ associated with storing the PEI Services Table pointer, so no additional\r
migration actions are required for Itanium or ARM CPUs.\r
\r
**/\r
)\r
{\r
//\r
- // PEI Services Table pointer is cached in the global variable. No additional \r
+ // PEI Services Table pointer is cached in the global variable. No additional\r
// migration actions are required.\r
//\r
return;\r
}\r
\r
/**\r
- Perform CPU specific actions required to migrate the PEI Services Table \r
+ Perform CPU specific actions required to migrate the PEI Services Table\r
pointer from temporary RAM to permanent RAM.\r
\r
- For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes \r
+ For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes\r
immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
- For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes \r
+ For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes\r
immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in\r
- a dedicated CPU register. This means that there is no memory storage \r
- associated with storing the PEI Services Table pointer, so no additional \r
+ a dedicated CPU register. This means that there is no memory storage\r
+ associated with storing the PEI Services Table pointer, so no additional\r
migration actions are required for Itanium or ARM CPUs.\r
\r
**/\r
)\r
{\r
//\r
- // PEI Services Table pointer is cached in SRAM. No additional \r
+ // PEI Services Table pointer is cached in SRAM. No additional\r
// migration actions are required.\r
//\r
return;\r
PeiServicesLib\r
\r
[Ppis]\r
- gEmuThunkPpiGuid
\ No newline at end of file
+ gEmuThunkPpiGuid\r
-/*++ @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\r
+ A simple FV stack so the SEC can extract the SEC Core from an\r
+ FV.\r
+\r
+Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiPei.h>\r
+\r
+\r
+#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \\r
+ (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))\r
+\r
+EFI_FFS_FILE_STATE\r
+GetFileState (\r
+ IN UINT8 ErasePolarity,\r
+ IN EFI_FFS_FILE_HEADER *FfsHeader\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+ Returns the highest bit set of the State field\r
+\r
+Arguments:\r
+ ErasePolarity - Erase Polarity as defined by EFI_FVB2_ERASE_POLARITY\r
+ in the Attributes field.\r
+ FfsHeader - Pointer to FFS File Header.\r
+\r
+Returns:\r
+ Returns the highest bit in the State field\r
+\r
+**/\r
+{\r
+ EFI_FFS_FILE_STATE FileState;\r
+ EFI_FFS_FILE_STATE HighestBit;\r
+\r
+ FileState = FfsHeader->State;\r
+\r
+ if (ErasePolarity != 0) {\r
+ FileState = (EFI_FFS_FILE_STATE)~FileState;\r
+ }\r
+\r
+ HighestBit = 0x80;\r
+ while (HighestBit != 0 && (HighestBit & FileState) == 0) {\r
+ HighestBit >>= 1;\r
+ }\r
+\r
+ return HighestBit;\r
+}\r
+\r
+UINT8\r
+CalculateHeaderChecksum (\r
+ IN EFI_FFS_FILE_HEADER *FileHeader\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+ Calculates the checksum of the header of a file.\r
+\r
+Arguments:\r
+ FileHeader - Pointer to FFS File Header.\r
+\r
+Returns:\r
+ Checksum of the header.\r
+\r
+**/\r
+{\r
+ UINT8 *ptr;\r
+ UINTN Index;\r
+ UINT8 Sum;\r
+\r
+ Sum = 0;\r
+ ptr = (UINT8 *) FileHeader;\r
+\r
+ for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {\r
+ Sum = (UINT8) (Sum + ptr[Index]);\r
+ Sum = (UINT8) (Sum + ptr[Index + 1]);\r
+ Sum = (UINT8) (Sum + ptr[Index + 2]);\r
+ Sum = (UINT8) (Sum + ptr[Index + 3]);\r
+ }\r
+\r
+ for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {\r
+ Sum = (UINT8) (Sum + ptr[Index]);\r
+ }\r
+ //\r
+ // State field (since this indicates the different state of file).\r
+ //\r
+ Sum = (UINT8) (Sum - FileHeader->State);\r
+ //\r
+ // Checksum field of the file is not part of the header checksum.\r
+ //\r
+ Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);\r
+\r
+ return Sum;\r
+}\r
+\r
+EFI_STATUS\r
+SecFfsFindNextFile (\r
+ IN EFI_FV_FILETYPE SearchType,\r
+ IN EFI_PEI_FV_HANDLE FvHandle,\r
+ IN OUT EFI_PEI_FILE_HANDLE *FileHandle\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+ Given the input file pointer, search for the next matching file in the\r
+ FFS volume as defined by SearchType. The search starts from FileHeader inside\r
+ the Firmware Volume defined by FwVolHeader.\r
+\r
+Arguments:\r
+ SearchType - Filter to find only files of this type.\r
+ Type EFI_FV_FILETYPE_ALL causes no filtering to be done.\r
+ FwVolHeader - Pointer to the FV header of the volume to search.\r
+ This parameter must point to a valid FFS volume.\r
+ FileHeader - Pointer to the current file from which to begin searching.\r
+ This pointer will be updated upon return to reflect the file\r
+ found.\r
+\r
+Returns:\r
+ EFI_NOT_FOUND - No files matching the search criteria were found\r
+ EFI_SUCCESS\r
+\r
+**/\r
+{\r
+ EFI_FFS_FILE_HEADER *FfsFileHeader;\r
+ UINT32 FileLength;\r
+ UINT32 FileOccupiedSize;\r
+ UINT32 FileOffset;\r
+ UINT64 FvLength;\r
+ UINT8 ErasePolarity;\r
+ UINT8 FileState;\r
+ EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;\r
+ EFI_FFS_FILE_HEADER **FileHeader;\r
+\r
+ //\r
+ // Convert the handle of FV to FV header for memory-mapped firmware volume\r
+ //\r
+ FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;\r
+ FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle;\r
+\r
+ FvLength = FwVolHeader->FvLength;\r
+ if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {\r
+ ErasePolarity = 1;\r
+ } else {\r
+ ErasePolarity = 0;\r
+ }\r
+ //\r
+ // If FileHeader is not specified (NULL) start with the first file in the\r
+ // firmware volume. Otherwise, start from the FileHeader.\r
+ //\r
+ if (*FileHeader == NULL) {\r
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader + FwVolHeader->HeaderLength);\r
+ } else {\r
+ //\r
+ // Length is 24 bits wide so mask upper 8 bits\r
+ // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.\r
+ //\r
+ FileLength = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;\r
+ FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);\r
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader + FileOccupiedSize);\r
+ }\r
+\r
+ FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);\r
+\r
+ while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {\r
+ //\r
+ // Get FileState which is the highest bit of the State\r
+ //\r
+ FileState = GetFileState (ErasePolarity, FfsFileHeader);\r
+\r
+ switch (FileState) {\r
+\r
+ case EFI_FILE_HEADER_INVALID:\r
+ FileOffset += sizeof (EFI_FFS_FILE_HEADER);\r
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));\r
+ break;\r
+\r
+ case EFI_FILE_DATA_VALID:\r
+ case EFI_FILE_MARKED_FOR_UPDATE:\r
+ if (CalculateHeaderChecksum (FfsFileHeader) == 0) {\r
+ FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;\r
+ FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);\r
+\r
+ if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {\r
+\r
+ *FileHeader = FfsFileHeader;\r
+\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ FileOffset += FileOccupiedSize;\r
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ break;\r
+\r
+ case EFI_FILE_DELETED:\r
+ FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;\r
+ FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);\r
+ FileOffset += FileOccupiedSize;\r
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);\r
+ break;\r
+\r
+ default:\r
+ return EFI_NOT_FOUND;\r
+\r
+ }\r
+ }\r
+\r
+ return EFI_NOT_FOUND;\r
+}\r
+\r
+EFI_STATUS\r
+SecFfsFindSectionData (\r
+ IN EFI_SECTION_TYPE SectionType,\r
+ IN EFI_FFS_FILE_HEADER *FfsFileHeader,\r
+ IN OUT VOID **SectionData\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+ Given the input file pointer, search for the next matching section in the\r
+ FFS volume.\r
+\r
+Arguments:\r
+ SearchType - Filter to find only sections of this type.\r
+ FfsFileHeader - Pointer to the current file to search.\r
+ SectionData - Pointer to the Section matching SectionType in FfsFileHeader.\r
+ NULL if section not found\r
+\r
+Returns:\r
+ EFI_NOT_FOUND - No files matching the search criteria were found\r
+ EFI_SUCCESS\r
+\r
+**/\r
+{\r
+ UINT32 FileSize;\r
+ EFI_COMMON_SECTION_HEADER *Section;\r
+ UINT32 SectionLength;\r
+ UINT32 ParsedLength;\r
+\r
+ //\r
+ // Size is 24 bits wide so mask upper 8 bits.\r
+ // Does not include FfsFileHeader header size\r
+ // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.\r
+ //\r
+ Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);\r
+ FileSize = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;\r
+ FileSize -= sizeof (EFI_FFS_FILE_HEADER);\r
+\r
+ *SectionData = NULL;\r
+ ParsedLength = 0;\r
+ while (ParsedLength < FileSize) {\r
+ if (Section->Type == SectionType) {\r
+ *SectionData = (VOID *) (Section + 1);\r
+ return EFI_SUCCESS;\r
+ }\r
+ //\r
+ // Size is 24 bits wide so mask upper 8 bits.\r
+ // SectionLength is adjusted it is 4 byte aligned.\r
+ // Go to the next section\r
+ //\r
+ SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;\r
+ SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);\r
+\r
+ ParsedLength += SectionLength;\r
+ Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + SectionLength);\r
+ }\r
+\r
+ return EFI_NOT_FOUND;\r
+}\r
+\r
-/*++ @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\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiPei.h>\r
+\r
+CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList = NULL;\r
+\r
-/** @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\r
+ Provides library functions for common SMBIOS operations. Only available to DXE\r
+ and UEFI module types.\r
+\r
+\r
+Copyright (c) 2012, Apple Inc. All rights reserved.\r
+Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials are licensed and made available under\r
+the terms and conditions of the BSD License that accompanies this distribution.\r
+The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php.\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiDxe.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/SmbiosLib.h>\r
+\r
+\r
+EFI_SMBIOS_PROTOCOL *gSmbios = NULL;\r
+\r
+\r
+/**\r
+ Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY\r
+ entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.\r
+\r
+ @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.\r
+\r
+ @retval EFI_SUCCESS New SMBIOS tables were created.\r
+ @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibInitializeFromTemplate (\r
+ IN SMBIOS_TEMPLATE_ENTRY *Template\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN Index;\r
+\r
+ if (Template == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
+ for (Index = 0; Template[Index].Entry != NULL; Index++) {\r
+ Status = SmbiosLibCreateEntry (Template[Index].Entry, Template[Index].StringArray);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+ Create SMBIOS record.\r
+\r
+ Converts a fixed SMBIOS structure and an array of pointers to strings into\r
+ an SMBIOS record where the strings are cat'ed on the end of the fixed record\r
+ and terminated via a double NULL and add to SMBIOS table.\r
+\r
+ SMBIOS_TABLE_TYPE32 gSmbiosType12 = {\r
+ { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },\r
+ 1 // StringCount\r
+ };\r
+ CHAR8 *gSmbiosType12Strings[] = {\r
+ "Not Found",\r
+ NULL\r
+ };\r
+\r
+ ...\r
+ CreateSmbiosEntry (\r
+ (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,\r
+ gSmbiosType12Strings\r
+ );\r
+\r
+ @param SmbiosEntry Fixed SMBIOS structure\r
+ @param StringArray Array of strings to convert to an SMBIOS string pack.\r
+ NULL is OK.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibCreateEntry (\r
+ IN SMBIOS_STRUCTURE *SmbiosEntry,\r
+ IN CHAR8 **StringArray\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_SMBIOS_HANDLE SmbiosHandle;\r
+ EFI_SMBIOS_TABLE_HEADER *Record;\r
+ UINTN Index;\r
+ UINTN StringSize;\r
+ UINTN Size;\r
+ CHAR8 *Str;\r
+\r
+ // Calculate the size of the fixed record and optional string pack\r
+ Size = SmbiosEntry->Length;\r
+ if (StringArray == NULL) {\r
+ Size += 2; // Min string section is double null\r
+ } else if (StringArray[0] == NULL) {\r
+ Size += 2; // Min string section is double null\r
+ } else {\r
+ for (Index = 0; StringArray[Index] != NULL; Index++) {\r
+ StringSize = AsciiStrSize (StringArray[Index]);\r
+ Size += StringSize;\r
+ }\r
+ // Don't forget the terminating double null\r
+ Size += 1;\r
+ }\r
+\r
+ // Copy over Template\r
+ Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);\r
+ if (Record == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);\r
+\r
+ if (StringArray != NULL) {\r
+ // Append string pack\r
+ Str = ((CHAR8 *)Record) + Record->Length;\r
+ for (Index = 0; StringArray[Index] != NULL; Index++) {\r
+ StringSize = AsciiStrSize (StringArray[Index]);\r
+ CopyMem (Str, StringArray[Index], StringSize);\r
+ Str += StringSize;\r
+ }\r
+ *Str = 0;\r
+ }\r
+\r
+ SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
+ Status = gSmbios->Add (\r
+ gSmbios,\r
+ gImageHandle,\r
+ &SmbiosHandle,\r
+ Record\r
+ );\r
+\r
+ FreePool (Record);\r
+ return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+ Update the string associated with an existing SMBIOS record.\r
+\r
+ This function allows the update of specific SMBIOS strings. The number of valid strings for any\r
+ SMBIOS record is defined by how many strings were present when Add() was called.\r
+\r
+ @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.\r
+ @param[in] StringNumber The non-zero string number of the string to update.\r
+ @param[in] String Update the StringNumber string with String.\r
+\r
+ @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.\r
+ @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.\r
+ @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.\r
+ @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibUpdateString (\r
+ IN EFI_SMBIOS_HANDLE SmbiosHandle,\r
+ IN SMBIOS_TABLE_STRING StringNumber,\r
+ IN CHAR8 *String\r
+ )\r
+{\r
+ UINTN StringIndex;\r
+\r
+ if (String == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (*String == '\0') {\r
+ // A string with no data is not legal in SMBIOS\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ StringIndex = StringNumber;\r
+ return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, String);\r
+}\r
+\r
+\r
+/**\r
+ Update the string associated with an existing SMBIOS record.\r
+\r
+ This function allows the update of specific SMBIOS strings. The number of valid strings for any\r
+ SMBIOS record is defined by how many strings were present when Add() was called.\r
+\r
+ @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.\r
+ @param[in] StringNumber The non-zero string number of the string to update.\r
+ @param[in] String Update the StringNumber string with String.\r
+\r
+ @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.\r
+ @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.\r
+ @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.\r
+ @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibUpdateUnicodeString (\r
+ IN EFI_SMBIOS_HANDLE SmbiosHandle,\r
+ IN SMBIOS_TABLE_STRING StringNumber,\r
+ IN CHAR16 *String\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN StringIndex;\r
+ CHAR8 *Ascii;\r
+\r
+ if (String == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (*String == '\0') {\r
+ // A string with no data is not legal in SMBIOS\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Ascii = AllocateZeroPool (StrSize (String));\r
+ if (Ascii == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ UnicodeStrToAsciiStr (String, Ascii);\r
+\r
+ StringIndex = StringNumber;\r
+ Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, Ascii);\r
+\r
+ FreePool (Ascii);\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ Allow caller to read a specific SMBIOS string\r
+\r
+ @param[in] Header SMBIOS record that contains the string.\r
+ @param[in[ StringNumber Instance of SMBIOS string 1 - N.\r
+\r
+ @retval NULL Instance of Type SMBIOS string was not found.\r
+ @retval Other Pointer to matching SMBIOS string.\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+SmbiosLibReadString (\r
+ IN SMBIOS_STRUCTURE *Header,\r
+ IN EFI_SMBIOS_STRING StringNumber\r
+ )\r
+{\r
+ CHAR8 *Data;\r
+ UINTN Match;\r
+\r
+ Data = (CHAR8 *)Header + Header->Length;\r
+ for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {\r
+ if (StringNumber == Match) {\r
+ return Data;\r
+ }\r
+ Data++;\r
+ if (*(Data - 1) == '\0') {\r
+ Match++;\r
+ }\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+\r
+/**\r
+ Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.\r
+\r
+ @param[in] Type Type of the next SMBIOS record to return.\r
+ @param[in[ Instance Instance of SMBIOS record 0 - N-1.\r
+ @param[out] SmbiosHandle Returns SMBIOS handle for the matching record.\r
+\r
+ @retval NULL Instance of Type SMBIOS record was not found.\r
+ @retval Other Pointer to matching SMBIOS record.\r
+**/\r
+SMBIOS_STRUCTURE *\r
+EFIAPI\r
+SmbiosLibGetRecord (\r
+ IN EFI_SMBIOS_TYPE Type,\r
+ IN UINTN Instance,\r
+ OUT EFI_SMBIOS_HANDLE *SmbiosHandle\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_SMBIOS_TABLE_HEADER *Record;\r
+ UINTN Match;\r
+\r
+ Match = 0;\r
+ *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
+ do {\r
+ Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record, NULL);\r
+ if (!EFI_ERROR (Status)) {\r
+ if (Match == Instance) {\r
+ return (SMBIOS_STRUCTURE *)Record;\r
+ }\r
+ Match++;\r
+ }\r
+ } while (!EFI_ERROR (Status));\r
+\r
+ return NULL;\r
+}\r
+\r
+\r
+/**\r
+ Remove an SMBIOS record.\r
+\r
+ This function removes an SMBIOS record using the handle specified by SmbiosHandle.\r
+\r
+ @param[in] SmbiosHandle The handle of the SMBIOS record to remove.\r
+\r
+ @retval EFI_SUCCESS SMBIOS record was removed.\r
+ @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibRemove (\r
+ OUT EFI_SMBIOS_HANDLE SmbiosHandle\r
+ )\r
+{\r
+ return gSmbios->Remove (gSmbios, SmbiosHandle);\r
+}\r
+\r
+\r
+\r
+/**\r
+\r
+ @param ImageHandle ImageHandle of the loaded driver.\r
+ @param SystemTable Pointer to the EFI System Table.\r
+\r
+ @retval EFI_SUCCESS Register successfully.\r
+ @retval EFI_OUT_OF_RESOURCES No enough memory to register this handler.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibConstructor (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&gSmbios);\r
+}\r
+\r
-## @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\r
+# SMBIOS Library\r
+#\r
+# Copyright (c) 2012, Apple Inc. All rights reserved.\r
+# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+#\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = SmbiosLib\r
+ FILE_GUID = 881863A2-09FD-3E44-8D62-7AE038D03747\r
+ MODULE_TYPE = DXE_DRIVER\r
+ VERSION_STRING = 1.0\r
+ LIBRARY_CLASS = SmbiosLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE UEFI_APPLICATION UEFI_DRIVER\r
+\r
+ CONSTRUCTOR = SmbiosLibConstructor\r
+\r
+\r
+[Sources]\r
+ SmbiosLib.c\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ EmulatorPkg/EmulatorPkg.dec\r
+\r
+[LibraryClasses]\r
+ BaseLib\r
+ BaseMemoryLib\r
+ DebugLib\r
+ MemoryAllocationLib\r
+ UefiBootServicesTableLib\r
+ UefiLib\r
+\r
+[Protocols]\r
+ gEfiSmbiosProtocolGuid\r
+\r
+[Depex]\r
+ gEfiSmbiosProtocolGuid\r
@param Smbios The EFI_SMBIOS_PROTOCOL instance.\r
@param SmbiosHandle A unique handle will be assigned to the SMBIOS record.\r
@param Record The data for the fixed portion of the SMBIOS record. The format of the record is\r
- determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined \r
- by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or \r
+ determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined\r
+ by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or\r
a set of null terminated strings and a null.\r
\r
@retval EFI_SUCCESS Record was added.\r
@param Smbios The EFI_SMBIOS_PROTOCOL instance.\r
@param SmbiosHandle A unique handle will be assigned to the SMBIOS record.\r
@param Record The data for the fixed portion of the SMBIOS record. The format of the record is\r
- determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined \r
- by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or \r
+ determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined\r
+ by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or\r
a set of null terminated strings and a null.\r
\r
@retval EFI_SUCCESS Record was added.\r
while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, HobPtr.Raw)) != NULL) {\r
if (HobPtr.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {\r
gSmbiosType19Template.ExtendedStartingAddress = HobPtr.ResourceDescriptor->PhysicalStart;\r
- gSmbiosType19Template.ExtendedEndingAddress = \r
- HobPtr.ResourceDescriptor->PhysicalStart + \r
+ gSmbiosType19Template.ExtendedEndingAddress =\r
+ HobPtr.ResourceDescriptor->PhysicalStart +\r
HobPtr.ResourceDescriptor->ResourceLength - 1;\r
- \r
+\r
SmbiosLibCreateEntry ((SMBIOS_STRUCTURE *)&gSmbiosType19Template, NULL);\r
}\r
HobPtr.Raw = GET_NEXT_HOB (HobPtr);\r
EFI_SMBIOS_HANDLE SmbiosHandle;\r
SMBIOS_STRUCTURE_POINTER Smbios;\r
\r
- // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform \r
+ // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform\r
// to an early version of the specification.\r
\r
// Phase 1 - Initialize SMBIOS tables from template\r
Smbios.Type0->BiosSize = (UINT8)DivU64x32 (FixedPcdGet64 (PcdEmuFirmwareFdSize), 64*1024) - 1;\r
\r
SmbiosLibUpdateUnicodeString (\r
- SmbiosHandle, \r
- Smbios.Type0->BiosVersion, \r
+ SmbiosHandle,\r
+ Smbios.Type0->BiosVersion,\r
(CHAR16 *) PcdGetPtr (PcdFirmwareVersionString)\r
);\r
SmbiosLibUpdateUnicodeString (\r
- SmbiosHandle, \r
- Smbios.Type0->BiosReleaseDate, \r
+ SmbiosHandle,\r
+ Smbios.Type0->BiosReleaseDate,\r
(CHAR16 *) PcdGetPtr (PcdFirmwareReleaseDateString)\r
);\r
}\r
\r
- // Phase 3 - Create tables from scratch \r
+ // Phase 3 - Create tables from scratch\r
\r
// Create Type 13 record from EFI Variables\r
// Do we need this record for EFI as the info is available from EFI varaibles\r
## @file\r
# Platform SMBIOS driver that fills in SMBIOS table entries.\r
#\r
-# Copyright (c) 2012, Apple Inc. All rights reserved. \r
+# Copyright (c) 2012, Apple Inc. All rights reserved.\r
# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
#\r
# This program and the accompanying materials\r
gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize\r
\r
[Depex]\r
- TRUE
\ No newline at end of file
+ TRUE\r
Processor Information (Type 4) - CPU Driver\r
Cache Information (Type 7) - For cache that is external to processor\r
System Slots (Type 9) - If system has slots\r
- Physical Memory Array (Type 16) \r
+ Physical Memory Array (Type 16)\r
Memory Device (Type 17) - For each socketed system-memory Device\r
Memory Array Mapped Address (Type 19) - One per contiguous block per Physical Memroy Array\r
System Boot Information (Type 32)\r
0, // PrinterIsSupported :1;\r
0, // CgaMonoIsSupported :1;\r
0, // NecPc98 :1;\r
- 0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor \r
- ///< and bits 48-63 reserved for System Vendor. \r
- }, \r
+ 0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor\r
+ ///< and bits 48-63 reserved for System Vendor.\r
+ },\r
{ // BIOSCharacteristicsExtensionBytes[]\r
0x81, // AcpiIsSupported :1;\r
// UsbLegacyIsSupported :1;\r
3, // Version String\r
4, // SerialNumber String\r
{ 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x7C, 0x02 } },\r
- SystemWakeupTypePowerSwitch, \r
+ SystemWakeupTypePowerSwitch,\r
5, // SKUNumber String\r
6, // Family String\r
};\r
"System Serial#",\r
"System SKU#",\r
"edk2",\r
- NULL \r
+ NULL\r
};\r
\r
SMBIOS_TABLE_TYPE2 gSmbiosType2Template = {\r
},\r
6, // LocationInChassis String\r
0, // ChassisHandle;\r
- BaseBoardTypeMotherBoard, // BoardType; \r
+ BaseBoardTypeMotherBoard, // BoardType;\r
0, // NumberOfContainedObjectHandles;\r
{ 0 } // ContainedObjectHandles[1];\r
};\r
"Base Board Serial#",\r
"Base Board Asset Tag#",\r
"Part Component",\r
- NULL \r
+ NULL\r
};\r
\r
SMBIOS_TABLE_TYPE3 gSmbiosType3Template = {\r
2, // Version String\r
3, // SerialNumber String\r
4, // AssetTag String\r
- ChassisStateSafe, // BootupState; \r
- ChassisStateSafe, // PowerSupplyState; \r
- ChassisStateSafe, // ThermalState; \r
- ChassisSecurityStatusNone,// SecurityStatus; \r
+ ChassisStateSafe, // BootupState;\r
+ ChassisStateSafe, // PowerSupplyState;\r
+ ChassisStateSafe, // ThermalState;\r
+ ChassisSecurityStatusNone,// SecurityStatus;\r
{ 0, 0, 0, 0 }, // OemDefined[4];\r
0, // Height;\r
0, // NumberofPowerCords;\r
"EmulatorPkg",\r
"Chassis Board Serial#",\r
"Chassis Board Asset Tag#",\r
- NULL \r
+ NULL\r
};\r
\r
SMBIOS_TABLE_TYPE8 gSmbiosType8Template1 = {\r
.586p\r
.model flat,C\r
.code\r
- \r
+\r
;------------------------------------------------------------------------------\r
; VOID\r
; EFIAPI\r
; UINT32 TemporaryMemoryBase,\r
; UINT32 PermenentMemoryBase\r
; );\r
-;------------------------------------------------------------------------------ \r
+;------------------------------------------------------------------------------\r
SecSwitchStack PROC\r
;\r
; Save three register: eax, ebx, ecx\r
push ebx\r
push ecx\r
push edx\r
- \r
+\r
;\r
; !!CAUTION!! this function address's is pushed into stack after\r
; migration of whole temporary memory, so need save it to permenent\r
; memory at first!\r
;\r
- \r
+\r
mov ebx, [esp + 20] ; Save the first parameter\r
mov ecx, [esp + 24] ; Save the second parameter\r
- \r
+\r
;\r
; Save this function's return address into permenent memory at first.\r
; Then, Fixup the esp point to permenent memory\r
sub eax, ebx\r
add eax, ecx\r
mov edx, dword ptr [esp] ; copy pushed register's value to permenent memory\r
- mov dword ptr [eax], edx \r
+ mov dword ptr [eax], edx\r
mov edx, dword ptr [esp + 4]\r
- mov dword ptr [eax + 4], edx \r
+ mov dword ptr [eax + 4], edx\r
mov edx, dword ptr [esp + 8]\r
- mov dword ptr [eax + 8], edx \r
+ mov dword ptr [eax + 8], edx\r
mov edx, dword ptr [esp + 12]\r
- mov dword ptr [eax + 12], edx \r
+ mov dword ptr [eax + 12], edx\r
mov edx, dword ptr [esp + 16] ; Update this function's return address into permenent memory\r
- mov dword ptr [eax + 16], edx \r
+ mov dword ptr [eax + 16], edx\r
mov esp, eax ; From now, esp is pointed to permenent memory\r
- \r
+\r
;\r
; Fixup the ebp point to permenent memory\r
;\r
sub eax, ebx\r
add eax, ecx\r
mov ebp, eax ; From now, ebp is pointed to permenent memory\r
- \r
+\r
;\r
; Fixup callee's ebp point for PeiDispatch\r
;\r
sub eax, ebx\r
add eax, ecx\r
mov dword ptr [ebp], eax ; From now, Temporary's PPI caller's stack is in permenent memory\r
- \r
+\r
pop edx\r
pop ecx\r
pop ebx\r
-/*++ @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\r
+ Stub SEC that is called from the OS appliation that is the root of the emulator.\r
+\r
+ The OS application will call the SEC with the PEI Entry Point API.\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Sec.h"\r
+\r
+\r
+\r
+EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {\r
+ SecTemporaryRamSupport\r
+};\r
+\r
+\r
+EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {\r
+ {\r
+ EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
+ &gEfiTemporaryRamSupportPpiGuid,\r
+ &mSecTemporaryRamSupportPpi\r
+ }\r
+};\r
+\r
+\r
+\r
+/**\r
+ The entry point of PE/COFF Image for the PEI Core, that has been hijacked by this\r
+ SEC that sits on top of an OS application. So the entry and exit of this module\r
+ has the same API.\r
+\r
+ This function is the entry point for the PEI Foundation, which allows the SEC phase\r
+ to pass information about the stack, temporary RAM and the Boot Firmware Volume.\r
+ In addition, it also allows the SEC phase to pass services and data forward for use\r
+ during the PEI phase in the form of one or more PPIs.\r
+ There is no limit to the number of additional PPIs that can be passed from SEC into\r
+ the PEI Foundation. As part of its initialization phase, the PEI Foundation will add\r
+ these SEC-hosted PPIs to its PPI database such that both the PEI Foundation and any\r
+ modules can leverage the associated service calls and/or code in these early PPIs.\r
+ This function is required to call ProcessModuleEntryPointList() with the Context\r
+ parameter set to NULL. ProcessModuleEntryPoint() is never expected to return.\r
+ The PEI Core is responsible for calling ProcessLibraryConstructorList() as soon as\r
+ the PEI Services Table and the file handle for the PEI Core itself have been established.\r
+ If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.\r
+\r
+ @param SecCoreData Points to a data structure containing information about the PEI\r
+ core's operating environment, such as the size and location of\r
+ temporary RAM, the stack location and the BFV location.\r
+\r
+ @param PpiList Points to a list of one or more PPI descriptors to be installed\r
+ initially by the PEI core. An empty PPI list consists of a single\r
+ descriptor with the end-tag EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.\r
+ As part of its initialization phase, the PEI Foundation will add\r
+ these SEC-hosted PPIs to its PPI database such that both the PEI\r
+ Foundation and any modules can leverage the associated service calls\r
+ and/or code in these early PPIs.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+_ModuleEntryPoint (\r
+ IN EFI_SEC_PEI_HAND_OFF *SecCoreData,\r
+ IN EFI_PEI_PPI_DESCRIPTOR *PpiList\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_PEI_FV_HANDLE VolumeHandle;\r
+ EFI_PEI_FILE_HANDLE FileHandle;\r
+ VOID *PeCoffImage;\r
+ EFI_PEI_CORE_ENTRY_POINT EntryPoint;\r
+ EFI_PEI_PPI_DESCRIPTOR *Ppi;\r
+ EFI_PEI_PPI_DESCRIPTOR *SecPpiList;\r
+ UINTN SecReseveredMemorySize;\r
+ UINTN Index;\r
+\r
+ EMU_MAGIC_PAGE()->PpiList = PpiList;\r
+ ProcessLibraryConstructorList ();\r
+\r
+ DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));\r
+\r
+ //\r
+ // Add Our PPIs to the list\r
+ //\r
+ SecReseveredMemorySize = sizeof (gPrivateDispatchTable);\r
+ for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {\r
+ SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);\r
+\r
+ if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {\r
+ // Since we are appending, need to clear out privious list terminator.\r
+ Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;\r
+ break;\r
+ }\r
+ }\r
+\r
+ // Keep everything on a good alignment\r
+ SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize, CPU_STACK_ALIGNMENT);\r
+\r
+#if 0\r
+ // Tell the PEI Core to not use our buffer in temp RAM\r
+ SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData->PeiTemporaryRamBase;\r
+ SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->PeiTemporaryRamBase + SecReseveredMemorySize);\r
+ SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;\r
+#else\r
+ {\r
+ //\r
+ // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core crashes? Either there is a bug\r
+ // or I don't understand temp RAM correctly?\r
+ //\r
+ EFI_PEI_PPI_DESCRIPTOR PpiArray[10];\r
+\r
+ SecPpiList = &PpiArray[0];\r
+ ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);\r
+ }\r
+#endif\r
+ // Copy existing list, and append our entries.\r
+ CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);\r
+ CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof (gPrivateDispatchTable));\r
+\r
+ // Find PEI Core and transfer control\r
+ VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData->BootFirmwareVolumeBase;\r
+ FileHandle = NULL;\r
+ Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, VolumeHandle, &FileHandle);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ // Transfer control to PEI Core\r
+ EntryPoint (SecCoreData, SecPpiList);\r
+\r
+ // PEI Core never returns\r
+ ASSERT (FALSE);\r
+ return;\r
+}\r
+\r
+\r
+\r
-/*++ @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\r
+ Stub SEC that is called from the OS appliation that is the root of the emulator.\r
+\r
+ The OS application will call the SEC with the PEI Entry Point API.\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __SEC_H___\r
+#define __SEC_H___\r
+\r
+\r
+#include <PiPei.h>\r
+#include <Library/EmuMagicPageLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/PeiServicesLib.h>\r
+#include <Library/PeCoffGetEntryPointLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+\r
+#include <Ppi/TemporaryRamSupport.h>\r
+\r
+\r
+//\r
+// I think this shold be defined in a MdePkg include file?\r
+//\r
+VOID\r
+EFIAPI\r
+ProcessLibraryConstructorList (\r
+ VOID\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+SecTemporaryRamSupport (\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,\r
+ IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,\r
+ IN UINTN CopySize\r
+ );\r
+\r
+\r
+#endif\r
+\r
VOID *CurrentReadPointer;\r
VOID *EndReadPointer;\r
\r
- UINT32 ReceivedPackets;\r
- UINT32 DroppedPackets;\r
+ UINT32 ReceivedPackets;\r
+ UINT32 DroppedPackets;\r
\r
} EMU_SNP_PRIVATE;\r
\r
struct ifreq BoundIf;\r
struct bpf_program BpfProgram;\r
struct bpf_insn *FilterProgram;\r
- u_int Value;\r
- u_int ReadBufferSize;\r
+ u_int Value;\r
+ u_int ReadBufferSize;\r
UINT16 Temp16;\r
UINT32 Temp32;\r
\r
}\r
\r
//\r
- // Get the read buffer size.\r
- //\r
- if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {\r
- goto DeviceErrorExit;\r
- }\r
-\r
- //\r
- // Default value from BIOCGBLEN is usually too small, so use a much larger size, if necessary.\r
- //\r
- if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {\r
- ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);\r
- if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {\r
- goto DeviceErrorExit;\r
- }\r
- }\r
-\r
- //\r
+ // Get the read buffer size.\r
+ //\r
+ if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {\r
+ goto DeviceErrorExit;\r
+ }\r
+\r
+ //\r
+ // Default value from BIOCGBLEN is usually too small, so use a much larger size, if necessary.\r
+ //\r
+ if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {\r
+ ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);\r
+ if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {\r
+ goto DeviceErrorExit;\r
+ }\r
+ }\r
+\r
+ //\r
// Associate our interface with this BPF file descriptor.\r
//\r
AsciiStrCpy (BoundIf.ifr_name, Private->InterfaceName);\r
}\r
\r
//\r
- // Enable immediate mode.\r
+ // Enable immediate mode.\r
//\r
Value = 1;\r
if (ioctl (Private->BpfFd, BIOCIMMEDIATE, &Value) < 0) {\r
//\r
// Allocate read buffer.\r
//\r
- Private->ReadBufferSize = ReadBufferSize;\r
- Private->ReadBuffer = malloc (Private->ReadBufferSize);\r
+ Private->ReadBufferSize = ReadBufferSize;\r
+ Private->ReadBuffer = malloc (Private->ReadBufferSize);\r
if (Private->ReadBuffer == NULL) {\r
goto ErrorExit;\r
}\r
Private->CurrentReadPointer = Private->EndReadPointer = Private->ReadBuffer;\r
\r
//\r
- // Install our packet filter: successful reads should only produce broadcast or unicast\r
+ // Install our packet filter: successful reads should only produce broadcast or unicast\r
// packets directed to our fake MAC address.\r
//\r
FilterProgram = malloc (sizeof (mFilterInstructionTemplate)) ;\r
{\r
EMU_SNP_PRIVATE *Private;\r
struct bpf_hdr *BpfHeader;\r
- struct bpf_stat BpfStats;\r
+ struct bpf_stat BpfStats;\r
ETHERNET_HEADER *EnetHeader;\r
ssize_t Result;\r
\r
return EFI_NOT_STARTED;\r
}\r
\r
- ZeroMem (&BpfStats, sizeof( BpfStats));\r
+ ZeroMem (&BpfStats, sizeof( BpfStats));\r
\r
- if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {\r
- Private->ReceivedPackets += BpfStats.bs_recv;\r
- if (BpfStats.bs_drop > Private->DroppedPackets) {\r
- printf (\r
- "SNP: STATS: RCVD = %d DROPPED = %d. Probably need to increase BPF PcdNetworkPacketFilterSize?\n",\r
- BpfStats.bs_recv,\r
- BpfStats.bs_drop - Private->DroppedPackets\r
- );\r
- Private->DroppedPackets = BpfStats.bs_drop;\r
- }\r
- }\r
+ if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {\r
+ Private->ReceivedPackets += BpfStats.bs_recv;\r
+ if (BpfStats.bs_drop > Private->DroppedPackets) {\r
+ printf (\r
+ "SNP: STATS: RCVD = %d DROPPED = %d. Probably need to increase BPF PcdNetworkPacketFilterSize?\n",\r
+ BpfStats.bs_recv,\r
+ BpfStats.bs_drop - Private->DroppedPackets\r
+ );\r
+ Private->DroppedPackets = BpfStats.bs_drop;\r
+ }\r
+ }\r
\r
//\r
// Do we have any remaining packets from the previous read?\r
EMU_SNP_PRIVATE *Private\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
struct ifaddrs *IfAddrs;\r
struct ifaddrs *If;\r
struct sockaddr_dl *IfSdl;\r
@param[in] MediaId Id of the media, changes every time the media is\r
replaced.\r
@param[in] Lba The starting Logical Block Address to read from.\r
- @param[in, out] Token A pointer to the token associated with the transaction.\r
+ @param[in, out] Token A pointer to the token associated with the transaction.\r
@param[in] BufferSize Size of Buffer, must be a multiple of device block size.\r
@param[out] Buffer A pointer to the destination buffer for the data. The\r
caller is responsible for either having implicit or\r
-/*++ @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\r
+ Since the SEC is the only program in our emulation we\r
+ must use a UEFI/PI mechanism to export APIs to other modules.\r
+ This is the role of the EFI_EMU_THUNK_PROTOCOL.\r
+\r
+ The mUnixThunkTable exists so that a change to EFI_EMU_THUNK_PROTOCOL\r
+ will cause an error in initializing the array if all the member functions\r
+ are not added. It looks like adding a element to end and not initializing\r
+ it may cause the table to be initaliized with the members at the end being\r
+ set to zero. This is bad as jumping to zero will crash.\r
+\r
+Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Host.h"\r
+\r
+#ifdef __APPLE__\r
+#define DebugAssert _Mangle__DebugAssert\r
+\r
+#include <assert.h>\r
+#include <CoreServices/CoreServices.h>\r
+#include <mach/mach.h>\r
+#include <mach/mach_time.h>\r
+\r
+#undef DebugAssert\r
+#endif\r
+\r
+int settimer_initialized;\r
+struct timeval settimer_timeval;\r
+void (*settimer_callback)(UINT64 delta);\r
+\r
+BOOLEAN gEmulatorInterruptEnabled = FALSE;\r
+\r
+\r
+UINTN\r
+SecWriteStdErr (\r
+ IN UINT8 *Buffer,\r
+ IN UINTN NumberOfBytes\r
+ )\r
+{\r
+ ssize_t Return;\r
+\r
+ Return = write (STDERR_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);\r
+\r
+ return (Return == -1) ? 0 : Return;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+SecConfigStdIn (\r
+ VOID\r
+ )\r
+{\r
+ struct termios tty;\r
+\r
+ //\r
+ // Need to turn off line buffering, ECHO, and make it unbuffered.\r
+ //\r
+ tcgetattr (STDIN_FILENO, &tty);\r
+ tty.c_lflag &= ~(ICANON | ECHO);\r
+ tcsetattr (STDIN_FILENO, TCSANOW, &tty);\r
+\r
+// setvbuf (STDIN_FILENO, NULL, _IONBF, 0);\r
+\r
+ // now ioctl FIONREAD will do what we need\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+UINTN\r
+SecWriteStdOut (\r
+ IN UINT8 *Buffer,\r
+ IN UINTN NumberOfBytes\r
+ )\r
+{\r
+ ssize_t Return;\r
+\r
+ Return = write (STDOUT_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);\r
+\r
+ return (Return == -1) ? 0 : Return;\r
+}\r
+\r
+UINTN\r
+SecReadStdIn (\r
+ IN UINT8 *Buffer,\r
+ IN UINTN NumberOfBytes\r
+ )\r
+{\r
+ ssize_t Return;\r
+\r
+ Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);\r
+\r
+ return (Return == -1) ? 0 : Return;\r
+}\r
+\r
+BOOLEAN\r
+SecPollStdIn (\r
+ VOID\r
+ )\r
+{\r
+ int Result;\r
+ int Bytes;\r
+\r
+ Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);\r
+ if (Result == -1) {\r
+ return FALSE;\r
+ }\r
+\r
+ return (BOOLEAN)(Bytes > 0);\r
+}\r
+\r
+\r
+VOID *\r
+SecMalloc (\r
+ IN UINTN Size\r
+ )\r
+{\r
+ return malloc ((size_t)Size);\r
+}\r
+\r
+VOID *\r
+SecValloc (\r
+ IN UINTN Size\r
+ )\r
+{\r
+ return valloc ((size_t)Size);\r
+}\r
+\r
+BOOLEAN\r
+SecFree (\r
+ IN VOID *Ptr\r
+ )\r
+{\r
+ if (EfiSystemMemoryRange (Ptr)) {\r
+ // If an address range is in the EFI memory map it was alloced via EFI.\r
+ // So don't free those ranges and let the caller know.\r
+ return FALSE;\r
+ }\r
+\r
+ free (Ptr);\r
+ return TRUE;\r
+}\r
+\r
+\r
+void\r
+settimer_handler (int sig)\r
+{\r
+ struct timeval timeval;\r
+ UINT64 delta;\r
+\r
+ gettimeofday (&timeval, NULL);\r
+ delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)\r
+ - ((UINT64)settimer_timeval.tv_sec * 1000)\r
+ - (settimer_timeval.tv_usec / 1000);\r
+ settimer_timeval = timeval;\r
+\r
+ if (settimer_callback) {\r
+ ReverseGasketUint64 (settimer_callback, delta);\r
+ }\r
+}\r
+\r
+VOID\r
+SecSetTimer (\r
+ IN UINT64 PeriodMs,\r
+ IN EMU_SET_TIMER_CALLBACK CallBack\r
+ )\r
+{\r
+ struct itimerval timerval;\r
+ UINT32 remainder;\r
+\r
+ if (!settimer_initialized) {\r
+ struct sigaction act;\r
+\r
+ settimer_initialized = 1;\r
+ act.sa_handler = settimer_handler;\r
+ act.sa_flags = 0;\r
+ sigemptyset (&act.sa_mask);\r
+ gEmulatorInterruptEnabled = TRUE;\r
+ if (sigaction (SIGALRM, &act, NULL) != 0) {\r
+ printf ("SetTimer: sigaction error %s\n", strerror (errno));\r
+ }\r
+ if (gettimeofday (&settimer_timeval, NULL) != 0) {\r
+ printf ("SetTimer: gettimeofday error %s\n", strerror (errno));\r
+ }\r
+ }\r
+ timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);\r
+ DivU64x32Remainder(PeriodMs, 1000, &remainder);\r
+ timerval.it_value.tv_usec = remainder * 1000;\r
+ timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);\r
+ timerval.it_interval = timerval.it_value;\r
+\r
+ if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {\r
+ printf ("SetTimer: setitimer error %s\n", strerror (errno));\r
+ }\r
+ settimer_callback = CallBack;\r
+}\r
+\r
+\r
+VOID\r
+SecEnableInterrupt (\r
+ VOID\r
+ )\r
+{\r
+ sigset_t sigset;\r
+\r
+ gEmulatorInterruptEnabled = TRUE;\r
+ // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts\r
+ // by enabling/disabling SIGALRM.\r
+ sigemptyset (&sigset);\r
+ sigaddset (&sigset, SIGALRM);\r
+ pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);\r
+}\r
+\r
+\r
+VOID\r
+SecDisableInterrupt (\r
+ VOID\r
+ )\r
+{\r
+ sigset_t sigset;\r
+\r
+ // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts\r
+ // by enabling/disabling SIGALRM.\r
+ sigemptyset (&sigset);\r
+ sigaddset (&sigset, SIGALRM);\r
+ pthread_sigmask (SIG_BLOCK, &sigset, NULL);\r
+ gEmulatorInterruptEnabled = FALSE;\r
+}\r
+\r
+\r
+BOOLEAN\r
+SecInterruptEanbled (void)\r
+{\r
+ return gEmulatorInterruptEnabled;\r
+}\r
+\r
+\r
+UINT64\r
+QueryPerformanceFrequency (\r
+ VOID\r
+ )\r
+{\r
+ // Hard code to nanoseconds\r
+ return 1000000000ULL;\r
+}\r
+\r
+UINT64\r
+QueryPerformanceCounter (\r
+ VOID\r
+ )\r
+{\r
+#if __APPLE__\r
+ UINT64 Start;\r
+ static mach_timebase_info_data_t sTimebaseInfo;\r
+\r
+\r
+ Start = mach_absolute_time ();\r
+\r
+ // Convert to nanoseconds.\r
+\r
+ // If this is the first time we've run, get the timebase.\r
+ // We can use denom == 0 to indicate that sTimebaseInfo is\r
+ // uninitialised because it makes no sense to have a zero\r
+ // denominator is a fraction.\r
+\r
+ if ( sTimebaseInfo.denom == 0 ) {\r
+ (void) mach_timebase_info(&sTimebaseInfo);\r
+ }\r
+\r
+ // Do the maths. We hope that the multiplication doesn't\r
+ // overflow; the price you pay for working in fixed point.\r
+\r
+ return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;\r
+#else\r
+ // Need to figure out what to do for Linux?\r
+ return 0;\r
+#endif\r
+}\r
+\r
+\r
+\r
+VOID\r
+SecSleep (\r
+ IN UINT64 Nanoseconds\r
+ )\r
+{\r
+ struct timespec rq, rm;\r
+ struct timeval start, end;\r
+ unsigned long MicroSec;\r
+\r
+ rq.tv_sec = DivU64x32 (Nanoseconds, 1000000000);\r
+ rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);\r
+\r
+ //\r
+ // nanosleep gets interrupted by our timer tic.\r
+ // we need to track wall clock time or we will stall for way too long\r
+ //\r
+ gettimeofday (&start, NULL);\r
+ end.tv_sec = start.tv_sec + rq.tv_sec;\r
+ MicroSec = (start.tv_usec + rq.tv_nsec/1000);\r
+ end.tv_usec = MicroSec % 1000000;\r
+ if (MicroSec > 1000000) {\r
+ end.tv_sec++;\r
+ }\r
+\r
+ while (nanosleep (&rq, &rm) == -1) {\r
+ if (errno != EINTR) {\r
+ break;\r
+ }\r
+ gettimeofday (&start, NULL);\r
+ if (start.tv_sec > end.tv_sec) {\r
+ break;\r
+ } if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {\r
+ break;\r
+ }\r
+ rq = rm;\r
+ }\r
+}\r
+\r
+\r
+VOID\r
+SecCpuSleep (\r
+ VOID\r
+ )\r
+{\r
+ struct timespec rq, rm;\r
+\r
+ // nanosleep gets interrupted by the timer tic\r
+ rq.tv_sec = 1;\r
+ rq.tv_nsec = 0;\r
+\r
+ nanosleep (&rq, &rm);\r
+}\r
+\r
+\r
+VOID\r
+SecExit (\r
+ UINTN Status\r
+ )\r
+{\r
+ exit (Status);\r
+}\r
+\r
+\r
+VOID\r
+SecGetTime (\r
+ OUT EFI_TIME *Time,\r
+ OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL\r
+ )\r
+{\r
+ struct tm *tm;\r
+ time_t t;\r
+\r
+ t = time (NULL);\r
+ tm = localtime (&t);\r
+\r
+ Time->Year = 1900 + tm->tm_year;\r
+ Time->Month = tm->tm_mon + 1;\r
+ Time->Day = tm->tm_mday;\r
+ Time->Hour = tm->tm_hour;\r
+ Time->Minute = tm->tm_min;\r
+ Time->Second = tm->tm_sec;\r
+ Time->Nanosecond = 0;\r
+ Time->TimeZone = timezone;\r
+ Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)\r
+ | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);\r
+\r
+ if (Capabilities != NULL) {\r
+ Capabilities->Resolution = 1;\r
+ Capabilities->Accuracy = 50000000;\r
+ Capabilities->SetsToZero = FALSE;\r
+ }\r
+}\r
+\r
+\r
+\r
+VOID\r
+SecSetTime (\r
+ IN EFI_TIME *Time\r
+ )\r
+{\r
+ // Don't change the time on the system\r
+ // We could save delta to localtime() and have SecGetTime adjust return values?\r
+ return;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+SecGetNextProtocol (\r
+ IN BOOLEAN EmuBusDriver,\r
+ OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL\r
+ )\r
+{\r
+ return GetNextThunkProtocol (EmuBusDriver, Instance);\r
+}\r
+\r
+\r
+EMU_THUNK_PROTOCOL gEmuThunkProtocol = {\r
+ GasketSecWriteStdErr,\r
+ GasketSecConfigStdIn,\r
+ GasketSecWriteStdOut,\r
+ GasketSecReadStdIn,\r
+ GasketSecPollStdIn,\r
+ GasketSecMalloc,\r
+ GasketSecValloc,\r
+ GasketSecFree,\r
+ GasketSecPeCoffGetEntryPoint,\r
+ GasketSecPeCoffRelocateImageExtraAction,\r
+ GasketSecPeCoffUnloadImageExtraAction,\r
+ GasketSecEnableInterrupt,\r
+ GasketSecDisableInterrupt,\r
+ GasketQueryPerformanceFrequency,\r
+ GasketQueryPerformanceCounter,\r
+ GasketSecSleep,\r
+ GasketSecCpuSleep,\r
+ GasketSecExit,\r
+ GasketSecGetTime,\r
+ GasketSecSetTime,\r
+ GasketSecSetTimer,\r
+ GasketSecGetNextProtocol\r
+};\r
+\r
+\r
+VOID\r
+SecInitThunkProtocol (\r
+ VOID\r
+ )\r
+{\r
+ // timezone and daylight lib globals depend on tzset be called 1st.\r
+ tzset ();\r
+}\r
+\r
\r
if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext->PdbPointer)) {\r
FILE *GdbTempFile;\r
- if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) { \r
+ if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {\r
GdbTempFile = fopen (gGdbWorkingFileName, "a");\r
if (GdbTempFile != NULL) {\r
long unsigned int SymbolsAddr = (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders);\r
GdbTempFile = fopen (gGdbWorkingFileName, "w");\r
if (GdbTempFile != NULL) {\r
fprintf (\r
- GdbTempFile, \r
- "add-symbol-file %s 0x%08lx\n", \r
- ImageContext->PdbPointer, \r
+ GdbTempFile,\r
+ "add-symbol-file %s 0x%08lx\n",\r
+ ImageContext->PdbPointer,\r
(long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders)\r
);\r
fclose (GdbTempFile);\r
- \r
+\r
//\r
// Target for gdb breakpoint in a script that uses gGdbWorkingFileName to set a breakpoint.\r
// Hey what can you say scripting in gdb is not that great....\r
return;\r
}\r
\r
- if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) { \r
+ if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {\r
//\r
// Write the file we need for the gdb script\r
//\r
SecGdbScriptBreak (ImageContext->PdbPointer, strlen (ImageContext->PdbPointer) + 1, 0, 0);\r
} else {\r
ASSERT (FALSE);\r
- } \r
+ }\r
}\r
}\r
\r
#undef NTOHS\r
#undef HTONS\r
#undef B0\r
-#undef CR3
+#undef CR3\r
\r
#include <PiPei.h>\r
#include <Uefi.h>\r
-#------------------------------------------------------------------------------
-#
-# 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
-
-
+#------------------------------------------------------------------------------\r
+#\r
+# Manage differenced between UNIX ABI and EFI/Windows ABI\r
+#\r
+# For IA-32 the only difference is Mac OS X requires a 16-byte aligned stack.\r
+# For Linux this stack adjustment is a no-op, but we may as well make the\r
+# the code common.\r
+#\r
+# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+\r
+\r
+ .text\r
+\r
+//\r
+// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)\r
+//\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)\r
+ASM_PFX(GasketSecWriteStdErr):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecWriteStdErr)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)\r
+ASM_PFX(GasketSecConfigStdIn):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecConfigStdIn)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)\r
+ASM_PFX(GasketSecWriteStdOut):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecWriteStdOut)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)\r
+ASM_PFX(GasketSecReadStdIn):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecReadStdIn)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)\r
+ASM_PFX(GasketSecPollStdIn):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecPollStdIn)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecMalloc)\r
+ASM_PFX(GasketSecMalloc):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecMalloc)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecValloc)\r
+ASM_PFX(GasketSecValloc):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecValloc)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecFree)\r
+ASM_PFX(GasketSecFree):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecFree)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecSetTimer)\r
+ASM_PFX(GasketSecSetTimer):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl 12(%ebp), %edx\r
+ movl %edx, 4(%esp)\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecSetTimer)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)\r
+ASM_PFX(GasketSecEnableInterrupt):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+ call ASM_PFX(SecEnableInterrupt)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)\r
+ASM_PFX(GasketSecDisableInterrupt):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+ call ASM_PFX(SecDisableInterrupt)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)\r
+ASM_PFX(GasketQueryPerformanceFrequency):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+ call ASM_PFX(QueryPerformanceFrequency)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)\r
+ASM_PFX(GasketQueryPerformanceCounter):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+ call ASM_PFX(QueryPerformanceCounter)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecSleep)\r
+ASM_PFX(GasketSecSleep):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl 12(%ebp), %ecx\r
+ movl %ecx, 4(%esp)\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecSleep)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)\r
+ASM_PFX(GasketSecCpuSleep):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+ call ASM_PFX(SecCpuSleep)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecExit)\r
+ASM_PFX(GasketSecExit):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI world\r
+LDEAD_LOOP:\r
+ jmp LDEAD_LOOP // _exit should never return\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecGetTime)\r
+ASM_PFX(GasketSecGetTime):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecGetTime)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecSetTime)\r
+ASM_PFX(GasketSecSetTime):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecSetTime)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)\r
+ASM_PFX(GasketSecGetNextProtocol):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecGetNextProtocol)\r
+\r
+ leave\r
+ ret\r
+\r
+// PPIs produced by SEC\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)\r
+ASM_PFX(GasketSecPeCoffGetEntryPoint):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecPeCoffGetEntryPoint)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)\r
+ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecPeCoffRelocateImageExtraAction)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)\r
+ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecPeCoffUnloadImageExtraAction)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)\r
+ASM_PFX(GasketSecEmuThunkAddress):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+ call ASM_PFX(SecEmuThunkAddress)\r
+\r
+ leave\r
+ ret\r
+\r
+//\r
+// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL\r
+//\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11Size)\r
+ASM_PFX(GasketX11Size):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(X11Size)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11CheckKey)\r
+ASM_PFX(GasketX11CheckKey):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(X11CheckKey)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GetKey)\r
+ASM_PFX(GasketX11GetKey):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(X11GetKey)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11KeySetState)\r
+ASM_PFX(GasketX11KeySetState):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(X11KeySetState)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)\r
+ASM_PFX(GasketX11RegisterKeyNotify):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(X11RegisterKeyNotify)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11Blt)\r
+ASM_PFX(GasketX11Blt):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(X11Blt)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)\r
+ASM_PFX(GasketX11CheckPointer):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(X11CheckPointer)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)\r
+ASM_PFX(GasketX11GetPointerState):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(X11GetPointerState)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)\r
+ASM_PFX(GasketX11GraphicsWindowOpen):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(X11GraphicsWindowOpen)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)\r
+ASM_PFX(GasketX11GraphicsWindowClose):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(X11GraphicsWindowClose)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+// Pthreads\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)\r
+ASM_PFX(GasketPthreadMutexLock):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PthreadMutexLock)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)\r
+ASM_PFX(GasketPthreadMutexUnLock):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PthreadMutexUnLock)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)\r
+ASM_PFX(GasketPthreadMutexTryLock):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PthreadMutexTryLock)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)\r
+ASM_PFX(GasketPthreadMutexInit):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+ call ASM_PFX(PthreadMutexInit)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)\r
+ASM_PFX(GasketPthreadMutexDestroy):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PthreadMutexDestroy)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadCreate)\r
+ASM_PFX(GasketPthreadCreate):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PthreadCreate)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadExit)\r
+ASM_PFX(GasketPthreadExit):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PthreadExit)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadSelf)\r
+ASM_PFX(GasketPthreadSelf):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+ call ASM_PFX(PthreadSelf)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadOpen)\r
+ASM_PFX(GasketPthreadOpen):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PthreadOpen)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadClose)\r
+ASM_PFX(GasketPthreadClose):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PthreadClose)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+\r
+\r
+//\r
+// UNIX ABI to EFI ABI call\r
+//\r
+// UINTN\r
+// ReverseGasketUint64 (\r
+// void *Api,\r
+// UINTN Arg1\r
+// );\r
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64)\r
+ASM_PFX(ReverseGasketUint64):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $8, %esp\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, (%esp)\r
+ calll *8(%ebp)\r
+ addl $8, %esp\r
+ popl %ebp\r
+ ret\r
+\r
+\r
+\r
+//\r
+// UNIX ABI to EFI ABI call\r
+//\r
+// UINTN\r
+// ReverseGasketUint64Uint64 (\r
+// void *Api,\r
+// UINTN Arg1\r
+// UINTN Arg2\r
+// );\r
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)\r
+ASM_PFX(ReverseGasketUint64Uint64):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp\r
+ movl 24(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, (%esp)\r
+ calll *8(%ebp)\r
+ addl $24, %esp\r
+ popl %ebp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)\r
+ASM_PFX(GasketSecUnixPeiAutoScan):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecUnixPeiAutoScan)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)\r
+ASM_PFX(GasketSecUnixFdAddress):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(SecUnixFdAddress)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+// EmuIoThunk SimpleFileSystem\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)\r
+ASM_PFX(GasketPosixOpenVolume):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixOpenVolume)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)\r
+ASM_PFX(GasketPosixFileOpen):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $56, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 28(%ebp), %eax\r
+ movl 32(%ebp), %ecx\r
+ movl %ecx, 24(%esp)\r
+ movl %eax, 20(%esp)\r
+ movl 20(%ebp), %eax\r
+ movl 24(%ebp), %ecx\r
+ movl %ecx, 16(%esp)\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixFileOpen)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)\r
+ASM_PFX(GasketPosixFileCLose):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixFileCLose)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)\r
+ASM_PFX(GasketPosixFileDelete):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixFileDelete)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileRead)\r
+ASM_PFX(GasketPosixFileRead):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixFileRead)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)\r
+ASM_PFX(GasketPosixFileWrite):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixFileWrite)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)\r
+ASM_PFX(GasketPosixFileSetPossition):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl 16(%ebp), %ecx\r
+ movl %ecx, 8(%esp)\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixFileSetPossition)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)\r
+ASM_PFX(GasketPosixFileGetPossition):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixFileGetPossition)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)\r
+ASM_PFX(GasketPosixFileGetInfo):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixFileGetInfo)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)\r
+ASM_PFX(GasketPosixFileSetInfo):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixFileSetInfo)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)\r
+ASM_PFX(GasketPosixFileFlush):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixFileFlush)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)\r
+ASM_PFX(GasketPosixFileSystmeThunkOpen):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixFileSystmeThunkOpen)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)\r
+ASM_PFX(GasketPosixFileSystmeThunkClose):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(PosixFileSystmeThunkClose)\r
+\r
+ leave\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)\r
+ASM_PFX(GasketEmuBlockIoReset):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuBlockIoReset)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)\r
+ASM_PFX(GasketEmuBlockIoReadBlocks):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $56, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 32(%ebp), %eax\r
+ movl %eax, 24(%esp)\r
+ movl 28(%ebp), %eax\r
+ movl %eax, 20(%esp)\r
+ movl 24(%ebp), %eax\r
+ movl %eax, 16(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl 20(%ebp), %edx\r
+ movl %edx, 12(%esp)\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuBlockIoReadBlocks)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)\r
+ASM_PFX(GasketEmuBlockIoWriteBlocks):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $56, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 32(%ebp), %eax\r
+ movl %eax, 24(%esp)\r
+ movl 28(%ebp), %eax\r
+ movl %eax, 20(%esp)\r
+ movl 24(%ebp), %eax\r
+ movl %eax, 16(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl 20(%ebp), %edx\r
+ movl %edx, 12(%esp)\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuBlockIoWriteBlocks)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)\r
+ASM_PFX(GasketEmuBlockIoFlushBlocks): pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+\r
+ call ASM_PFX(EmuBlockIoFlushBlocks)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)\r
+ASM_PFX(GasketEmuBlockIoCreateMapping):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuBlockIoCreateMapping)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)\r
+ASM_PFX(GasketBlockIoThunkOpen):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuBlockIoThunkOpen)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)\r
+ASM_PFX(GasketBlockIoThunkClose):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuBlockIoThunkClose)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)\r
+ASM_PFX(GasketSnpCreateMapping):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpCreateMapping)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStart)\r
+ASM_PFX(GasketSnpStart):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpStart)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStop)\r
+ASM_PFX(GasketSnpStop):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpStop)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpInitialize)\r
+ASM_PFX(GasketSnpInitialize):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpInitialize)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpReset)\r
+ASM_PFX(GasketSnpReset):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpReset)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpShutdown)\r
+ASM_PFX(GasketSnpShutdown):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpShutdown)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)\r
+ASM_PFX(GasketSnpReceiveFilters):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 28(%ebp), %eax\r
+ movl %eax, 20(%esp)\r
+ movl 24(%ebp), %eax\r
+ movl %eax, 16(%esp)\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpReceiveFilters)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)\r
+ASM_PFX(GasketSnpStationAddress):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStatistics)\r
+ASM_PFX(GasketSnpStatistics):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpStatistics)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)\r
+ASM_PFX(GasketSnpMCastIpToMac):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpMCastIpToMac)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpNvData)\r
+ASM_PFX(GasketSnpNvData):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 24(%ebp), %eax\r
+ movl %eax, 16(%esp)\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpNvData)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)\r
+ASM_PFX(GasketSnpGetStatus):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $40, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpGetStatus)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpTransmit)\r
+ASM_PFX(GasketSnpTransmit):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $56, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 32(%ebp), %eax\r
+ movl %eax, 24(%esp)\r
+ movl 28(%ebp), %eax\r
+ movl %eax, 20(%esp)\r
+ movl 24(%ebp), %eax\r
+ movl %eax, 16(%esp)\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpTransmit)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpReceive)\r
+ASM_PFX(GasketSnpReceive):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $56, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 32(%ebp), %eax\r
+ movl %eax, 24(%esp)\r
+ movl 28(%ebp), %eax\r
+ movl %eax, 20(%esp)\r
+ movl 24(%ebp), %eax\r
+ movl %eax, 16(%esp)\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpReceive)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)\r
+ASM_PFX(GasketSnpThunkOpen):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpThunkOpen)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)\r
+ASM_PFX(GasketSnpThunkClose):\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $24, %esp // sub extra 16 from the stack for alignment\r
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, (%esp)\r
+\r
+ call ASM_PFX(EmuSnpThunkClose)\r
+\r
+ leave\r
+ ret\r
+\r
+\r
-/*++
-
-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);
-}
-
-
-
+/*++\r
+\r
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+\r
+--*/\r
+\r
+#include "Host.h"\r
+\r
+\r
+/**\r
+ Transfers control to a function starting with a new stack.\r
+\r
+ Transfers control to the function specified by EntryPoint using the new stack\r
+ specified by NewStack and passing in the parameters specified by Context1 and\r
+ Context2. Context1 and Context2 are optional and may be NULL. The function\r
+ EntryPoint must never return.\r
+\r
+ If EntryPoint is NULL, then ASSERT().\r
+ If NewStack is NULL, then ASSERT().\r
+\r
+ @param EntryPoint A pointer to function to call with the new stack.\r
+ @param Context1 A pointer to the context to pass into the EntryPoint\r
+ function.\r
+ @param Context2 A pointer to the context to pass into the EntryPoint\r
+ function.\r
+ @param NewStack A pointer to the new stack to use for the EntryPoint\r
+ function.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+PeiSwitchStacks (\r
+ IN SWITCH_STACK_ENTRY_POINT EntryPoint,\r
+ IN VOID *Context1, OPTIONAL\r
+ IN VOID *Context2, OPTIONAL\r
+ IN VOID *NewStack\r
+ )\r
+{\r
+ BASE_LIBRARY_JUMP_BUFFER JumpBuffer;\r
+\r
+ ASSERT (EntryPoint != NULL);\r
+ ASSERT (NewStack != NULL);\r
+\r
+ //\r
+ // Stack should be aligned with CPU_STACK_ALIGNMENT\r
+ //\r
+ ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);\r
+\r
+ JumpBuffer.Eip = (UINTN)EntryPoint;\r
+ JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);\r
+ JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);\r
+ ((VOID**)JumpBuffer.Esp)[1] = Context1;\r
+ ((VOID**)JumpBuffer.Esp)[2] = Context2;\r
+\r
+ LongJump (&JumpBuffer, (UINTN)-1);\r
+\r
+\r
+ //\r
+ // PeiSwitchStacks () will never return\r
+ //\r
+ ASSERT (FALSE);\r
+}\r
+\r
+\r
+\r
-/*++ @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\r
+\r
+ Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+\r
+ This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Base.h"\r
+#include "Library/BaseMemoryLib.h"\r
+#include "Library/MemoryAllocationLib.h"\r
+\r
+#include <stdlib.h>\r
+\r
+/**\r
+ Allocates a buffer of type EfiBootServicesData.\r
+\r
+ Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a\r
+ pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is\r
+ returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.\r
+\r
+ @param AllocationSize The number of bytes to allocate.\r
+\r
+ @return A pointer to the allocated buffer or NULL if allocation fails.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+AllocatePool (\r
+ IN UINTN AllocationSize\r
+ )\r
+{\r
+ return (VOID*) malloc (AllocationSize);\r
+}\r
+\r
+\r
+/**\r
+ Allocates and zeros a buffer of type EfiBootServicesData.\r
+\r
+ Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the\r
+ buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a\r
+ valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the\r
+ request, then NULL is returned.\r
+\r
+ @param AllocationSize The number of bytes to allocate and zero.\r
+\r
+ @return A pointer to the allocated buffer or NULL if allocation fails.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+AllocateZeroPool (\r
+ IN UINTN AllocationSize\r
+ )\r
+{\r
+ VOID *Buffer;\r
+\r
+ Buffer = AllocatePool (AllocationSize);\r
+ if (Buffer == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ ZeroMem (Buffer, AllocationSize);\r
+\r
+ return Buffer;\r
+}\r
+\r
+\r
+/**\r
+ Reallocates a buffer of type EfiBootServicesData.\r
+\r
+ Allocates and zeros the number bytes specified by NewSize from memory of type\r
+ EfiBootServicesData. If OldBuffer is not NULL, then the smaller of OldSize and\r
+ NewSize bytes are copied from OldBuffer to the newly allocated buffer, and\r
+ OldBuffer is freed. A pointer to the newly allocated buffer is returned.\r
+ If NewSize is 0, then a valid buffer of 0 size is returned. If there is not\r
+ enough memory remaining to satisfy the request, then NULL is returned.\r
+\r
+ If the allocation of the new buffer is successful and the smaller of NewSize and OldSize\r
+ is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().\r
+\r
+ @param OldSize The size, in bytes, of OldBuffer.\r
+ @param NewSize The size, in bytes, of the buffer to reallocate.\r
+ @param OldBuffer The buffer to copy to the allocated buffer. This is an optional\r
+ parameter that may be NULL.\r
+\r
+ @return A pointer to the allocated buffer or NULL if allocation fails.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+ReallocatePool (\r
+ IN UINTN OldSize,\r
+ IN UINTN NewSize,\r
+ IN VOID *OldBuffer OPTIONAL\r
+ )\r
+{\r
+ VOID *NewBuffer;\r
+\r
+ NewBuffer = AllocatePool (NewSize);\r
+ if (NewBuffer == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ if (OldBuffer != NULL) {\r
+ if (OldSize > 0) {\r
+ CopyMem (NewBuffer, OldBuffer, OldSize);\r
+ }\r
+\r
+ FreePool (OldBuffer);\r
+ }\r
+\r
+ return NewBuffer;\r
+}\r
+\r
+\r
+/**\r
+ Frees a buffer that was previously allocated with one of the pool allocation functions in the\r
+ Memory Allocation Library.\r
+\r
+ Frees the buffer specified by Buffer. Buffer must have been allocated on a previous call to the\r
+ pool allocation services of the Memory Allocation Library. If it is not possible to free pool\r
+ resources, then this function will perform no actions.\r
+\r
+ If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,\r
+ then ASSERT().\r
+\r
+ @param Buffer Pointer to the buffer to free.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FreePool (\r
+ IN VOID *Buffer\r
+ )\r
+{\r
+ free ((void *) Buffer);\r
+}\r
+\r
-/*++ @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\r
+ POSIX Pthreads to emulate APs and implement threads\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+\r
+**/\r
+\r
+#include "Host.h"\r
+\r
+\r
+#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 's')\r
+\r
+typedef struct {\r
+ UINTN Signature;\r
+ EMU_IO_THUNK_PROTOCOL *Thunk;\r
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;\r
+ CHAR8 *FilePath;\r
+ CHAR16 *VolumeLabel;\r
+ BOOLEAN FileHandlesOpen;\r
+} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;\r
+\r
+#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \\r
+ CR (a, \\r
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE, \\r
+ SimpleFileSystem, \\r
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \\r
+ )\r
+\r
+\r
+#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 'i')\r
+\r
+typedef struct {\r
+ UINTN Signature;\r
+ EMU_IO_THUNK_PROTOCOL *Thunk;\r
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;\r
+ EFI_FILE_PROTOCOL EfiFile;\r
+ int fd;\r
+ DIR *Dir;\r
+ BOOLEAN IsRootDirectory;\r
+ BOOLEAN IsDirectoryPath;\r
+ BOOLEAN IsOpenedByRead;\r
+ char *FileName;\r
+ struct dirent *Dirent;\r
+} EMU_EFI_FILE_PRIVATE;\r
+\r
+#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \\r
+ CR (a, \\r
+ EMU_EFI_FILE_PRIVATE, \\r
+ EfiFile, \\r
+ EMU_EFI_FILE_PRIVATE_SIGNATURE \\r
+ )\r
+\r
+EFI_STATUS\r
+PosixFileGetInfo (\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN EFI_GUID *InformationType,\r
+ IN OUT UINTN *BufferSize,\r
+ OUT VOID *Buffer\r
+ );\r
+\r
+EFI_STATUS\r
+PosixFileSetInfo (\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN EFI_GUID *InformationType,\r
+ IN UINTN BufferSize,\r
+ IN VOID *Buffer\r
+ );\r
+\r
+\r
+EFI_FILE_PROTOCOL gPosixFileProtocol = {\r
+ EFI_FILE_REVISION,\r
+ GasketPosixFileOpen,\r
+ GasketPosixFileCLose,\r
+ GasketPosixFileDelete,\r
+ GasketPosixFileRead,\r
+ GasketPosixFileWrite,\r
+ GasketPosixFileGetPossition,\r
+ GasketPosixFileSetPossition,\r
+ GasketPosixFileGetInfo,\r
+ GasketPosixFileSetInfo,\r
+ GasketPosixFileFlush\r
+};\r
+\r
+EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {\r
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,\r
+ GasketPosixOpenVolume,\r
+};\r
+\r
+\r
+/**\r
+ Open the root directory on a volume.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param Root Returns an Open file handle for the root directory\r
+\r
+ @retval EFI_SUCCESS The device was opened.\r
+ @retval EFI_UNSUPPORTED This volume does not support the file system.\r
+ @retval EFI_NO_MEDIA The device has no media.\r
+ @retval EFI_DEVICE_ERROR The device reported an error.\r
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+ @retval EFI_ACCESS_DENIED The service denied access to the file.\r
+ @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixOpenVolume (\r
+ IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,\r
+ OUT EFI_FILE_PROTOCOL **Root\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;\r
+ EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+\r
+ Private = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ PrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));\r
+ if (PrivateFile == NULL) {\r
+ goto Done;\r
+ }\r
+\r
+ PrivateFile->FileName = malloc (AsciiStrSize (Private->FilePath));\r
+ if (PrivateFile->FileName == NULL) {\r
+ goto Done;\r
+ }\r
+ AsciiStrCpy (PrivateFile->FileName, Private->FilePath);\r
+\r
+ PrivateFile->Signature = EMU_EFI_FILE_PRIVATE_SIGNATURE;\r
+ PrivateFile->Thunk = Private->Thunk;\r
+ PrivateFile->SimpleFileSystem = This;\r
+ PrivateFile->IsRootDirectory = TRUE;\r
+ PrivateFile->IsDirectoryPath = TRUE;\r
+ PrivateFile->IsOpenedByRead = TRUE;\r
+\r
+ CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof (EFI_FILE_PROTOCOL));\r
+\r
+ PrivateFile->fd = -1;\r
+ PrivateFile->Dir = NULL;\r
+ PrivateFile->Dirent = NULL;\r
+\r
+ *Root = &PrivateFile->EfiFile;\r
+\r
+ PrivateFile->Dir = opendir (PrivateFile->FileName);\r
+ if (PrivateFile->Dir == NULL) {\r
+ Status = EFI_ACCESS_DENIED;\r
+ } else {\r
+ Status = EFI_SUCCESS;\r
+ }\r
+\r
+Done:\r
+ if (EFI_ERROR (Status)) {\r
+ if (PrivateFile != NULL) {\r
+ if (PrivateFile->FileName != NULL) {\r
+ free (PrivateFile->FileName);\r
+ }\r
+\r
+ free (PrivateFile);\r
+ }\r
+\r
+ *Root = NULL;\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+ErrnoToEfiStatus ()\r
+{\r
+ switch (errno) {\r
+ case EACCES:\r
+ return EFI_ACCESS_DENIED;\r
+\r
+ case EDQUOT:\r
+ case ENOSPC:\r
+ return EFI_VOLUME_FULL;\r
+\r
+ default:\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+}\r
+\r
+VOID\r
+CutPrefix (\r
+ IN CHAR8 *Str,\r
+ IN UINTN Count\r
+ )\r
+{\r
+ CHAR8 *Pointer;\r
+\r
+ if (AsciiStrLen (Str) < Count) {\r
+ ASSERT (0);\r
+ }\r
+\r
+ for (Pointer = Str; *(Pointer + Count); Pointer++) {\r
+ *Pointer = *(Pointer + Count);\r
+ }\r
+\r
+ *Pointer = *(Pointer + Count);\r
+}\r
+\r
+\r
+VOID\r
+PosixSystemTimeToEfiTime (\r
+ IN time_t SystemTime,\r
+ OUT EFI_TIME *Time\r
+ )\r
+{\r
+ struct tm *tm;\r
+\r
+ tm = gmtime (&SystemTime);\r
+ Time->Year = tm->tm_year;\r
+ Time->Month = tm->tm_mon + 1;\r
+ Time->Day = tm->tm_mday;\r
+ Time->Hour = tm->tm_hour;\r
+ Time->Minute = tm->tm_min;\r
+ Time->Second = tm->tm_sec;\r
+ Time->Nanosecond = 0;\r
+\r
+ Time->TimeZone = timezone;\r
+ Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);\r
+}\r
+\r
+\r
+EFI_STATUS\r
+UnixSimpleFileSystemFileInfo (\r
+ EMU_EFI_FILE_PRIVATE *PrivateFile,\r
+ IN CHAR8 *FileName,\r
+ IN OUT UINTN *BufferSize,\r
+ OUT VOID *Buffer\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN Size;\r
+ UINTN NameSize;\r
+ UINTN ResultSize;\r
+ EFI_FILE_INFO *Info;\r
+ CHAR8 *RealFileName;\r
+ CHAR8 *TempPointer;\r
+ CHAR16 *BufferFileName;\r
+ struct stat buf;\r
+\r
+ if (FileName != NULL) {\r
+ RealFileName = FileName;\r
+ } else if (PrivateFile->IsRootDirectory) {\r
+ RealFileName = "";\r
+ } else {\r
+ RealFileName = PrivateFile->FileName;\r
+ }\r
+\r
+ TempPointer = RealFileName;\r
+ while (*TempPointer) {\r
+ if (*TempPointer == '/') {\r
+ RealFileName = TempPointer + 1;\r
+ }\r
+\r
+ TempPointer++;\r
+ }\r
+\r
+ Size = SIZE_OF_EFI_FILE_INFO;\r
+ NameSize = AsciiStrSize (RealFileName) * 2;\r
+ ResultSize = Size + NameSize;\r
+\r
+ if (*BufferSize < ResultSize) {\r
+ *BufferSize = ResultSize;\r
+ return EFI_BUFFER_TOO_SMALL;\r
+ }\r
+ if (stat (FileName == NULL ? PrivateFile->FileName : FileName, &buf) < 0) {\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
+ Info = Buffer;\r
+ ZeroMem (Info, ResultSize);\r
+\r
+ Info->Size = ResultSize;\r
+ Info->FileSize = buf.st_size;\r
+ Info->PhysicalSize = MultU64x32 (buf.st_blocks, buf.st_blksize);\r
+\r
+ PosixSystemTimeToEfiTime (buf.st_ctime, &Info->CreateTime);\r
+ PosixSystemTimeToEfiTime (buf.st_atime, &Info->LastAccessTime);\r
+ PosixSystemTimeToEfiTime (buf.st_mtime, &Info->ModificationTime);\r
+\r
+ if (!(buf.st_mode & S_IWUSR)) {\r
+ Info->Attribute |= EFI_FILE_READ_ONLY;\r
+ }\r
+\r
+ if (S_ISDIR(buf.st_mode)) {\r
+ Info->Attribute |= EFI_FILE_DIRECTORY;\r
+ }\r
+\r
+\r
+ BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);\r
+ while (*RealFileName) {\r
+ *BufferFileName++ = *RealFileName++;\r
+ }\r
+ *BufferFileName = 0;\r
+\r
+ *BufferSize = ResultSize;\r
+ return Status;\r
+}\r
+\r
+BOOLEAN\r
+IsZero (\r
+ IN VOID *Buffer,\r
+ IN UINTN Length\r
+ )\r
+{\r
+ if (Buffer == NULL || Length == 0) {\r
+ return FALSE;\r
+ }\r
+\r
+ if (*(UINT8 *) Buffer != 0) {\r
+ return FALSE;\r
+ }\r
+\r
+ if (Length > 1) {\r
+ if (!CompareMem (Buffer, (UINT8 *) Buffer + 1, Length - 1)) {\r
+ return FALSE;\r
+ }\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+\r
+\r
+\r
+/**\r
+ Opens a new file relative to the source file's location.\r
+\r
+ @param This The protocol instance pointer.\r
+ @param NewHandle Returns File Handle for FileName.\r
+ @param FileName Null terminated string. "\", ".", and ".." are supported.\r
+ @param OpenMode Open mode for file.\r
+ @param Attributes Only used for EFI_FILE_MODE_CREATE.\r
+\r
+ @retval EFI_SUCCESS The device was opened.\r
+ @retval EFI_NOT_FOUND The specified file could not be found on the device.\r
+ @retval EFI_NO_MEDIA The device has no media.\r
+ @retval EFI_MEDIA_CHANGED The media has changed.\r
+ @retval EFI_DEVICE_ERROR The device reported an error.\r
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+ @retval EFI_ACCESS_DENIED The service denied access to the file.\r
+ @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.\r
+ @retval EFI_VOLUME_FULL The volume is full.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileOpen (\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ OUT EFI_FILE_PROTOCOL **NewHandle,\r
+ IN CHAR16 *FileName,\r
+ IN UINT64 OpenMode,\r
+ IN UINT64 Attributes\r
+ )\r
+{\r
+ EFI_FILE_PROTOCOL *Root;\r
+ EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+ EMU_EFI_FILE_PRIVATE *NewPrivateFile;\r
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;\r
+ EFI_STATUS Status;\r
+ CHAR16 *Src;\r
+ char *Dst;\r
+ CHAR8 *RealFileName;\r
+ char *ParseFileName;\r
+ char *GuardPointer;\r
+ CHAR8 TempChar;\r
+ UINTN Count;\r
+ BOOLEAN TrailingDash;\r
+ BOOLEAN LoopFinish;\r
+ UINTN InfoSize;\r
+ EFI_FILE_INFO *Info;\r
+ struct stat finfo;\r
+ int res;\r
+\r
+\r
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+ PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);\r
+ NewPrivateFile = NULL;\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+\r
+ //\r
+ // BUGBUG: assume an open of root\r
+ // if current location, return current data\r
+ //\r
+ TrailingDash = FALSE;\r
+ if ((StrCmp (FileName, L"\\") == 0) ||\r
+ (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {\r
+OpenRoot:\r
+ Status = PosixOpenVolume (PrivateFile->SimpleFileSystem, &Root);\r
+ NewPrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);\r
+ goto Done;\r
+ }\r
+\r
+ if (FileName[StrLen (FileName) - 1] == L'\\') {\r
+ TrailingDash = TRUE;\r
+ FileName[StrLen (FileName) - 1] = 0;\r
+ }\r
+\r
+ //\r
+ // Attempt to open the file\r
+ //\r
+ NewPrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));\r
+ if (NewPrivateFile == NULL) {\r
+ goto Done;\r
+ }\r
+\r
+ CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE));\r
+\r
+ NewPrivateFile->FileName = malloc (AsciiStrSize (PrivateFile->FileName) + 1 + StrLen (FileName) + 1);\r
+ if (NewPrivateFile->FileName == NULL) {\r
+ goto Done;\r
+ }\r
+\r
+ if (*FileName == L'\\') {\r
+ AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);\r
+ // Skip first '\'.\r
+ Src = FileName + 1;\r
+ } else {\r
+ AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);\r
+ Src = FileName;\r
+ }\r
+ Dst = NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileName);\r
+ GuardPointer = NewPrivateFile->FileName + AsciiStrLen (PrivateRoot->FilePath);\r
+ *Dst++ = '/';\r
+ // Convert unicode to ascii and '\' to '/'\r
+ while (*Src) {\r
+ if (*Src == '\\') {\r
+ *Dst++ = '/';\r
+ } else {\r
+ *Dst++ = *Src;\r
+ }\r
+ Src++;\r
+ }\r
+ *Dst = 0;\r
+\r
+\r
+ //\r
+ // Get rid of . and .., except leading . or ..\r
+ //\r
+\r
+ //\r
+ // GuardPointer protect simplefilesystem root path not be destroyed\r
+ //\r
+\r
+ LoopFinish = FALSE;\r
+ while (!LoopFinish) {\r
+ LoopFinish = TRUE;\r
+\r
+ for (ParseFileName = GuardPointer; *ParseFileName; ParseFileName++) {\r
+ if (*ParseFileName == '.' &&\r
+ (*(ParseFileName + 1) == 0 || *(ParseFileName + 1) == '/') &&\r
+ *(ParseFileName - 1) == '/'\r
+ ) {\r
+\r
+ //\r
+ // cut /.\r
+ //\r
+ CutPrefix (ParseFileName - 1, 2);\r
+ LoopFinish = FALSE;\r
+ break;\r
+ }\r
+\r
+ if (*ParseFileName == '.' &&\r
+ *(ParseFileName + 1) == '.' &&\r
+ (*(ParseFileName + 2) == 0 || *(ParseFileName + 2) == '/') &&\r
+ *(ParseFileName - 1) == '/'\r
+ ) {\r
+\r
+ ParseFileName--;\r
+ Count = 3;\r
+\r
+ while (ParseFileName != GuardPointer) {\r
+ ParseFileName--;\r
+ Count++;\r
+ if (*ParseFileName == '/') {\r
+ break;\r
+ }\r
+ }\r
+\r
+ //\r
+ // cut /.. and its left directory\r
+ //\r
+ CutPrefix (ParseFileName, Count);\r
+ LoopFinish = FALSE;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {\r
+ NewPrivateFile->IsRootDirectory = TRUE;\r
+ free (NewPrivateFile->FileName);\r
+ free (NewPrivateFile);\r
+ goto OpenRoot;\r
+ }\r
+\r
+ RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile->FileName) - 1;\r
+ while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/') {\r
+ RealFileName--;\r
+ }\r
+\r
+ TempChar = *(RealFileName - 1);\r
+ *(RealFileName - 1) = 0;\r
+ *(RealFileName - 1) = TempChar;\r
+\r
+\r
+ //\r
+ // Test whether file or directory\r
+ //\r
+ NewPrivateFile->IsRootDirectory = FALSE;\r
+ NewPrivateFile->fd = -1;\r
+ NewPrivateFile->Dir = NULL;\r
+ if (OpenMode & EFI_FILE_MODE_CREATE) {\r
+ if (Attributes & EFI_FILE_DIRECTORY) {\r
+ NewPrivateFile->IsDirectoryPath = TRUE;\r
+ } else {\r
+ NewPrivateFile->IsDirectoryPath = FALSE;\r
+ }\r
+ } else {\r
+ res = stat (NewPrivateFile->FileName, &finfo);\r
+ if (res == 0 && S_ISDIR(finfo.st_mode)) {\r
+ NewPrivateFile->IsDirectoryPath = TRUE;\r
+ } else {\r
+ NewPrivateFile->IsDirectoryPath = FALSE;\r
+ }\r
+ }\r
+\r
+ if (OpenMode & EFI_FILE_MODE_WRITE) {\r
+ NewPrivateFile->IsOpenedByRead = FALSE;\r
+ } else {\r
+ NewPrivateFile->IsOpenedByRead = TRUE;\r
+ }\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
+ //\r
+ // deal with directory\r
+ //\r
+ if (NewPrivateFile->IsDirectoryPath) {\r
+ if ((OpenMode & EFI_FILE_MODE_CREATE)) {\r
+ //\r
+ // Create a directory\r
+ //\r
+ if (mkdir (NewPrivateFile->FileName, 0777) != 0) {\r
+ if (errno != EEXIST) {\r
+ //free (TempFileName);\r
+ Status = EFI_ACCESS_DENIED;\r
+ goto Done;\r
+ }\r
+ }\r
+ }\r
+\r
+ NewPrivateFile->Dir = opendir (NewPrivateFile->FileName);\r
+ if (NewPrivateFile->Dir == NULL) {\r
+ if (errno == EACCES) {\r
+ Status = EFI_ACCESS_DENIED;\r
+ } else {\r
+ Status = EFI_NOT_FOUND;\r
+ }\r
+\r
+ goto Done;\r
+ }\r
+\r
+ } else {\r
+ //\r
+ // deal with file\r
+ //\r
+ NewPrivateFile->fd = open (\r
+ NewPrivateFile->FileName,\r
+ ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0) | (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),\r
+ 0666\r
+ );\r
+ if (NewPrivateFile->fd < 0) {\r
+ if (errno == ENOENT) {\r
+ Status = EFI_NOT_FOUND;\r
+ } else {\r
+ Status = EFI_ACCESS_DENIED;\r
+ }\r
+ }\r
+ }\r
+\r
+ if ((OpenMode & EFI_FILE_MODE_CREATE) && Status == EFI_SUCCESS) {\r
+ //\r
+ // Set the attribute\r
+ //\r
+ InfoSize = 0;\r
+ Info = NULL;\r
+ Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);\r
+ if (Status != EFI_BUFFER_TOO_SMALL) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Done;\r
+ }\r
+\r
+ Info = malloc (InfoSize);\r
+ if (Info == NULL) {\r
+ goto Done;\r
+ }\r
+\r
+ Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ Info->Attribute = Attributes;\r
+ PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);\r
+\r
+ free (Info);\r
+ }\r
+\r
+Done: ;\r
+ if (TrailingDash) {\r
+ FileName[StrLen (FileName) + 1] = 0;\r
+ FileName[StrLen (FileName)] = L'\\';\r
+ }\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ if (NewPrivateFile) {\r
+ if (NewPrivateFile->FileName) {\r
+ free (NewPrivateFile->FileName);\r
+ }\r
+\r
+ free (NewPrivateFile);\r
+ }\r
+ } else {\r
+ *NewHandle = &NewPrivateFile->EfiFile;\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+ Close the file handle\r
+\r
+ @param This Protocol instance pointer.\r
+\r
+ @retval EFI_SUCCESS The device was opened.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileCLose (\r
+ IN EFI_FILE_PROTOCOL *This\r
+ )\r
+{\r
+ EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+\r
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ if (PrivateFile->fd >= 0) {\r
+ close (PrivateFile->fd);\r
+ }\r
+ if (PrivateFile->Dir != NULL) {\r
+ closedir (PrivateFile->Dir);\r
+ }\r
+\r
+ PrivateFile->fd = -1;\r
+ PrivateFile->Dir = NULL;\r
+\r
+ if (PrivateFile->FileName) {\r
+ free (PrivateFile->FileName);\r
+ }\r
+\r
+ free (PrivateFile);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+ Close and delete the file handle.\r
+\r
+ @param This Protocol instance pointer.\r
+\r
+ @retval EFI_SUCCESS The device was opened.\r
+ @retval EFI_WARN_DELETE_FAILURE The handle was closed but the file was not deleted.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileDelete (\r
+ IN EFI_FILE_PROTOCOL *This\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+\r
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+ Status = EFI_WARN_DELETE_FAILURE;\r
+\r
+ if (PrivateFile->IsDirectoryPath) {\r
+ if (PrivateFile->Dir != NULL) {\r
+ closedir (PrivateFile->Dir);\r
+ PrivateFile->Dir = NULL;\r
+ }\r
+\r
+ if (rmdir (PrivateFile->FileName) == 0) {\r
+ Status = EFI_SUCCESS;\r
+ }\r
+ } else {\r
+ close (PrivateFile->fd);\r
+ PrivateFile->fd = -1;\r
+\r
+ if (!PrivateFile->IsOpenedByRead) {\r
+ if (!unlink (PrivateFile->FileName)) {\r
+ Status = EFI_SUCCESS;\r
+ }\r
+ }\r
+ }\r
+\r
+ free (PrivateFile->FileName);\r
+ free (PrivateFile);\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ Read data from the file.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param BufferSize On input size of buffer, on output amount of data in buffer.\r
+ @param Buffer The buffer in which data is read.\r
+\r
+ @retval EFI_SUCCESS Data was read.\r
+ @retval EFI_NO_MEDIA The device has no media.\r
+ @retval EFI_DEVICE_ERROR The device reported an error.\r
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+ @retval EFI_BUFFER_TO_SMALL BufferSize is too small. BufferSize contains required size.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileRead (\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN OUT UINTN *BufferSize,\r
+ OUT VOID *Buffer\r
+ )\r
+{\r
+ EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+ EFI_STATUS Status;\r
+ int Res;\r
+ UINTN Size;\r
+ UINTN NameSize;\r
+ UINTN ResultSize;\r
+ CHAR8 *FullFileName;\r
+\r
+\r
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ if (!PrivateFile->IsDirectoryPath) {\r
+ if (PrivateFile->fd < 0) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Done;\r
+ }\r
+\r
+ Res = read (PrivateFile->fd, Buffer, *BufferSize);\r
+ if (Res < 0) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Done;\r
+ }\r
+ *BufferSize = Res;\r
+ Status = EFI_SUCCESS;\r
+ goto Done;\r
+ }\r
+\r
+ //\r
+ // Read on a directory.\r
+ //\r
+ if (PrivateFile->Dir == NULL) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Done;\r
+ }\r
+\r
+ if (PrivateFile->Dirent == NULL) {\r
+ PrivateFile->Dirent = readdir (PrivateFile->Dir);\r
+ if (PrivateFile->Dirent == NULL) {\r
+ *BufferSize = 0;\r
+ Status = EFI_SUCCESS;\r
+ goto Done;\r
+ }\r
+ }\r
+\r
+ Size = SIZE_OF_EFI_FILE_INFO;\r
+ NameSize = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;\r
+ ResultSize = Size + 2 * NameSize;\r
+\r
+ if (*BufferSize < ResultSize) {\r
+ *BufferSize = ResultSize;\r
+ Status = EFI_BUFFER_TOO_SMALL;\r
+ goto Done;\r
+ }\r
+ Status = EFI_SUCCESS;\r
+\r
+ *BufferSize = ResultSize;\r
+\r
+ FullFileName = malloc (AsciiStrLen(PrivateFile->FileName) + 1 + NameSize);\r
+ if (FullFileName == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+\r
+ AsciiStrCpy (FullFileName, PrivateFile->FileName);\r
+ AsciiStrCat (FullFileName, "/");\r
+ AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name);\r
+ Status = UnixSimpleFileSystemFileInfo (\r
+ PrivateFile,\r
+ FullFileName,\r
+ BufferSize,\r
+ Buffer\r
+ );\r
+ free (FullFileName);\r
+\r
+ PrivateFile->Dirent = NULL;\r
+\r
+Done:\r
+ return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+ Write data to a file.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param BufferSize On input size of buffer, on output amount of data in buffer.\r
+ @param Buffer The buffer in which data to write.\r
+\r
+ @retval EFI_SUCCESS Data was written.\r
+ @retval EFI_UNSUPPORTED Writes to Open directory are not supported.\r
+ @retval EFI_NO_MEDIA The device has no media.\r
+ @retval EFI_DEVICE_ERROR The device reported an error.\r
+ @retval EFI_DEVICE_ERROR An attempt was made to write to a deleted file.\r
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+ @retval EFI_WRITE_PROTECTED The device is write protected.\r
+ @retval EFI_ACCESS_DENIED The file was open for read only.\r
+ @retval EFI_VOLUME_FULL The volume is full.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileWrite (\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN OUT UINTN *BufferSize,\r
+ IN VOID *Buffer\r
+ )\r
+{\r
+ EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+ int Res;\r
+\r
+\r
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ if (PrivateFile->fd < 0) {\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+\r
+ if (PrivateFile->IsDirectoryPath) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ if (PrivateFile->IsOpenedByRead) {\r
+ return EFI_ACCESS_DENIED;\r
+ }\r
+\r
+ Res = write (PrivateFile->fd, Buffer, *BufferSize);\r
+ if (Res == (UINTN)-1) {\r
+ return ErrnoToEfiStatus ();\r
+ }\r
+\r
+ *BufferSize = Res;\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+/**\r
+ Set a files current position\r
+\r
+ @param This Protocol instance pointer.\r
+ @param Position Byte position from the start of the file.\r
+\r
+ @retval EFI_SUCCESS Data was written.\r
+ @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileSetPossition (\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN UINT64 Position\r
+ )\r
+{\r
+ EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+ off_t Pos;\r
+\r
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ if (PrivateFile->IsDirectoryPath) {\r
+ if (Position != 0) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ if (PrivateFile->Dir == NULL) {\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+ rewinddir (PrivateFile->Dir);\r
+ return EFI_SUCCESS;\r
+ } else {\r
+ if (Position == (UINT64) -1) {\r
+ Pos = lseek (PrivateFile->fd, 0, SEEK_END);\r
+ } else {\r
+ Pos = lseek (PrivateFile->fd, Position, SEEK_SET);\r
+ }\r
+ if (Pos == (off_t)-1) {\r
+ return ErrnoToEfiStatus ();\r
+ }\r
+ return EFI_SUCCESS;\r
+ }\r
+}\r
+\r
+\r
+\r
+/**\r
+ Get a file's current position\r
+\r
+ @param This Protocol instance pointer.\r
+ @param Position Byte position from the start of the file.\r
+\r
+ @retval EFI_SUCCESS Data was written.\r
+ @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileGetPossition (\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ OUT UINT64 *Position\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+\r
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ if (PrivateFile->IsDirectoryPath) {\r
+ Status = EFI_UNSUPPORTED;\r
+ } else {\r
+ *Position = (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR);\r
+ Status = (*Position == (UINT64) -1) ? ErrnoToEfiStatus () : EFI_SUCCESS;\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ Get information about a file.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param InformationType Type of information to return in Buffer.\r
+ @param BufferSize On input size of buffer, on output amount of data in buffer.\r
+ @param Buffer The buffer to return data.\r
+\r
+ @retval EFI_SUCCESS Data was returned.\r
+ @retval EFI_UNSUPPORTED InformationType is not supported.\r
+ @retval EFI_NO_MEDIA The device has no media.\r
+ @retval EFI_DEVICE_ERROR The device reported an error.\r
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+ @retval EFI_WRITE_PROTECTED The device is write protected.\r
+ @retval EFI_ACCESS_DENIED The file was open for read only.\r
+ @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in BufferSize.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileGetInfo (\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN EFI_GUID *InformationType,\r
+ IN OUT UINTN *BufferSize,\r
+ OUT VOID *Buffer\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+ EFI_FILE_SYSTEM_INFO *FileSystemInfoBuffer;\r
+ int UnixStatus;\r
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;\r
+ struct statfs buf;\r
+\r
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+ PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);\r
+\r
+ Status = EFI_SUCCESS;\r
+ if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {\r
+ Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);\r
+ } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
+ if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel)) {\r
+ *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);\r
+ return EFI_BUFFER_TOO_SMALL;\r
+ }\r
+\r
+ UnixStatus = statfs (PrivateFile->FileName, &buf);\r
+ if (UnixStatus < 0) {\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+\r
+ FileSystemInfoBuffer = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
+ FileSystemInfoBuffer->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);\r
+ FileSystemInfoBuffer->ReadOnly = FALSE;\r
+\r
+ //\r
+ // Succeeded\r
+ //\r
+ FileSystemInfoBuffer->VolumeSize = MultU64x32 (buf.f_blocks, buf.f_bsize);\r
+ FileSystemInfoBuffer->FreeSpace = MultU64x32 (buf.f_bavail, buf.f_bsize);\r
+ FileSystemInfoBuffer->BlockSize = buf.f_bsize;\r
+\r
+\r
+ StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot->VolumeLabel);\r
+ *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);\r
+\r
+ } else if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
+ if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {\r
+ *BufferSize = StrSize (PrivateRoot->VolumeLabel);\r
+ return EFI_BUFFER_TOO_SMALL;\r
+ }\r
+\r
+ StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);\r
+ *BufferSize = StrSize (PrivateRoot->VolumeLabel);\r
+\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ Set information about a file\r
+\r
+ @param File Protocol instance pointer.\r
+ @param InformationType Type of information in Buffer.\r
+ @param BufferSize Size of buffer.\r
+ @param Buffer The data to write.\r
+\r
+ @retval EFI_SUCCESS Data was returned.\r
+ @retval EFI_UNSUPPORTED InformationType is not supported.\r
+ @retval EFI_NO_MEDIA The device has no media.\r
+ @retval EFI_DEVICE_ERROR The device reported an error.\r
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+ @retval EFI_WRITE_PROTECTED The device is write protected.\r
+ @retval EFI_ACCESS_DENIED The file was open for read only.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileSetInfo (\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN EFI_GUID *InformationType,\r
+ IN UINTN BufferSize,\r
+ IN VOID *Buffer\r
+ )\r
+{\r
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;\r
+ EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+ EFI_FILE_INFO *OldFileInfo;\r
+ EFI_FILE_INFO *NewFileInfo;\r
+ EFI_STATUS Status;\r
+ UINTN OldInfoSize;\r
+ mode_t NewAttr;\r
+ struct stat OldAttr;\r
+ CHAR8 *OldFileName;\r
+ CHAR8 *NewFileName;\r
+ CHAR8 *CharPointer;\r
+ BOOLEAN AttrChangeFlag;\r
+ BOOLEAN NameChangeFlag;\r
+ BOOLEAN SizeChangeFlag;\r
+ BOOLEAN TimeChangeFlag;\r
+ struct tm NewLastAccessSystemTime;\r
+ struct tm NewLastWriteSystemTime;\r
+ EFI_FILE_SYSTEM_INFO *NewFileSystemInfo;\r
+ CHAR8 *AsciiFilePtr;\r
+ CHAR16 *UnicodeFilePtr;\r
+ int UnixStatus;\r
+ struct utimbuf Utime;\r
+\r
+\r
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+ PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);\r
+ errno = 0;\r
+ Status = EFI_UNSUPPORTED;\r
+ OldFileInfo = NewFileInfo = NULL;\r
+ OldFileName = NewFileName = NULL;\r
+ AttrChangeFlag = NameChangeFlag = SizeChangeFlag = TimeChangeFlag = FALSE;\r
+\r
+ //\r
+ // Set file system information.\r
+ //\r
+ if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
+ if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel))) {\r
+ Status = EFI_BAD_BUFFER_SIZE;\r
+ goto Done;\r
+ }\r
+\r
+ NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
+\r
+ free (PrivateRoot->VolumeLabel);\r
+\r
+ PrivateRoot->VolumeLabel = malloc (StrSize (NewFileSystemInfo->VolumeLabel));\r
+ if (PrivateRoot->VolumeLabel == NULL) {\r
+ goto Done;\r
+ }\r
+\r
+ StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);\r
+\r
+ Status = EFI_SUCCESS;\r
+ goto Done;\r
+ }\r
+\r
+ //\r
+ // Set volume label information.\r
+ //\r
+ if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
+ if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {\r
+ Status = EFI_BAD_BUFFER_SIZE;\r
+ goto Done;\r
+ }\r
+\r
+ StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);\r
+\r
+ Status = EFI_SUCCESS;\r
+ goto Done;\r
+ }\r
+\r
+ if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {\r
+ Status = EFI_UNSUPPORTED;\r
+ goto Done;\r
+ }\r
+\r
+ if (BufferSize < SIZE_OF_EFI_FILE_INFO) {\r
+ Status = EFI_BAD_BUFFER_SIZE;\r
+ goto Done;\r
+ }\r
+\r
+ //\r
+ // Set file/directory information.\r
+ //\r
+\r
+ //\r
+ // Check for invalid set file information parameters.\r
+ //\r
+ NewFileInfo = (EFI_FILE_INFO *) Buffer;\r
+ if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||\r
+ (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||\r
+ (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)\r
+ ) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+\r
+ //\r
+ // Get current file information so we can determine what kind\r
+ // of change request this is.\r
+ //\r
+ OldInfoSize = 0;\r
+ Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, NULL);\r
+ if (Status != EFI_BUFFER_TOO_SMALL) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Done;\r
+ }\r
+\r
+ OldFileInfo = malloc (OldInfoSize);\r
+ if (OldFileInfo == NULL) {\r
+ goto Done;\r
+ }\r
+\r
+ Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, OldFileInfo);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ OldFileName = malloc (AsciiStrSize (PrivateFile->FileName));\r
+ if (OldFileInfo == NULL) {\r
+ goto Done;\r
+ }\r
+\r
+ AsciiStrCpy (OldFileName, PrivateFile->FileName);\r
+\r
+ //\r
+ // Make full pathname from new filename and rootpath.\r
+ //\r
+ if (NewFileInfo->FileName[0] == '\\') {\r
+ NewFileName = malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + StrLen (NewFileInfo->FileName) + 1);\r
+ if (NewFileName == NULL) {\r
+ goto Done;\r
+ }\r
+\r
+ AsciiStrCpy (NewFileName, PrivateRoot->FilePath);\r
+ AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);\r
+ UnicodeFilePtr = NewFileInfo->FileName + 1;\r
+ *AsciiFilePtr++ ='/';\r
+ } else {\r
+ NewFileName = malloc (AsciiStrLen (PrivateFile->FileName) + 2 + StrLen (NewFileInfo->FileName) + 1);\r
+ if (NewFileName == NULL) {\r
+ goto Done;\r
+ }\r
+\r
+ AsciiStrCpy (NewFileName, PrivateRoot->FilePath);\r
+ AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);\r
+ if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {\r
+ // make sure there is a / between Root FilePath and NewFileInfo Filename\r
+ AsciiFilePtr[0] = '/';\r
+ AsciiFilePtr[1] = '\0';\r
+ AsciiFilePtr++;\r
+ }\r
+ UnicodeFilePtr = NewFileInfo->FileName;\r
+ }\r
+ // Convert to ascii.\r
+ while (*UnicodeFilePtr) {\r
+ *AsciiFilePtr++ = *UnicodeFilePtr++;\r
+ }\r
+ *AsciiFilePtr = 0;\r
+\r
+ //\r
+ // Is there an attribute change request?\r
+ //\r
+ if (NewFileInfo->Attribute != OldFileInfo->Attribute) {\r
+ if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) != (OldFileInfo->Attribute & EFI_FILE_DIRECTORY)) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+\r
+ AttrChangeFlag = TRUE;\r
+ }\r
+\r
+ //\r
+ // Is there a name change request?\r
+ // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL\r
+ //\r
+ if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) {\r
+ NameChangeFlag = TRUE;\r
+ }\r
+\r
+ //\r
+ // Is there a size change request?\r
+ //\r
+ if (NewFileInfo->FileSize != OldFileInfo->FileSize) {\r
+ SizeChangeFlag = TRUE;\r
+ }\r
+\r
+ //\r
+ // Is there a time stamp change request?\r
+ //\r
+ if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) &&\r
+ CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime, sizeof (EFI_TIME))\r
+ ) {\r
+ TimeChangeFlag = TRUE;\r
+ } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &&\r
+ CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo->LastAccessTime, sizeof (EFI_TIME))\r
+ ) {\r
+ TimeChangeFlag = TRUE;\r
+ } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME)) &&\r
+ CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo->ModificationTime, sizeof (EFI_TIME))\r
+ ) {\r
+ TimeChangeFlag = TRUE;\r
+ }\r
+\r
+ //\r
+ // All done if there are no change requests being made.\r
+ //\r
+ if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag || TimeChangeFlag)) {\r
+ Status = EFI_SUCCESS;\r
+ goto Done;\r
+ }\r
+\r
+ //\r
+ // Set file or directory information.\r
+ //\r
+ if (stat (OldFileName, &OldAttr) != 0) {\r
+ Status = ErrnoToEfiStatus ();\r
+ goto Done;\r
+ }\r
+\r
+ //\r
+ // Name change.\r
+ //\r
+ if (NameChangeFlag) {\r
+ //\r
+ // Close the handles first\r
+ //\r
+ if (PrivateFile->IsOpenedByRead) {\r
+ Status = EFI_ACCESS_DENIED;\r
+ goto Done;\r
+ }\r
+\r
+ for (CharPointer = NewFileName; *CharPointer != 0 && *CharPointer != L'/'; CharPointer++) {\r
+ }\r
+\r
+ if (*CharPointer != 0) {\r
+ Status = EFI_ACCESS_DENIED;\r
+ goto Done;\r
+ }\r
+\r
+ UnixStatus = rename (OldFileName, NewFileName);\r
+ if (UnixStatus == 0) {\r
+ //\r
+ // modify file name\r
+ //\r
+ free (PrivateFile->FileName);\r
+\r
+ PrivateFile->FileName = malloc (AsciiStrSize (NewFileName));\r
+ if (PrivateFile->FileName == NULL) {\r
+ goto Done;\r
+ }\r
+\r
+ AsciiStrCpy (PrivateFile->FileName, NewFileName);\r
+ } else {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Done;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Size change\r
+ //\r
+ if (SizeChangeFlag) {\r
+ if (PrivateFile->IsDirectoryPath) {\r
+ Status = EFI_UNSUPPORTED;\r
+ goto Done;\r
+ }\r
+\r
+ if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute & EFI_FILE_READ_ONLY) {\r
+ Status = EFI_ACCESS_DENIED;\r
+ goto Done;\r
+ }\r
+\r
+ if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) != 0) {\r
+ Status = ErrnoToEfiStatus ();\r
+ goto Done;\r
+ }\r
+\r
+ }\r
+\r
+ //\r
+ // Time change\r
+ //\r
+ if (TimeChangeFlag) {\r
+ NewLastAccessSystemTime.tm_year = NewFileInfo->LastAccessTime.Year;\r
+ NewLastAccessSystemTime.tm_mon = NewFileInfo->LastAccessTime.Month;\r
+ NewLastAccessSystemTime.tm_mday = NewFileInfo->LastAccessTime.Day;\r
+ NewLastAccessSystemTime.tm_hour = NewFileInfo->LastAccessTime.Hour;\r
+ NewLastAccessSystemTime.tm_min = NewFileInfo->LastAccessTime.Minute;\r
+ NewLastAccessSystemTime.tm_sec = NewFileInfo->LastAccessTime.Second;\r
+ NewLastAccessSystemTime.tm_isdst = 0;\r
+\r
+ Utime.actime = mktime (&NewLastAccessSystemTime);\r
+\r
+ NewLastWriteSystemTime.tm_year = NewFileInfo->ModificationTime.Year;\r
+ NewLastWriteSystemTime.tm_mon = NewFileInfo->ModificationTime.Month;\r
+ NewLastWriteSystemTime.tm_mday = NewFileInfo->ModificationTime.Day;\r
+ NewLastWriteSystemTime.tm_hour = NewFileInfo->ModificationTime.Hour;\r
+ NewLastWriteSystemTime.tm_min = NewFileInfo->ModificationTime.Minute;\r
+ NewLastWriteSystemTime.tm_sec = NewFileInfo->ModificationTime.Second;\r
+ NewLastWriteSystemTime.tm_isdst = 0;\r
+\r
+ Utime.modtime = mktime (&NewLastWriteSystemTime);\r
+\r
+ if (Utime.actime == (time_t)-1 || Utime.modtime == (time_t)-1) {\r
+ goto Done;\r
+ }\r
+\r
+ if (utime (PrivateFile->FileName, &Utime) == -1) {\r
+ Status = ErrnoToEfiStatus ();\r
+ goto Done;\r
+ }\r
+ }\r
+\r
+ //\r
+ // No matter about AttrChangeFlag, Attribute must be set.\r
+ // Because operation before may cause attribute change.\r
+ //\r
+ NewAttr = OldAttr.st_mode;\r
+\r
+ if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {\r
+ NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);\r
+ } else {\r
+ NewAttr |= S_IRUSR;\r
+ }\r
+\r
+ if (chmod (NewFileName, NewAttr) != 0) {\r
+ Status = ErrnoToEfiStatus ();\r
+ }\r
+\r
+Done:\r
+ if (OldFileInfo != NULL) {\r
+ free (OldFileInfo);\r
+ }\r
+\r
+ if (OldFileName != NULL) {\r
+ free (OldFileName);\r
+ }\r
+\r
+ if (NewFileName != NULL) {\r
+ free (NewFileName);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ Flush data back for the file handle.\r
+\r
+ @param This Protocol instance pointer.\r
+\r
+ @retval EFI_SUCCESS Data was written.\r
+ @retval EFI_UNSUPPORTED Writes to Open directory are not supported.\r
+ @retval EFI_NO_MEDIA The device has no media.\r
+ @retval EFI_DEVICE_ERROR The device reported an error.\r
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+ @retval EFI_WRITE_PROTECTED The device is write protected.\r
+ @retval EFI_ACCESS_DENIED The file was open for read only.\r
+ @retval EFI_VOLUME_FULL The volume is full.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileFlush (\r
+ IN EFI_FILE_PROTOCOL *This\r
+ )\r
+{\r
+ EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+\r
+\r
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ if (PrivateFile->IsDirectoryPath) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ if (PrivateFile->IsOpenedByRead) {\r
+ return EFI_ACCESS_DENIED;\r
+ }\r
+\r
+ if (PrivateFile->fd < 0) {\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+\r
+ if (fsync (PrivateFile->fd) != 0) {\r
+ return ErrnoToEfiStatus ();\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+EFI_STATUS\r
+PosixFileSystmeThunkOpen (\r
+ IN EMU_IO_THUNK_PROTOCOL *This\r
+ )\r
+{\r
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;\r
+ UINTN i;\r
+\r
+ if (This->Private != NULL) {\r
+ return EFI_ALREADY_STARTED;\r
+ }\r
+\r
+ if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ Private = malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));\r
+ if (Private == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ Private->FilePath = malloc (StrLen (This->ConfigString) + 1);\r
+ if (Private->FilePath == NULL) {\r
+ free (Private);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ // Convert Unicode to Ascii\r
+ for (i = 0; This->ConfigString[i] != 0; i++) {\r
+ Private->FilePath[i] = This->ConfigString[i];\r
+ }\r
+ Private->FilePath[i] = 0;\r
+\r
+\r
+ Private->VolumeLabel = malloc (StrSize (L"EFI_EMULATED"));\r
+ if (Private->VolumeLabel == NULL) {\r
+ free (Private->FilePath);\r
+ free (Private);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ StrCpy (Private->VolumeLabel, L"EFI_EMULATED");\r
+\r
+ Private->Signature = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;\r
+ Private->Thunk = This;\r
+ CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof (Private->SimpleFileSystem));\r
+ Private->FileHandlesOpen = FALSE;\r
+\r
+ This->Interface = &Private->SimpleFileSystem;\r
+ This->Private = Private;\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+PosixFileSystmeThunkClose (\r
+ IN EMU_IO_THUNK_PROTOCOL *This\r
+ )\r
+{\r
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;\r
+\r
+ if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ Private = This->Private;\r
+\r
+ if (Private->FileHandlesOpen) {\r
+ //\r
+ // Close only supported if all the EFI_FILE_HANDLEs have been closed.\r
+ //\r
+ return EFI_NOT_READY;\r
+ }\r
+\r
+ if (This->Private != NULL) {\r
+ if (Private->VolumeLabel != NULL) {\r
+ free (Private->VolumeLabel);\r
+ }\r
+ free (This->Private);\r
+ This->Private = NULL;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {\r
+ &gEfiSimpleFileSystemProtocolGuid,\r
+ NULL,\r
+ NULL,\r
+ 0,\r
+ GasketPosixFileSystmeThunkOpen,\r
+ GasketPosixFileSystmeThunkClose,\r
+ NULL\r
+};\r
+\r
+\r
-/*++ @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\r
+ POSIX Pthreads to emulate APs and implement threads\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.\r
+Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+\r
+**/\r
+\r
+#include "Host.h"\r
+#include <pthread.h>\r
+\r
+\r
+UINTN\r
+EFIAPI\r
+PthreadMutexLock (\r
+ IN VOID *Mutex\r
+ )\r
+{\r
+ return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);\r
+}\r
+\r
+\r
+\r
+UINTN\r
+EFIAPI\r
+PthreadMutexUnLock (\r
+ IN VOID *Mutex\r
+ )\r
+{\r
+ return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);\r
+}\r
+\r
+\r
+UINTN\r
+EFIAPI\r
+PthreadMutexTryLock (\r
+ IN VOID *Mutex\r
+ )\r
+{\r
+ return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);\r
+}\r
+\r
+\r
+VOID *\r
+PthreadMutexInit (\r
+ IN VOID\r
+ )\r
+{\r
+ pthread_mutex_t *Mutex;\r
+ int err;\r
+\r
+ Mutex = malloc (sizeof (pthread_mutex_t));\r
+ err = pthread_mutex_init (Mutex, NULL);\r
+ if (err == 0) {\r
+ return Mutex;\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+\r
+UINTN\r
+PthreadMutexDestroy (\r
+ IN VOID *Mutex\r
+ )\r
+{\r
+ if (Mutex != NULL) {\r
+ return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);\r
+ }\r
+\r
+ return -1;\r
+}\r
+\r
+// Can't store this data on PthreadCreate stack so we need a global\r
+typedef struct {\r
+ pthread_mutex_t Mutex;\r
+ THREAD_THUNK_THREAD_ENTRY Start;\r
+} THREAD_MANGLE;\r
+\r
+THREAD_MANGLE mThreadMangle = {\r
+ PTHREAD_MUTEX_INITIALIZER,\r
+ NULL\r
+};\r
+\r
+VOID *\r
+SecFakePthreadStart (\r
+ VOID *Context\r
+ )\r
+{\r
+ THREAD_THUNK_THREAD_ENTRY Start;\r
+ sigset_t SigMask;\r
+\r
+ // Save global on the stack before we unlock\r
+ Start = mThreadMangle.Start;\r
+ pthread_mutex_unlock (&mThreadMangle.Mutex);\r
+\r
+ // Mask all signals to the APs\r
+ sigfillset (&SigMask);\r
+ pthread_sigmask (SIG_BLOCK, &SigMask, NULL);\r
+\r
+ //\r
+ // We have to start the thread in SEC as we need to follow\r
+ // OS X calling conventions. We can then call back into\r
+ // to the callers Start.\r
+ //\r
+ // This is a great example of how all problems in computer\r
+ // science can be solved by adding another level of indirection\r
+ //\r
+ return (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);\r
+}\r
+\r
+UINTN\r
+PthreadCreate (\r
+ IN VOID *Thread,\r
+ IN VOID *Attribute,\r
+ IN THREAD_THUNK_THREAD_ENTRY Start,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ int err;\r
+ BOOLEAN EnabledOnEntry;\r
+\r
+ //\r
+ // Threads inherit interrupt state so disable interrupts before we start thread\r
+ //\r
+ if (SecInterruptEanbled ()) {\r
+ SecDisableInterrupt ();\r
+ EnabledOnEntry = TRUE;\r
+ } else {\r
+ EnabledOnEntry = FALSE;\r
+ }\r
+\r
+ // Aquire lock for global, SecFakePthreadStart runs in a different thread.\r
+ pthread_mutex_lock (&mThreadMangle.Mutex);\r
+ mThreadMangle.Start = Start;\r
+\r
+ err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);\r
+ if (err != 0) {\r
+ // Thread failed to launch so release the lock;\r
+ pthread_mutex_unlock (&mThreadMangle.Mutex);\r
+ }\r
+\r
+ if (EnabledOnEntry) {\r
+ // Restore interrupt state\r
+ SecEnableInterrupt ();\r
+ }\r
+\r
+ return err;\r
+}\r
+\r
+\r
+VOID\r
+PthreadExit (\r
+ IN VOID *ValuePtr\r
+ )\r
+{\r
+ pthread_exit (ValuePtr);\r
+ return;\r
+}\r
+\r
+\r
+UINTN\r
+PthreadSelf (\r
+ VOID\r
+ )\r
+{\r
+ // POSIX currently allows pthread_t to be a structure or arithmetic type.\r
+ // Check out sys/types.h to make sure this will work if you are porting.\r
+ // On OS X (Darwin) pthread_t is a pointer to a structure so this code works.\r
+ return (UINTN)pthread_self ();\r
+}\r
+\r
+\r
+EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {\r
+ GasketPthreadMutexLock,\r
+ GasketPthreadMutexUnLock,\r
+ GasketPthreadMutexTryLock,\r
+ GasketPthreadMutexInit,\r
+ GasketPthreadMutexDestroy,\r
+ GasketPthreadCreate,\r
+ GasketPthreadExit,\r
+ GasketPthreadSelf\r
+};\r
+\r
+\r
+EFI_STATUS\r
+PthreadOpen (\r
+ IN EMU_IO_THUNK_PROTOCOL *This\r
+ )\r
+{\r
+ if (This->Instance != 0) {\r
+ // Only single instance is supported\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ if (This->ConfigString[0] == L'0') {\r
+ // If AP count is zero no need for threads\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ This->Interface = &gPthreadThunk;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+PthreadClose (\r
+ IN EMU_IO_THUNK_PROTOCOL *This\r
+ )\r
+{\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {\r
+ &gEmuThreadThunkProtocolGuid,\r
+ NULL,\r
+ NULL,\r
+ 0,\r
+ GasketPthreadOpen,\r
+ GasketPthreadClose,\r
+ NULL\r
+};\r
+\r
+\r
-/*++ @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\r
+\r
+Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
+\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Host.h"\r
+\r
+#include <sys/ipc.h>\r
+#include <sys/shm.h>\r
+\r
+#include <X11/Xlib.h>\r
+#include <X11/Xutil.h>\r
+#include <X11/Xos.h>\r
+#include <X11/extensions/XShm.h>\r
+#include <X11/keysym.h>\r
+#include <X11/cursorfont.h>\r
+\r
+#define KEYSYM_LOWER 0\r
+#define KEYSYM_UPPER 1\r
+\r
+\r
+struct uga_drv_shift_mask {\r
+ unsigned char shift;\r
+ unsigned char size;\r
+ unsigned char csize;\r
+};\r
+\r
+#define NBR_KEYS 32\r
+typedef struct {\r
+ EMU_GRAPHICS_WINDOW_PROTOCOL GraphicsIo;\r
+\r
+ Display *display;\r
+ int screen; // values for window_size in main\r
+ Window win;\r
+ GC gc;\r
+ Visual *visual;\r
+\r
+ int depth;\r
+ unsigned int width;\r
+ unsigned int height;\r
+ unsigned int line_bytes;\r
+ unsigned int pixel_shift;\r
+ unsigned char *image_data;\r
+\r
+ struct uga_drv_shift_mask r, g, b;\r
+\r
+ int use_shm;\r
+ XShmSegmentInfo xshm_info;\r
+ XImage *image;\r
+ char *Title;\r
+\r
+ unsigned int key_rd;\r
+ unsigned int key_wr;\r
+ unsigned int key_count;\r
+ EFI_KEY_DATA keys[NBR_KEYS];\r
+\r
+ EFI_KEY_STATE KeyState;\r
+\r
+ EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeRegisterdKeyCallback;\r
+ EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakRegisterdKeyCallback;\r
+ VOID *RegisterdKeyCallbackContext;\r
+\r
+ int previous_x;\r
+ int previous_y;\r
+ EFI_SIMPLE_POINTER_STATE pointer_state;\r
+ int pointer_state_changed;\r
+} GRAPHICS_IO_PRIVATE;\r
+\r
+void\r
+HandleEvents(\r
+ IN GRAPHICS_IO_PRIVATE *Drv\r
+ );\r
+\r
+void\r
+fill_shift_mask (\r
+ IN struct uga_drv_shift_mask *sm,\r
+ IN unsigned long mask\r
+ )\r
+{\r
+ sm->shift = 0;\r
+ sm->size = 0;\r
+ while ((mask & 1) == 0) {\r
+ mask >>= 1;\r
+ sm->shift++;\r
+ }\r
+ while (mask & 1) {\r
+ sm->size++;\r
+ mask >>= 1;\r
+ }\r
+ sm->csize = 8 - sm->size;\r
+}\r
+\r
+int\r
+TryCreateShmImage (\r
+ IN GRAPHICS_IO_PRIVATE *Drv\r
+ )\r
+{\r
+ Drv->image = XShmCreateImage (\r
+ Drv->display, Drv->visual,\r
+ Drv->depth, ZPixmap, NULL, &Drv->xshm_info,\r
+ Drv->width, Drv->height\r
+ );\r
+ if (Drv->image == NULL) {\r
+ return 0;\r
+ }\r
+\r
+ switch (Drv->image->bitmap_unit) {\r
+ case 32:\r
+ Drv->pixel_shift = 2;\r
+ break;\r
+ case 16:\r
+ Drv->pixel_shift = 1;\r
+ break;\r
+ case 8:\r
+ Drv->pixel_shift = 0;\r
+ break;\r
+ }\r
+\r
+ Drv->xshm_info.shmid = shmget (\r
+ IPC_PRIVATE, Drv->image->bytes_per_line * Drv->image->height,\r
+ IPC_CREAT | 0777\r
+ );\r
+ if (Drv->xshm_info.shmid < 0) {\r
+ XDestroyImage(Drv->image);\r
+ return 0;\r
+ }\r
+\r
+ Drv->image_data = shmat (Drv->xshm_info.shmid, NULL, 0);\r
+ if(!Drv->image_data) {\r
+ shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);\r
+ XDestroyImage(Drv->image);\r
+ return 0;\r
+ }\r
+\r
+#ifndef __APPLE__\r
+ //\r
+ // This closes shared memory in real time on OS X. Only closes after folks quit using\r
+ // it on Linux.\r
+ //\r
+ shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);\r
+#endif\r
+\r
+ Drv->xshm_info.shmaddr = (char*)Drv->image_data;\r
+ Drv->image->data = (char*)Drv->image_data;\r
+\r
+ if (!XShmAttach (Drv->display, &Drv->xshm_info)) {\r
+ shmdt (Drv->image_data);\r
+ XDestroyImage(Drv->image);\r
+ return 0;\r
+ }\r
+ return 1;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11Size (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,\r
+ IN UINT32 Width,\r
+ IN UINT32 Height\r
+ )\r
+{\r
+ GRAPHICS_IO_PRIVATE *Drv;\r
+ XSizeHints size_hints;\r
+\r
+ // Destroy current buffer if created.\r
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+ if (Drv->image != NULL) {\r
+ // Before destroy buffer, need to make sure the buffer available for access.\r
+ XDestroyImage (Drv->image);\r
+\r
+ if (Drv->use_shm) {\r
+ shmdt (Drv->image_data);\r
+ }\r
+\r
+ Drv->image_data = NULL;\r
+ Drv->image = NULL;\r
+ }\r
+\r
+ Drv->width = Width;\r
+ Drv->height = Height;\r
+ XResizeWindow (Drv->display, Drv->win, Width, Height);\r
+\r
+ // Allocate image.\r
+ if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) {\r
+ Drv->use_shm = 1;\r
+ } else {\r
+ Drv->use_shm = 0;\r
+ if (Drv->depth > 16) {\r
+ Drv->pixel_shift = 2;\r
+ } else if (Drv->depth > 8) {\r
+ Drv->pixel_shift = 1;\r
+ } else {\r
+ Drv->pixel_shift = 0;\r
+ }\r
+\r
+ Drv->image_data = malloc ((Drv->width * Drv->height) << Drv->pixel_shift);\r
+ Drv->image = XCreateImage (\r
+ Drv->display, Drv->visual, Drv->depth,\r
+ ZPixmap, 0, (char *)Drv->image_data,\r
+ Drv->width, Drv->height,\r
+ 8 << Drv->pixel_shift, 0\r
+ );\r
+ }\r
+\r
+ Drv->line_bytes = Drv->image->bytes_per_line;\r
+\r
+ fill_shift_mask (&Drv->r, Drv->image->red_mask);\r
+ fill_shift_mask (&Drv->g, Drv->image->green_mask);\r
+ fill_shift_mask (&Drv->b, Drv->image->blue_mask);\r
+\r
+ // Set WM hints.\r
+ size_hints.flags = PSize | PMinSize | PMaxSize;\r
+ size_hints.min_width = size_hints.max_width = size_hints.base_width = Width;\r
+ size_hints.min_height = size_hints.max_height = size_hints.base_height = Height;\r
+ XSetWMNormalHints (Drv->display, Drv->win, &size_hints);\r
+\r
+ XMapWindow (Drv->display, Drv->win);\r
+ HandleEvents (Drv);\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+void\r
+handleKeyEvent (\r
+ IN GRAPHICS_IO_PRIVATE *Drv,\r
+ IN XEvent *ev,\r
+ IN BOOLEAN Make\r
+ )\r
+{\r
+ KeySym *KeySym;\r
+ EFI_KEY_DATA KeyData;\r
+ int KeySymArraySize;\r
+\r
+ if (Make) {\r
+ if (Drv->key_count == NBR_KEYS) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ // keycode is a physical key on the keyboard\r
+ // KeySym is a mapping of a physical key\r
+ // KeyboardMapping is the array of KeySym for a given keycode. key, shifted key, option key, command key, ...\r
+ //\r
+ // Returns an array of KeySymArraySize of KeySym for the keycode. [0] is lower case, [1] is upper case,\r
+ // [2] and [3] are based on option and command modifiers. The problem we have is command V\r
+ // could be mapped to a crazy Unicode character so the old scheme of returning a string.\r
+ //\r
+ KeySym = XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1, &KeySymArraySize);\r
+\r
+ KeyData.Key.ScanCode = 0;\r
+ KeyData.Key.UnicodeChar = 0;\r
+ KeyData.KeyState.KeyShiftState = 0;\r
+\r
+ //\r
+ // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they are not on Macs\r
+ //\r
+ if ((ev->xkey.state & LockMask) == 0) {\r
+ Drv->KeyState.KeyToggleState &= ~EFI_CAPS_LOCK_ACTIVE;\r
+ } else {\r
+ if (Make) {\r
+ Drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;\r
+ }\r
+ }\r
+\r
+ // Skipping EFI_MENU_KEY_PRESSED and EFI_SYS_REQ_PRESSED\r
+\r
+ switch (*KeySym) {\r
+ case XK_Control_R:\r
+ if (Make) {\r
+ Drv->KeyState.KeyShiftState |= EFI_RIGHT_CONTROL_PRESSED;\r
+ } else {\r
+ Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_CONTROL_PRESSED;\r
+ }\r
+ break;\r
+ case XK_Control_L:\r
+ if (Make) {\r
+ Drv->KeyState.KeyShiftState |= EFI_LEFT_CONTROL_PRESSED;\r
+ } else {\r
+ Drv->KeyState.KeyShiftState &= ~EFI_LEFT_CONTROL_PRESSED;\r
+ }\r
+ break;\r
+\r
+ case XK_Shift_R:\r
+ if (Make) {\r
+ Drv->KeyState.KeyShiftState |= EFI_RIGHT_SHIFT_PRESSED;\r
+ } else {\r
+ Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_SHIFT_PRESSED;\r
+ }\r
+ break;\r
+ case XK_Shift_L:\r
+ if (Make) {\r
+ Drv->KeyState.KeyShiftState |= EFI_LEFT_SHIFT_PRESSED;\r
+ } else {\r
+ Drv->KeyState.KeyShiftState &= ~EFI_LEFT_SHIFT_PRESSED;\r
+ }\r
+ break;\r
+\r
+ case XK_Mode_switch:\r
+ if (Make) {\r
+ Drv->KeyState.KeyShiftState |= EFI_LEFT_ALT_PRESSED;\r
+ } else {\r
+ Drv->KeyState.KeyShiftState &= ~EFI_LEFT_ALT_PRESSED;\r
+ }\r
+ break;\r
+\r
+ case XK_Meta_R:\r
+ if (Make) {\r
+ Drv->KeyState.KeyShiftState |= EFI_RIGHT_LOGO_PRESSED;\r
+ } else {\r
+ Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_LOGO_PRESSED;\r
+ }\r
+ break;\r
+ case XK_Meta_L:\r
+ if (Make) {\r
+ Drv->KeyState.KeyShiftState |= EFI_LEFT_LOGO_PRESSED;\r
+ } else {\r
+ Drv->KeyState.KeyShiftState &= ~EFI_LEFT_LOGO_PRESSED;\r
+ }\r
+ break;\r
+\r
+ case XK_KP_Home:\r
+ case XK_Home: KeyData.Key.ScanCode = SCAN_HOME; break;\r
+\r
+ case XK_KP_End:\r
+ case XK_End: KeyData.Key.ScanCode = SCAN_END; break;\r
+\r
+ case XK_KP_Left:\r
+ case XK_Left: KeyData.Key.ScanCode = SCAN_LEFT; break;\r
+\r
+ case XK_KP_Right:\r
+ case XK_Right: KeyData.Key.ScanCode = SCAN_RIGHT; break;\r
+\r
+ case XK_KP_Up:\r
+ case XK_Up: KeyData.Key.ScanCode = SCAN_UP; break;\r
+\r
+ case XK_KP_Down:\r
+ case XK_Down: KeyData.Key.ScanCode = SCAN_DOWN; break;\r
+\r
+ case XK_KP_Delete:\r
+ case XK_Delete: KeyData.Key.ScanCode = SCAN_DELETE; break;\r
+\r
+ case XK_KP_Insert:\r
+ case XK_Insert: KeyData.Key.ScanCode = SCAN_INSERT; break;\r
+\r
+ case XK_KP_Page_Up:\r
+ case XK_Page_Up: KeyData.Key.ScanCode = SCAN_PAGE_UP; break;\r
+\r
+ case XK_KP_Page_Down:\r
+ case XK_Page_Down: KeyData.Key.ScanCode = SCAN_PAGE_DOWN; break;\r
+\r
+ case XK_Escape: KeyData.Key.ScanCode = SCAN_ESC; break;\r
+\r
+ case XK_Pause: KeyData.Key.ScanCode = SCAN_PAUSE; break;\r
+\r
+ case XK_KP_F1:\r
+ case XK_F1: KeyData.Key.ScanCode = SCAN_F1; break;\r
+\r
+ case XK_KP_F2:\r
+ case XK_F2: KeyData.Key.ScanCode = SCAN_F2; break;\r
+\r
+ case XK_KP_F3:\r
+ case XK_F3: KeyData.Key.ScanCode = SCAN_F3; break;\r
+\r
+ case XK_KP_F4:\r
+ case XK_F4: KeyData.Key.ScanCode = SCAN_F4; break;\r
+\r
+ case XK_F5: KeyData.Key.ScanCode = SCAN_F5; break;\r
+ case XK_F6: KeyData.Key.ScanCode = SCAN_F6; break;\r
+ case XK_F7: KeyData.Key.ScanCode = SCAN_F7; break;\r
+\r
+ // Don't map into X11 by default on a Mac\r
+ // System Preferences->Keyboard->Keyboard Shortcuts can be configured\r
+ // to not use higher function keys as shortcuts and the will show up\r
+ // in X11.\r
+ case XK_F8: KeyData.Key.ScanCode = SCAN_F8; break;\r
+ case XK_F9: KeyData.Key.ScanCode = SCAN_F9; break;\r
+ case XK_F10: KeyData.Key.ScanCode = SCAN_F10; break;\r
+\r
+ case XK_F11: KeyData.Key.ScanCode = SCAN_F11; break;\r
+ case XK_F12: KeyData.Key.ScanCode = SCAN_F12; break;\r
+\r
+ case XK_F13: KeyData.Key.ScanCode = SCAN_F13; break;\r
+ case XK_F14: KeyData.Key.ScanCode = SCAN_F14; break;\r
+ case XK_F15: KeyData.Key.ScanCode = SCAN_F15; break;\r
+ case XK_F16: KeyData.Key.ScanCode = SCAN_F16; break;\r
+ case XK_F17: KeyData.Key.ScanCode = SCAN_F17; break;\r
+ case XK_F18: KeyData.Key.ScanCode = SCAN_F18; break;\r
+ case XK_F19: KeyData.Key.ScanCode = SCAN_F19; break;\r
+ case XK_F20: KeyData.Key.ScanCode = SCAN_F20; break;\r
+ case XK_F21: KeyData.Key.ScanCode = SCAN_F21; break;\r
+ case XK_F22: KeyData.Key.ScanCode = SCAN_F22; break;\r
+ case XK_F23: KeyData.Key.ScanCode = SCAN_F23; break;\r
+ case XK_F24: KeyData.Key.ScanCode = SCAN_F24; break;\r
+\r
+ // No mapping in X11\r
+ //case XK_: KeyData.Key.ScanCode = SCAN_MUTE; break;\r
+ //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_UP; break;\r
+ //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_DOWN; break;\r
+ //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_UP; break;\r
+ //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_DOWN; break;\r
+ //case XK_: KeyData.Key.ScanCode = SCAN_SUSPEND; break;\r
+ //case XK_: KeyData.Key.ScanCode = SCAN_HIBERNATE; break;\r
+ //case XK_: KeyData.Key.ScanCode = SCAN_TOGGLE_DISPLAY; break;\r
+ //case XK_: KeyData.Key.ScanCode = SCAN_RECOVERY; break;\r
+ //case XK_: KeyData.Key.ScanCode = SCAN_EJECT; break;\r
+\r
+ case XK_BackSpace: KeyData.Key.UnicodeChar = 0x0008; break;\r
+\r
+ case XK_KP_Tab:\r
+ case XK_Tab: KeyData.Key.UnicodeChar = 0x0009; break;\r
+\r
+ case XK_Linefeed: KeyData.Key.UnicodeChar = 0x000a; break;\r
+\r
+ case XK_KP_Enter:\r
+ case XK_Return: KeyData.Key.UnicodeChar = 0x000d; break;\r
+\r
+ case XK_KP_Equal : KeyData.Key.UnicodeChar = L'='; break;\r
+ case XK_KP_Multiply : KeyData.Key.UnicodeChar = L'*'; break;\r
+ case XK_KP_Add : KeyData.Key.UnicodeChar = L'+'; break;\r
+ case XK_KP_Separator : KeyData.Key.UnicodeChar = L'~'; break;\r
+ case XK_KP_Subtract : KeyData.Key.UnicodeChar = L'-'; break;\r
+ case XK_KP_Decimal : KeyData.Key.UnicodeChar = L'.'; break;\r
+ case XK_KP_Divide : KeyData.Key.UnicodeChar = L'/'; break;\r
+\r
+ case XK_KP_0 : KeyData.Key.UnicodeChar = L'0'; break;\r
+ case XK_KP_1 : KeyData.Key.UnicodeChar = L'1'; break;\r
+ case XK_KP_2 : KeyData.Key.UnicodeChar = L'2'; break;\r
+ case XK_KP_3 : KeyData.Key.UnicodeChar = L'3'; break;\r
+ case XK_KP_4 : KeyData.Key.UnicodeChar = L'4'; break;\r
+ case XK_KP_5 : KeyData.Key.UnicodeChar = L'5'; break;\r
+ case XK_KP_6 : KeyData.Key.UnicodeChar = L'6'; break;\r
+ case XK_KP_7 : KeyData.Key.UnicodeChar = L'7'; break;\r
+ case XK_KP_8 : KeyData.Key.UnicodeChar = L'8'; break;\r
+ case XK_KP_9 : KeyData.Key.UnicodeChar = L'9'; break;\r
+\r
+ default:\r
+ ;\r
+ }\r
+\r
+ // The global state is our state\r
+ KeyData.KeyState.KeyShiftState = Drv->KeyState.KeyShiftState;\r
+ KeyData.KeyState.KeyToggleState = Drv->KeyState.KeyToggleState;\r
+\r
+ if (*KeySym < XK_BackSpace) {\r
+ if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED)) != 0) ||\r
+ ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) != 0) ) {\r
+\r
+ KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_UPPER];\r
+\r
+ // Per UEFI spec since we converted the Unicode clear the shift bits we pass up\r
+ KeyData.KeyState.KeyShiftState &= ~(EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED);\r
+ } else {\r
+ KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_LOWER];\r
+ }\r
+ } else {\r
+ // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? keys we process in this file\r
+ ;\r
+ }\r
+\r
+ if (Make) {\r
+ memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));\r
+ Drv->key_wr = (Drv->key_wr + 1) % NBR_KEYS;\r
+ Drv->key_count++;\r
+ if (Drv->MakeRegisterdKeyCallback != NULL) {\r
+ ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv->RegisterdKeyCallbackContext, &KeyData);\r
+ }\r
+ } else {\r
+ if (Drv->BreakRegisterdKeyCallback != NULL) {\r
+ ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv->RegisterdKeyCallbackContext, &KeyData);\r
+ }\r
+ }\r
+}\r
+\r
+\r
+void\r
+handleMouseMoved(\r
+ IN GRAPHICS_IO_PRIVATE *Drv,\r
+ IN XEvent *ev\r
+ )\r
+{\r
+ if (ev->xmotion.x != Drv->previous_x) {\r
+ Drv->pointer_state.RelativeMovementX += ( ev->xmotion.x - Drv->previous_x );\r
+ Drv->previous_x = ev->xmotion.x;\r
+ Drv->pointer_state_changed = 1;\r
+ }\r
+\r
+ if (ev->xmotion.y != Drv->previous_y) {\r
+ Drv->pointer_state.RelativeMovementY += ( ev->xmotion.y - Drv->previous_y );\r
+ Drv->previous_y = ev->xmotion.y;\r
+ Drv->pointer_state_changed = 1;\r
+ }\r
+\r
+ Drv->pointer_state.RelativeMovementZ = 0;\r
+}\r
+\r
+void\r
+handleMouseDown (\r
+ IN GRAPHICS_IO_PRIVATE *Drv,\r
+ IN XEvent *ev,\r
+ IN BOOLEAN Pressed\r
+ )\r
+{\r
+ if (ev->xbutton.button == Button1) {\r
+ Drv->pointer_state_changed = (Drv->pointer_state.LeftButton != Pressed);\r
+ Drv->pointer_state.LeftButton = Pressed;\r
+ }\r
+ if ( ev->xbutton.button == Button2 ) {\r
+ Drv->pointer_state_changed = (Drv->pointer_state.RightButton != Pressed);\r
+ Drv->pointer_state.RightButton = Pressed;\r
+ }\r
+}\r
+\r
+void\r
+Redraw (\r
+ IN GRAPHICS_IO_PRIVATE *Drv,\r
+ IN UINTN X,\r
+ IN UINTN Y,\r
+ IN UINTN Width,\r
+ IN UINTN Height\r
+ )\r
+{\r
+ if (Drv->use_shm) {\r
+ XShmPutImage (\r
+ Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height, False\r
+ );\r
+ } else {\r
+ XPutImage (\r
+ Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height\r
+ );\r
+ }\r
+ XFlush(Drv->display);\r
+}\r
+\r
+void\r
+HandleEvent(GRAPHICS_IO_PRIVATE *Drv, XEvent *ev)\r
+{\r
+ switch (ev->type) {\r
+ case Expose:\r
+ Redraw (Drv, ev->xexpose.x, ev->xexpose.y,\r
+ ev->xexpose.width, ev->xexpose.height);\r
+ break;\r
+ case GraphicsExpose:\r
+ Redraw (Drv, ev->xgraphicsexpose.x, ev->xgraphicsexpose.y,\r
+ ev->xgraphicsexpose.width, ev->xgraphicsexpose.height);\r
+ break;\r
+ case KeyPress:\r
+ handleKeyEvent (Drv, ev, TRUE);\r
+ break;\r
+ case KeyRelease:\r
+ handleKeyEvent (Drv, ev, FALSE);\r
+ break;\r
+ case MappingNotify:\r
+ XRefreshKeyboardMapping (&ev->xmapping);\r
+ break;\r
+ case MotionNotify:\r
+ handleMouseMoved (Drv, ev);\r
+ break;\r
+ case ButtonPress:\r
+ handleMouseDown (Drv, ev, TRUE);\r
+ break;\r
+ case ButtonRelease:\r
+ handleMouseDown (Drv, ev, FALSE);\r
+ break;\r
+#if 0\r
+ case DestroyNotify:\r
+ XCloseDisplay (Drv->display);\r
+ exit (1);\r
+ break;\r
+#endif\r
+ case NoExpose:\r
+ default:\r
+ break;\r
+ }\r
+}\r
+\r
+void\r
+HandleEvents (\r
+ IN GRAPHICS_IO_PRIVATE *Drv\r
+ )\r
+{\r
+ XEvent ev;\r
+\r
+ while (XPending (Drv->display) != 0) {\r
+ XNextEvent (Drv->display, &ev);\r
+ HandleEvent (Drv, &ev);\r
+ }\r
+}\r
+\r
+unsigned long\r
+X11PixelToColor (\r
+ IN GRAPHICS_IO_PRIVATE *Drv,\r
+ IN EFI_UGA_PIXEL pixel\r
+ )\r
+{\r
+ return ((pixel.Red >> Drv->r.csize) << Drv->r.shift)\r
+ | ((pixel.Green >> Drv->g.csize) << Drv->g.shift)\r
+ | ((pixel.Blue >> Drv->b.csize) << Drv->b.shift);\r
+}\r
+\r
+EFI_UGA_PIXEL\r
+X11ColorToPixel (\r
+ IN GRAPHICS_IO_PRIVATE *Drv,\r
+ IN unsigned long val\r
+ )\r
+{\r
+ EFI_UGA_PIXEL Pixel;\r
+\r
+ memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL));\r
+\r
+ // Truncation not an issue since X11 and EFI are both using 8 bits per color\r
+ Pixel.Red = (val >> Drv->r.shift) << Drv->r.csize;\r
+ Pixel.Green = (val >> Drv->g.shift) << Drv->g.csize;\r
+ Pixel.Blue = (val >> Drv->b.shift) << Drv->b.csize;\r
+\r
+ return Pixel;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11CheckKey (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo\r
+ )\r
+{\r
+ GRAPHICS_IO_PRIVATE *Drv;\r
+\r
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+ HandleEvents (Drv);\r
+\r
+ if (Drv->key_count != 0) {\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ return EFI_NOT_READY;\r
+}\r
+\r
+EFI_STATUS\r
+X11GetKey (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,\r
+ IN EFI_KEY_DATA *KeyData\r
+ )\r
+{\r
+ EFI_STATUS EfiStatus;\r
+ GRAPHICS_IO_PRIVATE *Drv;\r
+\r
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+ EfiStatus = X11CheckKey (GraphicsIo);\r
+ if (EFI_ERROR (EfiStatus)) {\r
+ return EfiStatus;\r
+ }\r
+\r
+ CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA));\r
+ Drv->key_rd = (Drv->key_rd + 1) % NBR_KEYS;\r
+ Drv->key_count--;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11KeySetState (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,\r
+ IN EFI_KEY_TOGGLE_STATE *KeyToggleState\r
+ )\r
+{\r
+ GRAPHICS_IO_PRIVATE *Drv;\r
+\r
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+ if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) {\r
+ if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) {\r
+ //\r
+ // We could create an XKeyEvent and send a XK_Caps_Lock to\r
+ // the UGA/GOP Window\r
+ //\r
+ }\r
+ }\r
+\r
+ Drv->KeyState.KeyToggleState = *KeyToggleState;\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11RegisterKeyNotify (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,\r
+ IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,\r
+ IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ GRAPHICS_IO_PRIVATE *Drv;\r
+\r
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+ Drv->MakeRegisterdKeyCallback = MakeCallBack;\r
+ Drv->BreakRegisterdKeyCallback = BreakCallBack;\r
+ Drv->RegisterdKeyCallbackContext = Context;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11Blt (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,\r
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,\r
+ IN EFI_UGA_BLT_OPERATION BltOperation,\r
+ IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args\r
+ )\r
+{\r
+ GRAPHICS_IO_PRIVATE *Private;\r
+ UINTN DstY;\r
+ UINTN SrcY;\r
+ UINTN DstX;\r
+ UINTN SrcX;\r
+ UINTN Index;\r
+ EFI_UGA_PIXEL *Blt;\r
+ UINT8 *Dst;\r
+ UINT8 *Src;\r
+ UINTN Nbr;\r
+ unsigned long Color;\r
+ XEvent ev;\r
+\r
+ Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+\r
+ //\r
+ // Check bounds\r
+ //\r
+ if (BltOperation == EfiUgaVideoToBltBuffer\r
+ || BltOperation == EfiUgaVideoToVideo) {\r
+ //\r
+ // Source is Video.\r
+ //\r
+ if (Args->SourceY + Args->Height > Private->height) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (Args->SourceX + Args->Width > Private->width) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ }\r
+\r
+ if (BltOperation == EfiUgaBltBufferToVideo\r
+ || BltOperation == EfiUgaVideoToVideo\r
+ || BltOperation == EfiUgaVideoFill) {\r
+ //\r
+ // Destination is Video\r
+ //\r
+ if (Args->DestinationY + Args->Height > Private->height) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (Args->DestinationX + Args->Width > Private->width) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ }\r
+\r
+ switch (BltOperation) {\r
+ case EfiUgaVideoToBltBuffer:\r
+ Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args->Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL));\r
+ Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);\r
+ for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) {\r
+ for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) {\r
+ *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX, SrcY));\r
+ }\r
+ Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);\r
+ }\r
+ break;\r
+ case EfiUgaBltBufferToVideo:\r
+ Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta) + Args->SourceX * sizeof (EFI_UGA_PIXEL));\r
+ Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);\r
+ for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) {\r
+ for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) {\r
+ XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *Blt));\r
+ Blt++;\r
+ }\r
+ Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);\r
+ }\r
+ break;\r
+ case EfiUgaVideoToVideo:\r
+ Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift)\r
+ + Args->DestinationY * Private->line_bytes;\r
+ Src = Private->image_data + (Args->SourceX << Private->pixel_shift)\r
+ + Args->SourceY * Private->line_bytes;\r
+ Nbr = Args->Width << Private->pixel_shift;\r
+ if (Args->DestinationY < Args->SourceY) {\r
+ for (Index = 0; Index < Args->Height; Index++) {\r
+ memcpy (Dst, Src, Nbr);\r
+ Dst += Private->line_bytes;\r
+ Src += Private->line_bytes;\r
+ }\r
+ } else {\r
+ Dst += (Args->Height - 1) * Private->line_bytes;\r
+ Src += (Args->Height - 1) * Private->line_bytes;\r
+ for (Index = 0; Index < Args->Height; Index++) {\r
+ //\r
+ // Source and Destination Y may be equal, therefore Dst and Src may\r
+ // overlap.\r
+ //\r
+ memmove (Dst, Src, Nbr);\r
+ Dst -= Private->line_bytes;\r
+ Src -= Private->line_bytes;\r
+ }\r
+ }\r
+ break;\r
+ case EfiUgaVideoFill:\r
+ Color = X11PixelToColor(Private, *BltBuffer);\r
+ for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) {\r
+ for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) {\r
+ XPutPixel(Private->image, DstX, DstY, Color);\r
+ }\r
+ }\r
+ break;\r
+ default:\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ //\r
+ // Refresh screen.\r
+ //\r
+ switch (BltOperation) {\r
+ case EfiUgaVideoToVideo:\r
+ XCopyArea(\r
+ Private->display, Private->win, Private->win, Private->gc,\r
+ Args->SourceX, Args->SourceY, Args->Width, Args->Height,\r
+ Args->DestinationX, Args->DestinationY\r
+ );\r
+\r
+ while (1) {\r
+ XNextEvent (Private->display, &ev);\r
+ HandleEvent (Private, &ev);\r
+ if (ev.type == NoExpose || ev.type == GraphicsExpose) {\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+ case EfiUgaVideoFill:\r
+ Color = X11PixelToColor (Private, *BltBuffer);\r
+ XSetForeground (Private->display, Private->gc, Color);\r
+ XFillRectangle (\r
+ Private->display, Private->win, Private->gc,\r
+ Args->DestinationX, Args->DestinationY, Args->Width, Args->Height\r
+ );\r
+ XFlush (Private->display);\r
+ break;\r
+ case EfiUgaBltBufferToVideo:\r
+ Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width, Args->Height);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11CheckPointer (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo\r
+ )\r
+{\r
+ GRAPHICS_IO_PRIVATE *Drv;\r
+\r
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+ HandleEvents (Drv);\r
+ if (Drv->pointer_state_changed != 0) {\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ return EFI_NOT_READY;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11GetPointerState (\r
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,\r
+ IN EFI_SIMPLE_POINTER_STATE *State\r
+ )\r
+{\r
+ EFI_STATUS EfiStatus;\r
+ GRAPHICS_IO_PRIVATE *Drv;\r
+\r
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+ EfiStatus = X11CheckPointer (GraphicsIo);\r
+ if (EfiStatus != EFI_SUCCESS) {\r
+ return EfiStatus;\r
+ }\r
+\r
+ memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE));\r
+\r
+ Drv->pointer_state.RelativeMovementX = 0;\r
+ Drv->pointer_state.RelativeMovementY = 0;\r
+ Drv->pointer_state.RelativeMovementZ = 0;\r
+ Drv->pointer_state_changed = 0;\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+EFI_STATUS\r
+X11GraphicsWindowOpen (\r
+ IN EMU_IO_THUNK_PROTOCOL *This\r
+ )\r
+{\r
+ GRAPHICS_IO_PRIVATE *Drv;\r
+ unsigned int border_width = 0;\r
+ char *display_name = NULL;\r
+\r
+ Drv = (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE));\r
+ if (Drv == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ Drv->GraphicsIo.Size = GasketX11Size;\r
+ Drv->GraphicsIo.CheckKey = GasketX11CheckKey;\r
+ Drv->GraphicsIo.GetKey = GasketX11GetKey;\r
+ Drv->GraphicsIo.KeySetState = GasketX11KeySetState;\r
+ Drv->GraphicsIo.RegisterKeyNotify = GasketX11RegisterKeyNotify;\r
+ Drv->GraphicsIo.Blt = GasketX11Blt;\r
+ Drv->GraphicsIo.CheckPointer = GasketX11CheckPointer;\r
+ Drv->GraphicsIo.GetPointerState = GasketX11GetPointerState;\r
+\r
+\r
+ Drv->key_count = 0;\r
+ Drv->key_rd = 0;\r
+ Drv->key_wr = 0;\r
+ Drv->KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;\r
+ Drv->KeyState.KeyToggleState = EFI_TOGGLE_STATE_VALID;\r
+ Drv->MakeRegisterdKeyCallback = NULL;\r
+ Drv->BreakRegisterdKeyCallback = NULL;\r
+ Drv->RegisterdKeyCallbackContext = NULL;\r
+\r
+\r
+ Drv->display = XOpenDisplay (display_name);\r
+ if (Drv->display == NULL) {\r
+ fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName (display_name));\r
+ free (Drv);\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+ Drv->screen = DefaultScreen (Drv->display);\r
+ Drv->visual = DefaultVisual (Drv->display, Drv->screen);\r
+ Drv->win = XCreateSimpleWindow (\r
+ Drv->display, RootWindow (Drv->display, Drv->screen),\r
+ 0, 0, 4, 4, border_width,\r
+ WhitePixel (Drv->display, Drv->screen),\r
+ BlackPixel (Drv->display, Drv->screen)\r
+ );\r
+\r
+ Drv->depth = DefaultDepth (Drv->display, Drv->screen);\r
+ XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display, XC_pirate));\r
+\r
+ Drv->Title = malloc (StrSize (This->ConfigString));\r
+ UnicodeStrToAsciiStr (This->ConfigString, Drv->Title);\r
+ XStoreName (Drv->display, Drv->win, Drv->Title);\r
+\r
+// XAutoRepeatOff (Drv->display);\r
+ XSelectInput (\r
+ Drv->display, Drv->win,\r
+ ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask\r
+ );\r
+ Drv->gc = DefaultGC (Drv->display, Drv->screen);\r
+\r
+ This->Private = (VOID *)Drv;\r
+ This->Interface = (VOID *)Drv;\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11GraphicsWindowClose (\r
+ IN EMU_IO_THUNK_PROTOCOL *This\r
+ )\r
+{\r
+ GRAPHICS_IO_PRIVATE *Drv;\r
+\r
+ Drv = (GRAPHICS_IO_PRIVATE *)This->Private;\r
+\r
+ if (Drv == NULL) {\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ if (Drv->image != NULL) {\r
+ XDestroyImage(Drv->image);\r
+\r
+ if (Drv->use_shm) {\r
+ shmdt (Drv->image_data);\r
+ }\r
+\r
+ Drv->image_data = NULL;\r
+ Drv->image = NULL;\r
+ }\r
+ XDestroyWindow (Drv->display, Drv->win);\r
+ XCloseDisplay (Drv->display);\r
+\r
+#ifdef __APPLE__\r
+ // Free up the shared memory\r
+ shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);\r
+#endif\r
+\r
+ free (Drv);\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {\r
+ &gEmuGraphicsWindowProtocolGuid,\r
+ NULL,\r
+ NULL,\r
+ 0,\r
+ GasketX11GraphicsWindowOpen,\r
+ GasketX11GraphicsWindowClose,\r
+ NULL\r
+};\r
+\r
+\r
-#------------------------------------------------------------------------------
-#
-# 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
-
-
+#------------------------------------------------------------------------------\r
+#\r
+# Manage differenced between UNIX ABI and EFI/Windows ABI\r
+#\r
+# EFI Arg passing: RCX, RDX, R8, R9\r
+# Callee allocates 32 bytes on stack to spill registers\r
+# UNIX Arg passing: RDI, RSI, RDX, RCX, R8, R9\r
+# RSI, RDI calle-save on EFI, scatch on UNIX callign\r
+#\r
+# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+//\r
+// Gaskets are EFI ABI to UNIX ABI calls\r
+// EFI ABI code will sub 40 (0x28) from %rsp before calling a function\r
+// This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16 byte boundry.\r
+//\r
+ .text\r
+\r
+// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry\r
+// Any call with 0 - 4 arguments allocates 40 bytes on the stack.\r
+// For more than 4 args you always have to increase in quanta of 16 so 5 or 6 args is 56,\r
+// 7 or 8 args is 72, and 9 or 10 args is 88\r
+\r
+\r
+\r
+ .text\r
+\r
+//\r
+// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)\r
+//\r
+\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)\r
+ASM_PFX(GasketSecWriteStdErr):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(SecWriteStdErr)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)\r
+ASM_PFX(GasketSecConfigStdIn):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ call ASM_PFX(SecConfigStdIn)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)\r
+ASM_PFX(GasketSecWriteStdOut):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(SecWriteStdOut)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)\r
+ASM_PFX(GasketSecReadStdIn):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(SecReadStdIn)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)\r
+ASM_PFX(GasketSecPollStdIn):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ call ASM_PFX(SecPollStdIn)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecMalloc)\r
+ASM_PFX(GasketSecMalloc):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(SecMalloc)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecValloc)\r
+ASM_PFX(GasketSecValloc):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(SecValloc)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecFree)\r
+ASM_PFX(GasketSecFree):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(SecFree)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecSetTimer)\r
+ASM_PFX(GasketSecSetTimer):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(SecSetTimer)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)\r
+ASM_PFX(GasketSecEnableInterrupt):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ call ASM_PFX(SecEnableInterrupt)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)\r
+ASM_PFX(GasketSecDisableInterrupt):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ call ASM_PFX(SecDisableInterrupt)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)\r
+ASM_PFX(GasketQueryPerformanceFrequency):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ call ASM_PFX(QueryPerformanceFrequency)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)\r
+ASM_PFX(GasketQueryPerformanceCounter):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ call ASM_PFX(QueryPerformanceCounter)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecSleep)\r
+ASM_PFX(GasketSecSleep):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(SecSleep)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)\r
+ASM_PFX(GasketSecCpuSleep):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ call ASM_PFX(SecCpuSleep)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecExit)\r
+ASM_PFX(GasketSecExit):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI world\r
+LDEAD_LOOP:\r
+ jmp LDEAD_LOOP // _exit should never return\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecGetTime)\r
+ASM_PFX(GasketSecGetTime):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(SecGetTime)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecSetTime)\r
+ASM_PFX(GasketSecSetTime):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(SecSetTime)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)\r
+ASM_PFX(GasketSecGetNextProtocol):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+\r
+ call ASM_PFX(SecGetNextProtocol)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+// PPIs produced by SEC\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)\r
+ASM_PFX(GasketSecPeCoffGetEntryPoint):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(SecPeCoffGetEntryPoint)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)\r
+ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(SecPeCoffRelocateImageExtraAction)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)\r
+ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(SecPeCoffUnloadImageExtraAction)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)\r
+ASM_PFX(GasketSecEmuThunkAddress):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ call ASM_PFX(SecEmuThunkAddress)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+//\r
+// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL\r
+//\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11Size)\r
+ASM_PFX(GasketX11Size):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+\r
+ call ASM_PFX(X11Size)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11CheckKey)\r
+ASM_PFX(GasketX11CheckKey):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(X11CheckKey)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GetKey)\r
+ASM_PFX(GasketX11GetKey):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(X11GetKey)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11KeySetState)\r
+ASM_PFX(GasketX11KeySetState):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(X11KeySetState)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)\r
+ASM_PFX(GasketX11RegisterKeyNotify):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+\r
+ call ASM_PFX(X11RegisterKeyNotify)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11Blt)\r
+ASM_PFX(GasketX11Blt):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+\r
+ call ASM_PFX(X11Blt)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)\r
+ASM_PFX(GasketX11CheckPointer):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(X11CheckPointer)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)\r
+ASM_PFX(GasketX11GetPointerState):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(X11GetPointerState)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)\r
+ASM_PFX(GasketX11GraphicsWindowOpen):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(X11GraphicsWindowOpen)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)\r
+ASM_PFX(GasketX11GraphicsWindowClose):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %r9, %rcx\r
+\r
+ call ASM_PFX(X11GraphicsWindowClose)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+// Pthreads\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)\r
+ASM_PFX(GasketPthreadMutexLock):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(PthreadMutexLock)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)\r
+ASM_PFX(GasketPthreadMutexUnLock):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(PthreadMutexUnLock)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)\r
+ASM_PFX(GasketPthreadMutexTryLock):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(PthreadMutexTryLock)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)\r
+ASM_PFX(GasketPthreadMutexInit):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+\r
+ call ASM_PFX(PthreadMutexInit)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)\r
+ASM_PFX(GasketPthreadMutexDestroy):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(PthreadMutexDestroy)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadCreate)\r
+ASM_PFX(GasketPthreadCreate):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+\r
+ call ASM_PFX(PthreadCreate)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadExit)\r
+ASM_PFX(GasketPthreadExit):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(PthreadExit)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadSelf)\r
+ASM_PFX(GasketPthreadSelf):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+\r
+ call ASM_PFX(PthreadSelf)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadOpen)\r
+ASM_PFX(GasketPthreadOpen):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(PthreadOpen)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadClose)\r
+ASM_PFX(GasketPthreadClose):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(PthreadClose)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+\r
+\r
+//\r
+// UNIX ABI to EFI ABI call\r
+//\r
+// UINTN\r
+// ReverseGasketUint64 (\r
+// void *Api,\r
+// UINTN Arg1\r
+// );\r
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64)\r
+ASM_PFX(ReverseGasketUint64):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ movq %rdi, %rax // Swizzle args\r
+ movq %rsi, %rcx\r
+\r
+ subq $32, %rsp // 32-byte shadow space\r
+ call *%rax\r
+ addq $32, %rsp\r
+\r
+ popq %rbp\r
+ ret\r
+\r
+//\r
+// UNIX ABI to EFI ABI call\r
+//\r
+// UINTN\r
+// ReverseGasketUint64Uint64 (\r
+// void *Api,\r
+// UINTN Arg1\r
+// UINTN Arg2\r
+// );\r
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)\r
+ASM_PFX(ReverseGasketUint64Uint64):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ movq %rdi, %rax // Swizzle args\r
+ movq %rsi, %rcx\r
+\r
+ subq $32, %rsp // 32-byte shadow space\r
+ call *%rax\r
+ addq $32, %rsp\r
+\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)\r
+ASM_PFX(GasketSecUnixPeiAutoScan):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+\r
+ call ASM_PFX(SecUnixPeiAutoScan)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)\r
+ASM_PFX(GasketSecUnixFdAddress):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+\r
+ call ASM_PFX(SecUnixFdAddress)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+// EmuIoThunk SimpleFileSystem\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)\r
+ASM_PFX(GasketPosixOpenVolume):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+\r
+ call ASM_PFX(PosixOpenVolume)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)\r
+ASM_PFX(GasketPosixFileOpen):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+ movq 48(%rbp), %r8\r
+\r
+ call ASM_PFX(PosixFileOpen)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)\r
+ASM_PFX(GasketPosixFileCLose):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(PosixFileCLose)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)\r
+ASM_PFX(GasketPosixFileDelete):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(PosixFileDelete)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileRead)\r
+ASM_PFX(GasketPosixFileRead):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+\r
+ call ASM_PFX(PosixFileRead)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)\r
+ASM_PFX(GasketPosixFileWrite):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+\r
+ call ASM_PFX(PosixFileWrite)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)\r
+ASM_PFX(GasketPosixFileSetPossition):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(PosixFileSetPossition)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)\r
+ASM_PFX(GasketPosixFileGetPossition):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(PosixFileGetPossition)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)\r
+ASM_PFX(GasketPosixFileGetInfo):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+\r
+ call ASM_PFX(PosixFileGetInfo)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)\r
+ASM_PFX(GasketPosixFileSetInfo):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+\r
+ call ASM_PFX(PosixFileSetInfo)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)\r
+ASM_PFX(GasketPosixFileFlush):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(PosixFileFlush)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)\r
+ASM_PFX(GasketPosixFileSystmeThunkOpen):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(PosixFileSystmeThunkOpen)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)\r
+ASM_PFX(GasketPosixFileSystmeThunkClose):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(PosixFileSystmeThunkClose)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)\r
+ASM_PFX(GasketEmuBlockIoReset):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(EmuBlockIoReset)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)\r
+ASM_PFX(GasketEmuBlockIoReadBlocks):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+ movq 48(%rbp), %r8\r
+ movq 56(%rbp), %r9\r
+\r
+ call ASM_PFX(EmuBlockIoReadBlocks)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)\r
+ASM_PFX(GasketEmuBlockIoWriteBlocks):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+ movq 48(%rbp), %r8\r
+ movq 56(%rbp), %r9\r
+\r
+ call ASM_PFX(EmuBlockIoWriteBlocks)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)\r
+ASM_PFX(GasketEmuBlockIoFlushBlocks):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(EmuBlockIoFlushBlocks)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)\r
+ASM_PFX(GasketEmuBlockIoCreateMapping):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(EmuBlockIoCreateMapping)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)\r
+ASM_PFX(GasketBlockIoThunkOpen):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(EmuBlockIoThunkOpen)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)\r
+ASM_PFX(GasketBlockIoThunkClose):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(EmuBlockIoThunkClose)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)\r
+ASM_PFX(GasketSnpCreateMapping):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(EmuSnpCreateMapping)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStart)\r
+ASM_PFX(GasketSnpStart):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(EmuSnpStart)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStop)\r
+ASM_PFX(GasketSnpStop):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(EmuSnpStop)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpInitialize)\r
+ASM_PFX(GasketSnpInitialize):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+\r
+ call ASM_PFX(EmuSnpInitialize)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpReset)\r
+ASM_PFX(GasketSnpReset):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+\r
+ call ASM_PFX(EmuSnpReset)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpShutdown)\r
+ASM_PFX(GasketSnpShutdown):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(EmuSnpShutdown)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)\r
+ASM_PFX(GasketSnpReceiveFilters):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+ movq 48(%rbp), %r8\r
+ movq 56(%rbp), %r9\r
+\r
+ call ASM_PFX(EmuSnpReceiveFilters)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)\r
+ASM_PFX(GasketSnpStationAddress):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+\r
+ call ASM_PFX(EmuSnpStationAddress)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStatistics)\r
+ASM_PFX(GasketSnpStatistics):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+\r
+ call ASM_PFX(EmuSnpStatistics)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)\r
+ASM_PFX(GasketSnpMCastIpToMac):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+\r
+ call ASM_PFX(EmuSnpMCastIpToMac)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpNvData)\r
+ASM_PFX(GasketSnpNvData):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+ movq 48(%rbp), %r8\r
+\r
+ call ASM_PFX(EmuSnpNvData)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)\r
+ASM_PFX(GasketSnpGetStatus):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+\r
+ call ASM_PFX(EmuSnpGetStatus)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpTransmit)\r
+ASM_PFX(GasketSnpTransmit):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+ subq $16, %rsp // Allocate space for args on the stack\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+ movq 48(%rbp), %r8\r
+ movq 56(%rbp), %r9\r
+ movq 64(%rbp), %rax\r
+ movq %rax, (%rsp)\r
+\r
+ call ASM_PFX(EmuSnpTransmit)\r
+ addq $16, %rsp\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpReceive)\r
+ASM_PFX(GasketSnpReceive):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+ subq $16, %rsp // Allocate space for args on the stack\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+ movq %rdx, %rsi\r
+ movq %r8, %rdx\r
+ movq %r9, %rcx\r
+ movq 48(%rbp), %r8\r
+ movq 56(%rbp), %r9\r
+ movq 64(%rbp), %rax\r
+ movq %rax, (%rsp)\r
+\r
+ call ASM_PFX(EmuSnpReceive)\r
+ addq $16, %rsp\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)\r
+ASM_PFX(GasketSnpThunkOpen):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(EmuSnpThunkOpen)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)\r
+ASM_PFX(GasketSnpThunkClose):\r
+ pushq %rbp // stack frame is for the debugger\r
+ movq %rsp, %rbp\r
+\r
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+ pushq %rdi\r
+\r
+ movq %rcx, %rdi // Swizzle args\r
+\r
+ call ASM_PFX(EmuSnpThunkClose)\r
+\r
+ popq %rdi // restore state\r
+ popq %rsi\r
+ popq %rbp\r
+ ret\r
+\r
+\r
-#!/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\r
+\r
+#\r
+# Copyright 2014 Apple Inc. All righes reserved.\r
+#\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+import lldb\r
+import os\r
+import uuid\r
+import string\r
+import commands\r
+import optparse\r
+import shlex\r
+\r
+guid_dict = {}\r
+\r
+\r
+def EFI_GUID_TypeSummary (valobj,internal_dict):\r
+ """ Type summary for EFI GUID, print C Name if known\r
+ """\r
+ # typedef struct {\r
+ # UINT32 Data1;\r
+ # UINT16 Data2;\r
+ # UINT16 Data3;\r
+ # UINT8 Data4[8];\r
+ # } EFI_GUID;\r
+ SBError = lldb.SBError()\r
+\r
+ data1_val = valobj.GetChildMemberWithName('Data1')\r
+ data1 = data1_val.GetValueAsUnsigned(0)\r
+ data2_val = valobj.GetChildMemberWithName('Data2')\r
+ data2 = data2_val.GetValueAsUnsigned(0)\r
+ data3_val = valobj.GetChildMemberWithName('Data3')\r
+ data3 = data3_val.GetValueAsUnsigned(0)\r
+ str = "%x-%x-%x-" % (data1, data2, data3)\r
+\r
+ data4_val = valobj.GetChildMemberWithName('Data4')\r
+ for i in range (data4_val.num_children):\r
+ if i == 2:\r
+ str +='-'\r
+ str += "%02x" % data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)\r
+\r
+ return guid_dict.get (str.upper(), '')\r
+\r
+\r
+\r
+EFI_STATUS_Dict = {\r
+ (0x8000000000000000 | 1): "Load Error",\r
+ (0x8000000000000000 | 2): "Invalid Parameter",\r
+ (0x8000000000000000 | 3): "Unsupported",\r
+ (0x8000000000000000 | 4): "Bad Buffer Size",\r
+ (0x8000000000000000 | 5): "Buffer Too Small",\r
+ (0x8000000000000000 | 6): "Not Ready",\r
+ (0x8000000000000000 | 7): "Device Error",\r
+ (0x8000000000000000 | 8): "Write Protected",\r
+ (0x8000000000000000 | 9): "Out of Resources",\r
+ (0x8000000000000000 | 10): "Volume Corrupt",\r
+ (0x8000000000000000 | 11): "Volume Full",\r
+ (0x8000000000000000 | 12): "No Media",\r
+ (0x8000000000000000 | 13): "Media changed",\r
+ (0x8000000000000000 | 14): "Not Found",\r
+ (0x8000000000000000 | 15): "Access Denied",\r
+ (0x8000000000000000 | 16): "No Response",\r
+ (0x8000000000000000 | 17): "No mapping",\r
+ (0x8000000000000000 | 18): "Time out",\r
+ (0x8000000000000000 | 19): "Not started",\r
+ (0x8000000000000000 | 20): "Already started",\r
+ (0x8000000000000000 | 21): "Aborted",\r
+ (0x8000000000000000 | 22): "ICMP Error",\r
+ (0x8000000000000000 | 23): "TFTP Error",\r
+ (0x8000000000000000 | 24): "Protocol Error",\r
+\r
+ 0 : "Success",\r
+ 1 : "Warning Unknown Glyph",\r
+ 2 : "Warning Delete Failure",\r
+ 3 : "Warning Write Failure",\r
+ 4 : "Warning Buffer Too Small",\r
+\r
+ (0x80000000 | 1): "Load Error",\r
+ (0x80000000 | 2): "Invalid Parameter",\r
+ (0x80000000 | 3): "Unsupported",\r
+ (0x80000000 | 4): "Bad Buffer Size",\r
+ (0x80000000 | 5): "Buffer Too Small",\r
+ (0x80000000 | 6): "Not Ready",\r
+ (0x80000000 | 7): "Device Error",\r
+ (0x80000000 | 8): "Write Protected",\r
+ (0x80000000 | 9): "Out of Resources",\r
+ (0x80000000 | 10): "Volume Corrupt",\r
+ (0x80000000 | 11): "Volume Full",\r
+ (0x80000000 | 12): "No Media",\r
+ (0x80000000 | 13): "Media changed",\r
+ (0x80000000 | 14): "Not Found",\r
+ (0x80000000 | 15): "Access Denied",\r
+ (0x80000000 | 16): "No Response",\r
+ (0x80000000 | 17): "No mapping",\r
+ (0x80000000 | 18): "Time out",\r
+ (0x80000000 | 19): "Not started",\r
+ (0x80000000 | 20): "Already started",\r
+ (0x80000000 | 21): "Aborted",\r
+ (0x80000000 | 22): "ICMP Error",\r
+ (0x80000000 | 23): "TFTP Error",\r
+ (0x80000000 | 24): "Protocol Error",\r
+}\r
+\r
+def EFI_STATUS_TypeSummary (valobj,internal_dict):\r
+ #\r
+ # Return summary string for EFI_STATUS from dictionary\r
+ #\r
+ Status = valobj.GetValueAsUnsigned(0)\r
+ return EFI_STATUS_Dict.get (Status, '')\r
+\r
+\r
+def EFI_TPL_TypeSummary (valobj,internal_dict):\r
+ #\r
+ # Return TPL values\r
+ #\r
+\r
+ if valobj.TypeIsPointerType():\r
+ return ""\r
+\r
+ Tpl = valobj.GetValueAsUnsigned(0)\r
+ if Tpl < 4:\r
+ Str = "%d" % Tpl\r
+ elif Tpl == 6:\r
+ Str = "TPL_DRIVER (Obsolete Concept in edk2)"\r
+ elif Tpl < 8:\r
+ Str = "TPL_APPLICATION"\r
+ if Tpl - 4 > 0:\r
+ Str += " + " + "%d" % (Tpl - 4)\r
+ elif Tpl < 16:\r
+ Str = "TPL_CALLBACK"\r
+ if Tpl - 8 > 0:\r
+ Str += " + " + "%d" % (Tpl - 4)\r
+ elif Tpl < 31:\r
+ Str = "TPL_NOTIFY"\r
+ if Tpl - 16 > 0:\r
+ Str += " + " + "%d" % (Tpl - 4)\r
+ elif Tpl == 31:\r
+ Str = "TPL_HIGH_LEVEL"\r
+ else:\r
+ Str = "Invalid TPL"\r
+\r
+ return Str\r
+\r
+\r
+def CHAR16_TypeSummary (valobj,internal_dict):\r
+ #\r
+ # Display EFI CHAR16 'unsigned short' as string\r
+ #\r
+ SBError = lldb.SBError()\r
+ Str = ''\r
+ if valobj.TypeIsPointerType():\r
+ if valobj.GetValueAsUnsigned () == 0:\r
+ return "NULL"\r
+\r
+ # CHAR16 * max string size 1024\r
+ for i in range (1024):\r
+ Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)\r
+ if SBError.fail or Char == 0:\r
+ break\r
+ Str += unichr (Char)\r
+ Str = 'L"' + Str + '"'\r
+ return Str.encode ('utf-8', 'replace')\r
+\r
+ if valobj.num_children == 0:\r
+ # CHAR16\r
+ if chr (valobj.unsigned) in string.printable:\r
+ Str = "L'" + unichr (valobj.unsigned) + "'"\r
+ return Str.encode ('utf-8', 'replace')\r
+ else:\r
+ # CHAR16 []\r
+ for i in range (valobj.num_children):\r
+ Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)\r
+ if Char == 0:\r
+ break\r
+ Str += unichr (Char)\r
+ Str = 'L"' + Str + '"'\r
+ return Str.encode ('utf-8', 'replace')\r
+\r
+ return Str\r
+\r
+def CHAR8_TypeSummary (valobj,internal_dict):\r
+ #\r
+ # Display EFI CHAR8 'signed char' as string\r
+ # unichr() is used as a junk string can produce an error message like this:\r
+ # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in position 1: ordinal not in range(128)\r
+ #\r
+ SBError = lldb.SBError()\r
+ Str = ''\r
+ if valobj.TypeIsPointerType():\r
+ if valobj.GetValueAsUnsigned () == 0:\r
+ return "NULL"\r
+\r
+ # CHAR8 * max string size 1024\r
+ for i in range (1024):\r
+ Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)\r
+ if SBError.fail or Char == 0:\r
+ break\r
+ Str += unichr (Char)\r
+ Str = '"' + Str + '"'\r
+ return Str.encode ('utf-8', 'replace')\r
+\r
+ if valobj.num_children == 0:\r
+ # CHAR8\r
+ if chr (valobj.unsigned) in string.printable:\r
+ Str = '"' + unichr (valobj.unsigned) + '"'\r
+ return Str.encode ('utf-8', 'replace')\r
+ else:\r
+ # CHAR8 []\r
+ for i in range (valobj.num_children):\r
+ Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)\r
+ if Char == 0:\r
+ break\r
+ Str += unichr (Char)\r
+ Str = '"' + Str + '"'\r
+ return Str.encode ('utf-8', 'replace')\r
+\r
+ return Str\r
+\r
+device_path_dict = {\r
+ (0x01, 0x01): "PCI_DEVICE_PATH",\r
+ (0x01, 0x02): "PCCARD_DEVICE_PATH",\r
+ (0x01, 0x03): "MEMMAP_DEVICE_PATH",\r
+ (0x01, 0x04): "VENDOR_DEVICE_PATH",\r
+ (0x01, 0x05): "CONTROLLER_DEVICE_PATH",\r
+ (0x02, 0x01): "ACPI_HID_DEVICE_PATH",\r
+ (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",\r
+ (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",\r
+ (0x03, 0x01): "ATAPI_DEVICE_PATH",\r
+ (0x03, 0x12): "SATA_DEVICE_PATH",\r
+ (0x03, 0x02): "SCSI_DEVICE_PATH",\r
+ (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",\r
+ (0x03, 0x04): "F1394_DEVICE_PATH",\r
+ (0x03, 0x05): "USB_DEVICE_PATH",\r
+ (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",\r
+ (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",\r
+ (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",\r
+ (0x03, 0x06): "I2O_DEVICE_PATH",\r
+ (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",\r
+ (0x03, 0x0c): "IPv4_DEVICE_PATH",\r
+ (0x03, 0x09): "INFINIBAND_DEVICE_PATH",\r
+ (0x03, 0x0e): "UART_DEVICE_PATH",\r
+ (0x03, 0x0a): "VENDOR_DEVICE_PATH",\r
+ (0x03, 0x13): "ISCSI_DEVICE_PATH",\r
+ (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",\r
+ (0x04, 0x02): "CDROM_DEVICE_PATH",\r
+ (0x04, 0x03): "VENDOR_DEVICE_PATH",\r
+ (0x04, 0x04): "FILEPATH_DEVICE_PATH",\r
+ (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",\r
+ (0x05, 0x01): "BBS_BBS_DEVICE_PATH",\r
+ (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",\r
+ (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",\r
+}\r
+\r
+def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):\r
+ #\r
+ #\r
+ #\r
+ if valobj.TypeIsPointerType():\r
+ # EFI_DEVICE_PATH_PROTOCOL *\r
+ return ""\r
+\r
+ Str = ""\r
+ if valobj.num_children == 3:\r
+ # EFI_DEVICE_PATH_PROTOCOL\r
+ Type = valobj.GetChildMemberWithName('Type').unsigned\r
+ SubType = valobj.GetChildMemberWithName('SubType').unsigned\r
+ if (Type, SubType) in device_path_dict:\r
+ TypeStr = device_path_dict[Type, SubType]\r
+ else:\r
+ TypeStr = ""\r
+\r
+ LenLow = valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned\r
+ LenHigh = valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned\r
+ Len = LenLow + (LenHigh >> 8)\r
+\r
+ Address = long ("%d" % valobj.addr)\r
+ if (Address == lldb.LLDB_INVALID_ADDRESS):\r
+ # Need to reserach this, it seems to be the nested struct case\r
+ ExprStr = ""\r
+ elif (Type & 0x7f == 0x7f):\r
+ ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"\r
+ else:\r
+ ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address)\r
+\r
+ Str = " {\n"\r
+ Str += " (UINT8) Type = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f == 0x7f) else "")\r
+ Str += " (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)\r
+ Str += " (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)\r
+ Str += " (UINT8) [0] = 0x%02x\n" % LenLow\r
+ Str += " (UINT8) [1] = 0x%02x\n" % LenHigh\r
+ Str += " }\n"\r
+ if (Type & 0x7f == 0x7f) and (SubType == 0xff):\r
+ pass\r
+ elif ExprStr != "":\r
+ NextNode = Address + Len\r
+ Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" % NextNode\r
+\r
+ return Str\r
+\r
+\r
+\r
+def TypePrintFormating(debugger):\r
+ #\r
+ # Set the default print formating for EFI types in lldb.\r
+ # seems lldb defaults to decimal.\r
+ #\r
+ category = debugger.GetDefaultCategory()\r
+ FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"), FormatBool)\r
+\r
+ FormatHex = lldb.SBTypeFormat(lldb.eFormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)\r
+\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"), FormatHex)\r
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"), FormatHex)\r
+\r
+ #\r
+ # Smart type printing for EFI\r
+ #\r
+ debugger.HandleCommand("type summary add EFI_GUID --python-function lldbefi.EFI_GUID_TypeSummary")\r
+ debugger.HandleCommand("type summary add EFI_STATUS --python-function lldbefi.EFI_STATUS_TypeSummary")\r
+ debugger.HandleCommand("type summary add EFI_TPL --python-function lldbefi.EFI_TPL_TypeSummary")\r
+ debugger.HandleCommand("type summary add EFI_DEVICE_PATH_PROTOCOL --python-function lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")\r
+\r
+ debugger.HandleCommand("type summary add CHAR16 --python-function lldbefi.CHAR16_TypeSummary")\r
+ debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]" --python-function lldbefi.CHAR16_TypeSummary')\r
+ debugger.HandleCommand("type summary add CHAR8 --python-function lldbefi.CHAR8_TypeSummary")\r
+ debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" --python-function lldbefi.CHAR8_TypeSummary')\r
+\r
+\r
+gEmulatorBreakWorkaroundNeeded = True\r
+\r
+def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):\r
+ #\r
+ # This is an lldb breakpoint script, and assumes the breakpoint is on a\r
+ # function with the same prototype as SecGdbScriptBreak(). The\r
+ # argument names are important as lldb looks them up.\r
+ #\r
+ # VOID\r
+ # SecGdbScriptBreak (\r
+ # char *FileName,\r
+ # int FileNameLength,\r
+ # long unsigned int LoadAddress,\r
+ # int AddSymbolFlag\r
+ # )\r
+ # {\r
+ # return;\r
+ # }\r
+ #\r
+ # When the emulator loads a PE/COFF image, it calls the stub function with\r
+ # the filename of the symbol file, the length of the FileName, the\r
+ # load address and a flag to indicate if this is a load or unload operation\r
+ #\r
+ global gEmulatorBreakWorkaroundNeeded\r
+\r
+ if gEmulatorBreakWorkaroundNeeded:\r
+ # turn off lldb debug prints on SIGALRM (EFI timer tick)\r
+ frame.thread.process.target.debugger.HandleCommand("process handle SIGALRM -n false")\r
+ gEmulatorBreakWorkaroundNeeded = False\r
+\r
+ # Convert C string to Python string\r
+ Error = lldb.SBError()\r
+ FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()\r
+ FileNameLen = frame.FindVariable ("FileNameLength").GetValueAsUnsigned()\r
+ FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr, FileNameLen, Error)\r
+ if not Error.Success():\r
+ print "!ReadCStringFromMemory() did not find a %d byte C string at %x" % (FileNameLen, FileNamePtr)\r
+ # make breakpoint command contiue\r
+ frame.GetThread().GetProcess().Continue()\r
+\r
+ debugger = frame.thread.process.target.debugger\r
+ if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:\r
+ LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned()\r
+\r
+ debugger.HandleCommand ("target modules add %s" % FileName)\r
+ print "target modules load --slid 0x%x %s" % (LoadAddress, FileName)\r
+ debugger.HandleCommand ("target modules load --slide 0x%x --file %s" % (LoadAddress, FileName))\r
+ else:\r
+ target = debugger.GetSelectedTarget()\r
+ for SBModule in target.module_iter():\r
+ ModuleName = SBModule.GetFileSpec().GetDirectory() + '/'\r
+ ModuleName += SBModule.GetFileSpec().GetFilename()\r
+ if FileName == ModuleName or FileName == SBModule.GetFileSpec().GetFilename():\r
+ target.ClearModuleLoadAddress (SBModule)\r
+ if not target.RemoveModule (SBModule):\r
+ print "!lldb.target.RemoveModule (%s) FAILED" % SBModule\r
+\r
+ # make breakpoint command contiue\r
+ frame.thread.process.Continue()\r
+\r
+def GuidToCStructStr (guid, Name=False):\r
+ #\r
+ # Convert a 16-byte bytesarry (or bytearray compat object) to C guid string\r
+ # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34, 0x7C } }\r
+ #\r
+ # Name=True means lookup name in GuidNameDict and us it if you find it\r
+ #\r
+\r
+ if not isinstance (guid, bytearray):\r
+ # convert guid object to UUID, and UUID to bytearray\r
+ Uuid = uuid.UUID(guid)\r
+ guid = bytearray (Uuid.bytes_le)\r
+\r
+ 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 } }" % \\r
+ (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])\r
+\r
+def ParseGuidString(GuidStr):\r
+ #\r
+ # Error check and convert C Guid init to string\r
+ # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")\r
+ # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }")\r
+ #\r
+\r
+ if "{" in GuidStr :\r
+ # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }"\r
+ # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1\r
+ # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C', '0x9E', '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']\r
+ Hex = ''.join(x for x in GuidStr if x not in '{,}').split()\r
+ Str = "%08X-%04X-%04X-%02.2X%02.2X-%02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \\r
+ (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0), \\r
+ int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0), int(Hex[10], 0))\r
+ elif GuidStr.count('-') == 4:\r
+ # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form\r
+ Check = "%s" % str(uuid.UUID(GuidStr)).upper()\r
+ if GuidStr.upper() == Check:\r
+ Str = GuidStr.upper()\r
+ else:\r
+ Ste = ""\r
+ else:\r
+ Str = ""\r
+\r
+ return Str\r
+\r
+\r
+def create_guid_options():\r
+ usage = "usage: %prog [data]"\r
+ description='''lookup EFI_GUID by CName, C struct, or GUID string and print out all three.\r
+ '''\r
+ parser = optparse.OptionParser(description=description, prog='guid',usage=usage)\r
+ return parser\r
+\r
+def efi_guid_command(debugger, command, result, dict):\r
+ # Use the Shell Lexer to properly parse up command options just like a\r
+ # shell would\r
+ command_args = shlex.split(command)\r
+ parser = create_guid_options()\r
+ try:\r
+ (options, args) = parser.parse_args(command_args)\r
+ if len(args) >= 1:\r
+ if args[0] == "{":\r
+ # caller forgot to quote the string"\r
+ # mark arg[0] a string containing all args[n]\r
+ args[0] = ' '.join(args)\r
+ GuidStr = ParseGuidString (args[0])\r
+ if GuidStr == "":\r
+ # return Key of GuidNameDict for value args[0]\r
+ GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value == args[0]][0]\r
+ GuidStr = GuidStr.upper()\r
+ except:\r
+ # if you don't handle exceptions, passing an incorrect argument to the OptionParser will cause LLDB to exit\r
+ # (courtesy of OptParse dealing with argument errors by throwing SystemExit)\r
+ result.SetError ("option parsing failed")\r
+ return\r
+\r
+\r
+ if len(args) >= 1:\r
+ if GuidStr in guid_dict:\r
+ print "%s = %s" % (guid_dict[GuidStr], GuidStr)\r
+ print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr))\r
+ else:\r
+ print GuidStr\r
+ else:\r
+ # dump entire dictionary\r
+ width = max(len(v) for k,v in guid_dict.iteritems())\r
+ for value in sorted(guid_dict, key=guid_dict.get):\r
+ print '%-*s %s %s' % (width, guid_dict[value], value, GuidToCStructStr(value))\r
+\r
+ return\r
+\r
+\r
+#\r
+########## Code that runs when this script is imported into LLDB ###########\r
+#\r
+def __lldb_init_module (debugger, internal_dict):\r
+ # This initializer is being run from LLDB in the embedded command interpreter\r
+ # Make the options so we can generate the help text for the new LLDB\r
+ # command line command prior to registering it with LLDB below\r
+\r
+ global guid_dict\r
+\r
+ # Source Guid.xref file if we can find it\r
+ inputfile = os.getcwd()\r
+ inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'\r
+ with open(inputfile) as f:\r
+ for line in f:\r
+ data = line.split(' ')\r
+ if len(data) >= 2:\r
+ guid_dict[data[0].upper()] = data[1].strip('\n')\r
+\r
+ # init EFI specific type formaters\r
+ TypePrintFormating (debugger)\r
+\r
+\r
+ # add guid command\r
+ parser = create_guid_options()\r
+ efi_guid_command.__doc__ = parser.format_help()\r
+ debugger.HandleCommand('command script add -f lldbefi.efi_guid_command guid')\r
+\r
+\r
+ Target = debugger.GetTargetAtIndex(0)\r
+ if Target:\r
+ Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')\r
+ if Breakpoint.GetNumLocations() == 1:\r
+ # Set the emulator breakpoints, if we are in the emulator\r
+ debugger.HandleCommand("breakpoint command add -s python -F lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))\r
+ print 'Type r to run emulator. SecLldbScriptBreak armed. EFI modules should now get source level debugging in the emulator.'\r
@param[in] MediaId Id of the media, changes every time the media is\r
replaced.\r
@param[in] Lba The starting Logical Block Address to read from.\r
- @param[in, out] Token A pointer to the token associated with the transaction.\r
+ @param[in, out] Token A pointer to the token associated with the transaction.\r
@param[in] BufferSize Size of Buffer, must be a multiple of device block size.\r
@param[out] Buffer A pointer to the destination buffer for the data. The\r
caller is responsible for either having implicit or\r
extern EMU_IO_THUNK_PROTOCOL mWinNtWndThunkIo;\r
extern EMU_IO_THUNK_PROTOCOL mWinNtFileSystemThunkIo;\r
extern EMU_IO_THUNK_PROTOCOL mWinNtBlockIoThunkIo;\r
-#endif
\ No newline at end of file
+#endif\r