summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--UnixPkg/.gdbinit8
-rw-r--r--UnixPkg/FvbServicesRuntimeDxe/FWBlockService.c24
-rw-r--r--UnixPkg/FvbServicesRuntimeDxe/FwBlockService.h10
-rw-r--r--UnixPkg/Include/Ppi/UnixFwh.h4
-rw-r--r--UnixPkg/Include/Protocol/UnixThunk.h83
-rw-r--r--UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c2
-rw-r--r--UnixPkg/Sec/Gasket.c418
-rw-r--r--UnixPkg/Sec/Gasket.h141
-rw-r--r--UnixPkg/Sec/Ia32/Gasket.S1128
-rw-r--r--UnixPkg/Sec/Ia32/GasketTemplate.c142
-rw-r--r--UnixPkg/Sec/SecMain.c35
-rw-r--r--UnixPkg/Sec/SecMain.h37
-rw-r--r--UnixPkg/Sec/SecMain.inf4
-rw-r--r--UnixPkg/Sec/UgaX11.c33
-rw-r--r--UnixPkg/Sec/UnixThunk.c74
-rw-r--r--UnixPkg/Sec/X64/Gasket.S1026
-rw-r--r--UnixPkg/UnixBlockIoDxe/UnixBlockIo.c14
-rw-r--r--UnixPkg/UnixBusDriverDxe/UnixBusDriver.c2
-rw-r--r--UnixPkg/UnixFirmwareVolumePei/UnixFwh.c7
-rw-r--r--UnixPkg/UnixFlashMapPei/FlashMap.c11
-rw-r--r--UnixPkg/UnixPkg.fdf9
-rw-r--r--UnixPkg/UnixSimpleFileSystemDxe/UnixSimpleFileSystem.c12
-rwxr-xr-xUnixPkg/Xcode/xcode_project/XcodeBuild.sh14
-rw-r--r--UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/default.pbxuser191
-rw-r--r--UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/project.pbxproj122
-rwxr-xr-xUnixPkg/build.sh96
-rw-r--r--UnixPkg/readme.txt26
27 files changed, 2564 insertions, 1109 deletions
diff --git a/UnixPkg/.gdbinit b/UnixPkg/.gdbinit
new file mode 100644
index 0000000000..173818c0e7
--- /dev/null
+++ b/UnixPkg/.gdbinit
@@ -0,0 +1,8 @@
+set confirm off
+set output-radix 16
+b SecGdbScriptBreak
+command
+silent
+source SecMain.gdb
+c
+end
diff --git a/UnixPkg/FvbServicesRuntimeDxe/FWBlockService.c b/UnixPkg/FvbServicesRuntimeDxe/FWBlockService.c
index 30723c5d72..c316d7c2ac 100644
--- a/UnixPkg/FvbServicesRuntimeDxe/FWBlockService.c
+++ b/UnixPkg/FvbServicesRuntimeDxe/FWBlockService.c
@@ -226,7 +226,7 @@ Returns:
EFI_STATUS
FvbGetVolumeAttributes (
IN UINTN Instance,
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
IN ESAL_FWB_GLOBAL *Global,
IN BOOLEAN Virtual
)
@@ -560,10 +560,10 @@ Returns:
{
EFI_FVB_ATTRIBUTES_2 Attributes;
- UINTN LbaAddress;
- UINTN LbaLength;
- EFI_STATUS Status;
- UINT8 Data;
+ UINTN LbaAddress;
+ UINTN LbaLength;
+ EFI_STATUS Status;
+ UINT8 Data;
//
// Check if the FV is write enabled
@@ -596,7 +596,7 @@ Returns:
EFI_STATUS
FvbSetVolumeAttributes (
IN UINTN Instance,
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
IN ESAL_FWB_GLOBAL *Global,
IN BOOLEAN Virtual
)
@@ -629,10 +629,10 @@ Returns:
EFI_FW_VOL_INSTANCE *FwhInstance = NULL;
EFI_FVB_ATTRIBUTES_2 OldAttributes;
EFI_FVB_ATTRIBUTES_2 *AttribPtr;
- UINT32 Capabilities;
- UINT32 OldStatus;
- UINT32 NewStatus;
- EFI_STATUS Status;
+ UINT32 Capabilities;
+ UINT32 OldStatus;
+ UINT32 NewStatus;
+ EFI_STATUS Status;
EFI_FVB_ATTRIBUTES_2 UnchangedAttributes;
@@ -809,7 +809,7 @@ EFI_STATUS
EFIAPI
FvbProtocolGetAttributes (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes
)
/*++
@@ -836,7 +836,7 @@ EFI_STATUS
EFIAPI
FvbProtocolSetAttributes (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
)
/*++
diff --git a/UnixPkg/FvbServicesRuntimeDxe/FwBlockService.h b/UnixPkg/FvbServicesRuntimeDxe/FwBlockService.h
index b87192dfde..5c9fc9f86b 100644
--- a/UnixPkg/FvbServicesRuntimeDxe/FwBlockService.h
+++ b/UnixPkg/FvbServicesRuntimeDxe/FwBlockService.h
@@ -102,7 +102,7 @@ FvbEraseBlock (
EFI_STATUS
FvbSetVolumeAttributes (
IN UINTN Instance,
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
IN ESAL_FWB_GLOBAL *Global,
IN BOOLEAN Virtual
)
@@ -111,7 +111,7 @@ FvbSetVolumeAttributes (
EFI_STATUS
FvbGetVolumeAttributes (
IN UINTN Instance,
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
IN ESAL_FWB_GLOBAL *Global,
IN BOOLEAN Virtual
)
@@ -162,7 +162,7 @@ EFI_STATUS
EFIAPI
FvbProtocolGetAttributes (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes
)
;
@@ -170,7 +170,7 @@ EFI_STATUS
EFIAPI
FvbProtocolSetAttributes (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
)
;
@@ -178,7 +178,7 @@ EFI_STATUS
EFIAPI
FvbProtocolGetPhysicalAddress (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- OUT EFI_PHYSICAL_ADDRESS *Address
+ OUT EFI_PHYSICAL_ADDRESS *Address
)
;
diff --git a/UnixPkg/Include/Ppi/UnixFwh.h b/UnixPkg/Include/Ppi/UnixFwh.h
index 1deed11454..a989c8a0aa 100644
--- a/UnixPkg/Include/Ppi/UnixFwh.h
+++ b/UnixPkg/Include/Ppi/UnixFwh.h
@@ -34,7 +34,8 @@ EFI_STATUS
(EFIAPI *UNIX_FWH_INFORMATION) (
IN UINTN Index,
IN OUT EFI_PHYSICAL_ADDRESS *FdBase,
- IN OUT UINT64 *FdSize
+ IN OUT UINT64 *FdSize,
+ IN OUT EFI_PHYSICAL_ADDRESS *FixUp
);
/*++
@@ -47,6 +48,7 @@ Arguments:
Index - Which FD, starts at zero.
FdSize - Size of the FD in bytes
FdBase - Start address of the FD. Assume it points to an FV Header
+ FixUp - Difference between actual FD address and build address
Returns:
EFI_SUCCESS - Return the Base address and size of the FV
diff --git a/UnixPkg/Include/Protocol/UnixThunk.h b/UnixPkg/Include/Protocol/UnixThunk.h
index 29a9791292..93e77e8f5d 100644
--- a/UnixPkg/Include/Protocol/UnixThunk.h
+++ b/UnixPkg/Include/Protocol/UnixThunk.h
@@ -62,11 +62,80 @@ Abstract:
#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 } \
@@ -115,8 +184,8 @@ typedef
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);
@@ -150,7 +219,7 @@ int
(*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);
@@ -213,7 +282,7 @@ int
(*UnixTcsetattr) (int __fd, int __optional_actions,
__const struct termios *__termios_p);
-typedef
+typedef
VOID *
(*UnixDlopen) (const char *FileName, int Flag);
@@ -230,20 +299,20 @@ VOID *
// 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
diff --git a/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c b/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c
index dea03fb142..f3a481b3d2 100644
--- a/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c
+++ b/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c
@@ -87,7 +87,7 @@ PeCoffLoaderRelocateImageExtraAction (
if (mUnix == NULL) {
UnixPeCoffGetUnixThunkStucture ();
}
- mUnix->PeCoffRelocateImageExtraAction (ImageContext);
+ mUnix->PeCoffRelocateImageExtraAction (ImageContext);
}
diff --git a/UnixPkg/Sec/Gasket.c b/UnixPkg/Sec/Gasket.c
new file mode 100644
index 0000000000..30f06a2479
--- /dev/null
+++ b/UnixPkg/Sec/Gasket.c
@@ -0,0 +1,418 @@
+
+#include "SecMain.h"
+#include "Gasket.h"
+
+//
+// Gasket functions for EFI_UNIX_THUNK_PROTOCOL
+//
+
+void
+GasketmsSleep (unsigned long Milliseconds)
+{
+ GasketUintn (msSleep, Milliseconds);
+ return;
+}
+
+void
+Gasketexit (int status)
+{
+ GasketUintn (exit, status);
+ return;
+}
+
+
+void
+GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs))
+{
+ GasketUint64Uintn (SetTimer, PeriodMs, (UINTN)CallBack);
+ return;
+}
+
+
+void
+GasketGetLocalTime (EFI_TIME *Time)
+{
+ GasketUintn (GetLocalTime, (UINTN)Time);
+ return;
+}
+
+
+struct tm *
+Gasketgmtime (const time_t *clock)
+{
+ return (struct tm *)(UINTN)GasketUintn (localtime, (UINTN)clock);
+}
+
+
+long
+GasketGetTimeZone (void)
+{
+ return GasketVoid (GetTimeZone);
+}
+
+
+int
+GasketGetDayLight (void)
+{
+ return GasketVoid (GetDayLight);
+}
+
+
+int
+Gasketpoll (struct pollfd *pfd, int nfds, int timeout)
+{
+ return GasketUintnUintnUintn (poll, (UINTN)pfd, nfds, timeout);
+}
+
+
+int
+Gasketread (int fd, void *buf, int count)
+{
+ return GasketUintnUintnUintn (read, fd, (UINTN)buf, count);
+}
+
+
+int
+Gasketwrite (int fd, const void *buf, int count)
+{
+ return GasketUintnUintnUintn (write, fd, (UINTN)buf, count);
+}
+
+
+char *
+Gasketgetenv (const char *name)
+{
+ return (char *)(UINTN)GasketUintn (getenv, (UINTN)name);
+}
+
+
+int
+Gasketopen (const char *name, int flags, int mode)
+{
+ return GasketUintnUintnUintn (open, (UINTN)name, flags, mode);
+}
+
+
+off_t
+Gasketlseek (int fd, off_t off, int whence)
+{
+ if (sizeof off == 8) {
+ return GasketUintnUint64Uintn (lseek, fd, off, whence);
+ } else if (sizeof off == 4) {
+ return GasketUintnUintnUintn (lseek, fd, off, whence);
+ }
+}
+
+
+int
+Gasketftruncate (int fd, long int len)
+{
+ return GasketUintnUintn (ftruncate, fd, len);
+}
+
+
+int
+Gasketclose (int fd)
+{
+ return GasketUintn (close, fd);
+}
+
+
+int
+Gasketmkdir (const char *pathname, mode_t mode)
+{
+ return GasketUintnUint16 (mkdir, (UINTN)pathname, mode);
+}
+
+
+int
+Gasketrmdir (const char *pathname)
+{
+ return GasketUintn (rmdir, (UINTN)pathname);
+}
+
+
+int
+Gasketunlink (const char *pathname)
+{
+ return GasketUintn (unlink, (UINTN)pathname);
+}
+
+
+int
+GasketGetErrno (void)
+{
+ return GasketVoid (GetErrno);
+}
+
+
+DIR *
+Gasketopendir (const char *pathname)
+{
+ return (DIR *)(UINTN)GasketUintn (opendir, (UINTN)pathname);
+}
+
+
+void *
+Gasketrewinddir (DIR *dir)
+{
+ return (void *)(UINTN)GasketUintn (rewinddir, (UINTN)dir);
+}
+
+
+struct dirent *
+Gasketreaddir (DIR *dir)
+{
+ return (struct dirent *)(UINTN)GasketUintn (readdir, (UINTN)dir);
+}
+
+
+int
+Gasketclosedir (DIR *dir)
+{
+ return GasketUintn (closedir, (UINTN)dir);
+}
+
+
+int
+Gasketstat (const char *path, STAT_FIX *buf)
+{
+ return GasketUintnUintn (stat, (UINTN)path, (UINTN)buf);
+}
+
+
+int
+Gasketstatfs (const char *path, struct statfs *buf)
+{
+ return GasketUintnUintn (statfs, (UINTN)path, (UINTN)buf);
+}
+
+
+int
+Gasketrename (const char *oldpath, const char *newpath)
+{
+ return GasketUintnUintn (rename, (UINTN)oldpath, (UINTN)newpath);
+}
+
+
+time_t
+Gasketmktime (struct tm *tm)
+{
+ return GasketUintn (mktime, (UINTN)tm);
+}
+
+
+int
+Gasketfsync (int fd)
+{
+ return GasketUintn (fsync, fd);
+}
+
+
+int
+Gasketchmod (const char *path, mode_t mode)
+{
+ return GasketUintnUint16 (chmod, (UINTN)path, mode);
+}
+
+
+int
+Gasketutime (const char *filename, const struct utimbuf *buf)
+{
+ return GasketUintnUintn (utime, (UINTN)filename, (UINTN)buf);
+}
+
+
+int
+Gaskettcflush (int fildes, int queue_selector)
+{
+ return GasketUintnUintn (tcflush, fildes, queue_selector);
+}
+
+
+EFI_STATUS
+GasketUgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title)
+{
+ return GasketUintnUintn (UgaCreate, (UINTN)UgaIo, (UINTN)Title);
+}
+
+
+void
+Gasketperror (__const char *__s)
+{
+ GasketUintn (perror, (UINTN)__s);
+ return;
+}
+
+
+
+//
+// ... is always an int or pointer to device specific data structure
+//
+int
+Gasketioctl (int fd, unsigned long int __request, ...)
+{
+ VA_LIST Marker;
+
+ VA_START (Marker, __request);
+ return GasketUintnUintnUintn (ioctl, fd, __request, VA_ARG (Marker, UINTN));
+}
+
+
+int
+Gasketfcntl (int __fd, int __cmd, ...)
+{
+ VA_LIST Marker;
+
+ VA_START (Marker, __cmd);
+ return GasketUintnUintnUintn (fcntl, __fd, __cmd, VA_ARG (Marker, UINTN));
+}
+
+
+
+int
+Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed)
+{
+ return GasketUintnUintn (cfsetispeed, (UINTN)__termios_p, __speed);
+}
+
+
+int
+Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed)
+{
+ return GasketUintnUintn (cfsetospeed, (UINTN)__termios_p, __speed);
+}
+
+
+int
+Gaskettcgetattr (int __fd, struct termios *__termios_p)
+{
+ return GasketUintnUintn (tcgetattr, __fd, (UINTN)__termios_p);
+}
+
+
+int
+Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p)
+{
+ return GasketUintnUintnUintn (tcsetattr, __fd, __optional_actions, (UINTN)__termios_p);
+}
+
+
+int
+Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact)
+{
+ return GasketUintnUintn (sigaction, (UINTN)act, (UINTN)oact);
+}
+
+
+int
+Gasketsetcontext (const ucontext_t *ucp)
+{
+ return GasketUintn (setcontext, (UINTN)ucp);
+}
+
+
+int
+Gasketgetcontext (ucontext_t *ucp)
+{
+ return GasketUintn (getcontext, (UINTN)ucp);
+}
+
+
+int
+Gasketsigemptyset (sigset_t *set)
+{
+ return GasketUintn (sigemptyset, (UINTN)set);
+}
+
+
+int
+Gasketsigaltstack (const stack_t *ss, stack_t *oss)
+{
+ return GasketUintnUintn (sigaltstack, (UINTN)ss, (UINTN)oss);
+}
+
+
+
+RETURN_STATUS
+GasketUnixPeCoffGetEntryPoint (
+ IN VOID *Pe32Data,
+ IN OUT VOID **EntryPoint
+ )
+{
+ return GasketUintnUintn (SecPeCoffGetEntryPoint, (UINTN)Pe32Data, (UINTN)EntryPoint);
+}
+
+
+
+VOID
+GasketUnixPeCoffRelocateImageExtraAction (
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
+ )
+{
+ GasketUintn (SecPeCoffRelocateImageExtraAction, (UINTN)ImageContext);
+ return;
+}
+
+
+
+VOID
+GasketPeCoffLoaderUnloadImageExtraAction (
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
+ )
+{
+ GasketUintn (SecPeCoffLoaderUnloadImageExtraAction, (UINTN)ImageContext);
+ return;
+}
+
+
+//
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
+//
+
+EFI_STATUS
+EFIAPI
+GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
+{
+ return GasketUintn (UgaClose, (UINTN)UgaIo);
+}
+
+EFI_STATUS
+EFIAPI
+GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height)
+{
+ return GasketUintnUintnUintn (UgaSize, (UINTN)UgaIo, Width, Height);
+}
+
+EFI_STATUS
+EFIAPI
+GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
+{
+ return GasketUintn (UgaCheckKey, (UINTN)UgaIo);
+}
+
+EFI_STATUS
+EFIAPI
+GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key)
+{
+ return GasketUintnUintn (UgaGetKey, (UINTN)UgaIo, (UINTN)key);
+}
+
+EFI_STATUS
+EFIAPI
+GasketUgaBlt (
+ EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
+ IN EFI_UGA_BLT_OPERATION BltOperation,
+ IN UINTN SourceX,
+ IN UINTN SourceY,
+ IN UINTN DestinationX,
+ IN UINTN DestinationY,
+ IN UINTN Width,
+ IN UINTN Height,
+ IN UINTN Delta OPTIONAL
+ )
+{
+ return GasketUintn10Args (UgaBlt, (UINTN)UgaIo, (UINTN)BltBuffer, BltOperation, SourceX, SourceY, DestinationX, DestinationY, Width, Height, Delta);
+}
+
diff --git a/UnixPkg/Sec/Gasket.h b/UnixPkg/Sec/Gasket.h
new file mode 100644
index 0000000000..8343de7feb
--- /dev/null
+++ b/UnixPkg/Sec/Gasket.h
@@ -0,0 +1,141 @@
+
+#ifndef _GASKET_H_
+#define _GASKET_H_
+
+#include <Library/PeCoffLib.h>
+
+#include <Protocol/UgaDraw.h>
+#include <Protocol/SimpleTextIn.h>
+#include <Protocol/UnixUgaIo.h>
+
+
+//
+// Gasket functions for EFI_UNIX_THUNK_PROTOCOL
+//
+
+void GasketmsSleep (unsigned long Milliseconds);
+void Gasketexit (int status);
+void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
+void GasketGetLocalTime (EFI_TIME *Time);
+struct tm *Gasketgmtime (const time_t *clock);
+long GasketGetTimeZone (void);
+int GasketGetDayLight (void);
+int Gasketpoll (struct pollfd *pfd, int nfds, int timeout);
+int Gasketread (int fd, void *buf, int count);
+int Gasketwrite (int fd, const void *buf, int count);
+char *Gasketgetenv (const char *name);
+int Gasketopen (const char *name, int flags, int mode);
+off_t Gasketlseek (int fd, off_t off, int whence);
+int Gasketftruncate (int fd, long int len);
+int Gasketclose (int fd);
+int Gasketmkdir (const char *pathname, mode_t mode);
+int Gasketrmdir (const char *pathname);
+int Gasketunlink (const char *pathname);
+int GasketGetErrno (void);
+DIR *Gasketopendir (const char *pathname);
+void *Gasketrewinddir (DIR *dir);
+struct dirent *Gasketreaddir (DIR *dir);
+int Gasketclosedir (DIR *dir);
+int Gasketstat (const char *path, STAT_FIX *buf);
+int Gasketstatfs (const char *path, struct statfs *buf);
+int Gasketrename (const char *oldpath, const char *newpath);
+time_t Gasketmktime (struct tm *tm);
+int Gasketfsync (int fd);
+int Gasketchmod (const char *path, mode_t mode);
+int Gasketutime (const char *filename, const struct utimbuf *buf);
+int Gaskettcflush (int fildes, int queue_selector);
+EFI_STATUS GasketUgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);
+void Gasketperror (__const char *__s);
+
+//
+// ... is always an int or pointer to device specific data structure
+//
+int Gasketioctl (int fd, unsigned long int __request, ...);
+int Gasketfcntl (int __fd, int __cmd, ...);
+
+int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);
+int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);
+int Gaskettcgetattr (int __fd, struct termios *__termios_p);
+int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);
+int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);
+int Gasketsetcontext (const ucontext_t *ucp);
+int Gasketgetcontext (ucontext_t *ucp);
+int Gasketsigemptyset (sigset_t *set);
+int Gasketsigaltstack (const stack_t *ss, stack_t *oss);
+
+RETURN_STATUS
+GasketUnixPeCoffGetEntryPoint (
+ IN VOID *Pe32Data,
+ IN OUT VOID **EntryPoint
+ );
+
+VOID
+GasketUnixPeCoffRelocateImageExtraAction (
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
+ );
+
+VOID
+GasketPeCoffLoaderUnloadImageExtraAction (
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
+ );
+
+
+int GasketVoid (void *api);
+int GasketUintn (void *api, UINTN a);
+int GasketUintnUintn (void *api, UINTN a, UINTN b);
+int GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c);
+int GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d);
+int GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j);
+int GasketUint64Uintn (void *api, UINT64 a, UINTN b);
+UINT64 GasketUintnUint64Uintn (void *api, UINTN a, UINT64 b, UINTN c);
+int GasketUintnUint16 (void *api, UINTN a, UINT16 b);
+
+
+//
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
+//
+
+EFI_STATUS EFIAPI GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+EFI_STATUS EFIAPI GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
+EFI_STATUS EFIAPI GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+EFI_STATUS EFIAPI GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
+EFI_STATUS EFIAPI GasketUgaBlt (
+ EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
+ IN EFI_UGA_BLT_OPERATION BltOperation,
+ IN UINTN SourceX,
+ IN UINTN SourceY,
+ IN UINTN DestinationX,
+ IN UINTN DestinationY,
+ IN UINTN Width,
+ IN UINTN Height,
+ IN UINTN Delta OPTIONAL
+ );
+
+EFI_STATUS UgaCreate (EFI_UNIX_UGA_IO_PROTOCOL **Uga, CONST CHAR16 *Title);
+
+
+//
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
+//
+EFI_STATUS UgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+EFI_STATUS UgaSize(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
+EFI_STATUS UgaCheckKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+EFI_STATUS UgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
+EFI_STATUS UgaBlt (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
+ IN EFI_UGA_BLT_OPERATION BltOperation,
+ IN UINTN SourceX,
+ IN UINTN SourceY,
+ IN UINTN DestinationX,
+ IN UINTN DestinationY,
+ IN UINTN Width,
+ IN UINTN Height,
+ IN UINTN Delta OPTIONAL
+ );
+
+
+
+#endif
+
+
diff --git a/UnixPkg/Sec/Ia32/Gasket.S b/UnixPkg/Sec/Ia32/Gasket.S
index 80d033675c..77e8296b0b 100644
--- a/UnixPkg/Sec/Ia32/Gasket.S
+++ b/UnixPkg/Sec/Ia32/Gasket.S
@@ -1,5 +1,21 @@
#------------------------------------------------------------------------------
#
+# OS X Application requires 16 byte stack alignment. The problem is these
+# APIs are exposed to code that does not have this requirement via
+# EFI_UNIX_THUNK_PROTOCOL. So these are wrapper functions that make sure
+# the stack is aligned. This code should also work if the stack is already
+# aligned. Extra stack padding is really the same as local varaibles so
+# it gets freed by the leave instruction
+#
+# I basically used the compiler, added extra 16 bytes to the local stack and
+# made sure %esp ended in 0 before the call (16 byte algined)
+#
+# The EFI_UNIX_THUNK_PROTOCOL member functions call a C API that then calls
+# one of these generic assembly routines. We do it that way to work around
+# some magic name changing that happens in C. For example stat() is _stat()
+# on Leopard and _stat$INDOE64 on Snow Leopard. That is why we pass stat()
+# into one of these gaskets from C code.
+#
# Copyright (c) 2008 - 2009 Apple Inc. All rights reserved.
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
@@ -9,975 +25,213 @@
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
-# Abstract:
-#
-# OS X Application requires 16 byte stack alignment. The problem is these
-# APIs are exposed to code that does not have this requirement via
-# EFI_UNIX_THUNK_PROTOCOL. So these are wrapper functions that make sure
-# the stack is aligned. This code should also work if the stack is already
-# aligned. Extra stack padding is really the same as local varaibles so
-# it gets freed by the leave instruction
-#
-# I basically used the compiler, added extra 16 bytes to the local stack and
-# made sure %esp ended in 0 before the call (16 byte algined)
-#
-# cat t.c
-##include <stdio.h>
-##include <sys/stat.h>
-#
-#int chmod (int fd, mode_t len){
-# long m = (long)fd;
-#}
-#
-#int Gasketchmod (int fd, mode_t len){
-# return chmod (fd, len);
-#}
-#
-# gcc -S t.c
-# cat t.s
-# this gives you the starting point....
-#
-#
#------------------------------------------------------------------------------
-#include <ProcessorBind.h>
-
.text
-
-#
-#
-# EFI_UNIX_THUNK_PROTOCOL that gets exported
-#
-#
-
-#------------------------------------------------------------------------------
-# VOID GasketmsSleep (unsigned long Milliseconds);
-#------------------------------------------------------------------------------
-.globl _GasketmsSleep
-_GasketmsSleep:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _msSleep
- leave
- ret
-
-
-#------------------------------------------------------------------------------
-# void Gasketexit (int status);
-#------------------------------------------------------------------------------
-.globl _Gasketexit
-_Gasketexit:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _exit
- leave
- ret
-
-
-#------------------------------------------------------------------------------
-# void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
-#------------------------------------------------------------------------------
-.globl _GasketSetTimer
-_GasketSetTimer:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, -16(%ebp)
- movl 12(%ebp), %eax
- movl %eax, -12(%ebp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl -16(%ebp), %eax
- movl -12(%ebp), %edx
- movl %eax, (%esp)
- movl %edx, 4(%esp)
- call _SetTimer
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# void GasketGetLocalTime (EFI_TIME *Time);
-#------------------------------------------------------------------------------
-.globl _GasketGetLocalTime
-_GasketGetLocalTime:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _GetLocalTime
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# struct tm *Gasketgmtime (const time_t *clock);
-#------------------------------------------------------------------------------
-.globl _Gasketgmtime
-_Gasketgmtime:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _gmtime
- leave
- ret
-
-
-
-
-#------------------------------------------------------------------------------
-# long GasketGetTimeZone(void);
-#------------------------------------------------------------------------------
-.globl _GasketGetTimeZone
-_GasketGetTimeZone:
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- call _GetTimeZone
- leave
- ret
-
-
-#------------------------------------------------------------------------------
-# int GasketGetDayLight (void);
-#------------------------------------------------------------------------------
-.globl _GasketGetDayLight
-_GasketGetDayLight:
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- call _GetDayLight
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketpoll (struct pollfd *pfd, int nfds, int timeout);
-#------------------------------------------------------------------------------
-.globl _Gasketpoll
-_Gasketpoll:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _poll
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketread (int fd, void *buf, int count);
-#------------------------------------------------------------------------------
-.globl _Gasketread
-_Gasketread:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _read
- leave
- ret
-
-
-#------------------------------------------------------------------------------
-# int Gasketwrite (int fd, const void *buf, int count);
-#------------------------------------------------------------------------------
-.globl _Gasketwrite
-_Gasketwrite:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _write
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# char *Gasketgetenv (const char *name);
-#------------------------------------------------------------------------------
-.globl _Gasketgetenv
-_Gasketgetenv:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _getenv
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketopen (const char *name, int flags, int mode);
-#------------------------------------------------------------------------------
-.globl _Gasketopen
-_Gasketopen:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _open
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# off_t Gasketlseek (int fd, off_t off, int whence);
-#------------------------------------------------------------------------------
-.globl _Gasketlseek
-_Gasketlseek:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, -16(%ebp)
- movl 16(%ebp), %eax
- movl %eax, -12(%ebp)
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl -16(%ebp), %eax
- movl -12(%ebp), %edx
- movl %eax, 4(%esp)
- movl %edx, 8(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _lseek
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketftruncate (int fd, long int len);
-#------------------------------------------------------------------------------
-.globl _Gasketftruncate
-_Gasketftruncate:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _truncate
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketclose (int fd);
-#------------------------------------------------------------------------------
-.globl _Gasketclose
-_Gasketclose:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _close
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketmkdir (const char *pathname, mode_t mode);
-#------------------------------------------------------------------------------
-.globl _Gasketmkdir
-_Gasketmkdir:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _mkdir
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketrmdir (const char *pathname);
-#------------------------------------------------------------------------------
-.globl _Gasketrmdir
-_Gasketrmdir:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _rmdir
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketunlink (const char *pathname);
-#------------------------------------------------------------------------------
-.globl _Gasketunlink
-_Gasketunlink:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _unlink
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int GasketGetErrno (void);
-#------------------------------------------------------------------------------
-.globl _GasketGetErrno
-_GasketGetErrno:
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- call _GetErrno
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# DIR *Gasketopendir (const char *pathname);
-#------------------------------------------------------------------------------
-.globl _Gasketopendir
-_Gasketopendir:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _opendir
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# void *Gasketrewinddir (DIR *dir);
-#------------------------------------------------------------------------------
-.globl _Gasketrewinddir
-_Gasketrewinddir:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _rewinddir
- leave
- ret
-
-
-#------------------------------------------------------------------------------
-# struct dirent *Gasketreaddir (DIR *dir);
-#------------------------------------------------------------------------------
-.globl _Gasketreaddir
-_Gasketreaddir:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _readdir
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketclosedir (DIR *dir);
-#------------------------------------------------------------------------------
-.globl _Gasketclosedir
-_Gasketclosedir:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _closedir
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketstat (const char *path, struct stat *buf);
-#------------------------------------------------------------------------------
-.globl _Gasketstat
-_Gasketstat:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _stat
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketstatfs (const char *path, struct statfs *buf);
-#------------------------------------------------------------------------------
-.globl _Gasketstatfs
-_Gasketstatfs:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _statfs
- leave
- ret
-
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketrename (const char *oldpath, const char *newpath);
-#------------------------------------------------------------------------------
-.globl _Gasketrename
-_Gasketrename:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _rename
- leave
- ret
-
-
-
-
-#------------------------------------------------------------------------------
-# time_t Gasketmktime (struct tm *tm);
-#------------------------------------------------------------------------------
-.globl _Gasketmktime
-_Gasketmktime:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _mktime
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketfsync (int fd);
-#------------------------------------------------------------------------------
-.globl _Gasketfsync
-_Gasketfsync:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _fsync
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketchmod (const char *path, mode_t mode);
-#------------------------------------------------------------------------------
-.globl _Gasketchmod
-_Gasketchmod:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movw %ax, -12(%ebp)
- movzwl -12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _chmod
- leave
- ret
-
-#------------------------------------------------------------------------------
-# int Gasketutime (const char *filename, const struct utimbuf *buf);
-#------------------------------------------------------------------------------
-.globl _Gasketutime
-_Gasketutime:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _rename
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gaskettcflush (int fildes, int queue_selector);
-#------------------------------------------------------------------------------
-.globl _Gaskettcflush
-_Gaskettcflush:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _rename
- leave
- ret
-
-
-#------------------------------------------------------------------------------
-# EFI_STATUS UgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);
#------------------------------------------------------------------------------
-.globl _GasketUgaCreate
-_GasketUgaCreate:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp #sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaCreate
+# int GasketVoid (void *api)
+#------------------------------------------------------------------------------
+.globl _GasketVoid
+_GasketVoid:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $34, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl -12(%ebp), %eax
+ call *%eax
leave
ret
-
-#------------------------------------------------------------------------------
-# void Gasketperror (__const char *__s);
-#------------------------------------------------------------------------------
-.globl _Gasketperror
-_Gasketperror:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _perror
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketioctl (int fd, unsigned long int __request, ...);
-#
-# ... is really int or pointer to structure, so we can treat like an int
-#
-#------------------------------------------------------------------------------
-.globl _Gasketioctl
-_Gasketioctl:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _ioctl
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketfcntl (int __fd, int __cmd, ...);
-#
-# ... is really int or pointer to structure, so we can treat like an int
-#
-#------------------------------------------------------------------------------
-.globl _Gasketfcntl
-_Gasketfcntl:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _fcntl
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);
-#------------------------------------------------------------------------------
-.globl _Gasketcfsetispeed
-_Gasketcfsetispeed:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _cfsetispeed
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);
-#------------------------------------------------------------------------------
-.globl _Gasketcfsetospeed
-_Gasketcfsetospeed:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _cfsetospeed
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gaskettcgetattr (int __fd, struct termios *__termios_p);
-#------------------------------------------------------------------------------
-.globl _Gaskettcgetattr
-_Gaskettcgetattr:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _tcgetattr
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);
-#------------------------------------------------------------------------------
-.globl _Gaskettcsetattr
-_Gaskettcsetattr:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _tcsetattr
- leave
- ret
-
#------------------------------------------------------------------------------
-# int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);
#------------------------------------------------------------------------------
-.globl _Gasketsigaction
-_Gasketsigaction:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _sigaction
- leave
- ret
-
+.globl _GasketUintn
+_GasketUintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $50, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# int Gasketsetcontext (const ucontext_t *ucp);
#------------------------------------------------------------------------------
-.globl _Gasketsetcontext
-_Gasketsetcontext:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _setcontext
- leave
- ret
+.globl _GasketUintnUintn
+_GasketUintnUintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $50, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# int Gasketgetcontext (ucontext_t *ucp);
#------------------------------------------------------------------------------
-.globl _Gasketgetcontext
-_Gasketgetcontext:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _getcontext
- leave
- ret
+.globl _GasketUintnUintnUintn
+_GasketUintnUintnUintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $50, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# int Gasketsigemptyset (sigset_t *set);
#------------------------------------------------------------------------------
-.globl _Gasketsigemptyset
-_Gasketsigemptyset:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _sigemptyset
- leave
- ret
-
+.globl _GasketUintnUintnUintnUintn
+_GasketUintnUintnUintnUintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $50, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 24(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# int Gasketsigaltstack (const stack_t *ss, stack_t *oss);
#------------------------------------------------------------------------------
-.globl _Gasketsigaltstack
-_Gasketsigaltstack:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _sigaltstack
- leave
- ret
-
-#
-#
-# UGA Functions that get exported
-#
-#
+.globl _GasketUintn10Args
+_GasketUintn10Args:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $82, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 48(%ebp), %eax
+ movl %eax, 36(%esp)
+ movl 44(%ebp), %eax
+ movl %eax, 32(%esp)
+ movl 40(%ebp), %eax
+ movl %eax, 28(%esp)
+ movl 36(%ebp), %eax
+ movl %eax, 24(%esp)
+ movl 32(%ebp), %eax
+ movl %eax, 20(%esp)
+ movl 28(%ebp), %eax
+ movl %eax, 16(%esp)
+ movl 24(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
-#------------------------------------------------------------------------------
-# EFI_STATUS GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
-#------------------------------------------------------------------------------
-.globl _GasketUgaClose
-_GasketUgaClose:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaClose
- leave
- ret
#------------------------------------------------------------------------------
-# EFI_STATUS GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
-#------------------------------------------------------------------------------
-.globl _GasketUgaSize
-_GasketUgaSize:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaSize
- leave
- ret
-
-
#------------------------------------------------------------------------------
-# EFI_STATUS GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
-#------------------------------------------------------------------------------
-.globl _GasketUgaCheckKey
-_GasketUgaCheckKey:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaCheckKey
- leave
- ret
+.globl _GasketUint64Uintn
+_GasketUint64Uintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $66, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, -32(%ebp)
+ movl 16(%ebp), %eax
+ movl %eax, -28(%ebp)
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl -32(%ebp), %eax
+ movl -28(%ebp), %edx
+ movl %eax, (%esp)
+ movl %edx, 4(%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# EFI_STATUS GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
#------------------------------------------------------------------------------
-.globl _GasketUgaGetKey
-_GasketUgaGetKey:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp #sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaGetKey
+.globl _GasketUintnUint64Uintn
+_GasketUintnUint64Uintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $66, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, -32(%ebp)
+ movl 20(%ebp), %eax
+ movl %eax, -28(%ebp)
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 24(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl -32(%ebp), %eax
+ movl -28(%ebp), %edx
+ movl %eax, 4(%esp)
+ movl %edx, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
leave
ret
-
#------------------------------------------------------------------------------
-# EFI_STATUS
-# GasketUgaBlt(
-# EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
-# IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
-# IN EFI_UGA_BLT_OPERATION BltOperation,
-# IN UINTN SourceX,
-# IN UINTN SourceY,
-# IN UINTN DestinationX,
-# IN UINTN DestinationY,
-# IN UINTN Width,
-# IN UINTN Height,
-# IN UINTN Delta OPTIONAL
-# );
#------------------------------------------------------------------------------
-.globl _GasketUgaBlt
-_GasketUgaBlt:
- pushl %ebp
- movl %esp, %ebp
- subl $88, %esp #sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl $0, -12(%ebp)
- movl 44(%ebp), %eax
- movl %eax, 36(%esp)
- movl 40(%ebp), %eax
- movl %eax, 32(%esp)
- movl 36(%ebp), %eax
- movl %eax, 28(%esp)
- movl 32(%ebp), %eax
- movl %eax, 24(%esp)
- movl 28(%ebp), %eax
- movl %eax, 20(%esp)
- movl 24(%ebp), %eax
- movl %eax, 16(%esp)
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaBlt
- leave
- ret
+.globl _GasketUintnUint16
+_GasketUintnUint16:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $66, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movw %ax, -28(%ebp)
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movzwl -28(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
+ .subsections_via_symbols
diff --git a/UnixPkg/Sec/Ia32/GasketTemplate.c b/UnixPkg/Sec/Ia32/GasketTemplate.c
new file mode 100644
index 0000000000..3b88135a58
--- /dev/null
+++ b/UnixPkg/Sec/Ia32/GasketTemplate.c
@@ -0,0 +1,142 @@
+/** @file
+ Template file used to create Gasket.S
+
+ This file is built on the command line via gcc GasketTemplate.c -S
+ and it will create GasketTemplate.s and this was used to create
+ Gasket.S. You still have to add the extra stack alignment code to
+ the assembly functions.
+
+Copyright (c) 2006 - 2009, Intel Corporation<BR>
+Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR>
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+
+#include <stdint.h>
+#include <sys/stat.h>
+
+typedef int8_t INT8;
+typedef uint8_t UINT8;
+typedef int16_t INT16;
+typedef uint16_t UINT16;
+typedef int32_t INT32;
+typedef uint32_t UINT32;
+typedef int64_t INT64;
+typedef uint64_t UINT64;
+typedef UINT32 UINTN;
+
+
+typedef int (*GASKET_VOID) ();
+typedef int (*GASKET_UINTN) (UINTN);
+typedef int (*GASKET_UINTN_UINTN) (UINTN, UINTN);
+typedef int (*GASKET_UINTN_UINTN_UINTN) (UINTN, UINTN, UINTN);
+typedef int (*GASKET_UINTN_UINTN_UINTN_UINTN) (UINTN, UINTN, UINTN, UINTN);
+typedef int (*GASKET_UINTN_10ARGS) (UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN);
+typedef int (*GASKET_UINT64_UINTN) (UINT64, UINTN);
+typedef UINT64 (*GASKET_UINTN_UINT64_UINTN) (UINTN, UINT64, UINTN);
+typedef int (*GASKET_UINTN_UINT16) (UINTN, UINT16);
+
+int GasketVoid (void *api);
+int GasketUintn (void *api, UINTN a);
+int GasketUintnUintn (void *api, UINTN a, UINTN b);
+int GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c);
+int GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d);
+int GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j);
+int GasketUint64Uintn (void *api, UINT64 a, UINTN b);
+UINT64 GasketUintnUiny64Uintn (void *api, UINTN a, UINT64 b, UINTN c);
+int GasketUintnUint16 (void *api, UINTN a, UINT16 b);
+
+
+
+int
+GasketVoid (void *api)
+{
+ GASKET_VOID func;
+
+ func = (GASKET_VOID)api;
+ return func ();
+}
+
+int
+GasketUintn (void *api, UINTN a)
+{
+ GASKET_UINTN func;
+
+ func = (GASKET_UINTN)api;
+ return func (a);
+}
+
+int
+GasketUintnUintn (void *api, UINTN a, UINTN b)
+{
+ GASKET_UINTN_UINTN func;
+
+ func = (GASKET_UINTN_UINTN)api;
+ return func (a, b);
+}
+
+
+int
+GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c)
+{
+ GASKET_UINTN_UINTN_UINTN func;
+
+ func = (GASKET_UINTN_UINTN_UINTN)api;
+ return func (a, b, c);
+}
+
+int
+GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d)
+{
+ GASKET_UINTN_UINTN_UINTN_UINTN func;
+
+ func = (GASKET_UINTN_UINTN_UINTN_UINTN)api;
+ return func (a, b, c, d);
+}
+
+int
+GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j)
+{
+ GASKET_UINTN_10ARGS func;
+
+ func = (GASKET_UINTN_10ARGS)api;
+ return func (a, b, c, d, e, f, g, h, i, j);
+}
+
+
+int
+GasketUint64Uintn (void *api, UINT64 a, UINTN b)
+{
+ GASKET_UINT64_UINTN func;
+
+ func = (GASKET_UINT64_UINTN)api;
+ return func (a, b);
+}
+
+UINT64
+GasketUintnUiny64Uintn (void *api, UINTN a, UINT64 b, UINTN c)
+{
+ GASKET_UINTN_UINT64_UINTN func;
+
+ func = (GASKET_UINTN_UINT64_UINTN)api;
+ return func (a, b, c);
+}
+
+int
+GasketUintnUint16 (void *api, UINTN a, UINT16 b)
+{
+ GASKET_UINTN_UINT16 func;
+
+ func = (GASKET_UINTN_UINT16)api;
+ return func (a, b);
+}
+
+
+
diff --git a/UnixPkg/Sec/SecMain.c b/UnixPkg/Sec/SecMain.c
index 98a7a4db9d..da19a4b134 100644
--- a/UnixPkg/Sec/SecMain.c
+++ b/UnixPkg/Sec/SecMain.c
@@ -89,7 +89,6 @@ EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
&mSecTemporaryRamSupportPpi
},
{
-
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
&gUnixFwhPpiGuid,
&mSecFwhInformationPpi
@@ -142,6 +141,7 @@ MapFile (
IN OUT EFI_PHYSICAL_ADDRESS *BaseAddress,
OUT UINT64 *Length
);
+
EFI_STATUS
EFIAPI
SecNt32PeCoffRelocateImage (
@@ -200,7 +200,7 @@ Returns:
// symbols when we load every PE/COFF image.
//
Index = strlen (*Argv);
- gGdbWorkingFileName = malloc (Index + strlen(".gdb"));
+ gGdbWorkingFileName = malloc (Index + strlen(".gdb") + 1);
strcpy (gGdbWorkingFileName, *Argv);
strcat (gGdbWorkingFileName, ".gdb");
#endif
@@ -783,6 +783,12 @@ Returns:
if (EFI_ERROR (Status)) {
return Status;
}
+
+ Status = PeCoffLoaderRelocateImage (&ImageContext);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
SecPeCoffRelocateImageExtraAction (&ImageContext);
@@ -823,7 +829,8 @@ EFIAPI
SecUnixFdAddress (
IN UINTN Index,
IN OUT EFI_PHYSICAL_ADDRESS *FdBase,
- IN OUT UINT64 *FdSize
+ IN OUT UINT64 *FdSize,
+ IN OUT EFI_PHYSICAL_ADDRESS *FixUp
)
/*++
@@ -835,6 +842,7 @@ Arguments:
Index - Which FD, starts at zero.
FdSize - Size of the FD in bytes
FdBase - Start address of the FD. Assume it points to an FV Header
+ FixUp - Difference between actual FD address and build address
Returns:
EFI_SUCCESS - Return the Base address and size of the FV
@@ -848,11 +856,21 @@ Returns:
*FdBase = gFdInfo[Index].Address;
*FdSize = gFdInfo[Index].Size;
+ *FixUp = 0;
if (*FdBase == 0 && *FdSize == 0) {
return EFI_UNSUPPORTED;
}
+ if (Index == 0) {
+ //
+ // FD 0 has XIP code and well known PCD values
+ // If the memory buffer could not be allocated at the FD build address
+ // the Fixup is the difference.
+ //
+ *FixUp = *FdBase - FixedPcdGet32 (PcdUnixFdBaseAddress);
+ }
+
return EFI_SUCCESS;
}
@@ -1109,13 +1127,6 @@ SecPeCoffRelocateImageExtraAction (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
)
{
- EFI_STATUS Status;
-
- Status = PeCoffLoaderRelocateImage (ImageContext);
- if (EFI_ERROR (Status)) {
- PrintLoadAddress (ImageContext);
- return;
- }
#ifdef __APPLE__
PrintLoadAddress (ImageContext);
@@ -1186,10 +1197,10 @@ SecPeCoffRelocateImageExtraAction (
(unsigned long)ImageContext->ImageAddress,
(unsigned long)ImageContext->EntryPoint);
- Handle = dlopen(ImageContext->PdbPointer, RTLD_NOW);
+ Handle = dlopen (ImageContext->PdbPointer, RTLD_NOW);
if (Handle) {
- Entry = dlsym(Handle, "_ModuleEntryPoint");
+ Entry = dlsym (Handle, "_ModuleEntryPoint");
} else {
printf("%s\n", dlerror());
}
diff --git a/UnixPkg/Sec/SecMain.h b/UnixPkg/Sec/SecMain.h
index c7a72c93a6..7a120f7a0a 100644
--- a/UnixPkg/Sec/SecMain.h
+++ b/UnixPkg/Sec/SecMain.h
@@ -157,9 +157,9 @@ EFI_STATUS
EFIAPI
SecPeiReportStatusCode (
IN CONST EFI_PEI_SERVICES **PeiServices,
- IN EFI_STATUS_CODE_TYPE CodeType,
- IN EFI_STATUS_CODE_VALUE Value,
- IN UINT32 Instance,
+ IN EFI_STATUS_CODE_TYPE CodeType,
+ IN EFI_STATUS_CODE_VALUE Value,
+ IN UINT32 Instance,
IN CONST EFI_GUID *CallerId,
IN CONST EFI_STATUS_CODE_DATA *Data OPTIONAL
)
@@ -390,25 +390,9 @@ EFIAPI
SecUnixFdAddress (
IN UINTN Index,
IN OUT EFI_PHYSICAL_ADDRESS *FdBase,
- IN OUT UINT64 *FdSize
+ IN OUT UINT64 *FdSize,
+ IN OUT EFI_PHYSICAL_ADDRESS *FixUp
)
-/*++
-
-Routine Description:
-
- TODO: Add function description
-
-Arguments:
-
- Index - TODO: add argument description
- FdBase - TODO: add argument description
- FdSize - TODO: add argument description
-
-Returns:
-
- TODO: add return values
-
---*/
;
EFI_STATUS
@@ -538,4 +522,15 @@ SecPeCoffLoaderUnloadImageExtraAction (
);
+
+VOID SetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
+void msSleep (unsigned long Milliseconds);
+void GetLocalTime (EFI_TIME *Time);
+void TzSet (void);
+long GetTimeZone(void);
+int GetDayLight(void);
+int GetErrno(void);
+
+
+
extern EFI_UNIX_THUNK_PROTOCOL *gUnix;
diff --git a/UnixPkg/Sec/SecMain.inf b/UnixPkg/Sec/SecMain.inf
index c7a9b40df7..b745faa16d 100644
--- a/UnixPkg/Sec/SecMain.inf
+++ b/UnixPkg/Sec/SecMain.inf
@@ -36,6 +36,7 @@
UnixThunk.c
FwVol.c
SecMain.c
+ Gasket.c
[Sources.Ia32]
Ia32/Gasket.S
@@ -71,6 +72,7 @@
gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareVolume
gEfiUnixPkgTokenSpaceGuid.PcdUnixMemorySizeForSecMain
gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareFdSize
+ gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress
[BuildOptions.common]
GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/SecMain -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o -L/usr/X11R6/lib -lXext -lX11 /usr/lib/crtn.o
@@ -83,5 +85,5 @@
# Need to do this link via gcc and not ld as the pathing to libraries changes from OS version to OS version
#
XCODE:*_*_IA32_DLINK_PATH == gcc
- XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -L/usr/X11R6/lib -lXext -lX11 -lIOKit -framework Carbon
+ XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -o $(BIN_DIR)/SecMain -L/usr/X11R6/lib -lXext -lX11 -lIOKit -framework Carbon
XCODE:*_*_IA32_ASM_FLAGS == -arch i386 -g
diff --git a/UnixPkg/Sec/UgaX11.c b/UnixPkg/Sec/UgaX11.c
index 386e0bc145..2c2fb186b9 100644
--- a/UnixPkg/Sec/UgaX11.c
+++ b/UnixPkg/Sec/UgaX11.c
@@ -123,19 +123,17 @@ TryCreateShmImage(UGA_IO_PRIVATE *drv)
drv->xshm_info.shmid = shmget
(IPC_PRIVATE, drv->image->bytes_per_line * drv->image->height,
IPC_CREAT | 0777);
- if (drv->xshm_info.shmid < 0)
- {
- XDestroyImage(drv->image);
- return 0;
- }
+ if (drv->xshm_info.shmid < 0) {
+ XDestroyImage(drv->image);
+ return 0;
+ }
drv->image_data = shmat (drv->xshm_info.shmid, NULL, 0);
- if(!drv->image_data)
- {
- shmctl (drv->xshm_info.shmid, IPC_RMID, NULL);
- XDestroyImage(drv->image);
- return 0;
- }
+ if(!drv->image_data) {
+ shmctl (drv->xshm_info.shmid, IPC_RMID, NULL);
+ XDestroyImage(drv->image);
+ return 0;
+ }
#ifndef __APPLE__
//
@@ -149,12 +147,11 @@ TryCreateShmImage(UGA_IO_PRIVATE *drv)
drv->xshm_info.shmaddr = (char*)drv->image_data;
drv->image->data = (char*)drv->image_data;
- if (!XShmAttach (drv->display, &drv->xshm_info))
- {
- shmdt (drv->image_data);
- XDestroyImage(drv->image);
- return 0;
- }
+ if (!XShmAttach (drv->display, &drv->xshm_info)) {
+ shmdt (drv->image_data);
+ XDestroyImage(drv->image);
+ return 0;
+ }
return 1;
}
@@ -386,7 +383,7 @@ UgaCheckKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
}
EFI_STATUS
-UgaGetKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key)
+UgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key)
{
UGA_IO_PRIVATE *drv = (UGA_IO_PRIVATE *)UgaIo;
EFI_STATUS status;
diff --git a/UnixPkg/Sec/UnixThunk.c b/UnixPkg/Sec/UnixThunk.c
index 5dfba7a734..c0f35d0729 100644
--- a/UnixPkg/Sec/UnixThunk.c
+++ b/UnixPkg/Sec/UnixThunk.c
@@ -36,6 +36,10 @@ Abstract:
#include "Uefi.h"
#include "Library/UnixLib.h"
+#ifdef __APPLE__
+#include "Gasket.h"
+#endif
+
int settimer_initialized;
struct timeval settimer_timeval;
void (*settimer_callback)(UINT64 delta);
@@ -150,74 +154,6 @@ GetErrno(void)
return errno;
}
-#if __APPLE__
-void GasketmsSleep (unsigned long Milliseconds);
-void Gasketexit (int status);
-void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
-void GasketGetLocalTime (EFI_TIME *Time);
-struct tm *Gasketgmtime (const time_t *clock);
-long GasketGetTimeZone (void);
-int GasketGetDayLight (void);
-int Gasketpoll (struct pollfd *pfd, int nfds, int timeout);
-int Gasketread (int fd, void *buf, int count);
-int Gasketwrite (int fd, const void *buf, int count);
-char *Gasketgetenv (const char *name);
-int Gasketopen (const char *name, int flags, int mode);
-off_t Gasketlseek (int fd, off_t off, int whence);
-int Gasketftruncate (int fd, long int len);
-int Gasketclose (int fd);
-int Gasketmkdir (const char *pathname, mode_t mode);
-int Gasketrmdir (const char *pathname);
-int Gasketunlink (const char *pathname);
-int GasketGetErrno (void);
-DIR *Gasketopendir (const char *pathname);
-void *Gasketrewinddir (DIR *dir);
-struct dirent *Gasketreaddir (DIR *dir);
-int Gasketclosedir (DIR *dir);
-int Gasketstat (const char *path, struct stat *buf);
-int Gasketstatfs (const char *path, struct statfs *buf);
-int Gasketrename (const char *oldpath, const char *newpath);
-time_t Gasketmktime (struct tm *tm);
-int Gasketfsync (int fd);
-int Gasketchmod (const char *path, mode_t mode);
-int Gasketutime (const char *filename, const struct utimbuf *buf);
-int Gaskettcflush (int fildes, int queue_selector);
-EFI_STATUS GasketUgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);
-void Gasketperror (__const char *__s);
-
-//
-// ... is always an int or pointer to device specific data structure
-//
-int Gasketioctl (int fd, unsigned long int __request, ...);
-int Gasketfcntl (int __fd, int __cmd, ...);
-
-int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);
-int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);
-int Gaskettcgetattr (int __fd, struct termios *__termios_p);
-int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);
-int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);
-int Gasketsetcontext (const ucontext_t *ucp);
-int Gasketgetcontext (ucontext_t *ucp);
-int Gasketsigemptyset (sigset_t *set);
-int Gasketsigaltstack (const stack_t *ss, stack_t *oss);
-
-RETURN_STATUS
-GasketUnixPeCoffGetEntryPoint (
- IN VOID *Pe32Data,
- IN OUT VOID **EntryPoint
- );
-
-VOID
-GasketUnixPeCoffRelocateImageExtraAction (
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
- );
-
-VOID
-GasketPeCoffLoaderUnloadImageExtraAction (
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
- );
-
-#endif
extern EFI_STATUS
UgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);
@@ -303,7 +239,7 @@ EFI_UNIX_THUNK_PROTOCOL mUnixThunkTable = {
rewinddir,
readdir,
closedir,
- stat,
+ (UnixStat)stat,
statfs,
rename,
mktime,
diff --git a/UnixPkg/Sec/X64/Gasket.S b/UnixPkg/Sec/X64/Gasket.S
new file mode 100644
index 0000000000..bce19f3d0d
--- /dev/null
+++ b/UnixPkg/Sec/X64/Gasket.S
@@ -0,0 +1,1026 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2008-2009 Apple Inc. All rights reserved.
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Abstract:
+#
+# EFI uses a simplified version of the MSFT calling convention, and every one else,
+# Mac OS X, BSD, Linux, uses a different one. We can skip dealing with floating point
+# other than making sure non volatile registers are preserved.
+#
+# Register for arguments
+# MSFT Every One Else
+# ---- --------------
+# rcx rdi
+# rdx rsi
+# r8 rdx
+# r9 rcx
+# r8
+# r9
+#
+# Callee saved registers
+# MSFT Every One Else
+# ---- --------------
+# rbx rbx
+# rbp rbp
+# r12-r15 r12-r15
+# rsi
+# rdi
+# xmm6-xmm15
+#
+# cat t.c
+##include <stdio.h>
+##include <sys/stat.h>
+#
+#int chmod (int fd, mode_t len){
+# long m = (long)fd;
+#}
+#
+#int Gasketchmod (int fd, mode_t len){
+# return chmod (fd, len);
+#}
+#
+# gcc -arch x86_64 -S t.c
+# cat t.s
+# this gives you the starting point....
+#
+#
+#------------------------------------------------------------------------------
+
+#include <ProcessorBind.h>
+
+ .text
+
+#
+#
+# EFI_UNIX_THUNK_PROTOCOL that gets exported
+#
+#
+
+#------------------------------------------------------------------------------
+# VOID GasketmsSleep (unsigned long Milliseconds);
+#------------------------------------------------------------------------------
+.globl _GasketmsSleep
+_GasketmsSleep:
+ pushl %rbp
+ movq %rsp, %rbp # does leave use rbp or rsp???
+ subq $148, %rsp
+
+ # save registers the OS X will think are volatile
+ movaps %xmm6, -8(%rbp)
+ movaps %xmm7, -24(%rbp)
+ movaps %xmm8, -40(%rbp)
+ movaps %xmm9, -56(%rbp)
+ movaps %xmm10, -72(%rbp)
+ movaps %xmm11, -88(%rbp)
+ movaps %xmm12, -104(%rbp)
+ movaps %xmm13, -120(%rbp)
+ movaps %xmm14, -136(%rbp)
+ movaps %xmm15, -152(%rbp)
+ movq %rsi, -160(%rbp)
+ movq %rdi, -168(%rbp)
+
+ movq %rcx, %rdi
+ call _msSleep
+
+ movaps -8(%rbp), %xmm6,
+ movaps -24(%rbp), %xmm7
+ movaps -40(%rbp), %xmm8
+ movaps -56(%rbp), %xmm9
+ movaps -72(%rbp), %xmm10
+ movaps -88(%rbp), %xmm11
+ movaps -104(%rbp), %xmm12
+ movaps -120(%rbp), %xmm13
+ movaps -136(%rbp), %xmm14
+ movaps -152(%rbp), %xmm15
+ movq -160(%rbp), %rsi
+ movq -168(%rbp), %rdi
+
+ leave
+ ret
+
+
+#------------------------------------------------------------------------------
+# void Gasketexit (int status);
+#------------------------------------------------------------------------------
+.globl _Gasketexit
+_Gasketexit:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _exit
+ leave
+ ret
+
+
+#------------------------------------------------------------------------------
+# void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
+#------------------------------------------------------------------------------
+.globl _GasketSetTimer
+_GasketSetTimer:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $56, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -16(%ebp)
+ movl 12(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl -16(%ebp), %eax
+ movl -12(%ebp), %edx
+ movl %eax, (%esp)
+ movl %edx, 4(%esp)
+ call _SetTimer
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# void GasketGetLocalTime (EFI_TIME *Time);
+#------------------------------------------------------------------------------
+.globl _GasketGetLocalTime
+_GasketGetLocalTime:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _GetLocalTime
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# struct tm *Gasketgmtime (const time_t *clock);
+#------------------------------------------------------------------------------
+.globl _Gasketgmtime
+_Gasketgmtime:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _gmtime
+ leave
+ ret
+
+
+
+
+#------------------------------------------------------------------------------
+# long GasketGetTimeZone(void);
+#------------------------------------------------------------------------------
+.globl _GasketGetTimeZone
+_GasketGetTimeZone:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ call _GetTimeZone
+ leave
+ ret
+
+
+#------------------------------------------------------------------------------
+# int GasketGetDayLight (void);
+#------------------------------------------------------------------------------
+.globl _GasketGetDayLight
+_GasketGetDayLight:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ call _GetDayLight
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketpoll (struct pollfd *pfd, int nfds, int timeout);
+#------------------------------------------------------------------------------
+.globl _Gasketpoll
+_Gasketpoll:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $56, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _poll
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketread (int fd, void *buf, int count);
+#------------------------------------------------------------------------------
+.globl _Gasketread
+_Gasketread:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $56, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _read
+ leave
+ ret
+
+
+#------------------------------------------------------------------------------
+# int Gasketwrite (int fd, const void *buf, int count);
+#------------------------------------------------------------------------------
+.globl _Gasketwrite
+_Gasketwrite:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $56, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _write
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# char *Gasketgetenv (const char *name);
+#------------------------------------------------------------------------------
+.globl _Gasketgetenv
+_Gasketgetenv:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _getenv
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketopen (const char *name, int flags, int mode);
+#------------------------------------------------------------------------------
+.globl _Gasketopen
+_Gasketopen:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $56, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _open
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# off_t Gasketlseek (int fd, off_t off, int whence);
+#------------------------------------------------------------------------------
+.globl _Gasketlseek
+_Gasketlseek:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $56, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, -16(%ebp)
+ movl 16(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl -16(%ebp), %eax
+ movl -12(%ebp), %edx
+ movl %eax, 4(%esp)
+ movl %edx, 8(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _lseek
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketftruncate (int fd, long int len);
+#------------------------------------------------------------------------------
+.globl _Gasketftruncate
+_Gasketftruncate:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _truncate
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketclose (int fd);
+#------------------------------------------------------------------------------
+.globl _Gasketclose
+_Gasketclose:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _close
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketmkdir (const char *pathname, mode_t mode);
+#------------------------------------------------------------------------------
+.globl _Gasketmkdir
+_Gasketmkdir:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _mkdir
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketrmdir (const char *pathname);
+#------------------------------------------------------------------------------
+.globl _Gasketrmdir
+_Gasketrmdir:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _rmdir
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketunlink (const char *pathname);
+#------------------------------------------------------------------------------
+.globl _Gasketunlink
+_Gasketunlink:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _unlink
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int GasketGetErrno (void);
+#------------------------------------------------------------------------------
+.globl _GasketGetErrno
+_GasketGetErrno:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ call _GetErrno
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# DIR *Gasketopendir (const char *pathname);
+#------------------------------------------------------------------------------
+.globl _Gasketopendir
+_Gasketopendir:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _opendir
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# void *Gasketrewinddir (DIR *dir);
+#------------------------------------------------------------------------------
+.globl _Gasketrewinddir
+_Gasketrewinddir:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _rewinddir
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# struct dirent *Gasketreaddir (DIR *dir);
+#------------------------------------------------------------------------------
+.globl _Gasketreaddir
+_Gasketreaddir:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _readdir
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketclosedir (DIR *dir);
+#------------------------------------------------------------------------------
+.globl _Gasketclosedir
+_Gasketclosedir:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _closedir
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketstat (const char *path, struct stat *buf);
+#------------------------------------------------------------------------------
+.globl _Gasketstat
+_Gasketstat:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _stat
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketstatfs (const char *path, struct statfs *buf);
+#------------------------------------------------------------------------------
+.globl _Gasketstatfs
+_Gasketstatfs:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _statfs
+ leave
+ ret
+
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketrename (const char *oldpath, const char *newpath);
+#------------------------------------------------------------------------------
+.globl _Gasketrename
+_Gasketrename:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _rename
+ leave
+ ret
+
+
+
+
+#------------------------------------------------------------------------------
+# time_t Gasketmktime (struct tm *tm);
+#------------------------------------------------------------------------------
+.globl _Gasketmktime
+_Gasketmktime:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _mktime
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketfsync (int fd);
+#------------------------------------------------------------------------------
+.globl _Gasketfsync
+_Gasketfsync:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _fsync
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketchmod (const char *path, mode_t mode);
+#------------------------------------------------------------------------------
+.globl _Gasketchmod
+_Gasketchmod:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $56, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movw %ax, -12(%ebp)
+ movzwl -12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _chmod
+ leave
+ ret
+
+#------------------------------------------------------------------------------
+# int Gasketutime (const char *filename, const struct utimbuf *buf);
+#------------------------------------------------------------------------------
+.globl _Gasketutime
+_Gasketutime:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _rename
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gaskettcflush (int fildes, int queue_selector);
+#------------------------------------------------------------------------------
+.globl _Gaskettcflush
+_Gaskettcflush:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _rename
+ leave
+ ret
+
+
+#------------------------------------------------------------------------------
+# EFI_STATUS UgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);
+#------------------------------------------------------------------------------
+.globl _GasketUgaCreate
+_GasketUgaCreate:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp #sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _UgaCreate
+ leave
+ ret
+
+
+#------------------------------------------------------------------------------
+# void Gasketperror (__const char *__s);
+#------------------------------------------------------------------------------
+.globl _Gasketperror
+_Gasketperror:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _perror
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketioctl (int fd, unsigned long int __request, ...);
+#
+# ... is really int or pointer to structure, so we can treat like an int
+#
+#------------------------------------------------------------------------------
+.globl _Gasketioctl
+_Gasketioctl:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _ioctl
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketfcntl (int __fd, int __cmd, ...);
+#
+# ... is really int or pointer to structure, so we can treat like an int
+#
+#------------------------------------------------------------------------------
+.globl _Gasketfcntl
+_Gasketfcntl:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _fcntl
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);
+#------------------------------------------------------------------------------
+.globl _Gasketcfsetispeed
+_Gasketcfsetispeed:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _cfsetispeed
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);
+#------------------------------------------------------------------------------
+.globl _Gasketcfsetospeed
+_Gasketcfsetospeed:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _cfsetospeed
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gaskettcgetattr (int __fd, struct termios *__termios_p);
+#------------------------------------------------------------------------------
+.globl _Gaskettcgetattr
+_Gaskettcgetattr:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _tcgetattr
+ leave
+ ret
+
+
+
+#------------------------------------------------------------------------------
+# int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);
+#------------------------------------------------------------------------------
+.globl _Gaskettcsetattr
+_Gaskettcsetattr:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _tcsetattr
+ leave
+ ret
+
+#------------------------------------------------------------------------------
+# int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);
+#------------------------------------------------------------------------------
+.globl _Gasketsigaction
+_Gasketsigaction:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _sigaction
+ leave
+ ret
+
+
+#------------------------------------------------------------------------------
+# int Gasketsetcontext (const ucontext_t *ucp);
+#------------------------------------------------------------------------------
+.globl _Gasketsetcontext
+_Gasketsetcontext:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _setcontext
+ leave
+ ret
+
+#------------------------------------------------------------------------------
+# int Gasketgetcontext (ucontext_t *ucp);
+#------------------------------------------------------------------------------
+.globl _Gasketgetcontext
+_Gasketgetcontext:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _getcontext
+ leave
+ ret
+
+#------------------------------------------------------------------------------
+# int Gasketsigemptyset (sigset_t *set);
+#------------------------------------------------------------------------------
+.globl _Gasketsigemptyset
+_Gasketsigemptyset:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _sigemptyset
+ leave
+ ret
+
+
+#------------------------------------------------------------------------------
+# int Gasketsigaltstack (const stack_t *ss, stack_t *oss);
+#------------------------------------------------------------------------------
+.globl _Gasketsigaltstack
+_Gasketsigaltstack:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _sigaltstack
+ leave
+ ret
+
+#
+#
+# UGA Functions that get exported
+#
+#
+
+#------------------------------------------------------------------------------
+# EFI_STATUS GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+#------------------------------------------------------------------------------
+.globl _GasketUgaClose
+_GasketUgaClose:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _UgaClose
+ leave
+ ret
+
+#------------------------------------------------------------------------------
+# EFI_STATUS GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
+#------------------------------------------------------------------------------
+.globl _GasketUgaSize
+_GasketUgaSize:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _UgaSize
+ leave
+ ret
+
+
+#------------------------------------------------------------------------------
+# EFI_STATUS GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+#------------------------------------------------------------------------------
+.globl _GasketUgaCheckKey
+_GasketUgaCheckKey:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _UgaCheckKey
+ leave
+ ret
+
+#------------------------------------------------------------------------------
+# EFI_STATUS GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
+#------------------------------------------------------------------------------
+.globl _GasketUgaGetKey
+_GasketUgaGetKey:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp #sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _UgaGetKey
+ leave
+ ret
+
+
+#------------------------------------------------------------------------------
+# EFI_STATUS
+# GasketUgaBlt(
+# EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
+# IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
+# IN EFI_UGA_BLT_OPERATION BltOperation,
+# IN UINTN SourceX,
+# IN UINTN SourceY,
+# IN UINTN DestinationX,
+# IN UINTN DestinationY,
+# IN UINTN Width,
+# IN UINTN Height,
+# IN UINTN Delta OPTIONAL
+# );
+#------------------------------------------------------------------------------
+.globl _GasketUgaBlt
+_GasketUgaBlt:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $88, %esp #sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl $0, -12(%ebp)
+ movl 44(%ebp), %eax
+ movl %eax, 36(%esp)
+ movl 40(%ebp), %eax
+ movl %eax, 32(%esp)
+ movl 36(%ebp), %eax
+ movl %eax, 28(%esp)
+ movl 32(%ebp), %eax
+ movl %eax, 24(%esp)
+ movl 28(%ebp), %eax
+ movl %eax, 20(%esp)
+ movl 24(%ebp), %eax
+ movl %eax, 16(%esp)
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+ call _UgaBlt
+ leave
+ ret
+
+
+
diff --git a/UnixPkg/UnixBlockIoDxe/UnixBlockIo.c b/UnixPkg/UnixBlockIoDxe/UnixBlockIo.c
index c3bd3d38c6..a223d82400 100644
--- a/UnixPkg/UnixBlockIoDxe/UnixBlockIo.c
+++ b/UnixPkg/UnixBlockIoDxe/UnixBlockIo.c
@@ -774,12 +774,9 @@ Returns:
//
// Open the device
//
- Private->fd = Private->UnixThunk->Open
- (Private->Filename, Private->Mode, 0644);
-
+ Private->fd = Private->UnixThunk->Open (Private->Filename, Private->Mode, 0644);
if (Private->fd < 0) {
- DEBUG ((EFI_D_INFO, "PlOpenBlock: Could not open %s\n",
- Private->Filename));
+ DEBUG ((EFI_D_INFO, "PlOpenBlock: Could not open %a\n", Private->Filename));
BlockIo->Media->MediaPresent = FALSE;
Status = EFI_NO_MEDIA;
goto Done;
@@ -798,16 +795,17 @@ Returns:
// get the size of the file
//
Status = SetFilePointer64 (Private, 0, &FileSize, SEEK_END);
-
if (EFI_ERROR (Status)) {
FileSize = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);
- DEBUG ((EFI_D_ERROR, "PlOpenBlock: Could not get filesize of %s\n", Private->Filename));
+ DEBUG ((EFI_D_ERROR, "PlOpenBlock: Could not get filesize of %a\n", Private->Filename));
Status = EFI_UNSUPPORTED;
goto Done;
}
if (Private->NumberOfBlocks == 0) {
Private->NumberOfBlocks = DivU64x32 (FileSize, Private->BlockSize);
+ Private->LastBlock = Private->NumberOfBlocks - 1;
+ Private->Media.LastBlock = Private->LastBlock;
}
EndOfFile = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);
@@ -829,7 +827,7 @@ Returns:
Private->UnixThunk->FTruncate (Private->fd, EndOfFile);
}
- DEBUG ((EFI_D_INIT, "%HPlOpenBlock: opened %s%N\n", Private->Filename));
+ DEBUG ((EFI_D_INIT, "%HPlOpenBlock: opened %a%N\n", Private->Filename));
Status = EFI_SUCCESS;
Done:
diff --git a/UnixPkg/UnixBusDriverDxe/UnixBusDriver.c b/UnixPkg/UnixBusDriverDxe/UnixBusDriver.c
index a7be30c385..fa242eb171 100644
--- a/UnixPkg/UnixBusDriverDxe/UnixBusDriver.c
+++ b/UnixPkg/UnixBusDriverDxe/UnixBusDriver.c
@@ -269,7 +269,7 @@ Returns:
Status = EFI_UNSUPPORTED;
}
- //
+ //
// Close protocol, don't use device path protocol in the Support() function
//
gBS->CloseProtocol (
diff --git a/UnixPkg/UnixFirmwareVolumePei/UnixFwh.c b/UnixPkg/UnixFirmwareVolumePei/UnixFwh.c
index 694f2f180b..1f588d0c9a 100644
--- a/UnixPkg/UnixFirmwareVolumePei/UnixFwh.c
+++ b/UnixPkg/UnixFirmwareVolumePei/UnixFwh.c
@@ -50,8 +50,9 @@ Returns:
{
EFI_STATUS Status;
EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;
- UNIX_FWH_PPI *FwhPpi;
+ UNIX_FWH_PPI *FwhPpi;
EFI_PHYSICAL_ADDRESS FdBase;
+ EFI_PHYSICAL_ADDRESS FdFixUp;
EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
UINT64 FdSize;
UINTN Index;
@@ -75,7 +76,7 @@ Returns:
//
// Get information about all the FD's in the system
//
- Status = FwhPpi->UnixFwh (Index, &FdBase, &FdSize);
+ Status = FwhPpi->UnixFwh (Index, &FdBase, &FdSize, &FdFixUp);
if (!EFI_ERROR (Status)) {
//
// Assume the FD starts with an FV header
@@ -116,7 +117,7 @@ Returns:
PcdGet32 (PcdFlashNvStorageFtwSpareSize) +
PcdGet32 (PcdUnixFlashNvStorageEventLogSize);
- BuildFvHob (FdBase + PcdGet32 (PcdUnixFlashNvStorageVariableBase), FdSize);
+ BuildFvHob (FdFixUp + PcdGet32 (PcdUnixFlashNvStorageVariableBase), FdSize);
} else {
//
// For other FD's just map them in.
diff --git a/UnixPkg/UnixFlashMapPei/FlashMap.c b/UnixPkg/UnixFlashMapPei/FlashMap.c
index d3a15cb814..f33b00ec17 100644
--- a/UnixPkg/UnixFlashMapPei/FlashMap.c
+++ b/UnixPkg/UnixFlashMapPei/FlashMap.c
@@ -57,9 +57,10 @@ Returns:
// TODO: EFI_SUCCESS - add return value to function comment
{
EFI_STATUS Status;
- UNIX_FWH_PPI *UnixFwhPpi;
+ UNIX_FWH_PPI *UnixFwhPpi;
EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;
EFI_PHYSICAL_ADDRESS FdBase;
+ EFI_PHYSICAL_ADDRESS FdFixUp;
UINT64 FdSize;
DEBUG ((EFI_D_ERROR, "NT 32 Flash Map PEIM Loaded\n"));
@@ -78,14 +79,14 @@ Returns:
//
// Assume that FD0 contains the Flash map.
//
- Status = UnixFwhPpi->UnixFwh (0, &FdBase, &FdSize);
+ Status = UnixFwhPpi->UnixFwh (0, &FdBase, &FdSize, &FdFixUp);
if (EFI_ERROR (Status)) {
return Status;
}
- PcdSet32 (PcdFlashNvStorageVariableBase, PcdGet32 (PcdUnixFlashNvStorageVariableBase) + (UINT32) FdBase);
- PcdSet32 (PcdFlashNvStorageFtwWorkingBase, PcdGet32 (PcdUnixFlashNvStorageFtwWorkingBase) + (UINT32) FdBase);
- PcdSet32 (PcdFlashNvStorageFtwSpareBase, PcdGet32 (PcdUnixFlashNvStorageFtwSpareBase) + (UINT32) FdBase);
+ PcdSet32 (PcdFlashNvStorageVariableBase, PcdGet32 (PcdUnixFlashNvStorageVariableBase) + (UINT32)FdFixUp);
+ PcdSet32 (PcdFlashNvStorageFtwWorkingBase, PcdGet32 (PcdUnixFlashNvStorageFtwWorkingBase) + (UINT32)FdFixUp);
+ PcdSet32 (PcdFlashNvStorageFtwSpareBase, PcdGet32 (PcdUnixFlashNvStorageFtwSpareBase) + (UINT32)FdFixUp);
return EFI_SUCCESS;
}
diff --git a/UnixPkg/UnixPkg.fdf b/UnixPkg/UnixPkg.fdf
index 1de2dc52fc..7fe962d1e2 100644
--- a/UnixPkg/UnixPkg.fdf
+++ b/UnixPkg/UnixPkg.fdf
@@ -25,8 +25,13 @@
#
################################################################################
[FD.Fv_Recovery]
-BaseAddress = 0x0|gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress #The base address of the FLASH Device.
-Size = 0x002a0000 #The size in bytes of the FLASH Device
+#
+# In OS X PEIMs are really XIP, so we need to make this address match the malloced
+# buffer for the FD (0x41000000). If this address does not match the FV will get
+# relocated in place (works, but not a great idea).
+#
+BaseAddress = 0x41000000|gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress #The base address of the FLASH Device.
+Size = 0x002a0000|gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareFdSize #The size in bytes of the FLASH Device
ErasePolarity = 1
BlockSize = 0x10000
NumBlocks = 0x2a
diff --git a/UnixPkg/UnixSimpleFileSystemDxe/UnixSimpleFileSystem.c b/UnixPkg/UnixSimpleFileSystemDxe/UnixSimpleFileSystem.c
index e39a18978f..b46c9dce97 100644
--- a/UnixPkg/UnixSimpleFileSystemDxe/UnixSimpleFileSystem.c
+++ b/UnixPkg/UnixSimpleFileSystemDxe/UnixSimpleFileSystem.c
@@ -836,7 +836,7 @@ OpenRoot:
NewPrivateFile->IsDirectoryPath = FALSE;
}
} else {
- struct stat finfo;
+ STAT_FIX finfo;
int res = NewPrivateFile->UnixThunk->Stat (NewPrivateFile->FileName, &finfo);
if (res == 0 && S_ISDIR(finfo.st_mode))
NewPrivateFile->IsDirectoryPath = TRUE;
@@ -1107,7 +1107,7 @@ Returns:
struct tm *tm;
tm = UnixThunk->GmTime (&SystemTime);
Time->Year = tm->tm_year;
- Time->Month = tm->tm_mon;
+ Time->Month = tm->tm_mon + 1;
Time->Day = tm->tm_mday;
Time->Hour = tm->tm_hour;
Time->Minute = tm->tm_min;
@@ -1151,10 +1151,10 @@ Returns:
UINTN NameSize;
UINTN ResultSize;
EFI_FILE_INFO *Info;
- CHAR8 *RealFileName;
- CHAR8 *TempPointer;
+ CHAR8 *RealFileName;
+ CHAR8 *TempPointer;
CHAR16 *BufferFileName;
- struct stat buf;
+ STAT_FIX buf;
if (FileName != NULL) {
RealFileName = FileName;
@@ -1724,7 +1724,7 @@ Returns:
UINTN OldInfoSize;
EFI_TPL OldTpl;
mode_t NewAttr;
- struct stat OldAttr;
+ STAT_FIX OldAttr;
CHAR8 *OldFileName;
CHAR8 *NewFileName;
CHAR8 *CharPointer;
diff --git a/UnixPkg/Xcode/xcode_project/XcodeBuild.sh b/UnixPkg/Xcode/xcode_project/XcodeBuild.sh
new file mode 100755
index 0000000000..e3827cec1f
--- /dev/null
+++ b/UnixPkg/Xcode/xcode_project/XcodeBuild.sh
@@ -0,0 +1,14 @@
+#!/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
diff --git a/UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/default.pbxuser b/UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/default.pbxuser
new file mode 100644
index 0000000000..f3db667599
--- /dev/null
+++ b/UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/default.pbxuser
@@ -0,0 +1,191 @@
+// !$*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;
+ };
+}
diff --git a/UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/project.pbxproj b/UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..199700f9ce
--- /dev/null
+++ b/UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/project.pbxproj
@@ -0,0 +1,122 @@
+// !$*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 */;
+}
diff --git a/UnixPkg/build.sh b/UnixPkg/build.sh
new file mode 100755
index 0000000000..2770019a1f
--- /dev/null
+++ b/UnixPkg/build.sh
@@ -0,0 +1,96 @@
+#!/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 $?
+
diff --git a/UnixPkg/readme.txt b/UnixPkg/readme.txt
index 35e2523e0f..f28d626f9c 100644
--- a/UnixPkg/readme.txt
+++ b/UnixPkg/readme.txt
@@ -20,6 +20,32 @@ UnixPkg is built with following command:
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
===