diff options
Diffstat (limited to 'UnixPkg/Sec')
-rw-r--r-- | UnixPkg/Sec/Gasket.c | 418 | ||||
-rw-r--r-- | UnixPkg/Sec/Gasket.h | 141 | ||||
-rw-r--r-- | UnixPkg/Sec/Ia32/Gasket.S | 1128 | ||||
-rw-r--r-- | UnixPkg/Sec/Ia32/GasketTemplate.c | 142 | ||||
-rw-r--r-- | UnixPkg/Sec/SecMain.c | 35 | ||||
-rw-r--r-- | UnixPkg/Sec/SecMain.h | 37 | ||||
-rw-r--r-- | UnixPkg/Sec/SecMain.inf | 4 | ||||
-rw-r--r-- | UnixPkg/Sec/UgaX11.c | 33 | ||||
-rw-r--r-- | UnixPkg/Sec/UnixThunk.c | 74 | ||||
-rw-r--r-- | UnixPkg/Sec/X64/Gasket.S | 1026 |
10 files changed, 1980 insertions, 1058 deletions
diff --git a/UnixPkg/Sec/Gasket.c b/UnixPkg/Sec/Gasket.c new file mode 100644 index 0000000000..30f06a2479 --- /dev/null +++ b/UnixPkg/Sec/Gasket.c @@ -0,0 +1,418 @@ +
+#include "SecMain.h"
+#include "Gasket.h"
+
+//
+// Gasket functions for EFI_UNIX_THUNK_PROTOCOL
+//
+
+void
+GasketmsSleep (unsigned long Milliseconds)
+{
+ GasketUintn (msSleep, Milliseconds);
+ return;
+}
+
+void
+Gasketexit (int status)
+{
+ GasketUintn (exit, status);
+ return;
+}
+
+
+void
+GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs))
+{
+ GasketUint64Uintn (SetTimer, PeriodMs, (UINTN)CallBack);
+ return;
+}
+
+
+void
+GasketGetLocalTime (EFI_TIME *Time)
+{
+ GasketUintn (GetLocalTime, (UINTN)Time);
+ return;
+}
+
+
+struct tm *
+Gasketgmtime (const time_t *clock)
+{
+ return (struct tm *)(UINTN)GasketUintn (localtime, (UINTN)clock);
+}
+
+
+long
+GasketGetTimeZone (void)
+{
+ return GasketVoid (GetTimeZone);
+}
+
+
+int
+GasketGetDayLight (void)
+{
+ return GasketVoid (GetDayLight);
+}
+
+
+int
+Gasketpoll (struct pollfd *pfd, int nfds, int timeout)
+{
+ return GasketUintnUintnUintn (poll, (UINTN)pfd, nfds, timeout);
+}
+
+
+int
+Gasketread (int fd, void *buf, int count)
+{
+ return GasketUintnUintnUintn (read, fd, (UINTN)buf, count);
+}
+
+
+int
+Gasketwrite (int fd, const void *buf, int count)
+{
+ return GasketUintnUintnUintn (write, fd, (UINTN)buf, count);
+}
+
+
+char *
+Gasketgetenv (const char *name)
+{
+ return (char *)(UINTN)GasketUintn (getenv, (UINTN)name);
+}
+
+
+int
+Gasketopen (const char *name, int flags, int mode)
+{
+ return GasketUintnUintnUintn (open, (UINTN)name, flags, mode);
+}
+
+
+off_t
+Gasketlseek (int fd, off_t off, int whence)
+{
+ if (sizeof off == 8) {
+ return GasketUintnUint64Uintn (lseek, fd, off, whence);
+ } else if (sizeof off == 4) {
+ return GasketUintnUintnUintn (lseek, fd, off, whence);
+ }
+}
+
+
+int
+Gasketftruncate (int fd, long int len)
+{
+ return GasketUintnUintn (ftruncate, fd, len);
+}
+
+
+int
+Gasketclose (int fd)
+{
+ return GasketUintn (close, fd);
+}
+
+
+int
+Gasketmkdir (const char *pathname, mode_t mode)
+{
+ return GasketUintnUint16 (mkdir, (UINTN)pathname, mode);
+}
+
+
+int
+Gasketrmdir (const char *pathname)
+{
+ return GasketUintn (rmdir, (UINTN)pathname);
+}
+
+
+int
+Gasketunlink (const char *pathname)
+{
+ return GasketUintn (unlink, (UINTN)pathname);
+}
+
+
+int
+GasketGetErrno (void)
+{
+ return GasketVoid (GetErrno);
+}
+
+
+DIR *
+Gasketopendir (const char *pathname)
+{
+ return (DIR *)(UINTN)GasketUintn (opendir, (UINTN)pathname);
+}
+
+
+void *
+Gasketrewinddir (DIR *dir)
+{
+ return (void *)(UINTN)GasketUintn (rewinddir, (UINTN)dir);
+}
+
+
+struct dirent *
+Gasketreaddir (DIR *dir)
+{
+ return (struct dirent *)(UINTN)GasketUintn (readdir, (UINTN)dir);
+}
+
+
+int
+Gasketclosedir (DIR *dir)
+{
+ return GasketUintn (closedir, (UINTN)dir);
+}
+
+
+int
+Gasketstat (const char *path, STAT_FIX *buf)
+{
+ return GasketUintnUintn (stat, (UINTN)path, (UINTN)buf);
+}
+
+
+int
+Gasketstatfs (const char *path, struct statfs *buf)
+{
+ return GasketUintnUintn (statfs, (UINTN)path, (UINTN)buf);
+}
+
+
+int
+Gasketrename (const char *oldpath, const char *newpath)
+{
+ return GasketUintnUintn (rename, (UINTN)oldpath, (UINTN)newpath);
+}
+
+
+time_t
+Gasketmktime (struct tm *tm)
+{
+ return GasketUintn (mktime, (UINTN)tm);
+}
+
+
+int
+Gasketfsync (int fd)
+{
+ return GasketUintn (fsync, fd);
+}
+
+
+int
+Gasketchmod (const char *path, mode_t mode)
+{
+ return GasketUintnUint16 (chmod, (UINTN)path, mode);
+}
+
+
+int
+Gasketutime (const char *filename, const struct utimbuf *buf)
+{
+ return GasketUintnUintn (utime, (UINTN)filename, (UINTN)buf);
+}
+
+
+int
+Gaskettcflush (int fildes, int queue_selector)
+{
+ return GasketUintnUintn (tcflush, fildes, queue_selector);
+}
+
+
+EFI_STATUS
+GasketUgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title)
+{
+ return GasketUintnUintn (UgaCreate, (UINTN)UgaIo, (UINTN)Title);
+}
+
+
+void
+Gasketperror (__const char *__s)
+{
+ GasketUintn (perror, (UINTN)__s);
+ return;
+}
+
+
+
+//
+// ... is always an int or pointer to device specific data structure
+//
+int
+Gasketioctl (int fd, unsigned long int __request, ...)
+{
+ VA_LIST Marker;
+
+ VA_START (Marker, __request);
+ return GasketUintnUintnUintn (ioctl, fd, __request, VA_ARG (Marker, UINTN));
+}
+
+
+int
+Gasketfcntl (int __fd, int __cmd, ...)
+{
+ VA_LIST Marker;
+
+ VA_START (Marker, __cmd);
+ return GasketUintnUintnUintn (fcntl, __fd, __cmd, VA_ARG (Marker, UINTN));
+}
+
+
+
+int
+Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed)
+{
+ return GasketUintnUintn (cfsetispeed, (UINTN)__termios_p, __speed);
+}
+
+
+int
+Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed)
+{
+ return GasketUintnUintn (cfsetospeed, (UINTN)__termios_p, __speed);
+}
+
+
+int
+Gaskettcgetattr (int __fd, struct termios *__termios_p)
+{
+ return GasketUintnUintn (tcgetattr, __fd, (UINTN)__termios_p);
+}
+
+
+int
+Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p)
+{
+ return GasketUintnUintnUintn (tcsetattr, __fd, __optional_actions, (UINTN)__termios_p);
+}
+
+
+int
+Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact)
+{
+ return GasketUintnUintn (sigaction, (UINTN)act, (UINTN)oact);
+}
+
+
+int
+Gasketsetcontext (const ucontext_t *ucp)
+{
+ return GasketUintn (setcontext, (UINTN)ucp);
+}
+
+
+int
+Gasketgetcontext (ucontext_t *ucp)
+{
+ return GasketUintn (getcontext, (UINTN)ucp);
+}
+
+
+int
+Gasketsigemptyset (sigset_t *set)
+{
+ return GasketUintn (sigemptyset, (UINTN)set);
+}
+
+
+int
+Gasketsigaltstack (const stack_t *ss, stack_t *oss)
+{
+ return GasketUintnUintn (sigaltstack, (UINTN)ss, (UINTN)oss);
+}
+
+
+
+RETURN_STATUS
+GasketUnixPeCoffGetEntryPoint (
+ IN VOID *Pe32Data,
+ IN OUT VOID **EntryPoint
+ )
+{
+ return GasketUintnUintn (SecPeCoffGetEntryPoint, (UINTN)Pe32Data, (UINTN)EntryPoint);
+}
+
+
+
+VOID
+GasketUnixPeCoffRelocateImageExtraAction (
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
+ )
+{
+ GasketUintn (SecPeCoffRelocateImageExtraAction, (UINTN)ImageContext);
+ return;
+}
+
+
+
+VOID
+GasketPeCoffLoaderUnloadImageExtraAction (
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
+ )
+{
+ GasketUintn (SecPeCoffLoaderUnloadImageExtraAction, (UINTN)ImageContext);
+ return;
+}
+
+
+//
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
+//
+
+EFI_STATUS
+EFIAPI
+GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
+{
+ return GasketUintn (UgaClose, (UINTN)UgaIo);
+}
+
+EFI_STATUS
+EFIAPI
+GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height)
+{
+ return GasketUintnUintnUintn (UgaSize, (UINTN)UgaIo, Width, Height);
+}
+
+EFI_STATUS
+EFIAPI
+GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
+{
+ return GasketUintn (UgaCheckKey, (UINTN)UgaIo);
+}
+
+EFI_STATUS
+EFIAPI
+GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key)
+{
+ return GasketUintnUintn (UgaGetKey, (UINTN)UgaIo, (UINTN)key);
+}
+
+EFI_STATUS
+EFIAPI
+GasketUgaBlt (
+ EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
+ IN EFI_UGA_BLT_OPERATION BltOperation,
+ IN UINTN SourceX,
+ IN UINTN SourceY,
+ IN UINTN DestinationX,
+ IN UINTN DestinationY,
+ IN UINTN Width,
+ IN UINTN Height,
+ IN UINTN Delta OPTIONAL
+ )
+{
+ return GasketUintn10Args (UgaBlt, (UINTN)UgaIo, (UINTN)BltBuffer, BltOperation, SourceX, SourceY, DestinationX, DestinationY, Width, Height, Delta);
+}
+
diff --git a/UnixPkg/Sec/Gasket.h b/UnixPkg/Sec/Gasket.h new file mode 100644 index 0000000000..8343de7feb --- /dev/null +++ b/UnixPkg/Sec/Gasket.h @@ -0,0 +1,141 @@ +
+#ifndef _GASKET_H_
+#define _GASKET_H_
+
+#include <Library/PeCoffLib.h>
+
+#include <Protocol/UgaDraw.h>
+#include <Protocol/SimpleTextIn.h>
+#include <Protocol/UnixUgaIo.h>
+
+
+//
+// Gasket functions for EFI_UNIX_THUNK_PROTOCOL
+//
+
+void GasketmsSleep (unsigned long Milliseconds);
+void Gasketexit (int status);
+void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
+void GasketGetLocalTime (EFI_TIME *Time);
+struct tm *Gasketgmtime (const time_t *clock);
+long GasketGetTimeZone (void);
+int GasketGetDayLight (void);
+int Gasketpoll (struct pollfd *pfd, int nfds, int timeout);
+int Gasketread (int fd, void *buf, int count);
+int Gasketwrite (int fd, const void *buf, int count);
+char *Gasketgetenv (const char *name);
+int Gasketopen (const char *name, int flags, int mode);
+off_t Gasketlseek (int fd, off_t off, int whence);
+int Gasketftruncate (int fd, long int len);
+int Gasketclose (int fd);
+int Gasketmkdir (const char *pathname, mode_t mode);
+int Gasketrmdir (const char *pathname);
+int Gasketunlink (const char *pathname);
+int GasketGetErrno (void);
+DIR *Gasketopendir (const char *pathname);
+void *Gasketrewinddir (DIR *dir);
+struct dirent *Gasketreaddir (DIR *dir);
+int Gasketclosedir (DIR *dir);
+int Gasketstat (const char *path, STAT_FIX *buf);
+int Gasketstatfs (const char *path, struct statfs *buf);
+int Gasketrename (const char *oldpath, const char *newpath);
+time_t Gasketmktime (struct tm *tm);
+int Gasketfsync (int fd);
+int Gasketchmod (const char *path, mode_t mode);
+int Gasketutime (const char *filename, const struct utimbuf *buf);
+int Gaskettcflush (int fildes, int queue_selector);
+EFI_STATUS GasketUgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);
+void Gasketperror (__const char *__s);
+
+//
+// ... is always an int or pointer to device specific data structure
+//
+int Gasketioctl (int fd, unsigned long int __request, ...);
+int Gasketfcntl (int __fd, int __cmd, ...);
+
+int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);
+int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);
+int Gaskettcgetattr (int __fd, struct termios *__termios_p);
+int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);
+int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);
+int Gasketsetcontext (const ucontext_t *ucp);
+int Gasketgetcontext (ucontext_t *ucp);
+int Gasketsigemptyset (sigset_t *set);
+int Gasketsigaltstack (const stack_t *ss, stack_t *oss);
+
+RETURN_STATUS
+GasketUnixPeCoffGetEntryPoint (
+ IN VOID *Pe32Data,
+ IN OUT VOID **EntryPoint
+ );
+
+VOID
+GasketUnixPeCoffRelocateImageExtraAction (
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
+ );
+
+VOID
+GasketPeCoffLoaderUnloadImageExtraAction (
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
+ );
+
+
+int GasketVoid (void *api);
+int GasketUintn (void *api, UINTN a);
+int GasketUintnUintn (void *api, UINTN a, UINTN b);
+int GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c);
+int GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d);
+int GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j);
+int GasketUint64Uintn (void *api, UINT64 a, UINTN b);
+UINT64 GasketUintnUint64Uintn (void *api, UINTN a, UINT64 b, UINTN c);
+int GasketUintnUint16 (void *api, UINTN a, UINT16 b);
+
+
+//
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
+//
+
+EFI_STATUS EFIAPI GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+EFI_STATUS EFIAPI GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
+EFI_STATUS EFIAPI GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+EFI_STATUS EFIAPI GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
+EFI_STATUS EFIAPI GasketUgaBlt (
+ EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
+ IN EFI_UGA_BLT_OPERATION BltOperation,
+ IN UINTN SourceX,
+ IN UINTN SourceY,
+ IN UINTN DestinationX,
+ IN UINTN DestinationY,
+ IN UINTN Width,
+ IN UINTN Height,
+ IN UINTN Delta OPTIONAL
+ );
+
+EFI_STATUS UgaCreate (EFI_UNIX_UGA_IO_PROTOCOL **Uga, CONST CHAR16 *Title);
+
+
+//
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
+//
+EFI_STATUS UgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+EFI_STATUS UgaSize(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
+EFI_STATUS UgaCheckKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+EFI_STATUS UgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
+EFI_STATUS UgaBlt (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
+ );
+
+
+
+#endif
+
+
diff --git a/UnixPkg/Sec/Ia32/Gasket.S b/UnixPkg/Sec/Ia32/Gasket.S index 80d033675c..77e8296b0b 100644 --- a/UnixPkg/Sec/Ia32/Gasket.S +++ b/UnixPkg/Sec/Ia32/Gasket.S @@ -1,5 +1,21 @@ #------------------------------------------------------------------------------
#
+# OS X Application requires 16 byte stack alignment. The problem is these
+# APIs are exposed to code that does not have this requirement via
+# EFI_UNIX_THUNK_PROTOCOL. So these are wrapper functions that make sure
+# the stack is aligned. This code should also work if the stack is already
+# aligned. Extra stack padding is really the same as local varaibles so
+# it gets freed by the leave instruction
+#
+# I basically used the compiler, added extra 16 bytes to the local stack and
+# made sure %esp ended in 0 before the call (16 byte algined)
+#
+# The EFI_UNIX_THUNK_PROTOCOL member functions call a C API that then calls
+# one of these generic assembly routines. We do it that way to work around
+# some magic name changing that happens in C. For example stat() is _stat()
+# on Leopard and _stat$INDOE64 on Snow Leopard. That is why we pass stat()
+# into one of these gaskets from C code.
+#
# Copyright (c) 2008 - 2009 Apple Inc. All rights reserved.
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
@@ -9,975 +25,213 @@ # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
-# Abstract:
-#
-# OS X Application requires 16 byte stack alignment. The problem is these
-# APIs are exposed to code that does not have this requirement via
-# EFI_UNIX_THUNK_PROTOCOL. So these are wrapper functions that make sure
-# the stack is aligned. This code should also work if the stack is already
-# aligned. Extra stack padding is really the same as local varaibles so
-# it gets freed by the leave instruction
-#
-# I basically used the compiler, added extra 16 bytes to the local stack and
-# made sure %esp ended in 0 before the call (16 byte algined)
-#
-# cat t.c
-##include <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
+# int GasketVoid (void *api)
+#------------------------------------------------------------------------------
+.globl _GasketVoid
+_GasketVoid:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $34, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl -12(%ebp), %eax
+ call *%eax
leave
ret
-
-#------------------------------------------------------------------------------
-# void Gasketperror (__const char *__s);
-#------------------------------------------------------------------------------
-.globl _Gasketperror
-_Gasketperror:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _perror
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketioctl (int fd, unsigned long int __request, ...);
-#
-# ... is really int or pointer to structure, so we can treat like an int
-#
-#------------------------------------------------------------------------------
-.globl _Gasketioctl
-_Gasketioctl:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _ioctl
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketfcntl (int __fd, int __cmd, ...);
-#
-# ... is really int or pointer to structure, so we can treat like an int
-#
-#------------------------------------------------------------------------------
-.globl _Gasketfcntl
-_Gasketfcntl:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _fcntl
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);
-#------------------------------------------------------------------------------
-.globl _Gasketcfsetispeed
-_Gasketcfsetispeed:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _cfsetispeed
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);
-#------------------------------------------------------------------------------
-.globl _Gasketcfsetospeed
-_Gasketcfsetospeed:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _cfsetospeed
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gaskettcgetattr (int __fd, struct termios *__termios_p);
-#------------------------------------------------------------------------------
-.globl _Gaskettcgetattr
-_Gaskettcgetattr:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _tcgetattr
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);
-#------------------------------------------------------------------------------
-.globl _Gaskettcsetattr
-_Gaskettcsetattr:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _tcsetattr
- leave
- ret
-
#------------------------------------------------------------------------------
-# int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);
#------------------------------------------------------------------------------
-.globl _Gasketsigaction
-_Gasketsigaction:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _sigaction
- leave
- ret
-
+.globl _GasketUintn
+_GasketUintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $50, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# int Gasketsetcontext (const ucontext_t *ucp);
#------------------------------------------------------------------------------
-.globl _Gasketsetcontext
-_Gasketsetcontext:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _setcontext
- leave
- ret
+.globl _GasketUintnUintn
+_GasketUintnUintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $50, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# int Gasketgetcontext (ucontext_t *ucp);
#------------------------------------------------------------------------------
-.globl _Gasketgetcontext
-_Gasketgetcontext:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _getcontext
- leave
- ret
+.globl _GasketUintnUintnUintn
+_GasketUintnUintnUintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $50, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# int Gasketsigemptyset (sigset_t *set);
#------------------------------------------------------------------------------
-.globl _Gasketsigemptyset
-_Gasketsigemptyset:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _sigemptyset
- leave
- ret
-
+.globl _GasketUintnUintnUintnUintn
+_GasketUintnUintnUintnUintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $50, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 24(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# int Gasketsigaltstack (const stack_t *ss, stack_t *oss);
#------------------------------------------------------------------------------
-.globl _Gasketsigaltstack
-_Gasketsigaltstack:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _sigaltstack
- leave
- ret
-
-#
-#
-# UGA Functions that get exported
-#
-#
+.globl _GasketUintn10Args
+_GasketUintn10Args:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $82, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 48(%ebp), %eax
+ movl %eax, 36(%esp)
+ movl 44(%ebp), %eax
+ movl %eax, 32(%esp)
+ movl 40(%ebp), %eax
+ movl %eax, 28(%esp)
+ movl 36(%ebp), %eax
+ movl %eax, 24(%esp)
+ movl 32(%ebp), %eax
+ movl %eax, 20(%esp)
+ movl 28(%ebp), %eax
+ movl %eax, 16(%esp)
+ movl 24(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
-#------------------------------------------------------------------------------
-# EFI_STATUS GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
-#------------------------------------------------------------------------------
-.globl _GasketUgaClose
-_GasketUgaClose:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaClose
- leave
- ret
#------------------------------------------------------------------------------
-# EFI_STATUS GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
-#------------------------------------------------------------------------------
-.globl _GasketUgaSize
-_GasketUgaSize:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaSize
- leave
- ret
-
-
#------------------------------------------------------------------------------
-# EFI_STATUS GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
-#------------------------------------------------------------------------------
-.globl _GasketUgaCheckKey
-_GasketUgaCheckKey:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaCheckKey
- leave
- ret
+.globl _GasketUint64Uintn
+_GasketUint64Uintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $66, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, -32(%ebp)
+ movl 16(%ebp), %eax
+ movl %eax, -28(%ebp)
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl -32(%ebp), %eax
+ movl -28(%ebp), %edx
+ movl %eax, (%esp)
+ movl %edx, 4(%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# EFI_STATUS GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
#------------------------------------------------------------------------------
-.globl _GasketUgaGetKey
-_GasketUgaGetKey:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp #sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaGetKey
+.globl _GasketUintnUint64Uintn
+_GasketUintnUint64Uintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $66, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, -32(%ebp)
+ movl 20(%ebp), %eax
+ movl %eax, -28(%ebp)
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 24(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl -32(%ebp), %eax
+ movl -28(%ebp), %edx
+ movl %eax, 4(%esp)
+ movl %edx, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
leave
ret
-
#------------------------------------------------------------------------------
-# EFI_STATUS
-# GasketUgaBlt(
-# EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
-# IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
-# IN EFI_UGA_BLT_OPERATION BltOperation,
-# IN UINTN SourceX,
-# IN UINTN SourceY,
-# IN UINTN DestinationX,
-# IN UINTN DestinationY,
-# IN UINTN Width,
-# IN UINTN Height,
-# IN UINTN Delta OPTIONAL
-# );
#------------------------------------------------------------------------------
-.globl _GasketUgaBlt
-_GasketUgaBlt:
- pushl %ebp
- movl %esp, %ebp
- subl $88, %esp #sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl $0, -12(%ebp)
- movl 44(%ebp), %eax
- movl %eax, 36(%esp)
- movl 40(%ebp), %eax
- movl %eax, 32(%esp)
- movl 36(%ebp), %eax
- movl %eax, 28(%esp)
- movl 32(%ebp), %eax
- movl %eax, 24(%esp)
- movl 28(%ebp), %eax
- movl %eax, 20(%esp)
- movl 24(%ebp), %eax
- movl %eax, 16(%esp)
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaBlt
- leave
- ret
+.globl _GasketUintnUint16
+_GasketUintnUint16:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $66, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movw %ax, -28(%ebp)
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movzwl -28(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
+ .subsections_via_symbols
diff --git a/UnixPkg/Sec/Ia32/GasketTemplate.c b/UnixPkg/Sec/Ia32/GasketTemplate.c new file mode 100644 index 0000000000..3b88135a58 --- /dev/null +++ b/UnixPkg/Sec/Ia32/GasketTemplate.c @@ -0,0 +1,142 @@ +/** @file + Template file used to create Gasket.S + + This file is built on the command line via gcc GasketTemplate.c -S + and it will create GasketTemplate.s and this was used to create + Gasket.S. You still have to add the extra stack alignment code to + the assembly functions. + +Copyright (c) 2006 - 2009, Intel Corporation<BR> +Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR> +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + + +#include <stdint.h> +#include <sys/stat.h> + +typedef int8_t INT8; +typedef uint8_t UINT8; +typedef int16_t INT16; +typedef uint16_t UINT16; +typedef int32_t INT32; +typedef uint32_t UINT32; +typedef int64_t INT64; +typedef uint64_t UINT64; +typedef UINT32 UINTN; + + +typedef int (*GASKET_VOID) (); +typedef int (*GASKET_UINTN) (UINTN); +typedef int (*GASKET_UINTN_UINTN) (UINTN, UINTN); +typedef int (*GASKET_UINTN_UINTN_UINTN) (UINTN, UINTN, UINTN); +typedef int (*GASKET_UINTN_UINTN_UINTN_UINTN) (UINTN, UINTN, UINTN, UINTN); +typedef int (*GASKET_UINTN_10ARGS) (UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN); +typedef int (*GASKET_UINT64_UINTN) (UINT64, UINTN); +typedef UINT64 (*GASKET_UINTN_UINT64_UINTN) (UINTN, UINT64, UINTN); +typedef int (*GASKET_UINTN_UINT16) (UINTN, UINT16); + +int GasketVoid (void *api); +int GasketUintn (void *api, UINTN a); +int GasketUintnUintn (void *api, UINTN a, UINTN b); +int GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c); +int GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d); +int GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j); +int GasketUint64Uintn (void *api, UINT64 a, UINTN b); +UINT64 GasketUintnUiny64Uintn (void *api, UINTN a, UINT64 b, UINTN c); +int GasketUintnUint16 (void *api, UINTN a, UINT16 b); + + + +int +GasketVoid (void *api) +{ + GASKET_VOID func; + + func = (GASKET_VOID)api; + return func (); +} + +int +GasketUintn (void *api, UINTN a) +{ + GASKET_UINTN func; + + func = (GASKET_UINTN)api; + return func (a); +} + +int +GasketUintnUintn (void *api, UINTN a, UINTN b) +{ + GASKET_UINTN_UINTN func; + + func = (GASKET_UINTN_UINTN)api; + return func (a, b); +} + + +int +GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c) +{ + GASKET_UINTN_UINTN_UINTN func; + + func = (GASKET_UINTN_UINTN_UINTN)api; + return func (a, b, c); +} + +int +GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d) +{ + GASKET_UINTN_UINTN_UINTN_UINTN func; + + func = (GASKET_UINTN_UINTN_UINTN_UINTN)api; + return func (a, b, c, d); +} + +int +GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j) +{ + GASKET_UINTN_10ARGS func; + + func = (GASKET_UINTN_10ARGS)api; + return func (a, b, c, d, e, f, g, h, i, j); +} + + +int +GasketUint64Uintn (void *api, UINT64 a, UINTN b) +{ + GASKET_UINT64_UINTN func; + + func = (GASKET_UINT64_UINTN)api; + return func (a, b); +} + +UINT64 +GasketUintnUiny64Uintn (void *api, UINTN a, UINT64 b, UINTN c) +{ + GASKET_UINTN_UINT64_UINTN func; + + func = (GASKET_UINTN_UINT64_UINTN)api; + return func (a, b, c); +} + +int +GasketUintnUint16 (void *api, UINTN a, UINT16 b) +{ + GASKET_UINTN_UINT16 func; + + func = (GASKET_UINTN_UINT16)api; + return func (a, b); +} + + + diff --git a/UnixPkg/Sec/SecMain.c b/UnixPkg/Sec/SecMain.c index 98a7a4db9d..da19a4b134 100644 --- a/UnixPkg/Sec/SecMain.c +++ b/UnixPkg/Sec/SecMain.c @@ -89,7 +89,6 @@ EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = { &mSecTemporaryRamSupportPpi }, { - EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, &gUnixFwhPpiGuid, &mSecFwhInformationPpi @@ -142,6 +141,7 @@ MapFile ( IN OUT EFI_PHYSICAL_ADDRESS *BaseAddress, OUT UINT64 *Length ); + EFI_STATUS EFIAPI SecNt32PeCoffRelocateImage ( @@ -200,7 +200,7 @@ Returns: // symbols when we load every PE/COFF image. // Index = strlen (*Argv); - gGdbWorkingFileName = malloc (Index + strlen(".gdb")); + gGdbWorkingFileName = malloc (Index + strlen(".gdb") + 1); strcpy (gGdbWorkingFileName, *Argv); strcat (gGdbWorkingFileName, ".gdb"); #endif @@ -783,6 +783,12 @@ Returns: if (EFI_ERROR (Status)) { return Status; } + + Status = PeCoffLoaderRelocateImage (&ImageContext); + if (EFI_ERROR (Status)) { + return Status; + } + SecPeCoffRelocateImageExtraAction (&ImageContext); @@ -823,7 +829,8 @@ EFIAPI SecUnixFdAddress ( IN UINTN Index, IN OUT EFI_PHYSICAL_ADDRESS *FdBase, - IN OUT UINT64 *FdSize + IN OUT UINT64 *FdSize, + IN OUT EFI_PHYSICAL_ADDRESS *FixUp ) /*++ @@ -835,6 +842,7 @@ Arguments: Index - Which FD, starts at zero. FdSize - Size of the FD in bytes FdBase - Start address of the FD. Assume it points to an FV Header + FixUp - Difference between actual FD address and build address Returns: EFI_SUCCESS - Return the Base address and size of the FV @@ -848,11 +856,21 @@ Returns: *FdBase = gFdInfo[Index].Address; *FdSize = gFdInfo[Index].Size; + *FixUp = 0; if (*FdBase == 0 && *FdSize == 0) { return EFI_UNSUPPORTED; } + if (Index == 0) { + // + // FD 0 has XIP code and well known PCD values + // If the memory buffer could not be allocated at the FD build address + // the Fixup is the difference. + // + *FixUp = *FdBase - FixedPcdGet32 (PcdUnixFdBaseAddress); + } + return EFI_SUCCESS; } @@ -1109,13 +1127,6 @@ SecPeCoffRelocateImageExtraAction ( IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext ) { - EFI_STATUS Status; - - Status = PeCoffLoaderRelocateImage (ImageContext); - if (EFI_ERROR (Status)) { - PrintLoadAddress (ImageContext); - return; - } #ifdef __APPLE__ PrintLoadAddress (ImageContext); @@ -1186,10 +1197,10 @@ SecPeCoffRelocateImageExtraAction ( (unsigned long)ImageContext->ImageAddress, (unsigned long)ImageContext->EntryPoint); - Handle = dlopen(ImageContext->PdbPointer, RTLD_NOW); + Handle = dlopen (ImageContext->PdbPointer, RTLD_NOW); if (Handle) { - Entry = dlsym(Handle, "_ModuleEntryPoint"); + Entry = dlsym (Handle, "_ModuleEntryPoint"); } else { printf("%s\n", dlerror()); } diff --git a/UnixPkg/Sec/SecMain.h b/UnixPkg/Sec/SecMain.h index c7a72c93a6..7a120f7a0a 100644 --- a/UnixPkg/Sec/SecMain.h +++ b/UnixPkg/Sec/SecMain.h @@ -157,9 +157,9 @@ EFI_STATUS EFIAPI
SecPeiReportStatusCode (
IN CONST EFI_PEI_SERVICES **PeiServices,
- IN EFI_STATUS_CODE_TYPE CodeType,
- IN EFI_STATUS_CODE_VALUE Value,
- IN UINT32 Instance,
+ IN EFI_STATUS_CODE_TYPE CodeType,
+ IN EFI_STATUS_CODE_VALUE Value,
+ IN UINT32 Instance,
IN CONST EFI_GUID *CallerId,
IN CONST EFI_STATUS_CODE_DATA *Data OPTIONAL
)
@@ -390,25 +390,9 @@ EFIAPI SecUnixFdAddress (
IN UINTN Index,
IN OUT EFI_PHYSICAL_ADDRESS *FdBase,
- IN OUT UINT64 *FdSize
+ IN OUT UINT64 *FdSize,
+ IN OUT EFI_PHYSICAL_ADDRESS *FixUp
)
-/*++
-
-Routine Description:
-
- TODO: Add function description
-
-Arguments:
-
- Index - TODO: add argument description
- FdBase - TODO: add argument description
- FdSize - TODO: add argument description
-
-Returns:
-
- TODO: add return values
-
---*/
;
EFI_STATUS
@@ -538,4 +522,15 @@ SecPeCoffLoaderUnloadImageExtraAction ( );
+
+VOID SetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
+void msSleep (unsigned long Milliseconds);
+void GetLocalTime (EFI_TIME *Time);
+void TzSet (void);
+long GetTimeZone(void);
+int GetDayLight(void);
+int GetErrno(void);
+
+
+
extern EFI_UNIX_THUNK_PROTOCOL *gUnix;
diff --git a/UnixPkg/Sec/SecMain.inf b/UnixPkg/Sec/SecMain.inf index c7a9b40df7..b745faa16d 100644 --- a/UnixPkg/Sec/SecMain.inf +++ b/UnixPkg/Sec/SecMain.inf @@ -36,6 +36,7 @@ UnixThunk.c
FwVol.c
SecMain.c
+ Gasket.c
[Sources.Ia32]
Ia32/Gasket.S
@@ -71,6 +72,7 @@ gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareVolume
gEfiUnixPkgTokenSpaceGuid.PcdUnixMemorySizeForSecMain
gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareFdSize
+ gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress
[BuildOptions.common]
GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/SecMain -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o -L/usr/X11R6/lib -lXext -lX11 /usr/lib/crtn.o
@@ -83,5 +85,5 @@ # Need to do this link via gcc and not ld as the pathing to libraries changes from OS version to OS version
#
XCODE:*_*_IA32_DLINK_PATH == gcc
- XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -L/usr/X11R6/lib -lXext -lX11 -lIOKit -framework Carbon
+ XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -o $(BIN_DIR)/SecMain -L/usr/X11R6/lib -lXext -lX11 -lIOKit -framework Carbon
XCODE:*_*_IA32_ASM_FLAGS == -arch i386 -g
diff --git a/UnixPkg/Sec/UgaX11.c b/UnixPkg/Sec/UgaX11.c index 386e0bc145..2c2fb186b9 100644 --- a/UnixPkg/Sec/UgaX11.c +++ b/UnixPkg/Sec/UgaX11.c @@ -123,19 +123,17 @@ TryCreateShmImage(UGA_IO_PRIVATE *drv) drv->xshm_info.shmid = shmget (IPC_PRIVATE, drv->image->bytes_per_line * drv->image->height, IPC_CREAT | 0777); - if (drv->xshm_info.shmid < 0) - { - XDestroyImage(drv->image); - return 0; - } + if (drv->xshm_info.shmid < 0) { + XDestroyImage(drv->image); + return 0; + } drv->image_data = shmat (drv->xshm_info.shmid, NULL, 0); - if(!drv->image_data) - { - shmctl (drv->xshm_info.shmid, IPC_RMID, NULL); - XDestroyImage(drv->image); - return 0; - } + if(!drv->image_data) { + shmctl (drv->xshm_info.shmid, IPC_RMID, NULL); + XDestroyImage(drv->image); + return 0; + } #ifndef __APPLE__ // @@ -149,12 +147,11 @@ TryCreateShmImage(UGA_IO_PRIVATE *drv) drv->xshm_info.shmaddr = (char*)drv->image_data; drv->image->data = (char*)drv->image_data; - if (!XShmAttach (drv->display, &drv->xshm_info)) - { - shmdt (drv->image_data); - XDestroyImage(drv->image); - return 0; - } + if (!XShmAttach (drv->display, &drv->xshm_info)) { + shmdt (drv->image_data); + XDestroyImage(drv->image); + return 0; + } return 1; } @@ -386,7 +383,7 @@ UgaCheckKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo) } EFI_STATUS -UgaGetKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key) +UgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key) { UGA_IO_PRIVATE *drv = (UGA_IO_PRIVATE *)UgaIo; EFI_STATUS status; diff --git a/UnixPkg/Sec/UnixThunk.c b/UnixPkg/Sec/UnixThunk.c index 5dfba7a734..c0f35d0729 100644 --- a/UnixPkg/Sec/UnixThunk.c +++ b/UnixPkg/Sec/UnixThunk.c @@ -36,6 +36,10 @@ Abstract: #include "Uefi.h" #include "Library/UnixLib.h" +#ifdef __APPLE__ +#include "Gasket.h" +#endif + int settimer_initialized; struct timeval settimer_timeval; void (*settimer_callback)(UINT64 delta); @@ -150,74 +154,6 @@ GetErrno(void) return errno; } -#if __APPLE__ -void GasketmsSleep (unsigned long Milliseconds); -void Gasketexit (int status); -void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs)); -void GasketGetLocalTime (EFI_TIME *Time); -struct tm *Gasketgmtime (const time_t *clock); -long GasketGetTimeZone (void); -int GasketGetDayLight (void); -int Gasketpoll (struct pollfd *pfd, int nfds, int timeout); -int Gasketread (int fd, void *buf, int count); -int Gasketwrite (int fd, const void *buf, int count); -char *Gasketgetenv (const char *name); -int Gasketopen (const char *name, int flags, int mode); -off_t Gasketlseek (int fd, off_t off, int whence); -int Gasketftruncate (int fd, long int len); -int Gasketclose (int fd); -int Gasketmkdir (const char *pathname, mode_t mode); -int Gasketrmdir (const char *pathname); -int Gasketunlink (const char *pathname); -int GasketGetErrno (void); -DIR *Gasketopendir (const char *pathname); -void *Gasketrewinddir (DIR *dir); -struct dirent *Gasketreaddir (DIR *dir); -int Gasketclosedir (DIR *dir); -int Gasketstat (const char *path, struct stat *buf); -int Gasketstatfs (const char *path, struct statfs *buf); -int Gasketrename (const char *oldpath, const char *newpath); -time_t Gasketmktime (struct tm *tm); -int Gasketfsync (int fd); -int Gasketchmod (const char *path, mode_t mode); -int Gasketutime (const char *filename, const struct utimbuf *buf); -int Gaskettcflush (int fildes, int queue_selector); -EFI_STATUS GasketUgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title); -void Gasketperror (__const char *__s); - -// -// ... is always an int or pointer to device specific data structure -// -int Gasketioctl (int fd, unsigned long int __request, ...); -int Gasketfcntl (int __fd, int __cmd, ...); - -int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed); -int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed); -int Gaskettcgetattr (int __fd, struct termios *__termios_p); -int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p); -int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact); -int Gasketsetcontext (const ucontext_t *ucp); -int Gasketgetcontext (ucontext_t *ucp); -int Gasketsigemptyset (sigset_t *set); -int Gasketsigaltstack (const stack_t *ss, stack_t *oss); - -RETURN_STATUS -GasketUnixPeCoffGetEntryPoint ( - IN VOID *Pe32Data, - IN OUT VOID **EntryPoint - ); - -VOID -GasketUnixPeCoffRelocateImageExtraAction ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ); - -VOID -GasketPeCoffLoaderUnloadImageExtraAction ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ); - -#endif extern EFI_STATUS UgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title); @@ -303,7 +239,7 @@ EFI_UNIX_THUNK_PROTOCOL mUnixThunkTable = { rewinddir, readdir, closedir, - stat, + (UnixStat)stat, statfs, rename, mktime, diff --git a/UnixPkg/Sec/X64/Gasket.S b/UnixPkg/Sec/X64/Gasket.S new file mode 100644 index 0000000000..bce19f3d0d --- /dev/null +++ b/UnixPkg/Sec/X64/Gasket.S @@ -0,0 +1,1026 @@ +#------------------------------------------------------------------------------ +# +# 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: +# +# EFI uses a simplified version of the MSFT calling convention, and every one else, +# Mac OS X, BSD, Linux, uses a different one. We can skip dealing with floating point +# other than making sure non volatile registers are preserved. +# +# Register for arguments +# MSFT Every One Else +# ---- -------------- +# rcx rdi +# rdx rsi +# r8 rdx +# r9 rcx +# r8 +# r9 +# +# Callee saved registers +# MSFT Every One Else +# ---- -------------- +# rbx rbx +# rbp rbp +# r12-r15 r12-r15 +# rsi +# rdi +# xmm6-xmm15 +# +# 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 -arch x86_64 -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 %rbp + movq %rsp, %rbp # does leave use rbp or rsp??? + subq $148, %rsp + + # save registers the OS X will think are volatile + movaps %xmm6, -8(%rbp) + movaps %xmm7, -24(%rbp) + movaps %xmm8, -40(%rbp) + movaps %xmm9, -56(%rbp) + movaps %xmm10, -72(%rbp) + movaps %xmm11, -88(%rbp) + movaps %xmm12, -104(%rbp) + movaps %xmm13, -120(%rbp) + movaps %xmm14, -136(%rbp) + movaps %xmm15, -152(%rbp) + movq %rsi, -160(%rbp) + movq %rdi, -168(%rbp) + + movq %rcx, %rdi + call _msSleep + + movaps -8(%rbp), %xmm6, + movaps -24(%rbp), %xmm7 + movaps -40(%rbp), %xmm8 + movaps -56(%rbp), %xmm9 + movaps -72(%rbp), %xmm10 + movaps -88(%rbp), %xmm11 + movaps -104(%rbp), %xmm12 + movaps -120(%rbp), %xmm13 + movaps -136(%rbp), %xmm14 + movaps -152(%rbp), %xmm15 + movq -160(%rbp), %rsi + movq -168(%rbp), %rdi + + 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 + + + |