mirror of https://github.com/acidanthera/audk.git
984 lines
29 KiB
ArmAsm
984 lines
29 KiB
ArmAsm
|
#------------------------------------------------------------------------------
|
||
|
#
|
||
|
# 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 <stdio.h>
|
||
|
##include <sys/stat.h>
|
||
|
#
|
||
|
#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 <ProcessorBind.h>
|
||
|
|
||
|
.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
|
||
|
|