Adding Simple Pointer, GOP, SimpleTextInEx, and Networking protocols to the emulator. Cleaned up POSIX include situation by centralizing it in a single file, like NT32. Fixed TPL issue with TPL High not being emulated correctly, it was possible to take a timer tick when the locks in the DXE core should have prevented this. Remove some unused files to make things easier to maintain.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11105 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
andrewfish
2010-11-30 23:38:40 +00:00
parent e23a349aae
commit 2ff79f2eda
44 changed files with 6574 additions and 9581 deletions

View File

@@ -1,6 +1,6 @@
/** @file
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
Copyright (c) 2008 - 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
@@ -369,28 +369,88 @@ GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
EFI_STATUS
EFIAPI
GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key)
GasketUgaKeySetState (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_KEY_TOGGLE_STATE *KeyToggleState)
{
return GasketUintnUintn (UgaGetKey, (UINTN)UgaIo, (UINTN)KeyToggleState);
}
EFI_STATUS
EFIAPI
GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_KEY_DATA *key)
{
return GasketUintnUintn (UgaGetKey, (UINTN)UgaIo, (UINTN)key);
}
EFI_STATUS
EFIAPI
GasketUgaRegisterKeyNotify (
IN EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN UGA_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
IN VOID *Context
)
{
return GasketUintnUintnUintn (UgaRegisterKeyNotify, (UINTN)UgaIo, (UINTN)CallBack, (UINTN)Context);
}
EFI_STATUS
EFIAPI
GasketUgaBlt (
EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
IN EFI_UGA_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
IN UGA_BLT_ARGS *Args
)
{
return GasketUintn10Args (UgaBlt, (UINTN)UgaIo, (UINTN)BltBuffer, BltOperation, SourceX, SourceY, DestinationX, DestinationY, Width, Height, Delta);
return GasketUintnUintnUintnUintn (UgaBlt, (UINTN)UgaIo, (UINTN)BltBuffer, (UINTN)BltOperation, (UINTN)Args);
}
EFI_STATUS
EFIAPI
GasketUgaCheckPointer (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
{
return GasketUintn (UgaCheckPointer, (UINTN)UgaIo);
}
EFI_STATUS
EFIAPI
GasketUgaGetPointerState (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_SIMPLE_POINTER_STATE *state)
{
return GasketUintnUintn (UgaGetPointerState, (UINTN)UgaIo, (UINTN)state);
}
void
GasketUnixEnableInterrupt (void)
{
GasketVoid (UnixEnableInterrupt);
}
void
GasketUnixDisableInterrupt (void)
{
GasketVoid (UnixDisableInterrupt);
}
int
Gasketgetifaddrs (struct ifaddrs **ifap)
{
return( GasketUintn( getifaddrs, ( UINTN ) ifap ) );
}
void
Gasketfreeifaddrs (struct ifaddrs *ifap)
{
GasketUintn( freeifaddrs, ( UINTN ) ifap );
}
int
Gasketsocket (int domain, int type, int protocol )
{
return( GasketUintnUintnUintn( socket, domain, type, protocol ) );
}
#endif

View File

@@ -1,6 +1,6 @@
/** @file
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
Copyright (c) 2008 - 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
@@ -19,6 +19,7 @@
#include <Protocol/UgaDraw.h>
#include <Protocol/SimpleTextIn.h>
#include <Protocol/SimpleTextInEx.h>
#include <Protocol/UnixUgaIo.h>
@@ -177,11 +178,17 @@ Gasketclosedir (
int
EFIAPI
Gasketstat (const char *path, STAT_FIX *buf);
Gasketstat (
const char *path,
STAT_FIX *buf)
;
int
EFIAPI
Gasketstatfs (const char *path, struct statfs *buf);
Gasketstatfs (
const char *path,
struct statfs *buf
);
int
EFIAPI
@@ -293,6 +300,34 @@ Gasketsigaction (
struct sigaction *oact
);
int
EFIAPI
Gasketgetifaddrs (
struct ifaddrs **ifap
);
void
EFIAPI
Gasketfreeifaddrs (
struct ifaddrs *ifap
);
int
EFIAPI
Gasketsocket (
int domain,
int type,
int protocol
);
void
EFIAPI
GasketUnixEnableInterrupt (void);
void
EFIAPI
GasketUnixDisableInterrupt (void);
RETURN_STATUS
EFIAPI
GasketUnixPeCoffGetEntryPoint (
@@ -406,6 +441,13 @@ ReverseGasketUint64 (
UINT64 a
);
UINTN
ReverseGasketUint64Uint64 (
VOID *CallBack,
VOID *Context,
VOID *Key
);
//
// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
//
@@ -435,24 +477,52 @@ EFI_STATUS
EFIAPI
GasketUgaGetKey (
EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
EFI_INPUT_KEY *key
EFI_KEY_DATA *key
);
EFI_STATUS
EFIAPI
GasketUgaBlt (
GasketUgaKeySetState (
EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
EFI_KEY_TOGGLE_STATE *KeyToggleState
);
EFI_STATUS
EFIAPI
GasketUgaRegisterKeyNotify (
IN EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN UGA_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
IN VOID *Context
);
EFI_STATUS
EFIAPI
GasketUgaBlt (
IN EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
IN EFI_UGA_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
IN UGA_BLT_ARGS *Args
);
EFI_STATUS
EFIAPI
GasketUgaCheckPointer (
EFI_UNIX_UGA_IO_PROTOCOL *UgaIo
);
EFI_STATUS
EFIAPI
GasketUgaGetPointerState (
EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
EFI_SIMPLE_POINTER_STATE *state
);
//
// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL C calls
//
EFI_STATUS
EFIAPI
UgaCreate (
@@ -460,10 +530,6 @@ UgaCreate (
CONST CHAR16 *Title
);
//
// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
//
EFI_STATUS
EFIAPI
UgaClose (
@@ -488,25 +554,40 @@ EFI_STATUS
EFIAPI
UgaGetKey (
EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
EFI_INPUT_KEY *key
EFI_KEY_DATA *key
);
EFI_STATUS
EFIAPI
UgaBlt (
EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
IN EFI_UGA_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
UgaRegisterKeyNotify (
IN EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN UGA_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
IN VOID *Context
);
EFI_STATUS
EFIAPI
UgaBlt (
IN EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
IN EFI_UGA_BLT_OPERATION BltOperation,
IN UGA_BLT_ARGS *Args
);
EFI_STATUS
EFIAPI
UgaCheckPointer (
IN EFI_UNIX_UGA_IO_PROTOCOL *UgaIo
);
EFI_STATUS
EFIAPI
UgaGetPointerState (
IN EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN EFI_SIMPLE_POINTER_STATE *State
);
#endif

View File

@@ -127,6 +127,31 @@ _GasketUintnUintnUintnUintn:
leave
ret
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
.globl _GasketUintnUintnUintnUintnUintn
_GasketUintnUintnUintnUintnUintn:
pushl %ebp
movl %esp, %ebp
subl $50, %esp # sub extra 0x10 from the stack for the AND
and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
movl 8(%ebp), %eax
movl %eax, -12(%ebp)
movl 28(%ebp), %eax
movl %eax, 16(%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)
movl -12(%ebp), %eax
call *%eax
leave
ret
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
.globl _GasketUintn10Args
@@ -256,6 +281,35 @@ _ReverseGasketUint64:
ret
.globl _ReverseGasketUint64Uint64
_ReverseGasketUint64Uint64:
pushl %ebp
movl %esp, %ebp
subl $56, %esp
movl 12(%ebp), %eax
movl %eax, -32(%ebp)
movl 16(%ebp), %eax
movl %eax, -28(%ebp)
movl 20(%ebp), %eax
movl %eax, -40(%ebp)
movl 24(%ebp), %eax
movl %eax, -36(%ebp)
movl 8(%ebp), %eax
movl %eax, -12(%ebp)
movl -40(%ebp), %eax
movl -36(%ebp), %edx
movl %eax, 8(%esp)
movl %edx, 12(%esp)
movl -32(%ebp), %eax
movl -28(%ebp), %edx
movl %eax, (%esp)
movl %edx, 4(%esp)
movl -12(%ebp), %eax
call *%eax
leave
ret
// Sec PPI Callbacks
.globl _GasketSecUnixPeiLoadFile
@@ -288,4 +342,3 @@ _GasketSecTemporaryRamSupport:
jmp _SecTemporaryRamSupport
#endif

View File

@@ -7,7 +7,7 @@
the assembly functions.
Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
Portions copyright (c) 2008 - 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
@@ -36,6 +36,7 @@ typedef UINT32 UINTN;
typedef int (*GASKET_VOID) ();
typedef int (*GASKET_UINTN) (UINTN);
typedef int (*GASKET_UINT64) (UINT64);
typedef int (*GASKET_UINT64UINT64) (UINT64, UINT64);
typedef int (*GASKET_UINTN_UINTN) (UINTN, UINTN);
typedef int (*GASKET_UINTN_UINTN_UINTN) (UINTN, UINTN, UINTN);
typedef int (*GASKET_UINTN_UINTN_UINTN_UINTN) (UINTN, UINTN, UINTN, UINTN);
@@ -149,4 +150,14 @@ ReverseGasketUint64 (void *api, UINT64 a)
return;
}
void
ReverseGasketUint64UINT64 (void *api, UINT64 a, UINT64 b)
{
GASKET_UINT64UINT64 func;
func = (GASKET_UINT64UINT64)api;
func (a, b);
return;
}

View File

@@ -1,7 +1,7 @@
/*++
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
Portions copyright (c) 2008 - 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
@@ -1114,6 +1114,18 @@ SecPeCoffRelocateImageExtraAction (
{
#ifdef __APPLE__
BOOLEAN EnabledOnEntry;
//
// Make sure writting of the file is an atomic operation
//
if (UnixInterruptEanbled ()) {
UnixDisableInterrupt ();
EnabledOnEntry = TRUE;
} else {
EnabledOnEntry = FALSE;
}
PrintLoadAddress (ImageContext);
//
@@ -1165,10 +1177,17 @@ SecPeCoffRelocateImageExtraAction (
// Hey what can you say scripting in gdb is not that great....
//
SecGdbScriptBreak ();
} else {
ASSERT (FALSE);
}
AddHandle (ImageContext, ImageContext->PdbPointer);
if (EnabledOnEntry) {
UnixEnableInterrupt ();
}
}
#else
@@ -1223,12 +1242,20 @@ SecPeCoffLoaderUnloadImageExtraAction (
#ifdef __APPLE__
FILE *GdbTempFile;
BOOLEAN EnabledOnEntry;
if (Handle != NULL) {
//
// Need to skip .PDB files created from VC++
//
if (!IsPdbFile (ImageContext->PdbPointer)) {
if (UnixInterruptEanbled ()) {
UnixDisableInterrupt ();
EnabledOnEntry = TRUE;
} else {
EnabledOnEntry = FALSE;
}
//
// Write the file we need for the gdb script
//
@@ -1242,6 +1269,12 @@ SecPeCoffLoaderUnloadImageExtraAction (
// Hey what can you say scripting in gdb is not that great....
//
SecGdbScriptBreak ();
} else {
ASSERT (FALSE);
}
if (EnabledOnEntry) {
UnixEnableInterrupt ();
}
}
}

View File

@@ -1,7 +1,7 @@
/*++
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
Portions copyright (c) 2008 - 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
@@ -585,7 +585,6 @@ SecPeCoffLoaderUnloadImageExtraAction (
);
VOID SetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
void msSleep (unsigned long Milliseconds);
void GetLocalTime (EFI_TIME *Time);
@@ -593,6 +592,9 @@ void TzSet (void);
long GetTimeZone(void);
int GetDayLight(void);
int GetErrno(void);
void UnixEnableInterrupt (void);
void UnixDisableInterrupt (void);
BOOLEAN UnixInterruptEanbled (void);

View File

@@ -3,7 +3,7 @@
#
# Main executable file of Unix Emulator that loads PEI core after initialization finished.
# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
# Portions copyright (c) 2008 - 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
@@ -42,7 +42,7 @@
Ia32/SwitchStack.c
[Sources.X64]
# X64/Gasket.S # pure UINX x86_64 ABI also need to fix issues in BaseLib
# X64/Gasket.S # pure UNIX x86_64 ABI also need to fix issues in BaseLib
X64/MangleGasket.S # convert between UNIX x86_64 ABI and EFI X64 ABI
X64/SwitchStack.S

View File

@@ -1,7 +1,7 @@
/*++
Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
Portions copyright (c) 2008 - 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
@@ -17,16 +17,20 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <stdio.h>
#include <stdlib.h>
#include "PiPei.h"
#include "Protocol/UnixThunk.h"
#include "Protocol/SimpleTextIn.h"
#include "Protocol/UgaDraw.h"
#include "Protocol/UnixUgaIo.h"
#include <PiPei.h>
#include <Protocol/SimplePointer.h>
#include <Protocol/SimpleTextIn.h>
#include <Protocol/SimpleTextInEx.h>
#include <Protocol/UgaDraw.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>
#include <Protocol/UnixThunk.h>
#include <Protocol/UnixUgaIo.h>
#include <Ppi/StatusCode.h>
@@ -37,20 +41,22 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Library/PcdLib.h>
#include <Library/DebugLib.h>
#include "Gasket.h"
#include "SecMain.h"
extern void msSleep (unsigned long Milliseconds);
/* XQueryPointer */
struct uga_drv_shift_mask
{
struct uga_drv_shift_mask {
unsigned char shift;
unsigned char size;
unsigned char csize;
};
#define NBR_KEYS 32
typedef struct
{
typedef struct {
EFI_UNIX_UGA_IO_PROTOCOL UgaIo;
Display *display;
@@ -75,7 +81,17 @@ typedef struct
unsigned int key_rd;
unsigned int key_wr;
unsigned int key_count;
EFI_INPUT_KEY keys[NBR_KEYS];
EFI_KEY_DATA keys[NBR_KEYS];
EFI_KEY_STATE KeyState;
UGA_REGISTER_KEY_NOTIFY_CALLBACK RegisterdKeyCallback;
VOID *RegisterdKeyCallbackContext;
int previous_x;
int previous_y;
EFI_SIMPLE_POINTER_STATE pointer_state;
int pointer_state_changed;
} UGA_IO_PRIVATE;
void
@@ -246,49 +262,165 @@ handleKeyEvent(UGA_IO_PRIVATE *drv, XEvent *ev)
{
KeySym keysym;
char str[4];
EFI_INPUT_KEY Key;
EFI_KEY_DATA KeyData;
int res;
if (drv->key_count == NBR_KEYS)
return;
res = XLookupString(&ev->xkey, str, sizeof(str), &keysym, NULL);
Key.ScanCode = 0;
Key.UnicodeChar = 0;
switch (keysym) {
case XK_Home: Key.ScanCode = SCAN_HOME; break;
case XK_End: Key.ScanCode = SCAN_END; break;
case XK_Left: Key.ScanCode = SCAN_LEFT; break;
case XK_Right: Key.ScanCode = SCAN_RIGHT; break;
case XK_Up: Key.ScanCode = SCAN_UP; break;
case XK_Down: Key.ScanCode = SCAN_DOWN; break;
case XK_Delete: Key.ScanCode = SCAN_DELETE; break;
case XK_Insert: Key.ScanCode = SCAN_INSERT; break;
case XK_Page_Up: Key.ScanCode = SCAN_PAGE_UP; break;
case XK_Page_Down: Key.ScanCode = SCAN_PAGE_DOWN; break;
case XK_Escape: Key.ScanCode = SCAN_ESC; break;
KeyData.Key.ScanCode = 0;
KeyData.Key.UnicodeChar = 0;
KeyData.KeyState.KeyShiftState = 0;
case XK_F1: Key.ScanCode = SCAN_F1; break;
case XK_F2: Key.ScanCode = SCAN_F2; break;
case XK_F3: Key.ScanCode = SCAN_F3; break;
case XK_F4: Key.ScanCode = SCAN_F4; break;
case XK_F5: Key.ScanCode = SCAN_F5; break;
case XK_F6: Key.ScanCode = SCAN_F6; break;
case XK_F7: Key.ScanCode = SCAN_F7; break;
case XK_F8: Key.ScanCode = SCAN_F8; break;
case XK_F9: Key.ScanCode = SCAN_F9; break;
//
// KeyRelease is not supported (on Mac) so we can not easily implement Ex functions.
// If a modifier key is hit by its self we get a keysym. If a modfifier and key is hit
// we get the state bit set and keysym is the modified key.
//
// We use lack of state bits being set to clear ToggleState and KeyShiftState. We can
// also use the stat bits to set ToggleState and KeyShiftState.
// 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 {
drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;
}
if ((ev->xkey.state & ControlMask) == 0) {
drv->KeyState.KeyShiftState &= ~(EFI_RIGHT_CONTROL_PRESSED | EFI_LEFT_CONTROL_PRESSED);
} else if ((drv->KeyState.KeyShiftState & EFI_RIGHT_CONTROL_PRESSED) == 0) {
drv->KeyState.KeyShiftState |= EFI_LEFT_CONTROL_PRESSED;
}
if ((ev->xkey.state & ShiftMask) == 0) {
drv->KeyState.KeyShiftState &= ~(EFI_RIGHT_SHIFT_PRESSED | EFI_LEFT_SHIFT_PRESSED);
} else if ((drv->KeyState.KeyShiftState & EFI_RIGHT_SHIFT_PRESSED) == 0) {
drv->KeyState.KeyShiftState |= EFI_LEFT_SHIFT_PRESSED;
}
if ((ev->xkey.state & Mod2Mask) == 0) {
drv->KeyState.KeyShiftState &= ~(EFI_RIGHT_LOGO_PRESSED | EFI_LEFT_LOGO_PRESSED);
} else if ((drv->KeyState.KeyShiftState & EFI_RIGHT_LOGO_PRESSED) == 0) {
drv->KeyState.KeyShiftState |= EFI_LEFT_LOGO_PRESSED;
}
if ((ev->xkey.state & 0x2000) == 0) {
drv->KeyState.KeyShiftState &= ~(EFI_LEFT_ALT_PRESSED);
} else {
drv->KeyState.KeyShiftState |= EFI_LEFT_ALT_PRESSED;
}
switch (keysym) {
case XK_Control_R:
drv->KeyState.KeyShiftState |= EFI_RIGHT_CONTROL_PRESSED;
break;
case XK_Control_L:
drv->KeyState.KeyShiftState |= EFI_LEFT_CONTROL_PRESSED;
break;
case XK_Shift_R:
drv->KeyState.KeyShiftState |= EFI_RIGHT_SHIFT_PRESSED;
break;
case XK_Shift_L:
drv->KeyState.KeyShiftState |= EFI_LEFT_SHIFT_PRESSED;
break;
case XK_Mode_switch:
drv->KeyState.KeyShiftState |= EFI_LEFT_ALT_PRESSED;
break;
case XK_Meta_R:
drv->KeyState.KeyShiftState |= EFI_RIGHT_LOGO_PRESSED;
break;
case XK_Meta_L:
drv->KeyState.KeyShiftState |= EFI_LEFT_LOGO_PRESSED;
break;
case XK_Home: KeyData.Key.ScanCode = SCAN_HOME; break;
case XK_End: KeyData.Key.ScanCode = SCAN_END; break;
case XK_Left: KeyData.Key.ScanCode = SCAN_LEFT; break;
case XK_Right: KeyData.Key.ScanCode = SCAN_RIGHT; break;
case XK_Up: KeyData.Key.ScanCode = SCAN_UP; break;
case XK_Down: KeyData.Key.ScanCode = SCAN_DOWN; break;
case XK_Delete: KeyData.Key.ScanCode = SCAN_DELETE; break;
case XK_Insert: KeyData.Key.ScanCode = SCAN_INSERT; break;
case XK_Page_Up: KeyData.Key.ScanCode = SCAN_PAGE_UP; break;
case XK_Page_Down: KeyData.Key.ScanCode = SCAN_PAGE_DOWN; break;
case XK_Escape: KeyData.Key.ScanCode = SCAN_ESC; break;
case XK_F1: KeyData.Key.ScanCode = SCAN_F1; break;
case XK_F2: KeyData.Key.ScanCode = SCAN_F2; break;
case XK_F3: KeyData.Key.ScanCode = SCAN_F3; break;
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;
case XK_F8: KeyData.Key.ScanCode = SCAN_F8; break;
case XK_F9: KeyData.Key.ScanCode = SCAN_F9; break;
default:
if (res == 1) {
Key.UnicodeChar = str[0];
KeyData.Key.UnicodeChar = str[0];
} else {
return;
}
}
drv->keys[drv->key_wr] = Key;
// The global state is our state
KeyData.KeyState.KeyShiftState = drv->KeyState.KeyShiftState;
KeyData.KeyState.KeyToggleState = drv->KeyState.KeyToggleState;
CopyMem (&drv->keys[drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));
drv->key_wr = (drv->key_wr + 1) % NBR_KEYS;
drv->key_count++;
#if defined(__APPLE__) || defined(MDE_CPU_X64)
ReverseGasketUint64Uint64 (drv->RegisterdKeyCallback ,drv->RegisterdKeyCallbackContext, &KeyData);
#else
drv->RegisterdKeyCallback (drv->RegisterdKeyCallbackContext, &KeyData);
#endif
}
void
handleMouseMoved(UGA_IO_PRIVATE *drv, 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(UGA_IO_PRIVATE *drv, XEvent *ev, 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
@@ -319,9 +451,20 @@ HandleEvent(UGA_IO_PRIVATE *drv, XEvent *ev)
case KeyPress:
handleKeyEvent(drv, ev);
break;
case KeyRelease:
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);
@@ -368,37 +511,87 @@ UgaColorToPixel (UGA_IO_PRIVATE *drv, unsigned long val)
return res;
}
EFI_STATUS
UgaCheckKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
STATIC EFI_STATUS
CheckKeyInternal( UGA_IO_PRIVATE *drv, BOOLEAN delay )
{
UGA_IO_PRIVATE *drv = (UGA_IO_PRIVATE *)UgaIo;
HandleEvents(drv);
if (drv->key_count != 0) {
if (drv->key_count != 0)
return EFI_SUCCESS;
} else {
/* EFI is certainly polling. Be CPU-friendly. */
if ( delay )
/* EFI is polling. Be CPU-friendly. */
msSleep (20);
return EFI_NOT_READY;
}
EFI_STATUS
UgaCheckKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
{
UGA_IO_PRIVATE *drv = (UGA_IO_PRIVATE *)UgaIo;
return( CheckKeyInternal( drv, TRUE ) );
}
EFI_STATUS
UgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key)
EFIAPI
UgaGetKey (
IN EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN EFI_KEY_DATA *KeyData
)
{
UGA_IO_PRIVATE *drv = (UGA_IO_PRIVATE *)UgaIo;
EFI_STATUS status;
status = UgaCheckKey(UgaIo);
status = CheckKeyInternal(drv, FALSE);
if (status != EFI_SUCCESS)
return status;
*key = drv->keys[drv->key_rd];
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
EFIAPI
UgaKeySetState (
IN EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN EFI_KEY_TOGGLE_STATE *KeyToggleState
)
{
UGA_IO_PRIVATE *drv = (UGA_IO_PRIVATE *)UgaIo;
// XKeyEvent event;
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
EFIAPI
UgaRegisterKeyNotify (
IN EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN UGA_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
IN VOID *Context
)
{
UGA_IO_PRIVATE *drv = (UGA_IO_PRIVATE *)UgaIo;
drv->RegisterdKeyCallback = CallBack;
drv->RegisterdKeyCallbackContext = Context;
return EFI_SUCCESS;
}
EFI_STATUS
UgaBlt(
IN EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
@@ -545,6 +738,44 @@ UgaBlt(
return EFI_SUCCESS;
}
STATIC EFI_STATUS
CheckPointerInternal( UGA_IO_PRIVATE *drv, BOOLEAN delay )
{
HandleEvents(drv);
if (drv->pointer_state_changed != 0)
return EFI_SUCCESS;
if ( delay )
/* EFI is polling. Be CPU-friendly. */
msSleep (20);
return EFI_NOT_READY;
}
EFI_STATUS
UgaCheckPointer(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
{
UGA_IO_PRIVATE *drv = (UGA_IO_PRIVATE *)UgaIo;
return( CheckPointerInternal( drv, TRUE ) );
}
EFI_STATUS
UgaGetPointerState (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_SIMPLE_POINTER_STATE *state)
{
UGA_IO_PRIVATE *drv = (UGA_IO_PRIVATE *)UgaIo;
EFI_STATUS status;
status = CheckPointerInternal( drv, FALSE );
if (status != EFI_SUCCESS)
return status;
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
UgaCreate (EFI_UNIX_UGA_IO_PROTOCOL **Uga, CONST CHAR16 *Title)
{
@@ -557,32 +788,29 @@ UgaCreate (EFI_UNIX_UGA_IO_PROTOCOL **Uga, CONST CHAR16 *Title)
if (drv == NULL)
return EFI_OUT_OF_RESOURCES;
#ifdef __APPLE__
#if defined(__APPLE__) || defined(MDE_CPU_X64)
//
//
//
EFI_STATUS EFIAPI GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
EFI_STATUS EFIAPI GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
EFI_STATUS EFIAPI GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
EFI_STATUS EFIAPI GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
EFI_STATUS EFIAPI GasketUgaBlt (
EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
IN EFI_UGA_BLT_OPERATION BltOperation,
IN UGA_BLT_ARGS *Args
);
drv->UgaIo.UgaClose = GasketUgaClose;
drv->UgaIo.UgaSize = GasketUgaSize;
drv->UgaIo.UgaCheckKey = GasketUgaCheckKey;
drv->UgaIo.UgaGetKey = GasketUgaGetKey;
drv->UgaIo.UgaKeySetState = GasketUgaKeySetState;
drv->UgaIo.UgaRegisterKeyNotify = GasketUgaRegisterKeyNotify;
drv->UgaIo.UgaBlt = GasketUgaBlt;
drv->UgaIo.UgaCheckPointer = GasketUgaCheckPointer;
drv->UgaIo.UgaGetPointerState = GasketUgaGetPointerState;
#else
drv->UgaIo.UgaClose = UgaClose;
drv->UgaIo.UgaSize = UgaSize;
drv->UgaIo.UgaCheckKey = UgaCheckKey;
drv->UgaIo.UgaGetKey = UgaGetKey;
drv->UgaIo.UgaKeySetState = UgaKeySetState;
drv->UgaIo.UgaRegisterKeyNotify = UgaRegisterKeyNotify;
drv->UgaIo.UgaBlt = UgaBlt;
drv->UgaIo.UgaCheckPointer = UgaCheckPointer;
drv->UgaIo.UgaGetPointerState = UgaGetPointerState;
#endif
@@ -590,6 +818,12 @@ EFI_STATUS EFIAPI GasketUgaBlt (
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->RegisterdKeyCallback = NULL;
drv->RegisterdKeyCallbackContext = NULL;
drv->display = XOpenDisplay (display_name);
if (drv->display == NULL)
{
@@ -607,6 +841,7 @@ EFI_STATUS EFIAPI GasketUgaBlt (
BlackPixel (drv->display, drv->screen));
drv->depth = DefaultDepth (drv->display, drv->screen);
XDefineCursor (drv->display, drv->win, XCreateFontCursor (drv->display, XC_pirate));
/* Compute title len and convert to Ascii. */
for (title_len = 0; Title[title_len] != 0; title_len++)
@@ -621,8 +856,8 @@ EFI_STATUS EFIAPI GasketUgaBlt (
XStoreName (drv->display, drv->win, title);
}
XSelectInput (drv->display, drv->win, ExposureMask | KeyPressMask);
XSelectInput (drv->display, drv->win,
ExposureMask | KeyPressMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask );
drv->gc = DefaultGC (drv->display, drv->screen);
*Uga = (EFI_UNIX_UGA_IO_PROTOCOL *)drv;

View File

@@ -1,14 +1,14 @@
/*++
Copyright (c) 2004 - 2009, 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.
Portions copyright (c) 2008 - 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.
Module Name:
@@ -16,7 +16,7 @@ Module Name:
Abstract:
Since the SEC is the only program in our emulation we
Since the SEC is the only program in our emulation we
must use a Tiano mechanism to export APIs to other modules.
This is the role of the EFI_UNIX_THUNK_PROTOCOL.
@@ -25,7 +25,7 @@ Abstract:
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.
gUnix is a a public exported global that contains the initialized
data.
@@ -44,6 +44,9 @@ int settimer_initialized;
struct timeval settimer_timeval;
void (*settimer_callback)(UINT64 delta);
BOOLEAN gEmulatorInterruptEnabled = FALSE;
void
settimer_handler (int sig)
{
@@ -52,15 +55,15 @@ settimer_handler (int sig)
gettimeofday (&timeval, NULL);
delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
- ((UINT64)settimer_timeval.tv_sec * 1000)
- ((UINT64)settimer_timeval.tv_sec * 1000)
- (settimer_timeval.tv_usec / 1000);
settimer_timeval = timeval;
if (settimer_callback) {
#if defined(__APPLE__) || defined(MDE_CPU_X64)
ReverseGasketUint64 (settimer_callback, delta);
#else
(*settimer_callback)(delta);
(*settimer_callback)(delta);
#endif
}
}
@@ -78,6 +81,7 @@ SetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs))
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));
}
@@ -90,13 +94,50 @@ SetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs))
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
UnixEnableInterrupt (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);
sigprocmask (SIG_UNBLOCK, &sigset, NULL);
}
void
UnixDisableInterrupt (void)
{
sigset_t sigset;
// Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
// by enabling/disabling SIGALRM.
sigemptyset (&sigset);
sigaddset (&sigset, SIGALRM);
sigprocmask (SIG_BLOCK, &sigset, NULL);
gEmulatorInterruptEnabled = FALSE;
}
BOOLEAN
UnixInterruptEanbled (void)
{
return gEmulatorInterruptEnabled;
}
void
msSleep (unsigned long Milliseconds)
{
@@ -110,7 +151,7 @@ msSleep (unsigned long Milliseconds)
break;
}
rq = rm;
}
}
}
@@ -174,7 +215,7 @@ EFI_UNIX_THUNK_PROTOCOL mUnixThunkTable = {
#if defined(__APPLE__) || defined(MDE_CPU_X64)
//
// Mac OS X requires the stack to be 16-byte aligned for IA-32. So on an OS X build
// we add an assembly wrapper that makes sure the stack ges aligned.
// we add an assembly wrapper that makes sure the stack ges aligned.
// This has the nice benfit of being able to run EFI ABI code, like the EFI shell
// that is checked in to source control in the OS X version of the emulator
//
@@ -217,9 +258,16 @@ EFI_UNIX_THUNK_PROTOCOL mUnixThunkTable = {
Gasketcfsetospeed,
Gaskettcgetattr,
Gaskettcsetattr,
GasketUnixPeCoffGetEntryPoint,
GasketUnixPeCoffRelocateImageExtraAction,
GasketUnixPeCoffUnloadImageExtraAction
GasketUnixPeCoffGetEntryPoint,
GasketUnixPeCoffRelocateImageExtraAction,
GasketUnixPeCoffUnloadImageExtraAction,
GasketUnixEnableInterrupt,
GasketUnixDisableInterrupt,
Gasketgetifaddrs,
Gasketfreeifaddrs,
Gasketsocket,
#else
msSleep, /* Sleep */
@@ -263,7 +311,12 @@ EFI_UNIX_THUNK_PROTOCOL mUnixThunkTable = {
tcsetattr,
SecPeCoffGetEntryPoint,
SecPeCoffRelocateImageExtraAction,
SecPeCoffLoaderUnloadImageExtraAction
SecPeCoffLoaderUnloadImageExtraAction,
UnixEnableInterrupt,
UnixDisableInterrupt,
getifaddrs,
freeifaddrs,
socket
#endif
};

File diff suppressed because it is too large Load Diff

View File

@@ -1,154 +0,0 @@
/** @file
Template file used to create Gasket.S
This file is built on the command line via gcc GasketTemplate.c -S
and it will create GasketTemplate.s and this was used to create
Gasket.S. This builds code for Unix ABI on both sides. To convert
to EFI ABI will require changing the code by hand
Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
Portions copyright (c) 2008 - 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.
**/
#include <stdint.h>
#include <sys/stat.h>
typedef int8_t INT8;
typedef uint8_t UINT8;
typedef int16_t INT16;
typedef uint16_t UINT16;
typedef int32_t INT32;
typedef uint32_t UINT32;
typedef int64_t INT64;
typedef uint64_t UINT64;
typedef UINT64 UINTN;
typedef UINTN (*GASKET_VOID) ();
typedef UINTN (*GASKET_UINTN) (UINTN);
typedef UINTN (*GASKET_UINT64) (UINT64);
typedef UINTN (*GASKET_UINTN_UINTN) (UINTN, UINTN);
typedef UINTN (*GASKET_UINTN_UINTN_UINTN) (UINTN, UINTN, UINTN);
typedef UINTN (*GASKET_UINTN_UINTN_UINTN_UINTN) (UINTN, UINTN, UINTN, UINTN);
typedef UINTN (*GASKET_UINTN_10ARGS) (UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN);
typedef UINTN (*GASKET_UINT64_UINTN) (UINT64, UINTN);
typedef UINT64 (*GASKET_UINTN_UINT64_UINTN) (UINTN, UINT64, UINTN);
typedef UINTN (*GASKET_UINTN_UINT16) (UINTN, UINT16);
UINTN GasketVoid (void *api);
UINTN GasketUintn (void *api, UINTN a);
UINTN GasketUintnUintn (void *api, UINTN a, UINTN b);
UINTN GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c);
UINTN GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d);
UINTN GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j);
UINTN GasketUint64Uintn (void *api, UINT64 a, UINTN b);
UINT64 GasketUintnUiny64Uintn (void *api, UINTN a, UINT64 b, UINTN c);
UINTN GasketUintnUint16 (void *api, UINTN a, UINT16 b);
UINTN
GasketVoid (void *api)
{
GASKET_VOID func;
func = (GASKET_VOID)api;
return func ();
}
UINTN
GasketUintn (void *api, UINTN a)
{
GASKET_UINTN func;
func = (GASKET_UINTN)api;
return func (a);
}
UINTN
GasketUintnUintn (void *api, UINTN a, UINTN b)
{
GASKET_UINTN_UINTN func;
func = (GASKET_UINTN_UINTN)api;
return func (a, b);
}
UINTN
GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c)
{
GASKET_UINTN_UINTN_UINTN func;
func = (GASKET_UINTN_UINTN_UINTN)api;
return func (a, b, c);
}
UINTN
GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d)
{
GASKET_UINTN_UINTN_UINTN_UINTN func;
func = (GASKET_UINTN_UINTN_UINTN_UINTN)api;
return func (a, b, c, d);
}
UINTN
GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j)
{
GASKET_UINTN_10ARGS func;
func = (GASKET_UINTN_10ARGS)api;
return func (a, b, c, d, e, f, g, h, i, j);
}
UINTN
GasketUint64Uintn (void *api, UINT64 a, UINTN b)
{
GASKET_UINT64_UINTN func;
func = (GASKET_UINT64_UINTN)api;
return func (a, b);
}
UINT64
GasketUintnUint64Uintn (void *api, UINTN a, UINT64 b, UINTN c)
{
GASKET_UINTN_UINT64_UINTN func;
func = (GASKET_UINTN_UINT64_UINTN)api;
return func (a, b, c);
}
UINTN
GasketUintnUint16 (void *api, UINTN a, UINT16 b)
{
GASKET_UINTN_UINT16 func;
func = (GASKET_UINTN_UINT16)api;
return func (a, b);
}
void
ReverseGasketUint64 (void *api, UINT64 a)
{
GASKET_UINT64 func;
func = (GASKET_UINT64)api;
func (a);
return;
}

File diff suppressed because it is too large Load Diff

View File

@@ -39,7 +39,9 @@
#------------------------------------------------------------------------------
ASM_GLOBAL ASM_PFX(PeiSwitchStacks)
ASM_PFX(PeiSwitchStacks):
// movq %rdx, %rdx
pushq %rbp // stack frame is for the debugger
movq %rsp, %rbp
movq %r8, %rsp
movq %rdi, %rax
@@ -50,7 +52,7 @@ ASM_PFX(PeiSwitchStacks):
# Reserve space for register parameters (rcx, rdx, r8 & r9) on the stack,
# in case the callee wishes to spill them.
#
subq $40, %rsp // 32-byte shadow space plus alignment pad
subq $32, %rsp // 32-byte shadow space plus alignment pad
call *%rax
@@ -74,6 +76,9 @@ ASM_PFX(PeiSwitchStacks):
#------------------------------------------------------------------------------
ASM_GLOBAL ASM_PFX(UnixPeiSwitchStacks)
ASM_PFX(UnixPeiSwitchStacks):
pushq %rbp // stack frame is for the debugger
movq %rsp, %rbp
mov %rdi, %rax
mov %rsi, %rdi
mov %rdx, %rsi
@@ -100,12 +105,16 @@ ASM_PFX(UnixPeiSwitchStacks):
#------------------------------------------------------------------------------
ASM_GLOBAL ASM_PFX(SecSwitchStack)
ASM_PFX(SecSwitchStack):
pushq %rbp // stack frame is for the debugger
movq %rsp, %rbp
mov %rsp, %rax
sub %rdi, %rax
add %rsi, %rax
mov (%rip), %r10
mov %r10, (%rax)
popq %rbp
ret