Changed the X64 gasket so it would be possible to port it to deal with the Unix to EFI ABI mangling. It still just does Unix ABI, and has some Xcode specific stuff to make source level debug a little easier, but it is a good first step.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10689 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
andrewfish 2010-07-23 22:20:00 +00:00
parent 185969ed53
commit ede7ec0bcd
7 changed files with 8992 additions and 305 deletions

View File

@ -61,8 +61,6 @@ Abstract:
#endif
#include <utime.h>
#include <dlfcn.h>
#include <ucontext.h>
#include <Base.h>
#include <Library/PeCoffLib.h>

View File

@ -314,40 +314,6 @@ Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__ter
}
int
Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact)
{
return GasketUintnUintn (sigaction, (UINTN)act, (UINTN)oact);
}
int
Gasketsetcontext (const ucontext_t *ucp)
{
return GasketUintn (setcontext, (UINTN)ucp);
}
int
Gasketgetcontext (ucontext_t *ucp)
{
return GasketUintn (getcontext, (UINTN)ucp);
}
int
Gasketsigemptyset (sigset_t *set)
{
return GasketUintn (sigemptyset, (UINTN)set);
}
int
Gasketsigaltstack (const stack_t *ss, stack_t *oss)
{
return GasketUintnUintn (sigaltstack, (UINTN)ss, (UINTN)oss);
}
RETURN_STATUS

View File

@ -71,10 +71,6 @@ int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);
int Gaskettcgetattr (int __fd, struct termios *__termios_p);
int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);
int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);
int Gasketsetcontext (const ucontext_t *ucp);
int Gasketgetcontext (ucontext_t *ucp);
int Gasketsigemptyset (sigset_t *set);
int Gasketsigaltstack (const stack_t *ss, stack_t *oss);
RETURN_STATUS
GasketUnixPeCoffGetEntryPoint (

View File

@ -34,9 +34,9 @@
UnixThunk.c
FwVol.c
SecMain.c
Gasket.c
[Sources.Ia32]
Gasket.c
Ia32/Gasket.S
Ia32/Stack.S
Ia32/SwitchStack.c
@ -44,6 +44,10 @@
[Sources.X64]
X64/Gasket.S
X64/SwitchStack.S
X64/NameManglingFix.c
# Only used to help construct Gasket.S
# X64/GasketEfiTemplate.c
[Packages]
MdePkg/MdePkg.dec

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,419 @@
/** @file
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 "SecMain.h"
#include "Gasket.h"
//
// OS X Posix does some strange name mangling on these names in C.
// If you call from assembler you get the wrong version of the function
// So these globals get you the correct name mangled functions that can
// be accessed from assembly
//
extern UnixRmDir gUnixRmDir;
extern UnixOpenDir gUnixOpenDir;
extern UnixStat gUnixStat;
extern UnixStatFs gUnixStatFs;
//
// Gasket functions for EFI_UNIX_THUNK_PROTOCOL
//
int
Gasketrmdir (const char *pathname)
{
return gUnixRmDir (pathname);
}
DIR *
Gasketopendir (const char *pathname)
{
return gUnixOpenDir (pathname);
}
int
Gasketstat (const char *path, STAT_FIX *buf)
{
return gUnixStat (path, buf);
}
int
Gasketstatfs (const char *path, struct statfs *buf)
{
return gUnixStatFs (path, buf);
}
/////
void
GasketmsSleep (unsigned long Milliseconds)
{
msSleep (Milliseconds);
return;
}
void
Gasketexit (int status)
{
exit (status);
return;
}
void
GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs))
{
SetTimer (PeriodMs, CallBack);
return;
}
void
GasketGetLocalTime (EFI_TIME *Time)
{
GetLocalTime (Time);
return;
}
struct tm *
Gasketgmtime (const time_t *clock)
{
return localtime (clock);
}
long
GasketGetTimeZone (void)
{
return GetTimeZone ();
}
int
GasketGetDayLight (void)
{
return GetDayLight ();
}
int
Gasketpoll (struct pollfd *pfd, unsigned int nfds, int timeout)
{
return poll (pfd, nfds, timeout);
}
long
Gasketread (int fd, void *buf, int count)
{
return read (fd, buf, count);
}
long
Gasketwrite (int fd, const void *buf, int count)
{
return write (fd, buf, count);
}
char *
Gasketgetenv (const char *name)
{
return getenv (name);
}
int
Gasketopen (const char *name, int flags, int mode)
{
return open (name, flags, mode);
}
off_t
Gasketlseek (int fd, off_t off, int whence)
{
return lseek (fd, off, whence);
}
int
Gasketftruncate (int fd, long int len)
{
return ftruncate (fd, len);
}
int
Gasketclose (int fd)
{
return close (fd);
}
int
Gasketmkdir (const char *pathname, mode_t mode)
{
return mkdir (pathname, mode);
}
int
Gasketunlink (const char *pathname)
{
return unlink (pathname);
}
int
GasketGetErrno (void)
{
return GetErrno ();
}
void
Gasketrewinddir (DIR *dir)
{
rewinddir (dir);
return;
}
struct dirent *
Gasketreaddir (DIR *dir)
{
return readdir (dir);
}
int
Gasketclosedir (DIR *dir)
{
return closedir (dir);
}
int
Gasketrename (const char *oldpath, const char *newpath)
{
return rename (oldpath, newpath);
}
time_t
Gasketmktime (struct tm *tm)
{
return mktime (tm);
}
int
Gasketfsync (int fd)
{
return fsync (fd);
}
int
Gasketchmod (const char *path, mode_t mode)
{
return chmod (path, mode);
}
int
Gasketutime (const char *filename, const struct utimbuf *buf)
{
return utime (filename, buf);
}
int
Gaskettcflush (int fildes, int queue_selector)
{
return tcflush (fildes, queue_selector);
}
EFI_STATUS
GasketUgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title)
{
return UgaCreate (UgaIo, Title);
}
void
Gasketperror (__const char *__s)
{
perror (__s);
return;
}
//
// ... is always an int or pointer to device specific data structure
//
int
Gasketioctl (int fd, unsigned long int __request, ...)
{
VA_LIST Marker;
VA_START (Marker, __request);
return ioctl (fd, __request, VA_ARG (Marker, UINTN));
}
int
Gasketfcntl (int __fd, int __cmd, ...)
{
VA_LIST Marker;
VA_START (Marker, __cmd);
return fcntl (__fd, __cmd, VA_ARG (Marker, UINTN));
}
int
Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed)
{
return cfsetispeed (__termios_p, __speed);
}
int
Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed)
{
return cfsetospeed (__termios_p, __speed);
}
int
Gaskettcgetattr (int __fd, struct termios *__termios_p)
{
return tcgetattr (__fd, __termios_p);
}
int
Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p)
{
return tcsetattr (__fd, __optional_actions, __termios_p);
}
RETURN_STATUS
GasketUnixPeCoffGetEntryPoint (
IN VOID *Pe32Data,
IN OUT VOID **EntryPoint
)
{
return SecPeCoffGetEntryPoint (Pe32Data, EntryPoint);
}
VOID
GasketUnixPeCoffRelocateImageExtraAction (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
)
{
SecPeCoffRelocateImageExtraAction (ImageContext);
return;
}
VOID
GasketUnixPeCoffUnloadImageExtraAction (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
)
{
SecPeCoffLoaderUnloadImageExtraAction (ImageContext);
return;
}
//
// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
//
EFI_STATUS
EFIAPI
GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
{
return UgaClose (UgaIo);
}
EFI_STATUS
EFIAPI
GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height)
{
return UgaSize (UgaIo, Width, Height);
}
EFI_STATUS
EFIAPI
GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
{
return UgaCheckKey (UgaIo);
}
EFI_STATUS
EFIAPI
GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key)
{
return UgaGetKey (UgaIo, key);
}
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
)
{
return UgaBlt (UgaIo, BltBuffer, BltOperation, SourceX, SourceY, DestinationX, DestinationY, Width, Height, Delta);
}
typedef void (*SET_TIMER_CALLBACK)(UINT64 delta);
UINTN
ReverseGasketUint64 (void *api, UINT64 a)
{
SET_TIMER_CALLBACK settimer_callback = (SET_TIMER_CALLBACK)api;
(*settimer_callback)(a);
return 0;
}

View File

@ -0,0 +1,27 @@
/** @file
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 "SecMain.h"
//
// OS X Posix does some strange name mangling on these names in C.
// If you call from assembler you get the wrong version of the function
// So these globals get you the correct name mangled functions that can
// be accessed from assembly
//
UnixRmDir gUnixRmDir = rmdir;
UnixOpenDir gUnixOpenDir = opendir;
UnixStat gUnixStat = (UnixStat)stat;
UnixStatFs gUnixStatFs = statfs;