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:
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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 ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user