From 7ee3b61338de1fa592227c719eca20f7813ea606 Mon Sep 17 00:00:00 2001 From: AJFISH Date: Sun, 6 Dec 2009 02:00:37 +0000 Subject: Added support for Xcode on Snow Leopard. Upaded with bug fixes for Snow Leopard. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9519 6f19259b-4bc3-4df7-8a09-765794883524 --- UnixPkg/Sec/Ia32/Gasket.S | 1128 +++++++------------------------------ UnixPkg/Sec/Ia32/GasketTemplate.c | 142 +++++ 2 files changed, 333 insertions(+), 937 deletions(-) create mode 100644 UnixPkg/Sec/Ia32/GasketTemplate.c (limited to 'UnixPkg/Sec/Ia32') diff --git a/UnixPkg/Sec/Ia32/Gasket.S b/UnixPkg/Sec/Ia32/Gasket.S index 80d033675c..77e8296b0b 100644 --- a/UnixPkg/Sec/Ia32/Gasket.S +++ b/UnixPkg/Sec/Ia32/Gasket.S @@ -1,5 +1,21 @@ #------------------------------------------------------------------------------ # +# OS X Application requires 16 byte stack alignment. The problem is these +# APIs are exposed to code that does not have this requirement via +# EFI_UNIX_THUNK_PROTOCOL. So these are wrapper functions that make sure +# the stack is aligned. This code should also work if the stack is already +# aligned. Extra stack padding is really the same as local varaibles so +# it gets freed by the leave instruction +# +# I basically used the compiler, added extra 16 bytes to the local stack and +# made sure %esp ended in 0 before the call (16 byte algined) +# +# The EFI_UNIX_THUNK_PROTOCOL member functions call a C API that then calls +# one of these generic assembly routines. We do it that way to work around +# some magic name changing that happens in C. For example stat() is _stat() +# on Leopard and _stat$INDOE64 on Snow Leopard. That is why we pass stat() +# into one of these gaskets from C code. +# # Copyright (c) 2008 - 2009 Apple Inc. All rights reserved. # All rights reserved. This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -9,975 +25,213 @@ # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # -# Abstract: -# -# OS X Application requires 16 byte stack alignment. The problem is these -# APIs are exposed to code that does not have this requirement via -# EFI_UNIX_THUNK_PROTOCOL. So these are wrapper functions that make sure -# the stack is aligned. This code should also work if the stack is already -# aligned. Extra stack padding is really the same as local varaibles so -# it gets freed by the leave instruction -# -# I basically used the compiler, added extra 16 bytes to the local stack and -# made sure %esp ended in 0 before the call (16 byte algined) -# -# cat t.c -##include -##include -# -#int chmod (int fd, mode_t len){ -# long m = (long)fd; -#} -# -#int Gasketchmod (int fd, mode_t len){ -# return chmod (fd, len); -#} -# -# gcc -S t.c -# cat t.s -# this gives you the starting point.... -# -# #------------------------------------------------------------------------------ -#include - .text - -# -# -# EFI_UNIX_THUNK_PROTOCOL that gets exported -# -# - -#------------------------------------------------------------------------------ -# VOID GasketmsSleep (unsigned long Milliseconds); -#------------------------------------------------------------------------------ -.globl _GasketmsSleep -_GasketmsSleep: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _msSleep - leave - ret - - -#------------------------------------------------------------------------------ -# void Gasketexit (int status); -#------------------------------------------------------------------------------ -.globl _Gasketexit -_Gasketexit: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _exit - leave - ret - - -#------------------------------------------------------------------------------ -# void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs)); -#------------------------------------------------------------------------------ -.globl _GasketSetTimer -_GasketSetTimer: - pushl %ebp - movl %esp, %ebp - subl $56, %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, -16(%ebp) - movl 12(%ebp), %eax - movl %eax, -12(%ebp) - movl 16(%ebp), %eax - movl %eax, 8(%esp) - movl -16(%ebp), %eax - movl -12(%ebp), %edx - movl %eax, (%esp) - movl %edx, 4(%esp) - call _SetTimer - leave - ret - - - -#------------------------------------------------------------------------------ -# void GasketGetLocalTime (EFI_TIME *Time); -#------------------------------------------------------------------------------ -.globl _GasketGetLocalTime -_GasketGetLocalTime: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _GetLocalTime - leave - ret - - - -#------------------------------------------------------------------------------ -# struct tm *Gasketgmtime (const time_t *clock); -#------------------------------------------------------------------------------ -.globl _Gasketgmtime -_Gasketgmtime: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _gmtime - leave - ret - - - - -#------------------------------------------------------------------------------ -# long GasketGetTimeZone(void); -#------------------------------------------------------------------------------ -.globl _GasketGetTimeZone -_GasketGetTimeZone: - pushl %ebp - movl %esp, %ebp - subl $24, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - call _GetTimeZone - leave - ret - - -#------------------------------------------------------------------------------ -# int GasketGetDayLight (void); -#------------------------------------------------------------------------------ -.globl _GasketGetDayLight -_GasketGetDayLight: - pushl %ebp - movl %esp, %ebp - subl $24, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - call _GetDayLight - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketpoll (struct pollfd *pfd, int nfds, int timeout); -#------------------------------------------------------------------------------ -.globl _Gasketpoll -_Gasketpoll: - pushl %ebp - movl %esp, %ebp - subl $56, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 16(%ebp), %eax - movl %eax, 8(%esp) - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _poll - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketread (int fd, void *buf, int count); -#------------------------------------------------------------------------------ -.globl _Gasketread -_Gasketread: - pushl %ebp - movl %esp, %ebp - subl $56, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 16(%ebp), %eax - movl %eax, 8(%esp) - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _read - leave - ret - - -#------------------------------------------------------------------------------ -# int Gasketwrite (int fd, const void *buf, int count); -#------------------------------------------------------------------------------ -.globl _Gasketwrite -_Gasketwrite: - pushl %ebp - movl %esp, %ebp - subl $56, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 16(%ebp), %eax - movl %eax, 8(%esp) - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _write - leave - ret - - - -#------------------------------------------------------------------------------ -# char *Gasketgetenv (const char *name); -#------------------------------------------------------------------------------ -.globl _Gasketgetenv -_Gasketgetenv: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _getenv - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketopen (const char *name, int flags, int mode); -#------------------------------------------------------------------------------ -.globl _Gasketopen -_Gasketopen: - pushl %ebp - movl %esp, %ebp - subl $56, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 16(%ebp), %eax - movl %eax, 8(%esp) - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _open - leave - ret - - - -#------------------------------------------------------------------------------ -# off_t Gasketlseek (int fd, off_t off, int whence); -#------------------------------------------------------------------------------ -.globl _Gasketlseek -_Gasketlseek: - pushl %ebp - movl %esp, %ebp - subl $56, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, -16(%ebp) - movl 16(%ebp), %eax - movl %eax, -12(%ebp) - movl 20(%ebp), %eax - movl %eax, 12(%esp) - movl -16(%ebp), %eax - movl -12(%ebp), %edx - movl %eax, 4(%esp) - movl %edx, 8(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _lseek - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketftruncate (int fd, long int len); -#------------------------------------------------------------------------------ -.globl _Gasketftruncate -_Gasketftruncate: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _truncate - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketclose (int fd); -#------------------------------------------------------------------------------ -.globl _Gasketclose -_Gasketclose: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _close - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketmkdir (const char *pathname, mode_t mode); -#------------------------------------------------------------------------------ -.globl _Gasketmkdir -_Gasketmkdir: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _mkdir - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketrmdir (const char *pathname); -#------------------------------------------------------------------------------ -.globl _Gasketrmdir -_Gasketrmdir: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _rmdir - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketunlink (const char *pathname); -#------------------------------------------------------------------------------ -.globl _Gasketunlink -_Gasketunlink: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _unlink - leave - ret - - - -#------------------------------------------------------------------------------ -# int GasketGetErrno (void); -#------------------------------------------------------------------------------ -.globl _GasketGetErrno -_GasketGetErrno: - pushl %ebp - movl %esp, %ebp - subl $24, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - call _GetErrno - leave - ret - - - -#------------------------------------------------------------------------------ -# DIR *Gasketopendir (const char *pathname); -#------------------------------------------------------------------------------ -.globl _Gasketopendir -_Gasketopendir: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _opendir - leave - ret - - - -#------------------------------------------------------------------------------ -# void *Gasketrewinddir (DIR *dir); -#------------------------------------------------------------------------------ -.globl _Gasketrewinddir -_Gasketrewinddir: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _rewinddir - leave - ret - - -#------------------------------------------------------------------------------ -# struct dirent *Gasketreaddir (DIR *dir); -#------------------------------------------------------------------------------ -.globl _Gasketreaddir -_Gasketreaddir: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _readdir - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketclosedir (DIR *dir); -#------------------------------------------------------------------------------ -.globl _Gasketclosedir -_Gasketclosedir: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _closedir - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketstat (const char *path, struct stat *buf); -#------------------------------------------------------------------------------ -.globl _Gasketstat -_Gasketstat: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _stat - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketstatfs (const char *path, struct statfs *buf); -#------------------------------------------------------------------------------ -.globl _Gasketstatfs -_Gasketstatfs: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _statfs - leave - ret - - - - -#------------------------------------------------------------------------------ -# int Gasketrename (const char *oldpath, const char *newpath); -#------------------------------------------------------------------------------ -.globl _Gasketrename -_Gasketrename: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _rename - leave - ret - - - - -#------------------------------------------------------------------------------ -# time_t Gasketmktime (struct tm *tm); -#------------------------------------------------------------------------------ -.globl _Gasketmktime -_Gasketmktime: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _mktime - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketfsync (int fd); -#------------------------------------------------------------------------------ -.globl _Gasketfsync -_Gasketfsync: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _fsync - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketchmod (const char *path, mode_t mode); -#------------------------------------------------------------------------------ -.globl _Gasketchmod -_Gasketchmod: - pushl %ebp - movl %esp, %ebp - subl $56, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movw %ax, -12(%ebp) - movzwl -12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _chmod - leave - ret - -#------------------------------------------------------------------------------ -# int Gasketutime (const char *filename, const struct utimbuf *buf); -#------------------------------------------------------------------------------ -.globl _Gasketutime -_Gasketutime: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _rename - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gaskettcflush (int fildes, int queue_selector); -#------------------------------------------------------------------------------ -.globl _Gaskettcflush -_Gaskettcflush: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _rename - leave - ret - - -#------------------------------------------------------------------------------ -# EFI_STATUS UgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title); #------------------------------------------------------------------------------ -.globl _GasketUgaCreate -_GasketUgaCreate: - pushl %ebp - movl %esp, %ebp - subl $40, %esp #sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _UgaCreate +# int GasketVoid (void *api) +#------------------------------------------------------------------------------ +.globl _GasketVoid +_GasketVoid: + pushl %ebp + movl %esp, %ebp + subl $34, %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 -12(%ebp), %eax + call *%eax leave ret - -#------------------------------------------------------------------------------ -# void Gasketperror (__const char *__s); -#------------------------------------------------------------------------------ -.globl _Gasketperror -_Gasketperror: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _perror - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketioctl (int fd, unsigned long int __request, ...); -# -# ... is really int or pointer to structure, so we can treat like an int -# -#------------------------------------------------------------------------------ -.globl _Gasketioctl -_Gasketioctl: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 16(%ebp), %eax - movl %eax, 8(%esp) - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _ioctl - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketfcntl (int __fd, int __cmd, ...); -# -# ... is really int or pointer to structure, so we can treat like an int -# -#------------------------------------------------------------------------------ -.globl _Gasketfcntl -_Gasketfcntl: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 16(%ebp), %eax - movl %eax, 8(%esp) - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _fcntl - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed); -#------------------------------------------------------------------------------ -.globl _Gasketcfsetispeed -_Gasketcfsetispeed: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _cfsetispeed - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed); -#------------------------------------------------------------------------------ -.globl _Gasketcfsetospeed -_Gasketcfsetospeed: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _cfsetospeed - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gaskettcgetattr (int __fd, struct termios *__termios_p); -#------------------------------------------------------------------------------ -.globl _Gaskettcgetattr -_Gaskettcgetattr: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _tcgetattr - leave - ret - - - -#------------------------------------------------------------------------------ -# int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p); -#------------------------------------------------------------------------------ -.globl _Gaskettcsetattr -_Gaskettcsetattr: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 16(%ebp), %eax - movl %eax, 8(%esp) - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _tcsetattr - leave - ret - #------------------------------------------------------------------------------ -# int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact); #------------------------------------------------------------------------------ -.globl _Gasketsigaction -_Gasketsigaction: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 16(%ebp), %eax - movl %eax, 8(%esp) - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _sigaction - leave - ret - +.globl _GasketUintn +_GasketUintn: + 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 12(%ebp), %eax + movl %eax, (%esp) + movl -12(%ebp), %eax + call *%eax + leave + ret #------------------------------------------------------------------------------ -# int Gasketsetcontext (const ucontext_t *ucp); #------------------------------------------------------------------------------ -.globl _Gasketsetcontext -_Gasketsetcontext: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _setcontext - leave - ret +.globl _GasketUintnUintn +_GasketUintnUintn: + 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 16(%ebp), %eax + movl %eax, 4(%esp) + movl 12(%ebp), %eax + movl %eax, (%esp) + movl -12(%ebp), %eax + call *%eax + leave + ret #------------------------------------------------------------------------------ -# int Gasketgetcontext (ucontext_t *ucp); #------------------------------------------------------------------------------ -.globl _Gasketgetcontext -_Gasketgetcontext: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _getcontext - leave - ret +.globl _GasketUintnUintnUintn +_GasketUintnUintnUintn: + 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 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 #------------------------------------------------------------------------------ -# int Gasketsigemptyset (sigset_t *set); #------------------------------------------------------------------------------ -.globl _Gasketsigemptyset -_Gasketsigemptyset: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _sigemptyset - leave - ret - +.globl _GasketUintnUintnUintnUintn +_GasketUintnUintnUintnUintn: + 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 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 #------------------------------------------------------------------------------ -# int Gasketsigaltstack (const stack_t *ss, stack_t *oss); #------------------------------------------------------------------------------ -.globl _Gasketsigaltstack -_Gasketsigaltstack: - pushl %ebp - movl %esp, %ebp - subl $40, %esp # sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _sigaltstack - leave - ret - -# -# -# UGA Functions that get exported -# -# +.globl _GasketUintn10Args +_GasketUintn10Args: + pushl %ebp + movl %esp, %ebp + subl $82, %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 48(%ebp), %eax + movl %eax, 36(%esp) + movl 44(%ebp), %eax + movl %eax, 32(%esp) + movl 40(%ebp), %eax + movl %eax, 28(%esp) + movl 36(%ebp), %eax + movl %eax, 24(%esp) + movl 32(%ebp), %eax + movl %eax, 20(%esp) + 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 -#------------------------------------------------------------------------------ -# EFI_STATUS GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo); -#------------------------------------------------------------------------------ -.globl _GasketUgaClose -_GasketUgaClose: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _UgaClose - leave - ret #------------------------------------------------------------------------------ -# EFI_STATUS GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height); -#------------------------------------------------------------------------------ -.globl _GasketUgaSize -_GasketUgaSize: - pushl %ebp - movl %esp, %ebp - subl $40, %esp - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 16(%ebp), %eax - movl %eax, 8(%esp) - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _UgaSize - leave - ret - - #------------------------------------------------------------------------------ -# EFI_STATUS GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo); -#------------------------------------------------------------------------------ -.globl _GasketUgaCheckKey -_GasketUgaCheckKey: - pushl %ebp - movl %esp, %ebp - subl $40, %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, (%esp) - call _UgaCheckKey - leave - ret +.globl _GasketUint64Uintn +_GasketUint64Uintn: + pushl %ebp + movl %esp, %ebp + subl $66, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, -32(%ebp) + movl 16(%ebp), %eax + movl %eax, -28(%ebp) + movl 8(%ebp), %eax + movl %eax, -12(%ebp) + movl 20(%ebp), %eax + movl %eax, 8(%esp) + movl -32(%ebp), %eax + movl -28(%ebp), %edx + movl %eax, (%esp) + movl %edx, 4(%esp) + movl -12(%ebp), %eax + call *%eax + leave + ret #------------------------------------------------------------------------------ -# EFI_STATUS GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key); #------------------------------------------------------------------------------ -.globl _GasketUgaGetKey -_GasketUgaGetKey: - pushl %ebp - movl %esp, %ebp - subl $40, %esp #sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _UgaGetKey +.globl _GasketUintnUint64Uintn +_GasketUintnUint64Uintn: + pushl %ebp + movl %esp, %ebp + subl $66, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 16(%ebp), %eax + movl %eax, -32(%ebp) + movl 20(%ebp), %eax + movl %eax, -28(%ebp) + movl 8(%ebp), %eax + movl %eax, -12(%ebp) + movl 24(%ebp), %eax + movl %eax, 12(%esp) + movl -32(%ebp), %eax + movl -28(%ebp), %edx + movl %eax, 4(%esp) + movl %edx, 8(%esp) + movl 12(%ebp), %eax + movl %eax, (%esp) + movl -12(%ebp), %eax + call *%eax leave ret - #------------------------------------------------------------------------------ -# EFI_STATUS -# 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 -# ); #------------------------------------------------------------------------------ -.globl _GasketUgaBlt -_GasketUgaBlt: - pushl %ebp - movl %esp, %ebp - subl $88, %esp #sub extra 0x10 from the stack for the AND - and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call - movl $0, -12(%ebp) - movl 44(%ebp), %eax - movl %eax, 36(%esp) - movl 40(%ebp), %eax - movl %eax, 32(%esp) - movl 36(%ebp), %eax - movl %eax, 28(%esp) - movl 32(%ebp), %eax - movl %eax, 24(%esp) - movl 28(%ebp), %eax - movl %eax, 20(%esp) - movl 24(%ebp), %eax - movl %eax, 16(%esp) - movl 20(%ebp), %eax - movl %eax, 12(%esp) - movl 16(%ebp), %eax - movl %eax, 8(%esp) - movl 12(%ebp), %eax - movl %eax, 4(%esp) - movl 8(%ebp), %eax - movl %eax, (%esp) - call _UgaBlt - leave - ret +.globl _GasketUintnUint16 +_GasketUintnUint16: + pushl %ebp + movl %esp, %ebp + subl $66, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 16(%ebp), %eax + movw %ax, -28(%ebp) + movl 8(%ebp), %eax + movl %eax, -12(%ebp) + movzwl -28(%ebp), %eax + movl %eax, 4(%esp) + movl 12(%ebp), %eax + movl %eax, (%esp) + movl -12(%ebp), %eax + call *%eax + leave + ret + .subsections_via_symbols diff --git a/UnixPkg/Sec/Ia32/GasketTemplate.c b/UnixPkg/Sec/Ia32/GasketTemplate.c new file mode 100644 index 0000000000..3b88135a58 --- /dev/null +++ b/UnixPkg/Sec/Ia32/GasketTemplate.c @@ -0,0 +1,142 @@ +/** @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. You still have to add the extra stack alignment code to + the assembly functions. + +Copyright (c) 2006 - 2009, Intel Corporation
+Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.
+All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + + +#include +#include + +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 UINT32 UINTN; + + +typedef int (*GASKET_VOID) (); +typedef int (*GASKET_UINTN) (UINTN); +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); +typedef int (*GASKET_UINTN_10ARGS) (UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN); +typedef int (*GASKET_UINT64_UINTN) (UINT64, UINTN); +typedef UINT64 (*GASKET_UINTN_UINT64_UINTN) (UINTN, UINT64, UINTN); +typedef int (*GASKET_UINTN_UINT16) (UINTN, UINT16); + +int GasketVoid (void *api); +int GasketUintn (void *api, UINTN a); +int GasketUintnUintn (void *api, UINTN a, UINTN b); +int GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c); +int GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d); +int GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j); +int GasketUint64Uintn (void *api, UINT64 a, UINTN b); +UINT64 GasketUintnUiny64Uintn (void *api, UINTN a, UINT64 b, UINTN c); +int GasketUintnUint16 (void *api, UINTN a, UINT16 b); + + + +int +GasketVoid (void *api) +{ + GASKET_VOID func; + + func = (GASKET_VOID)api; + return func (); +} + +int +GasketUintn (void *api, UINTN a) +{ + GASKET_UINTN func; + + func = (GASKET_UINTN)api; + return func (a); +} + +int +GasketUintnUintn (void *api, UINTN a, UINTN b) +{ + GASKET_UINTN_UINTN func; + + func = (GASKET_UINTN_UINTN)api; + return func (a, b); +} + + +int +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); +} + +int +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); +} + +int +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); +} + + +int +GasketUint64Uintn (void *api, UINT64 a, UINTN b) +{ + GASKET_UINT64_UINTN func; + + func = (GASKET_UINT64_UINTN)api; + return func (a, b); +} + +UINT64 +GasketUintnUiny64Uintn (void *api, UINTN a, UINT64 b, UINTN c) +{ + GASKET_UINTN_UINT64_UINTN func; + + func = (GASKET_UINTN_UINT64_UINTN)api; + return func (a, b, c); +} + +int +GasketUintnUint16 (void *api, UINTN a, UINT16 b) +{ + GASKET_UINTN_UINT16 func; + + func = (GASKET_UINTN_UINT16)api; + return func (a, b); +} + + + -- cgit v1.2.3