mirror of
https://github.com/acidanthera/audk.git
synced 2025-04-08 17:05:09 +02:00
Add Sec/Ia32/Gasket.S
Remove unreferenced Stack.S git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9195 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
ccd55824e7
commit
6156fca14d
983
UnixPkg/Sec/Ia32/Gasket.S
Normal file
983
UnixPkg/Sec/Ia32/Gasket.S
Normal file
@ -0,0 +1,983 @@
|
||||
#------------------------------------------------------------------------------
|
||||
#
|
||||
# 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
|
||||
|
@ -1,92 +0,0 @@
|
||||
#------------------------------------------------------------------------------
|
||||
#
|
||||
# Copyright (c) 2008, Intel Corporation
|
||||
# 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.
|
||||
#
|
||||
# Module Name:
|
||||
#
|
||||
# Stack.asm
|
||||
#
|
||||
# Abstract:
|
||||
#
|
||||
# Switch the stack from temporary memory to permenent memory.
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# VOID
|
||||
# EFIAPI
|
||||
# SecSwitchStack (
|
||||
# UINT32 TemporaryMemoryBase,
|
||||
# UINT32 PermenentMemoryBase
|
||||
# );
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
#include <ProcessorBind.h>
|
||||
|
||||
ASM_GLOBAL ASM_PFX(SecSwitchStack)
|
||||
ASM_PFX(SecSwitchStack):
|
||||
#
|
||||
# Save three register: eax, ebx, ecx
|
||||
#
|
||||
push %eax
|
||||
push %ebx
|
||||
push %ecx
|
||||
push %edx
|
||||
|
||||
#
|
||||
# !!CAUTION!! this function address's is pushed into stack after
|
||||
# migration of whole temporary memory, so need save it to permenent
|
||||
# memory at first!
|
||||
#
|
||||
|
||||
movl 20(%esp), %ebx # Save the first parameter
|
||||
movl 24(%esp), %ecx # Save the second parameter
|
||||
|
||||
#
|
||||
# Save this function's return address into permenent memory at first.
|
||||
# Then, Fixup the esp point to permenent memory
|
||||
#
|
||||
|
||||
movl %esp, %eax
|
||||
subl %ebx, %eax
|
||||
addl %ecx, %eax
|
||||
movl (%esp), %edx # copy pushed register's value to permenent memory
|
||||
movl %edx, (%eax)
|
||||
movl 4(%esp), %edx
|
||||
movl %edx, 4(%eax)
|
||||
movl 8(%esp), %edx
|
||||
movl %edx, 8(%eax)
|
||||
movl 12(%esp), %edx
|
||||
movl %edx, 12(%eax)
|
||||
movl 16(%esp), %edx
|
||||
movl %edx, 16(%eax)
|
||||
movl %eax, %esp # From now, esp is pointed to permenent memory
|
||||
|
||||
#
|
||||
# Fixup the ebp point to permenent memory
|
||||
#
|
||||
movl %ebp, %eax
|
||||
subl %ebx, %eax
|
||||
addl %ecx, %eax
|
||||
movl %eax, %ebp # From now, ebp is pointed to permenent memory
|
||||
|
||||
#
|
||||
# Fixup callee's ebp point for PeiDispatch
|
||||
#
|
||||
movl (%ebp), %eax
|
||||
subl %ebx, %eax
|
||||
addl %ecx, %eax
|
||||
movl %eax, (%ebp) # From now, Temporary's PPI caller's stack is in permenent memory
|
||||
|
||||
pop %edx
|
||||
pop %ecx
|
||||
pop %ebx
|
||||
pop %eax
|
||||
ret
|
Loading…
x
Reference in New Issue
Block a user