#------------------------------------------------------------------------------ # # 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. # # 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 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 #------------------------------------------------------------------------------ # 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 #------------------------------------------------------------------------------ # 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 #------------------------------------------------------------------------------ # 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 #------------------------------------------------------------------------------ # 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 # # #------------------------------------------------------------------------------ # 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 #------------------------------------------------------------------------------ # 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 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