--- /dev/null
+set confirm off
+set output-radix 16
+b SecGdbScriptBreak
+command
+silent
+source SecMain.gdb
+c
+end
EFI_STATUS\r
FvbGetVolumeAttributes (\r
IN UINTN Instance,\r
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
IN ESAL_FWB_GLOBAL *Global,\r
IN BOOLEAN Virtual\r
)\r
{\r
\r
EFI_FVB_ATTRIBUTES_2 Attributes;\r
- UINTN LbaAddress;\r
- UINTN LbaLength;\r
- EFI_STATUS Status;\r
- UINT8 Data;\r
+ UINTN LbaAddress;\r
+ UINTN LbaLength;\r
+ EFI_STATUS Status;\r
+ UINT8 Data;\r
\r
//\r
// Check if the FV is write enabled\r
EFI_STATUS\r
FvbSetVolumeAttributes (\r
IN UINTN Instance,\r
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
IN ESAL_FWB_GLOBAL *Global,\r
IN BOOLEAN Virtual\r
)\r
EFI_FW_VOL_INSTANCE *FwhInstance = NULL;\r
EFI_FVB_ATTRIBUTES_2 OldAttributes;\r
EFI_FVB_ATTRIBUTES_2 *AttribPtr;\r
- UINT32 Capabilities;\r
- UINT32 OldStatus;\r
- UINT32 NewStatus;\r
- EFI_STATUS Status;\r
+ UINT32 Capabilities;\r
+ UINT32 OldStatus;\r
+ UINT32 NewStatus;\r
+ EFI_STATUS Status;\r
EFI_FVB_ATTRIBUTES_2 UnchangedAttributes;\r
\r
\r
EFIAPI\r
FvbProtocolGetAttributes (\r
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
)\r
/*++\r
\r
EFIAPI\r
FvbProtocolSetAttributes (\r
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
)\r
/*++\r
\r
EFI_STATUS\r
FvbSetVolumeAttributes (\r
IN UINTN Instance,\r
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
IN ESAL_FWB_GLOBAL *Global,\r
IN BOOLEAN Virtual\r
)\r
EFI_STATUS\r
FvbGetVolumeAttributes (\r
IN UINTN Instance,\r
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
IN ESAL_FWB_GLOBAL *Global,\r
IN BOOLEAN Virtual\r
)\r
EFIAPI\r
FvbProtocolGetAttributes (\r
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
)\r
;\r
\r
EFIAPI\r
FvbProtocolSetAttributes (\r
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
)\r
;\r
\r
EFIAPI\r
FvbProtocolGetPhysicalAddress (\r
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
- OUT EFI_PHYSICAL_ADDRESS *Address\r
+ OUT EFI_PHYSICAL_ADDRESS *Address\r
)\r
;\r
\r
(EFIAPI *UNIX_FWH_INFORMATION) (\r
IN UINTN Index,\r
IN OUT EFI_PHYSICAL_ADDRESS *FdBase,\r
- IN OUT UINT64 *FdSize\r
+ IN OUT UINT64 *FdSize,\r
+ IN OUT EFI_PHYSICAL_ADDRESS *FixUp\r
);\r
\r
/*++\r
Index - Which FD, starts at zero.\r
FdSize - Size of the FD in bytes\r
FdBase - Start address of the FD. Assume it points to an FV Header\r
+ FixUp - Difference between actual FD address and build address\r
\r
Returns:\r
EFI_SUCCESS - Return the Base address and size of the FV\r
#include <utime.h>
#include <dlfcn.h>
+#include <ucontext.h>
#include <Base.h>
#include <Library/PeCoffLib.h>
+#if __APPLE__
+//
+// EFI packing is not compatible witht he default OS packing for struct stat.
+// st_size is 64-bit but starts on a 32-bit offset in the structure. The compiler
+// flags used to produce compatible EFI images, break struct stat
+//
+#pragma pack(4)
+
+#if __DARWIN_64_BIT_INO_T
+
+typedef struct stat_fix { \
+ dev_t st_dev; /* [XSI] ID of device containing file */
+ mode_t st_mode; /* [XSI] Mode of file (see below) */
+ nlink_t st_nlink; /* [XSI] Number of hard links */
+ __darwin_ino64_t st_ino; /* [XSI] File serial number */
+ uid_t st_uid; /* [XSI] User ID of the file */
+ gid_t st_gid; /* [XSI] Group ID of the file */
+ dev_t st_rdev; /* [XSI] Device ID */
+ __DARWIN_STRUCT_STAT64_TIMES
+ off_t st_size; /* [XSI] file size, in bytes */
+ blkcnt_t st_blocks; /* [XSI] blocks allocated for file */
+ blksize_t st_blksize; /* [XSI] optimal blocksize for I/O */
+ __uint32_t st_flags; /* user defined flags for file */
+ __uint32_t st_gen; /* file generation number */
+ __int32_t st_lspare; /* RESERVED: DO NOT USE! */
+ __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */
+} STAT_FIX;
+
+#else /* !__DARWIN_64_BIT_INO_T */
+
+typedef struct stat_fix {
+ dev_t st_dev; /* [XSI] ID of device containing file */
+ ino_t st_ino; /* [XSI] File serial number */
+ mode_t st_mode; /* [XSI] Mode of file (see below) */
+ nlink_t st_nlink; /* [XSI] Number of hard links */
+ uid_t st_uid; /* [XSI] User ID of the file */
+ gid_t st_gid; /* [XSI] Group ID of the file */
+ dev_t st_rdev; /* [XSI] Device ID */
+#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
+ struct timespec st_atimespec; /* time of last access */
+ struct timespec st_mtimespec; /* time of last data modification */
+ struct timespec st_ctimespec; /* time of last status change */
+#else
+ time_t st_atime; /* [XSI] Time of last access */
+ long st_atimensec; /* nsec of last access */
+ time_t st_mtime; /* [XSI] Last data modification time */
+ long st_mtimensec; /* last data modification nsec */
+ time_t st_ctime; /* [XSI] Time of last status change */
+ long st_ctimensec; /* nsec of last status change */
+#endif
+ off_t st_size; /* [XSI] file size, in bytes */
+ blkcnt_t st_blocks; /* [XSI] blocks allocated for file */
+ blksize_t st_blksize; /* [XSI] optimal blocksize for I/O */
+ __uint32_t st_flags; /* user defined flags for file */
+ __uint32_t st_gen; /* file generation number */
+ __int32_t st_lspare; /* RESERVED: DO NOT USE! */
+ __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */
+} STAT_FIX;
+
+#pragma pack()
+#endif
+
+#else
+
+ typedef struct stat STAT_FIX;
+
+#endif
+
#define EFI_UNIX_THUNK_PROTOCOL_GUID \
{ \
0xf2e98868, 0x8985, 0x11db, {0x9a, 0x59, 0x00, 0x40, 0xd0, 0x2b, 0x18, 0x35 } \
int
(*UnixOpen) (const char *name, int flags, int mode);
typedef
-long int
-(*UnixSeek) (int fd, long int off, int whence);
+off_t
+(*UnixSeek) (int fd, off_t off, int whence);
typedef
int
(*UnixFtruncate) (int fd, long int len);
(*UnixCloseDir)(DIR *dir);
typedef
int
-(*UnixStat)(const char *path, struct stat *buf);
+(*UnixStat)(const char *path, STAT_FIX *buf);
typedef
int
(*UnixStatFs)(const char *path, struct statfs *buf);
(*UnixTcsetattr) (int __fd, int __optional_actions,
__const struct termios *__termios_p);
-typedef
+typedef
VOID *
(*UnixDlopen) (const char *FileName, int Flag);
// Work functions to enable source level debug in the emulator
//
-typedef
+typedef
RETURN_STATUS
(EFIAPI *UnixPeCoffGetEntryPoint) (
IN VOID *Pe32Data,
IN OUT VOID **EntryPoint
);
-typedef
+typedef
VOID
(EFIAPI *UnixPeCoffRelocateImageExtraAction) (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
);
-typedef
+typedef
VOID
(EFIAPI *UnixPeCoffLoaderUnloadImageExtraAction) (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
if (mUnix == NULL) {\r
UnixPeCoffGetUnixThunkStucture ();\r
}\r
- mUnix->PeCoffRelocateImageExtraAction (ImageContext);\r
+ mUnix->PeCoffRelocateImageExtraAction (ImageContext);\r
}\r
\r
\r
--- /dev/null
+\r
+#include "SecMain.h"\r
+#include "Gasket.h"\r
+\r
+//\r
+// Gasket functions for EFI_UNIX_THUNK_PROTOCOL\r
+//\r
+\r
+void \r
+GasketmsSleep (unsigned long Milliseconds)\r
+{ \r
+ GasketUintn (msSleep, Milliseconds);\r
+ return;\r
+}\r
+\r
+void \r
+Gasketexit (int status)\r
+{\r
+ GasketUintn (exit, status);\r
+ return;\r
+}\r
+\r
+\r
+void \r
+GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs))\r
+{\r
+ GasketUint64Uintn (SetTimer, PeriodMs, (UINTN)CallBack);\r
+ return;\r
+}\r
+\r
+\r
+void \r
+GasketGetLocalTime (EFI_TIME *Time)\r
+{\r
+ GasketUintn (GetLocalTime, (UINTN)Time);\r
+ return;\r
+}\r
+\r
+\r
+struct tm *\r
+Gasketgmtime (const time_t *clock)\r
+{\r
+ return (struct tm *)(UINTN)GasketUintn (localtime, (UINTN)clock);\r
+}\r
+\r
+\r
+long \r
+GasketGetTimeZone (void)\r
+{\r
+ return GasketVoid (GetTimeZone);\r
+}\r
+\r
+\r
+int \r
+GasketGetDayLight (void)\r
+{\r
+ return GasketVoid (GetDayLight);\r
+}\r
+\r
+\r
+int \r
+Gasketpoll (struct pollfd *pfd, int nfds, int timeout)\r
+{\r
+ return GasketUintnUintnUintn (poll, (UINTN)pfd, nfds, timeout);\r
+}\r
+\r
+\r
+int \r
+Gasketread (int fd, void *buf, int count)\r
+{\r
+ return GasketUintnUintnUintn (read, fd, (UINTN)buf, count);\r
+}\r
+\r
+\r
+int \r
+Gasketwrite (int fd, const void *buf, int count)\r
+{\r
+ return GasketUintnUintnUintn (write, fd, (UINTN)buf, count);\r
+}\r
+\r
+\r
+char *\r
+Gasketgetenv (const char *name)\r
+{\r
+ return (char *)(UINTN)GasketUintn (getenv, (UINTN)name);\r
+}\r
+\r
+\r
+int \r
+Gasketopen (const char *name, int flags, int mode)\r
+{\r
+ return GasketUintnUintnUintn (open, (UINTN)name, flags, mode);\r
+}\r
+\r
+\r
+off_t \r
+Gasketlseek (int fd, off_t off, int whence)\r
+{\r
+ if (sizeof off == 8) {\r
+ return GasketUintnUint64Uintn (lseek, fd, off, whence);\r
+ } else if (sizeof off == 4) {\r
+ return GasketUintnUintnUintn (lseek, fd, off, whence);\r
+ }\r
+}\r
+\r
+\r
+int \r
+Gasketftruncate (int fd, long int len)\r
+{\r
+ return GasketUintnUintn (ftruncate, fd, len);\r
+}\r
+\r
+\r
+int \r
+Gasketclose (int fd)\r
+{\r
+ return GasketUintn (close, fd);\r
+}\r
+\r
+\r
+int \r
+Gasketmkdir (const char *pathname, mode_t mode)\r
+{\r
+ return GasketUintnUint16 (mkdir, (UINTN)pathname, mode);\r
+}\r
+\r
+\r
+int \r
+Gasketrmdir (const char *pathname)\r
+{\r
+ return GasketUintn (rmdir, (UINTN)pathname);\r
+}\r
+\r
+\r
+int \r
+Gasketunlink (const char *pathname)\r
+{\r
+ return GasketUintn (unlink, (UINTN)pathname);\r
+}\r
+\r
+\r
+int \r
+GasketGetErrno (void)\r
+{\r
+ return GasketVoid (GetErrno);\r
+}\r
+\r
+\r
+DIR *\r
+Gasketopendir (const char *pathname)\r
+{\r
+ return (DIR *)(UINTN)GasketUintn (opendir, (UINTN)pathname);\r
+}\r
+\r
+\r
+void *\r
+Gasketrewinddir (DIR *dir)\r
+{\r
+ return (void *)(UINTN)GasketUintn (rewinddir, (UINTN)dir);\r
+}\r
+\r
+\r
+struct dirent *\r
+Gasketreaddir (DIR *dir)\r
+{\r
+ return (struct dirent *)(UINTN)GasketUintn (readdir, (UINTN)dir);\r
+}\r
+\r
+\r
+int \r
+Gasketclosedir (DIR *dir)\r
+{\r
+ return GasketUintn (closedir, (UINTN)dir);\r
+}\r
+\r
+\r
+int \r
+Gasketstat (const char *path, STAT_FIX *buf)\r
+{\r
+ return GasketUintnUintn (stat, (UINTN)path, (UINTN)buf);\r
+}\r
+\r
+\r
+int \r
+Gasketstatfs (const char *path, struct statfs *buf)\r
+{\r
+ return GasketUintnUintn (statfs, (UINTN)path, (UINTN)buf);\r
+}\r
+\r
+\r
+int \r
+Gasketrename (const char *oldpath, const char *newpath)\r
+{\r
+ return GasketUintnUintn (rename, (UINTN)oldpath, (UINTN)newpath);\r
+}\r
+\r
+\r
+time_t \r
+Gasketmktime (struct tm *tm)\r
+{\r
+ return GasketUintn (mktime, (UINTN)tm);\r
+}\r
+\r
+\r
+int \r
+Gasketfsync (int fd)\r
+{\r
+ return GasketUintn (fsync, fd);\r
+}\r
+\r
+\r
+int \r
+Gasketchmod (const char *path, mode_t mode)\r
+{\r
+ return GasketUintnUint16 (chmod, (UINTN)path, mode);\r
+}\r
+\r
+\r
+int \r
+Gasketutime (const char *filename, const struct utimbuf *buf)\r
+{\r
+ return GasketUintnUintn (utime, (UINTN)filename, (UINTN)buf);\r
+}\r
+\r
+\r
+int \r
+Gaskettcflush (int fildes, int queue_selector)\r
+{\r
+ return GasketUintnUintn (tcflush, fildes, queue_selector);\r
+}\r
+\r
+\r
+EFI_STATUS \r
+GasketUgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title)\r
+{\r
+ return GasketUintnUintn (UgaCreate, (UINTN)UgaIo, (UINTN)Title);\r
+}\r
+\r
+\r
+void \r
+Gasketperror (__const char *__s)\r
+{\r
+ GasketUintn (perror, (UINTN)__s);\r
+ return;\r
+}\r
+\r
+\r
+\r
+//\r
+// ... is always an int or pointer to device specific data structure\r
+//\r
+int \r
+Gasketioctl (int fd, unsigned long int __request, ...)\r
+{\r
+ VA_LIST Marker;\r
+ \r
+ VA_START (Marker, __request);\r
+ return GasketUintnUintnUintn (ioctl, fd, __request, VA_ARG (Marker, UINTN));\r
+}\r
+\r
+\r
+int \r
+Gasketfcntl (int __fd, int __cmd, ...)\r
+{\r
+ VA_LIST Marker;\r
+ \r
+ VA_START (Marker, __cmd);\r
+ return GasketUintnUintnUintn (fcntl, __fd, __cmd, VA_ARG (Marker, UINTN));\r
+}\r
+\r
+\r
+\r
+int \r
+Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed)\r
+{\r
+ return GasketUintnUintn (cfsetispeed, (UINTN)__termios_p, __speed);\r
+}\r
+\r
+\r
+int \r
+Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed)\r
+{\r
+ return GasketUintnUintn (cfsetospeed, (UINTN)__termios_p, __speed);\r
+}\r
+\r
+\r
+int \r
+Gaskettcgetattr (int __fd, struct termios *__termios_p)\r
+{\r
+ return GasketUintnUintn (tcgetattr, __fd, (UINTN)__termios_p);\r
+}\r
+\r
+ \r
+int \r
+Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p)\r
+{\r
+ return GasketUintnUintnUintn (tcsetattr, __fd, __optional_actions, (UINTN)__termios_p);\r
+}\r
+\r
+\r
+int \r
+Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact)\r
+{\r
+ return GasketUintnUintn (sigaction, (UINTN)act, (UINTN)oact);\r
+}\r
+\r
+\r
+int \r
+Gasketsetcontext (const ucontext_t *ucp)\r
+{\r
+ return GasketUintn (setcontext, (UINTN)ucp);\r
+}\r
+\r
+\r
+int \r
+Gasketgetcontext (ucontext_t *ucp)\r
+{\r
+ return GasketUintn (getcontext, (UINTN)ucp);\r
+}\r
+\r
+\r
+int \r
+Gasketsigemptyset (sigset_t *set)\r
+{\r
+ return GasketUintn (sigemptyset, (UINTN)set);\r
+}\r
+\r
+\r
+int \r
+Gasketsigaltstack (const stack_t *ss, stack_t *oss)\r
+{\r
+ return GasketUintnUintn (sigaltstack, (UINTN)ss, (UINTN)oss);\r
+}\r
+\r
+\r
+\r
+RETURN_STATUS\r
+GasketUnixPeCoffGetEntryPoint (\r
+ IN VOID *Pe32Data,\r
+ IN OUT VOID **EntryPoint\r
+ )\r
+{\r
+ return GasketUintnUintn (SecPeCoffGetEntryPoint, (UINTN)Pe32Data, (UINTN)EntryPoint);\r
+}\r
+\r
+\r
+\r
+VOID\r
+GasketUnixPeCoffRelocateImageExtraAction (\r
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
+ )\r
+{\r
+ GasketUintn (SecPeCoffRelocateImageExtraAction, (UINTN)ImageContext);\r
+ return;\r
+}\r
+\r
+\r
+\r
+VOID\r
+GasketPeCoffLoaderUnloadImageExtraAction (\r
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
+ )\r
+{\r
+ GasketUintn (SecPeCoffLoaderUnloadImageExtraAction, (UINTN)ImageContext);\r
+ return;\r
+}\r
+\r
+\r
+//\r
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL\r
+//\r
+\r
+EFI_STATUS \r
+EFIAPI \r
+GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)\r
+{\r
+ return GasketUintn (UgaClose, (UINTN)UgaIo);\r
+}\r
+\r
+EFI_STATUS \r
+EFIAPI \r
+GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height)\r
+{\r
+ return GasketUintnUintnUintn (UgaSize, (UINTN)UgaIo, Width, Height);\r
+}\r
+\r
+EFI_STATUS \r
+EFIAPI \r
+GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)\r
+{\r
+ return GasketUintn (UgaCheckKey, (UINTN)UgaIo);\r
+}\r
+\r
+EFI_STATUS \r
+EFIAPI \r
+GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key)\r
+{\r
+ return GasketUintnUintn (UgaGetKey, (UINTN)UgaIo, (UINTN)key);\r
+}\r
+\r
+EFI_STATUS \r
+EFIAPI \r
+GasketUgaBlt (\r
+ EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,\r
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,\r
+ IN EFI_UGA_BLT_OPERATION BltOperation,\r
+ IN UINTN SourceX,\r
+ IN UINTN SourceY,\r
+ IN UINTN DestinationX,\r
+ IN UINTN DestinationY,\r
+ IN UINTN Width,\r
+ IN UINTN Height,\r
+ IN UINTN Delta OPTIONAL\r
+ )\r
+{\r
+ return GasketUintn10Args (UgaBlt, (UINTN)UgaIo, (UINTN)BltBuffer, BltOperation, SourceX, SourceY, DestinationX, DestinationY, Width, Height, Delta);\r
+}\r
+\r
--- /dev/null
+\r
+#ifndef _GASKET_H_\r
+#define _GASKET_H_\r
+\r
+#include <Library/PeCoffLib.h>\r
+\r
+#include <Protocol/UgaDraw.h>\r
+#include <Protocol/SimpleTextIn.h>\r
+#include <Protocol/UnixUgaIo.h>\r
+\r
+\r
+//\r
+// Gasket functions for EFI_UNIX_THUNK_PROTOCOL\r
+//\r
+\r
+void GasketmsSleep (unsigned long Milliseconds);\r
+void Gasketexit (int status);\r
+void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));\r
+void GasketGetLocalTime (EFI_TIME *Time);\r
+struct tm *Gasketgmtime (const time_t *clock);\r
+long GasketGetTimeZone (void);\r
+int GasketGetDayLight (void);\r
+int Gasketpoll (struct pollfd *pfd, int nfds, int timeout);\r
+int Gasketread (int fd, void *buf, int count);\r
+int Gasketwrite (int fd, const void *buf, int count);\r
+char *Gasketgetenv (const char *name);\r
+int Gasketopen (const char *name, int flags, int mode);\r
+off_t Gasketlseek (int fd, off_t off, int whence);\r
+int Gasketftruncate (int fd, long int len);\r
+int Gasketclose (int fd);\r
+int Gasketmkdir (const char *pathname, mode_t mode);\r
+int Gasketrmdir (const char *pathname);\r
+int Gasketunlink (const char *pathname);\r
+int GasketGetErrno (void);\r
+DIR *Gasketopendir (const char *pathname);\r
+void *Gasketrewinddir (DIR *dir);\r
+struct dirent *Gasketreaddir (DIR *dir);\r
+int Gasketclosedir (DIR *dir);\r
+int Gasketstat (const char *path, STAT_FIX *buf);\r
+int Gasketstatfs (const char *path, struct statfs *buf);\r
+int Gasketrename (const char *oldpath, const char *newpath);\r
+time_t Gasketmktime (struct tm *tm);\r
+int Gasketfsync (int fd);\r
+int Gasketchmod (const char *path, mode_t mode);\r
+int Gasketutime (const char *filename, const struct utimbuf *buf);\r
+int Gaskettcflush (int fildes, int queue_selector);\r
+EFI_STATUS GasketUgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);\r
+void Gasketperror (__const char *__s);\r
+\r
+//\r
+// ... is always an int or pointer to device specific data structure\r
+//\r
+int Gasketioctl (int fd, unsigned long int __request, ...);\r
+int Gasketfcntl (int __fd, int __cmd, ...);\r
+\r
+int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);\r
+int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);\r
+int Gaskettcgetattr (int __fd, struct termios *__termios_p); \r
+int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);\r
+int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);\r
+int Gasketsetcontext (const ucontext_t *ucp);\r
+int Gasketgetcontext (ucontext_t *ucp);\r
+int Gasketsigemptyset (sigset_t *set);\r
+int Gasketsigaltstack (const stack_t *ss, stack_t *oss);\r
+\r
+RETURN_STATUS\r
+GasketUnixPeCoffGetEntryPoint (\r
+ IN VOID *Pe32Data,\r
+ IN OUT VOID **EntryPoint\r
+ );\r
+\r
+VOID\r
+GasketUnixPeCoffRelocateImageExtraAction (\r
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
+ );\r
+\r
+VOID\r
+GasketPeCoffLoaderUnloadImageExtraAction (\r
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
+ );\r
+ \r
+\r
+int GasketVoid (void *api);\r
+int GasketUintn (void *api, UINTN a);\r
+int GasketUintnUintn (void *api, UINTN a, UINTN b);\r
+int GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c);\r
+int GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d);\r
+int GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j);\r
+int GasketUint64Uintn (void *api, UINT64 a, UINTN b);\r
+UINT64 GasketUintnUint64Uintn (void *api, UINTN a, UINT64 b, UINTN c);\r
+int GasketUintnUint16 (void *api, UINTN a, UINT16 b);\r
+\r
+\r
+//\r
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL\r
+//\r
+\r
+EFI_STATUS EFIAPI GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);\r
+EFI_STATUS EFIAPI GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);\r
+EFI_STATUS EFIAPI GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);\r
+EFI_STATUS EFIAPI GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);\r
+EFI_STATUS EFIAPI GasketUgaBlt (\r
+ EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,\r
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,\r
+ IN EFI_UGA_BLT_OPERATION BltOperation,\r
+ IN UINTN SourceX,\r
+ IN UINTN SourceY,\r
+ IN UINTN DestinationX,\r
+ IN UINTN DestinationY,\r
+ IN UINTN Width,\r
+ IN UINTN Height,\r
+ IN UINTN Delta OPTIONAL\r
+ );\r
+\r
+EFI_STATUS UgaCreate (EFI_UNIX_UGA_IO_PROTOCOL **Uga, CONST CHAR16 *Title);\r
+\r
+\r
+//\r
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL\r
+//\r
+EFI_STATUS UgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);\r
+EFI_STATUS UgaSize(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);\r
+EFI_STATUS UgaCheckKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);\r
+EFI_STATUS UgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);\r
+EFI_STATUS UgaBlt (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,\r
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,\r
+ IN EFI_UGA_BLT_OPERATION BltOperation,\r
+ IN UINTN SourceX,\r
+ IN UINTN SourceY,\r
+ IN UINTN DestinationX,\r
+ IN UINTN DestinationY,\r
+ IN UINTN Width,\r
+ IN UINTN Height,\r
+ IN UINTN Delta OPTIONAL\r
+ );\r
+\r
+\r
+\r
+#endif\r
+\r
+\r
#------------------------------------------------------------------------------\r
#\r
+# OS X Application requires 16 byte stack alignment. The problem is these\r
+# APIs are exposed to code that does not have this requirement via \r
+# EFI_UNIX_THUNK_PROTOCOL. So these are wrapper functions that make sure\r
+# the stack is aligned. This code should also work if the stack is already\r
+# aligned. Extra stack padding is really the same as local varaibles so \r
+# it gets freed by the leave instruction\r
+#\r
+# I basically used the compiler, added extra 16 bytes to the local stack and\r
+# made sure %esp ended in 0 before the call (16 byte algined)\r
+#\r
+# The EFI_UNIX_THUNK_PROTOCOL member functions call a C API that then calls \r
+# one of these generic assembly routines. We do it that way to work around \r
+# some magic name changing that happens in C. For example stat() is _stat() \r
+# on Leopard and _stat$INDOE64 on Snow Leopard. That is why we pass stat()\r
+# into one of these gaskets from C code.\r
+#\r
# Copyright (c) 2008 - 2009 Apple Inc. All rights reserved.\r
# All rights reserved. This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
#\r
-# Abstract:\r
-#\r
-# OS X Application requires 16 byte stack alignment. The problem is these\r
-# APIs are exposed to code that does not have this requirement via \r
-# EFI_UNIX_THUNK_PROTOCOL. So these are wrapper functions that make sure\r
-# the stack is aligned. This code should also work if the stack is already\r
-# aligned. Extra stack padding is really the same as local varaibles so \r
-# it gets freed by the leave instruction\r
-#\r
-# I basically used the compiler, added extra 16 bytes to the local stack and\r
-# made sure %esp ended in 0 before the call (16 byte algined)\r
-#\r
-# cat t.c\r
-##include <stdio.h>\r
-##include <sys/stat.h>\r
-#\r
-#int chmod (int fd, mode_t len){\r
-# long m = (long)fd;\r
-#}\r
-#\r
-#int Gasketchmod (int fd, mode_t len){\r
-# return chmod (fd, len);\r
-#}\r
-#\r
-# gcc -S t.c\r
-# cat t.s\r
-# this gives you the starting point.... \r
-#\r
-#\r
#------------------------------------------------------------------------------\r
\r
-#include <ProcessorBind.h>\r
-\r
.text\r
- \r
-#\r
-#\r
-# EFI_UNIX_THUNK_PROTOCOL that gets exported\r
-#\r
-#\r
- \r
-#------------------------------------------------------------------------------\r
-# VOID GasketmsSleep (unsigned long Milliseconds);\r
-#------------------------------------------------------------------------------ \r
-.globl _GasketmsSleep\r
-_GasketmsSleep:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _msSleep\r
- leave\r
- ret\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# void Gasketexit (int status);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketexit\r
-_Gasketexit:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _exit\r
- leave\r
- ret\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));\r
-#------------------------------------------------------------------------------\r
-.globl _GasketSetTimer\r
-_GasketSetTimer:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $56, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, -16(%ebp)\r
- movl 12(%ebp), %eax\r
- movl %eax, -12(%ebp)\r
- movl 16(%ebp), %eax\r
- movl %eax, 8(%esp)\r
- movl -16(%ebp), %eax\r
- movl -12(%ebp), %edx\r
- movl %eax, (%esp)\r
- movl %edx, 4(%esp)\r
- call _SetTimer\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# void GasketGetLocalTime (EFI_TIME *Time);\r
-#------------------------------------------------------------------------------\r
-.globl _GasketGetLocalTime\r
-_GasketGetLocalTime:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _GetLocalTime\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# struct tm *Gasketgmtime (const time_t *clock);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketgmtime\r
-_Gasketgmtime:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _gmtime\r
- leave\r
- ret\r
-\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# long GasketGetTimeZone(void);\r
-#------------------------------------------------------------------------------\r
-.globl _GasketGetTimeZone\r
-_GasketGetTimeZone:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $24, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- call _GetTimeZone\r
- leave\r
- ret\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int GasketGetDayLight (void);\r
-#------------------------------------------------------------------------------\r
-.globl _GasketGetDayLight\r
-_GasketGetDayLight:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $24, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- call _GetDayLight\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketpoll (struct pollfd *pfd, int nfds, int timeout);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketpoll\r
-_Gasketpoll:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $56, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 16(%ebp), %eax\r
- movl %eax, 8(%esp)\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _poll\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketread (int fd, void *buf, int count);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketread\r
-_Gasketread:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $56, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 16(%ebp), %eax\r
- movl %eax, 8(%esp)\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _read\r
- leave\r
- ret\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketwrite (int fd, const void *buf, int count);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketwrite\r
-_Gasketwrite:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $56, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 16(%ebp), %eax\r
- movl %eax, 8(%esp)\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _write\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# char *Gasketgetenv (const char *name);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketgetenv\r
-_Gasketgetenv:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _getenv\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketopen (const char *name, int flags, int mode);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketopen\r
-_Gasketopen:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $56, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 16(%ebp), %eax\r
- movl %eax, 8(%esp)\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _open\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# off_t Gasketlseek (int fd, off_t off, int whence);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketlseek\r
-_Gasketlseek:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $56, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, -16(%ebp)\r
- movl 16(%ebp), %eax\r
- movl %eax, -12(%ebp)\r
- movl 20(%ebp), %eax\r
- movl %eax, 12(%esp)\r
- movl -16(%ebp), %eax\r
- movl -12(%ebp), %edx\r
- movl %eax, 4(%esp)\r
- movl %edx, 8(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _lseek\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketftruncate (int fd, long int len);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketftruncate\r
-_Gasketftruncate:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _truncate\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketclose (int fd);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketclose\r
-_Gasketclose:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _close\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketmkdir (const char *pathname, mode_t mode);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketmkdir\r
-_Gasketmkdir:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _mkdir\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketrmdir (const char *pathname);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketrmdir\r
-_Gasketrmdir:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _rmdir\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketunlink (const char *pathname);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketunlink\r
-_Gasketunlink:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _unlink\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int GasketGetErrno (void);\r
-#------------------------------------------------------------------------------\r
-.globl _GasketGetErrno\r
-_GasketGetErrno:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $24, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- call _GetErrno\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# DIR *Gasketopendir (const char *pathname);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketopendir\r
-_Gasketopendir:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _opendir\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# void *Gasketrewinddir (DIR *dir);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketrewinddir\r
-_Gasketrewinddir:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _rewinddir\r
- leave\r
- ret\r
-\r
\r
-\r
-#------------------------------------------------------------------------------\r
-# struct dirent *Gasketreaddir (DIR *dir);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketreaddir\r
-_Gasketreaddir:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _readdir\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketclosedir (DIR *dir);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketclosedir\r
-_Gasketclosedir:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _closedir\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketstat (const char *path, struct stat *buf);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketstat\r
-_Gasketstat:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _stat\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketstatfs (const char *path, struct statfs *buf);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketstatfs\r
-_Gasketstatfs:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _statfs\r
- leave\r
- ret\r
-\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketrename (const char *oldpath, const char *newpath);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketrename\r
-_Gasketrename:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _rename\r
- leave\r
- ret\r
-\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# time_t Gasketmktime (struct tm *tm);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketmktime\r
-_Gasketmktime:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _mktime\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketfsync (int fd);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketfsync\r
-_Gasketfsync:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _fsync\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketchmod (const char *path, mode_t mode);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketchmod\r
-_Gasketchmod:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $56, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movw %ax, -12(%ebp)\r
- movzwl -12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _chmod\r
- leave\r
- ret\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketutime (const char *filename, const struct utimbuf *buf);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketutime\r
-_Gasketutime:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _rename\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gaskettcflush (int fildes, int queue_selector);\r
-#------------------------------------------------------------------------------\r
-.globl _Gaskettcflush\r
-_Gaskettcflush:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _rename\r
- leave\r
- ret\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# EFI_STATUS UgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);\r
#------------------------------------------------------------------------------\r
-.globl _GasketUgaCreate\r
-_GasketUgaCreate:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp #sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _UgaCreate\r
+# int GasketVoid (void *api)\r
+#------------------------------------------------------------------------------ \r
+.globl _GasketVoid\r
+_GasketVoid:\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $34, %esp # sub extra 0x10 from the stack for the AND\r
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, -12(%ebp)\r
+ movl -12(%ebp), %eax\r
+ call *%eax\r
leave\r
ret\r
\r
-\r
-#------------------------------------------------------------------------------\r
-# void Gasketperror (__const char *__s);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketperror\r
-_Gasketperror:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _perror\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketioctl (int fd, unsigned long int __request, ...);\r
-#\r
-# ... is really int or pointer to structure, so we can treat like an int\r
-#\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketioctl\r
-_Gasketioctl:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 16(%ebp), %eax\r
- movl %eax, 8(%esp)\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _ioctl\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketfcntl (int __fd, int __cmd, ...);\r
-#\r
-# ... is really int or pointer to structure, so we can treat like an int\r
-#\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketfcntl\r
-_Gasketfcntl:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 16(%ebp), %eax\r
- movl %eax, 8(%esp)\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _fcntl\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketcfsetispeed\r
-_Gasketcfsetispeed:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _cfsetispeed\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);\r
-#------------------------------------------------------------------------------\r
-.globl _Gasketcfsetospeed\r
-_Gasketcfsetospeed:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _cfsetospeed\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gaskettcgetattr (int __fd, struct termios *__termios_p); \r
-#------------------------------------------------------------------------------\r
-.globl _Gaskettcgetattr\r
-_Gaskettcgetattr:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _tcgetattr\r
- leave\r
- ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);\r
-#------------------------------------------------------------------------------\r
-.globl _Gaskettcsetattr\r
-_Gaskettcsetattr:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 16(%ebp), %eax\r
- movl %eax, 8(%esp)\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _tcsetattr\r
- leave\r
- ret\r
-\r
#------------------------------------------------------------------------------\r
-# int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);\r
#------------------------------------------------------------------------------\r
-.globl _Gasketsigaction\r
-_Gasketsigaction:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 16(%ebp), %eax\r
- movl %eax, 8(%esp)\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _sigaction\r
- leave\r
- ret\r
-\r
+.globl _GasketUintn\r
+_GasketUintn:\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $50, %esp # sub extra 0x10 from the stack for the AND\r
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, -12(%ebp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, (%esp)\r
+ movl -12(%ebp), %eax\r
+ call *%eax\r
+ leave\r
+ ret\r
\r
#------------------------------------------------------------------------------\r
-# int Gasketsetcontext (const ucontext_t *ucp);\r
#------------------------------------------------------------------------------\r
-.globl _Gasketsetcontext\r
-_Gasketsetcontext:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _setcontext\r
- leave\r
- ret\r
+.globl _GasketUintnUintn\r
+_GasketUintnUintn:\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $50, %esp # sub extra 0x10 from the stack for the AND \r
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, -12(%ebp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, (%esp)\r
+ movl -12(%ebp), %eax\r
+ call *%eax\r
+ leave\r
+ ret\r
\r
#------------------------------------------------------------------------------\r
-# int Gasketgetcontext (ucontext_t *ucp);\r
#------------------------------------------------------------------------------\r
-.globl _Gasketgetcontext\r
-_Gasketgetcontext:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _getcontext\r
- leave\r
- ret\r
+.globl _GasketUintnUintnUintn\r
+_GasketUintnUintnUintn:\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $50, %esp # sub extra 0x10 from the stack for the AND\r
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, -12(%ebp)\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, (%esp)\r
+ movl -12(%ebp), %eax\r
+ call *%eax\r
+ leave\r
+ ret\r
\r
#------------------------------------------------------------------------------\r
-# int Gasketsigemptyset (sigset_t *set);\r
#------------------------------------------------------------------------------\r
-.globl _Gasketsigemptyset\r
-_Gasketsigemptyset:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _sigemptyset\r
- leave\r
- ret\r
-\r
+.globl _GasketUintnUintnUintnUintn\r
+_GasketUintnUintnUintnUintn:\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $50, %esp # sub extra 0x10 from the stack for the AND\r
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax\r
+ movl %eax, -12(%ebp)\r
+ movl 24(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, (%esp)\r
+ movl -12(%ebp), %eax\r
+ call *%eax\r
+ leave\r
+ ret\r
\r
#------------------------------------------------------------------------------\r
-# int Gasketsigaltstack (const stack_t *ss, stack_t *oss);\r
#------------------------------------------------------------------------------\r
-.globl _Gasketsigaltstack\r
-_Gasketsigaltstack:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _sigaltstack\r
- leave\r
- ret\r
-\r
-#\r
-#\r
-# UGA Functions that get exported\r
-#\r
-#\r
+.globl _GasketUintn10Args\r
+_GasketUintn10Args:\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $82, %esp # sub extra 0x10 from the stack for the AND\r
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
+ movl 8(%ebp), %eax \r
+ movl %eax, -12(%ebp)\r
+ movl 48(%ebp), %eax\r
+ movl %eax, 36(%esp)\r
+ movl 44(%ebp), %eax\r
+ movl %eax, 32(%esp)\r
+ movl 40(%ebp), %eax\r
+ movl %eax, 28(%esp)\r
+ movl 36(%ebp), %eax\r
+ movl %eax, 24(%esp)\r
+ movl 32(%ebp), %eax\r
+ movl %eax, 20(%esp)\r
+ movl 28(%ebp), %eax\r
+ movl %eax, 16(%esp)\r
+ movl 24(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, (%esp)\r
+ movl -12(%ebp), %eax\r
+ call *%eax\r
+ leave\r
+ ret\r
\r
-#------------------------------------------------------------------------------\r
-# EFI_STATUS GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);\r
-#------------------------------------------------------------------------------ \r
-.globl _GasketUgaClose\r
-_GasketUgaClose:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _UgaClose\r
- leave\r
- ret\r
\r
#------------------------------------------------------------------------------\r
-# EFI_STATUS GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);\r
-#------------------------------------------------------------------------------\r
-.globl _GasketUgaSize\r
-_GasketUgaSize:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 16(%ebp), %eax\r
- movl %eax, 8(%esp)\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _UgaSize\r
- leave\r
- ret\r
-\r
-\r
#------------------------------------------------------------------------------\r
-# EFI_STATUS GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);\r
-#------------------------------------------------------------------------------ \r
-.globl _GasketUgaCheckKey\r
-_GasketUgaCheckKey:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp # sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _UgaCheckKey\r
- leave\r
- ret\r
+.globl _GasketUint64Uintn\r
+_GasketUint64Uintn:\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $66, %esp # sub extra 0x10 from the stack for the AND\r
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
+ movl 12(%ebp), %eax\r
+ movl %eax, -32(%ebp)\r
+ movl 16(%ebp), %eax\r
+ movl %eax, -28(%ebp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, -12(%ebp)\r
+ movl 20(%ebp), %eax\r
+ movl %eax, 8(%esp)\r
+ movl -32(%ebp), %eax\r
+ movl -28(%ebp), %edx\r
+ movl %eax, (%esp)\r
+ movl %edx, 4(%esp)\r
+ movl -12(%ebp), %eax\r
+ call *%eax\r
+ leave\r
+ ret\r
\r
#------------------------------------------------------------------------------\r
-# EFI_STATUS GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);\r
#------------------------------------------------------------------------------\r
-.globl _GasketUgaGetKey\r
-_GasketUgaGetKey:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $40, %esp #sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _UgaGetKey\r
+.globl _GasketUintnUint64Uintn\r
+_GasketUintnUint64Uintn:\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $66, %esp # sub extra 0x10 from the stack for the AND\r
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
+ movl 16(%ebp), %eax\r
+ movl %eax, -32(%ebp)\r
+ movl 20(%ebp), %eax\r
+ movl %eax, -28(%ebp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, -12(%ebp)\r
+ movl 24(%ebp), %eax\r
+ movl %eax, 12(%esp)\r
+ movl -32(%ebp), %eax\r
+ movl -28(%ebp), %edx\r
+ movl %eax, 4(%esp)\r
+ movl %edx, 8(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, (%esp)\r
+ movl -12(%ebp), %eax\r
+ call *%eax\r
leave\r
ret\r
\r
-\r
#------------------------------------------------------------------------------\r
-# EFI_STATUS\r
-# GasketUgaBlt(\r
-# EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,\r
-# IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,\r
-# IN EFI_UGA_BLT_OPERATION BltOperation,\r
-# IN UINTN SourceX,\r
-# IN UINTN SourceY,\r
-# IN UINTN DestinationX,\r
-# IN UINTN DestinationY,\r
-# IN UINTN Width,\r
-# IN UINTN Height,\r
-# IN UINTN Delta OPTIONAL\r
-# );\r
#------------------------------------------------------------------------------\r
-.globl _GasketUgaBlt\r
-_GasketUgaBlt:\r
- pushl %ebp\r
- movl %esp, %ebp\r
- subl $88, %esp #sub extra 0x10 from the stack for the AND\r
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
- movl $0, -12(%ebp)\r
- movl 44(%ebp), %eax\r
- movl %eax, 36(%esp)\r
- movl 40(%ebp), %eax\r
- movl %eax, 32(%esp)\r
- movl 36(%ebp), %eax\r
- movl %eax, 28(%esp)\r
- movl 32(%ebp), %eax\r
- movl %eax, 24(%esp)\r
- movl 28(%ebp), %eax\r
- movl %eax, 20(%esp)\r
- movl 24(%ebp), %eax\r
- movl %eax, 16(%esp)\r
- movl 20(%ebp), %eax\r
- movl %eax, 12(%esp)\r
- movl 16(%ebp), %eax\r
- movl %eax, 8(%esp)\r
- movl 12(%ebp), %eax\r
- movl %eax, 4(%esp)\r
- movl 8(%ebp), %eax\r
- movl %eax, (%esp)\r
- call _UgaBlt\r
- leave\r
- ret\r
+.globl _GasketUintnUint16\r
+_GasketUintnUint16:\r
+ pushl %ebp\r
+ movl %esp, %ebp\r
+ subl $66, %esp # sub extra 0x10 from the stack for the AND\r
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call\r
+ movl 16(%ebp), %eax\r
+ movw %ax, -28(%ebp)\r
+ movl 8(%ebp), %eax\r
+ movl %eax, -12(%ebp)\r
+ movzwl -28(%ebp), %eax\r
+ movl %eax, 4(%esp)\r
+ movl 12(%ebp), %eax\r
+ movl %eax, (%esp)\r
+ movl -12(%ebp), %eax\r
+ call *%eax\r
+ leave\r
+ ret\r
\r
+ .subsections_via_symbols\r
--- /dev/null
+/** @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);
+}
+
+
+
&mSecTemporaryRamSupportPpi
},
{
-
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
&gUnixFwhPpiGuid,
&mSecFwhInformationPpi
IN OUT EFI_PHYSICAL_ADDRESS *BaseAddress,
OUT UINT64 *Length
);
+
EFI_STATUS
EFIAPI
SecNt32PeCoffRelocateImage (
// 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
if (EFI_ERROR (Status)) {
return Status;
}
+
+ Status = PeCoffLoaderRelocateImage (&ImageContext);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
SecPeCoffRelocateImageExtraAction (&ImageContext);
SecUnixFdAddress (
IN UINTN Index,
IN OUT EFI_PHYSICAL_ADDRESS *FdBase,
- IN OUT UINT64 *FdSize
+ IN OUT UINT64 *FdSize,
+ IN OUT EFI_PHYSICAL_ADDRESS *FixUp
)
/*++
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
*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;
}
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);
(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());
}
EFIAPI\r
SecPeiReportStatusCode (\r
IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_STATUS_CODE_TYPE CodeType,\r
- IN EFI_STATUS_CODE_VALUE Value,\r
- IN UINT32 Instance,\r
+ IN EFI_STATUS_CODE_TYPE CodeType,\r
+ IN EFI_STATUS_CODE_VALUE Value,\r
+ IN UINT32 Instance,\r
IN CONST EFI_GUID *CallerId,\r
IN CONST EFI_STATUS_CODE_DATA *Data OPTIONAL\r
)\r
SecUnixFdAddress (\r
IN UINTN Index,\r
IN OUT EFI_PHYSICAL_ADDRESS *FdBase,\r
- IN OUT UINT64 *FdSize\r
+ IN OUT UINT64 *FdSize,\r
+ IN OUT EFI_PHYSICAL_ADDRESS *FixUp\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- Index - TODO: add argument description\r
- FdBase - TODO: add argument description\r
- FdSize - TODO: add argument description\r
-\r
-Returns:\r
-\r
- TODO: add return values\r
-\r
---*/\r
;\r
\r
EFI_STATUS\r
);\r
\r
\r
+\r
+VOID SetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));\r
+void msSleep (unsigned long Milliseconds);\r
+void GetLocalTime (EFI_TIME *Time);\r
+void TzSet (void);\r
+long GetTimeZone(void);\r
+int GetDayLight(void);\r
+int GetErrno(void);\r
+\r
+\r
+\r
extern EFI_UNIX_THUNK_PROTOCOL *gUnix;\r
UnixThunk.c\r
FwVol.c\r
SecMain.c\r
+ Gasket.c\r
\r
[Sources.Ia32] \r
Ia32/Gasket.S\r
gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareVolume\r
gEfiUnixPkgTokenSpaceGuid.PcdUnixMemorySizeForSecMain\r
gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareFdSize\r
+ gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress\r
\r
[BuildOptions.common]\r
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\r
# Need to do this link via gcc and not ld as the pathing to libraries changes from OS version to OS version\r
#\r
XCODE:*_*_IA32_DLINK_PATH == gcc\r
- XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -L/usr/X11R6/lib -lXext -lX11 -lIOKit -framework Carbon \r
+ XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -o $(BIN_DIR)/SecMain -L/usr/X11R6/lib -lXext -lX11 -lIOKit -framework Carbon \r
XCODE:*_*_IA32_ASM_FLAGS == -arch i386 -g\r
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__
//
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;
}
}
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;
#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);
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);
rewinddir,
readdir,
closedir,
- stat,
+ (UnixStat)stat,
statfs,
rename,
mktime,
--- /dev/null
+#------------------------------------------------------------------------------
+#
+# 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
+
+
+
//\r
// Open the device\r
//\r
- Private->fd = Private->UnixThunk->Open\r
- (Private->Filename, Private->Mode, 0644);\r
-\r
+ Private->fd = Private->UnixThunk->Open (Private->Filename, Private->Mode, 0644);\r
if (Private->fd < 0) {\r
- DEBUG ((EFI_D_INFO, "PlOpenBlock: Could not open %s\n",\r
- Private->Filename));\r
+ DEBUG ((EFI_D_INFO, "PlOpenBlock: Could not open %a\n", Private->Filename));\r
BlockIo->Media->MediaPresent = FALSE;\r
Status = EFI_NO_MEDIA;\r
goto Done;\r
// get the size of the file\r
//\r
Status = SetFilePointer64 (Private, 0, &FileSize, SEEK_END);\r
-\r
if (EFI_ERROR (Status)) {\r
FileSize = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);\r
- DEBUG ((EFI_D_ERROR, "PlOpenBlock: Could not get filesize of %s\n", Private->Filename));\r
+ DEBUG ((EFI_D_ERROR, "PlOpenBlock: Could not get filesize of %a\n", Private->Filename));\r
Status = EFI_UNSUPPORTED;\r
goto Done;\r
}\r
\r
if (Private->NumberOfBlocks == 0) {\r
Private->NumberOfBlocks = DivU64x32 (FileSize, Private->BlockSize);\r
+ Private->LastBlock = Private->NumberOfBlocks - 1;\r
+ Private->Media.LastBlock = Private->LastBlock;\r
}\r
\r
EndOfFile = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);\r
Private->UnixThunk->FTruncate (Private->fd, EndOfFile);\r
}\r
\r
- DEBUG ((EFI_D_INIT, "%HPlOpenBlock: opened %s%N\n", Private->Filename));\r
+ DEBUG ((EFI_D_INIT, "%HPlOpenBlock: opened %a%N\n", Private->Filename));\r
Status = EFI_SUCCESS;\r
\r
Done:\r
Status = EFI_UNSUPPORTED;\r
}\r
\r
- //\r
+ //\r
// Close protocol, don't use device path protocol in the Support() function\r
//\r
gBS->CloseProtocol (\r
{\r
EFI_STATUS Status;\r
EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;\r
- UNIX_FWH_PPI *FwhPpi;\r
+ UNIX_FWH_PPI *FwhPpi;\r
EFI_PHYSICAL_ADDRESS FdBase;\r
+ EFI_PHYSICAL_ADDRESS FdFixUp;\r
EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
UINT64 FdSize;\r
UINTN Index;\r
//\r
// Get information about all the FD's in the system\r
//\r
- Status = FwhPpi->UnixFwh (Index, &FdBase, &FdSize);\r
+ Status = FwhPpi->UnixFwh (Index, &FdBase, &FdSize, &FdFixUp);\r
if (!EFI_ERROR (Status)) {\r
//\r
// Assume the FD starts with an FV header\r
PcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
PcdGet32 (PcdUnixFlashNvStorageEventLogSize);\r
\r
- BuildFvHob (FdBase + PcdGet32 (PcdUnixFlashNvStorageVariableBase), FdSize);\r
+ BuildFvHob (FdFixUp + PcdGet32 (PcdUnixFlashNvStorageVariableBase), FdSize);\r
} else {\r
//\r
// For other FD's just map them in.\r
// TODO: EFI_SUCCESS - add return value to function comment\r
{\r
EFI_STATUS Status;\r
- UNIX_FWH_PPI *UnixFwhPpi;\r
+ UNIX_FWH_PPI *UnixFwhPpi;\r
EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;\r
EFI_PHYSICAL_ADDRESS FdBase;\r
+ EFI_PHYSICAL_ADDRESS FdFixUp;\r
UINT64 FdSize;\r
\r
DEBUG ((EFI_D_ERROR, "NT 32 Flash Map PEIM Loaded\n"));\r
//\r
// Assume that FD0 contains the Flash map.\r
//\r
- Status = UnixFwhPpi->UnixFwh (0, &FdBase, &FdSize);\r
+ Status = UnixFwhPpi->UnixFwh (0, &FdBase, &FdSize, &FdFixUp);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
- PcdSet32 (PcdFlashNvStorageVariableBase, PcdGet32 (PcdUnixFlashNvStorageVariableBase) + (UINT32) FdBase);\r
- PcdSet32 (PcdFlashNvStorageFtwWorkingBase, PcdGet32 (PcdUnixFlashNvStorageFtwWorkingBase) + (UINT32) FdBase);\r
- PcdSet32 (PcdFlashNvStorageFtwSpareBase, PcdGet32 (PcdUnixFlashNvStorageFtwSpareBase) + (UINT32) FdBase);\r
+ PcdSet32 (PcdFlashNvStorageVariableBase, PcdGet32 (PcdUnixFlashNvStorageVariableBase) + (UINT32)FdFixUp);\r
+ PcdSet32 (PcdFlashNvStorageFtwWorkingBase, PcdGet32 (PcdUnixFlashNvStorageFtwWorkingBase) + (UINT32)FdFixUp);\r
+ PcdSet32 (PcdFlashNvStorageFtwSpareBase, PcdGet32 (PcdUnixFlashNvStorageFtwSpareBase) + (UINT32)FdFixUp);\r
\r
return EFI_SUCCESS;\r
}\r
#\r
################################################################################\r
[FD.Fv_Recovery]\r
-BaseAddress = 0x0|gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress #The base address of the FLASH Device.\r
-Size = 0x002a0000 #The size in bytes of the FLASH Device\r
+#\r
+# In OS X PEIMs are really XIP, so we need to make this address match the malloced \r
+# buffer for the FD (0x41000000). If this address does not match the FV will get\r
+# relocated in place (works, but not a great idea).\r
+#\r
+BaseAddress = 0x41000000|gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress #The base address of the FLASH Device.\r
+Size = 0x002a0000|gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareFdSize #The size in bytes of the FLASH Device\r
ErasePolarity = 1\r
BlockSize = 0x10000\r
NumBlocks = 0x2a\r
NewPrivateFile->IsDirectoryPath = FALSE;\r
}\r
} else {\r
- struct stat finfo;\r
+ STAT_FIX finfo;\r
int res = NewPrivateFile->UnixThunk->Stat (NewPrivateFile->FileName, &finfo);\r
if (res == 0 && S_ISDIR(finfo.st_mode))\r
NewPrivateFile->IsDirectoryPath = TRUE;\r
struct tm *tm;\r
tm = UnixThunk->GmTime (&SystemTime);\r
Time->Year = tm->tm_year;\r
- Time->Month = tm->tm_mon;\r
+ Time->Month = tm->tm_mon + 1;\r
Time->Day = tm->tm_mday;\r
Time->Hour = tm->tm_hour;\r
Time->Minute = tm->tm_min;\r
UINTN NameSize;\r
UINTN ResultSize;\r
EFI_FILE_INFO *Info;\r
- CHAR8 *RealFileName;\r
- CHAR8 *TempPointer;\r
+ CHAR8 *RealFileName;\r
+ CHAR8 *TempPointer;\r
CHAR16 *BufferFileName;\r
- struct stat buf;\r
+ STAT_FIX buf;\r
\r
if (FileName != NULL) {\r
RealFileName = FileName;\r
UINTN OldInfoSize;\r
EFI_TPL OldTpl;\r
mode_t NewAttr;\r
- struct stat OldAttr;\r
+ STAT_FIX OldAttr;\r
CHAR8 *OldFileName;\r
CHAR8 *NewFileName;\r
CHAR8 *CharPointer;\r
--- /dev/null
+#!/bin/bash
+#
+# External makefile Xcode project project uses this script to build and clean from the Xcode GUI
+#
+
+# force exit on error
+set -e
+
+#
+# Source the workspace and set up the environment varaibles we need
+#
+cd ../..
+echo `pwd`
+./build.sh
--- /dev/null
+// !$*UTF8*$!
+{
+ 08FB7793FE84155DC02AAC07 /* Project object */ = {
+ activeBuildConfigurationName = Debug;
+ activeExecutable = BA11A1010FB10BCE00D06FEC /* SecMain.dll */;
+ activeTarget = D28A88AD04BDD90700651E21 /* xcode_project */;
+ breakpoints = (
+ BA11A11A0FB10E0700D06FEC /* SecGdbScriptBreak */,
+ );
+ codeSenseManager = BA11A0FE0FB10B4800D06FEC /* Code sense */;
+ executables = (
+ BA11A1010FB10BCE00D06FEC /* SecMain.dll */,
+ );
+ perUserDictionary = {
+ "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = {
+ PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+ PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID;
+ PBXFileTableDataSourceColumnWidthsKey = (
+ 20,
+ 20,
+ 198,
+ 20,
+ 99,
+ 99,
+ 29,
+ 20,
+ );
+ PBXFileTableDataSourceColumnsKey = (
+ PBXBreakpointsDataSource_ActionID,
+ PBXBreakpointsDataSource_TypeID,
+ PBXBreakpointsDataSource_BreakpointID,
+ PBXBreakpointsDataSource_UseID,
+ PBXBreakpointsDataSource_LocationID,
+ PBXBreakpointsDataSource_ConditionID,
+ PBXBreakpointsDataSource_IgnoreCountID,
+ PBXBreakpointsDataSource_ContinueID,
+ );
+ };
+ PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = {
+ PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+ PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID;
+ PBXFileTableDataSourceColumnWidthsKey = (
+ 22,
+ 300,
+ 229,
+ );
+ PBXFileTableDataSourceColumnsKey = (
+ PBXExecutablesDataSource_ActiveFlagID,
+ PBXExecutablesDataSource_NameID,
+ PBXExecutablesDataSource_CommentsID,
+ );
+ };
+ PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
+ PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+ PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+ PBXFileTableDataSourceColumnWidthsKey = (
+ 20,
+ 341,
+ 20,
+ 48,
+ 43,
+ 43,
+ 20,
+ );
+ PBXFileTableDataSourceColumnsKey = (
+ PBXFileDataSource_FiletypeID,
+ PBXFileDataSource_Filename_ColumnID,
+ PBXFileDataSource_Built_ColumnID,
+ PBXFileDataSource_ObjectSize_ColumnID,
+ PBXFileDataSource_Errors_ColumnID,
+ PBXFileDataSource_Warnings_ColumnID,
+ PBXFileDataSource_Target_ColumnID,
+ );
+ };
+ PBXPerProjectTemplateStateSaveDate = 263260969;
+ PBXWorkspaceStateSaveDate = 263260969;
+ };
+ sourceControlManager = BA11A0FD0FB10B4800D06FEC /* Source Control */;
+ userBuildSettings = {
+ };
+ };
+ BA11A0FD0FB10B4800D06FEC /* Source Control */ = {
+ isa = PBXSourceControlManager;
+ fallbackIsa = XCSourceControlManager;
+ isSCMEnabled = 0;
+ repositoryNamesForRoots = {
+ };
+ scmConfiguration = {
+ };
+ };
+ BA11A0FE0FB10B4800D06FEC /* Code sense */ = {
+ isa = PBXCodeSenseManager;
+ indexTemplatePath = "";
+ };
+ BA11A1010FB10BCE00D06FEC /* SecMain.dll */ = {
+ isa = PBXExecutable;
+ activeArgIndices = (
+ );
+ argumentStrings = (
+ );
+ autoAttachOnCrash = 1;
+ breakpointsEnabled = 1;
+ configStateDict = {
+ "PBXLSLaunchAction-0" = {
+ PBXLSLaunchAction = 0;
+ PBXLSLaunchStartAction = 1;
+ PBXLSLaunchStdioStyle = 2;
+ PBXLSLaunchStyle = 0;
+ class = PBXLSRunLaunchConfig;
+ commandLineArgs = (
+ );
+ displayName = "Executable Runner";
+ environment = {
+ };
+ identifier = com.apple.Xcode.launch.runConfig;
+ remoteHostInfo = "";
+ startActionInfo = "";
+ };
+ "PBXLSLaunchAction-1" = {
+ PBXLSLaunchAction = 1;
+ PBXLSLaunchStartAction = 1;
+ PBXLSLaunchStdioStyle = 2;
+ PBXLSLaunchStyle = 0;
+ class = PBXGDB_LaunchConfig;
+ commandLineArgs = (
+ );
+ displayName = GDB;
+ environment = {
+ };
+ identifier = com.apple.Xcode.launch.GDBMI_Config;
+ remoteHostInfo = "";
+ startActionInfo = "";
+ };
+ };
+ customDataFormattersEnabled = 0;
+ dataTipCustomDataFormattersEnabled = 1;
+ dataTipShowTypeColumn = 1;
+ dataTipSortType = 0;
+ debuggerPlugin = GDBDebugging;
+ disassemblyDisplayState = 0;
+ dylibVariantSuffix = "";
+ enableDebugStr = 1;
+ environmentEntries = (
+ );
+ executableSystemSymbolLevel = 0;
+ executableUserSymbolLevel = 0;
+ launchableReference = BA11A1020FB10BCE00D06FEC /* SecMain.dll */;
+ libgmallocEnabled = 0;
+ name = SecMain.dll;
+ savedGlobals = {
+ };
+ showTypeColumn = 0;
+ sourceDirectories = (
+ );
+ startupPath = ../../../Build/Unix/DEBUG_XCODE32/IA32;
+ };
+ BA11A1020FB10BCE00D06FEC /* SecMain.dll */ = {
+ isa = PBXFileReference;
+ lastKnownFileType = "compiled.mach-o.executable";
+ name = SecMain.dll;
+ path = ../../../Build/Unix/DEBUG_XCODE32/IA32/SecMain;
+ sourceTree = SOURCE_ROOT;
+ };
+ BA11A11A0FB10E0700D06FEC /* SecGdbScriptBreak */ = {
+ isa = PBXSymbolicBreakpoint;
+ actions = (
+ BA11A11E0FB10E2200D06FEC /* XCBreakpointCommandAction */,
+ );
+ breakpointStyle = 1;
+ continueAfterActions = 1;
+ countType = 0;
+ delayBeforeContinue = 0;
+ hitCount = 0;
+ ignoreCount = 0;
+ location = SecMain;
+ modificationTime = 263261853.260195;
+ originalNumberOfMultipleMatches = 1;
+ state = 1;
+ symbolName = SecGdbScriptBreak;
+ };
+ BA11A11E0FB10E2200D06FEC /* XCBreakpointCommandAction */ = {
+ isa = XCBreakpointCommandAction;
+ command = "source SecMain.gdb";
+ fallbackIsa = XCBreakpointAction;
+ logCommand = 0;
+ useDebuggerSideImplementation = 1;
+ };
+ D28A88AD04BDD90700651E21 /* xcode_project */ = {
+ activeExec = 0;
+ };
+}
--- /dev/null
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 45;
+ objects = {
+
+/* Begin PBXFileReference section */
+ F27EDBED101FA6FC0097B575 /* PciIoKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PciIoKit.h; path = ../../Sec/PciIoKit.h; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXGroup section */
+ 08FB7794FE84155DC02AAC07 /* xcode_project */ = {
+ isa = PBXGroup;
+ children = (
+ F27EDBED101FA6FC0097B575 /* PciIoKit.h */,
+ );
+ name = xcode_project;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXLegacyTarget section */
+ D28A88AD04BDD90700651E21 /* xcode_project */ = {
+ isa = PBXLegacyTarget;
+ buildArgumentsString = "$(ACTION)";
+ buildConfigurationList = 1DEB918F08733D9F0010E9CD /* Build configuration list for PBXLegacyTarget "xcode_project" */;
+ buildPhases = (
+ );
+ buildToolPath = ./XcodeBuild.sh;
+ buildWorkingDirectory = "";
+ dependencies = (
+ );
+ name = xcode_project;
+ passBuildSettingsInEnvironment = 1;
+ productName = xcode_project;
+ };
+/* End PBXLegacyTarget section */
+
+/* Begin PBXProject section */
+ 08FB7793FE84155DC02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 1DEB919308733D9F0010E9CD /* Build configuration list for PBXProject "xcode_project" */;
+ compatibilityVersion = "Xcode 3.1";
+ hasScannedForEncodings = 1;
+ mainGroup = 08FB7794FE84155DC02AAC07 /* xcode_project */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D28A88AD04BDD90700651E21 /* xcode_project */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin XCBuildConfiguration section */
+ 1DEB919008733D9F0010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = xcode_project;
+ };
+ name = Debug;
+ };
+ 1DEB919108733D9F0010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = "";
+ PRODUCT_NAME = xcode_project;
+ };
+ name = Release;
+ };
+ 1DEB919408733D9F0010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ PREBINDING = NO;
+ SDKROOT = macosx10.6;
+ };
+ name = Debug;
+ };
+ 1DEB919508733D9F0010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ SDKROOT = macosx10.6;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1DEB918F08733D9F0010E9CD /* Build configuration list for PBXLegacyTarget "xcode_project" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB919008733D9F0010E9CD /* Debug */,
+ 1DEB919108733D9F0010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 1DEB919308733D9F0010E9CD /* Build configuration list for PBXProject "xcode_project" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB919408733D9F0010E9CD /* Debug */,
+ 1DEB919508733D9F0010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
+}
--- /dev/null
+#!/bin/bash
+#
+# 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.
+#
+
+set -e
+shopt -s nocasematch
+
+
+
+#
+# Setup workspace if it is not set
+#
+if [ -z "$WORKSPACE" ]
+then
+ echo Initializing workspace
+ cd ..
+ export EDK_TOOLS_PATH=`pwd`/BaseTools
+ echo $EDK_TOOLS_PATH
+ source edksetup.sh BaseTools
+else
+ echo Building from: $WORKSPACE
+fi
+
+#
+# Pick a default tool type for a given OS
+#
+TARGET_TOOLS=MYTOOLS
+case `uname` in
+ CYGWIN*) echo Cygwin not fully supported yet. ;;
+ Darwin*)
+ Major=$(uname -r | cut -f 1 -d '.')
+ if [[ $Major == 9 ]]
+ then
+ echo UnixPkg requires Snow Leopard or later OS
+ exit 1
+ else
+ TARGET_TOOLS=XCODE32
+ fi
+ ;;
+ Linux*) TARGET_TOOLS=ELFGCC ;;
+
+esac
+
+BUILD_ROOT_ARCH=$WORKSPACE/Build/Unix/DEBUG_"$TARGET_TOOLS"/IA32
+
+if [[ ! -f `which build` || ! -f `which GenFv` ]];
+then
+ # build the tools if they don't yet exist
+ echo Building tools
+ make -C $WORKSPACE/BaseTools
+else
+ echo using prebuilt tools
+fi
+
+
+for arg in "$@"
+do
+ if [[ $arg == run ]]; then
+ case `uname` in
+ Darwin*)
+ #
+ # On Darwin we can't use dlopen, so we have to load the real PE/COFF images.
+ # This .gdbinit script sets a breakpoint that loads symbols for the PE/COFFEE
+ # images that get loaded in SecMain
+ #
+ cp $WORKSPACE/UnixPkg/.gdbinit $WORKSPACE/Build/Unix/DEBUG_"$TARGET_TOOLS"/IA32
+ ;;
+ esac
+
+ /usr/bin/gdb $BUILD_ROOT_ARCH/SecMain -q -cd=$BUILD_ROOT_ARCH
+ exit
+ fi
+
+ if [[ $arg == cleanall ]]; then
+ make -C $WORKSPACE/BaseTools clean
+ fi
+done
+
+
+#
+# Build the edk2 UnixPkg
+#
+echo $PATH
+echo `which build`
+build -p $WORKSPACE/EdkShellPkg/EdkShellPkg.dsc -a IA32 -t $TARGET_TOOLS $1 $2 $3 $4 $5 $6 $7 $8
+build -p $WORKSPACE/UnixPkg/UnixPkg.dsc -a IA32 -t $TARGET_TOOLS $1 $2 $3 $4 $5 $6 $7 $8
+exit $?
+
Notes: ELFGCC is defined in <Workspace>/Conf/tools_def.txt file. This tool chain use native gcc/binutil instead of
cross-compiler like UNIXGCC tool chain.
+On Mac OS X you can cd into UnixPkg directory and execute ./build.sh to build. This does not require
+setting up the environment like running the build command. Note Snow Leopard or later is required.
+This script should also work for any *INUX, but has not been tested.
+
+./build.sh run will lanuch the emulator in gdb so you can source level debug via gdb.
+
+
+Notes:
+=====
+On Mac OS X Snow Leopard you can use Xcode 3.2 as a GUI debugger.
+Launch Xcode and open UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj
+Under the build menu chose build and debug. shift-cmd-B shows the build results.
+
+Under most *INUX the EFI executables are placed in the emulated EFI memory by the EFI PE/COFF loader
+but dlopen() is used to also load the image into the process to support source level debug.
+The entry point for the image is moved from the EFI emulator memory into the dlopen() image. This
+is not the case for Mac OS X. On Mac OS X a debugger script is used and the real EFI images in
+the emulator are the ones being debugged.
+
+Also on Mac OS X the stack alignment requirements for IA-32 are 16 bytes and this is more strict
+than the EFI ABI. To work around this gasket code was introduced to ensure the stack is always
+16 byte aligned when making any POSIX call on Mac OS X.
+
+To build PE/COFF images with Xcode 3.2 and extra tool call mtoc is required to convert Mach-O
+images into PE/COFF images. The tool only supports EFI PE/COFF images and the instructions on
+how to download it are on the edk2 website.
FAQ
===