]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Added support for Xcode on Snow Leopard. Upaded with bug fixes for Snow Leopard.
authorAJFISH <AJFISH@6f19259b-4bc3-4df7-8a09-765794883524>
Sun, 6 Dec 2009 02:00:37 +0000 (02:00 +0000)
committerAJFISH <AJFISH@6f19259b-4bc3-4df7-8a09-765794883524>
Sun, 6 Dec 2009 02:00:37 +0000 (02:00 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9519 6f19259b-4bc3-4df7-8a09-765794883524

27 files changed:
UnixPkg/.gdbinit [new file with mode: 0644]
UnixPkg/FvbServicesRuntimeDxe/FWBlockService.c
UnixPkg/FvbServicesRuntimeDxe/FwBlockService.h
UnixPkg/Include/Ppi/UnixFwh.h
UnixPkg/Include/Protocol/UnixThunk.h
UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c
UnixPkg/Sec/Gasket.c [new file with mode: 0644]
UnixPkg/Sec/Gasket.h [new file with mode: 0644]
UnixPkg/Sec/Ia32/Gasket.S
UnixPkg/Sec/Ia32/GasketTemplate.c [new file with mode: 0644]
UnixPkg/Sec/SecMain.c
UnixPkg/Sec/SecMain.h
UnixPkg/Sec/SecMain.inf
UnixPkg/Sec/UgaX11.c
UnixPkg/Sec/UnixThunk.c
UnixPkg/Sec/X64/Gasket.S [new file with mode: 0644]
UnixPkg/UnixBlockIoDxe/UnixBlockIo.c
UnixPkg/UnixBusDriverDxe/UnixBusDriver.c
UnixPkg/UnixFirmwareVolumePei/UnixFwh.c
UnixPkg/UnixFlashMapPei/FlashMap.c
UnixPkg/UnixPkg.fdf
UnixPkg/UnixSimpleFileSystemDxe/UnixSimpleFileSystem.c
UnixPkg/Xcode/xcode_project/XcodeBuild.sh [new file with mode: 0755]
UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/default.pbxuser [new file with mode: 0644]
UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/project.pbxproj [new file with mode: 0644]
UnixPkg/build.sh [new file with mode: 0755]
UnixPkg/readme.txt

diff --git a/UnixPkg/.gdbinit b/UnixPkg/.gdbinit
new file mode 100644 (file)
index 0000000..173818c
--- /dev/null
@@ -0,0 +1,8 @@
+set confirm off
+set output-radix 16
+b SecGdbScriptBreak
+command
+silent
+source SecMain.gdb
+c
+end
index 30723c5d729d40ca240e14ea903f8da45d616cfd..c316d7c2ac84591952ffd458aea04fc2598f2cde 100644 (file)
@@ -226,7 +226,7 @@ Returns:
 EFI_STATUS\r
 FvbGetVolumeAttributes (\r
   IN UINTN                                Instance,\r
-  OUT EFI_FVB_ATTRIBUTES_2                  *Attributes,\r
+  OUT EFI_FVB_ATTRIBUTES_2                *Attributes,\r
   IN ESAL_FWB_GLOBAL                      *Global,\r
   IN BOOLEAN                              Virtual\r
   )\r
@@ -560,10 +560,10 @@ Returns:
 {\r
 \r
   EFI_FVB_ATTRIBUTES_2  Attributes;\r
-  UINTN               LbaAddress;\r
-  UINTN               LbaLength;\r
-  EFI_STATUS          Status;\r
-  UINT8               Data;\r
+  UINTN                 LbaAddress;\r
+  UINTN                 LbaLength;\r
+  EFI_STATUS            Status;\r
+  UINT8                 Data;\r
 \r
   //\r
   // Check if the FV is write enabled\r
@@ -596,7 +596,7 @@ Returns:
 EFI_STATUS\r
 FvbSetVolumeAttributes (\r
   IN UINTN                                Instance,\r
-  IN OUT EFI_FVB_ATTRIBUTES_2               *Attributes,\r
+  IN OUT EFI_FVB_ATTRIBUTES_2             *Attributes,\r
   IN ESAL_FWB_GLOBAL                      *Global,\r
   IN BOOLEAN                              Virtual\r
   )\r
@@ -629,10 +629,10 @@ Returns:
   EFI_FW_VOL_INSTANCE   *FwhInstance = NULL;\r
   EFI_FVB_ATTRIBUTES_2  OldAttributes;\r
   EFI_FVB_ATTRIBUTES_2  *AttribPtr;\r
-  UINT32              Capabilities;\r
-  UINT32              OldStatus;\r
-  UINT32              NewStatus;\r
-  EFI_STATUS          Status;\r
+  UINT32                Capabilities;\r
+  UINT32                OldStatus;\r
+  UINT32                NewStatus;\r
+  EFI_STATUS            Status;\r
   EFI_FVB_ATTRIBUTES_2  UnchangedAttributes;\r
 \r
 \r
@@ -809,7 +809,7 @@ EFI_STATUS
 EFIAPI\r
 FvbProtocolGetAttributes (\r
   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL     *This,\r
-  OUT EFI_FVB_ATTRIBUTES_2                          *Attributes\r
+  OUT EFI_FVB_ATTRIBUTES_2                        *Attributes\r
   )\r
 /*++\r
 \r
@@ -836,7 +836,7 @@ EFI_STATUS
 EFIAPI\r
 FvbProtocolSetAttributes (\r
   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL     *This,\r
-  IN OUT EFI_FVB_ATTRIBUTES_2                       *Attributes\r
+  IN OUT EFI_FVB_ATTRIBUTES_2                     *Attributes\r
   )\r
 /*++\r
 \r
index b87192dfde6ec5bc1908526e1bf2dcc20a7d89d3..5c9fc9f86bc9a73f8dc4b2b46d124420745bd47a 100644 (file)
@@ -102,7 +102,7 @@ FvbEraseBlock (
 EFI_STATUS\r
 FvbSetVolumeAttributes (\r
   IN UINTN                                Instance,\r
-  IN OUT EFI_FVB_ATTRIBUTES_2               *Attributes,\r
+  IN OUT EFI_FVB_ATTRIBUTES_2             *Attributes,\r
   IN ESAL_FWB_GLOBAL                      *Global,\r
   IN BOOLEAN                              Virtual\r
   )\r
@@ -111,7 +111,7 @@ FvbSetVolumeAttributes (
 EFI_STATUS\r
 FvbGetVolumeAttributes (\r
   IN UINTN                                Instance,\r
-  OUT EFI_FVB_ATTRIBUTES_2                  *Attributes,\r
+  OUT EFI_FVB_ATTRIBUTES_2                *Attributes,\r
   IN ESAL_FWB_GLOBAL                      *Global,\r
   IN BOOLEAN                              Virtual\r
   )\r
@@ -162,7 +162,7 @@ EFI_STATUS
 EFIAPI\r
 FvbProtocolGetAttributes (\r
   IN  CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,\r
-  OUT EFI_FVB_ATTRIBUTES_2                          *Attributes\r
+  OUT       EFI_FVB_ATTRIBUTES_2                         *Attributes\r
   )\r
 ;\r
 \r
@@ -170,7 +170,7 @@ EFI_STATUS
 EFIAPI\r
 FvbProtocolSetAttributes (\r
   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,\r
-  IN OUT EFI_FVB_ATTRIBUTES_2                       *Attributes\r
+  IN OUT   EFI_FVB_ATTRIBUTES_2                         *Attributes\r
   )\r
 ;\r
 \r
@@ -178,7 +178,7 @@ EFI_STATUS
 EFIAPI\r
 FvbProtocolGetPhysicalAddress (\r
   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,\r
-  OUT EFI_PHYSICAL_ADDRESS                        *Address\r
+  OUT      EFI_PHYSICAL_ADDRESS                         *Address\r
   )\r
 ;\r
 \r
index 1deed11454c76f470bb58ddc7dcc1db3d56341a5..a989c8a0aa069fdbf4cf011ded3c4e2b9e28a2f9 100644 (file)
@@ -34,7 +34,8 @@ EFI_STATUS
 (EFIAPI *UNIX_FWH_INFORMATION) (\r
   IN     UINTN                  Index,\r
   IN OUT EFI_PHYSICAL_ADDRESS   *FdBase,\r
-  IN OUT UINT64                 *FdSize\r
+  IN OUT UINT64                 *FdSize,\r
+  IN OUT EFI_PHYSICAL_ADDRESS   *FixUp\r
   );\r
 \r
 /*++\r
@@ -47,6 +48,7 @@ Arguments:
   Index  - Which FD, starts at zero.\r
   FdSize - Size of the FD in bytes\r
   FdBase - Start address of the FD. Assume it points to an FV Header\r
+  FixUp  - Difference between actual FD address and build address\r
 \r
 Returns:\r
   EFI_SUCCESS     - Return the Base address and size of the FV\r
index 29a9791292635b3cd594cf19fa482db06fed60d4..93e77e8f5dd7a373aac84517ca9ee0892667be0a 100644 (file)
@@ -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
index dea03fb142e384817ab12428b224855056c5e900..f3a481b3d24fc10e3fd7c6c084e953dd08bc34f7 100644 (file)
@@ -87,7 +87,7 @@ PeCoffLoaderRelocateImageExtraAction (
   if (mUnix == NULL) {\r
     UnixPeCoffGetUnixThunkStucture ();\r
   }\r
-  mUnix->PeCoffRelocateImageExtraAction (ImageContext);\r
+    mUnix->PeCoffRelocateImageExtraAction (ImageContext);\r
   }\r
 \r
 \r
diff --git a/UnixPkg/Sec/Gasket.c b/UnixPkg/Sec/Gasket.c
new file mode 100644 (file)
index 0000000..30f06a2
--- /dev/null
@@ -0,0 +1,418 @@
+\r
+#include "SecMain.h"\r
+#include "Gasket.h"\r
+\r
+//\r
+// Gasket functions for EFI_UNIX_THUNK_PROTOCOL\r
+//\r
+\r
+void \r
+GasketmsSleep (unsigned long Milliseconds)\r
+{ \r
+  GasketUintn (msSleep, Milliseconds);\r
+  return;\r
+}\r
+\r
+void \r
+Gasketexit (int status)\r
+{\r
+ GasketUintn (exit, status);\r
+  return;\r
+}\r
+\r
+\r
+void \r
+GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs))\r
+{\r
+ GasketUint64Uintn (SetTimer, PeriodMs, (UINTN)CallBack);\r
+  return;\r
+}\r
+\r
+\r
+void \r
+GasketGetLocalTime (EFI_TIME *Time)\r
+{\r
+  GasketUintn (GetLocalTime, (UINTN)Time);\r
+  return;\r
+}\r
+\r
+\r
+struct tm *\r
+Gasketgmtime (const time_t *clock)\r
+{\r
+  return (struct tm *)(UINTN)GasketUintn (localtime, (UINTN)clock);\r
+}\r
+\r
+\r
+long \r
+GasketGetTimeZone (void)\r
+{\r
+  return  GasketVoid (GetTimeZone);\r
+}\r
+\r
+\r
+int \r
+GasketGetDayLight (void)\r
+{\r
+  return  GasketVoid (GetDayLight);\r
+}\r
+\r
+\r
+int \r
+Gasketpoll (struct pollfd *pfd, int nfds, int timeout)\r
+{\r
+  return GasketUintnUintnUintn (poll, (UINTN)pfd, nfds, timeout);\r
+}\r
+\r
+\r
+int \r
+Gasketread (int fd, void *buf, int count)\r
+{\r
+  return  GasketUintnUintnUintn (read, fd, (UINTN)buf, count);\r
+}\r
+\r
+\r
+int \r
+Gasketwrite (int fd, const void *buf, int count)\r
+{\r
+  return  GasketUintnUintnUintn (write, fd, (UINTN)buf, count);\r
+}\r
+\r
+\r
+char *\r
+Gasketgetenv (const char *name)\r
+{\r
+  return (char *)(UINTN)GasketUintn (getenv, (UINTN)name);\r
+}\r
+\r
+\r
+int \r
+Gasketopen (const char *name, int flags, int mode)\r
+{\r
+  return  GasketUintnUintnUintn (open, (UINTN)name, flags, mode);\r
+}\r
+\r
+\r
+off_t \r
+Gasketlseek (int fd, off_t off, int whence)\r
+{\r
+  if (sizeof off == 8) {\r
+    return GasketUintnUint64Uintn (lseek, fd, off, whence);\r
+  } else if (sizeof off == 4) {\r
+    return GasketUintnUintnUintn (lseek, fd, off, whence);\r
+  }\r
+}\r
+\r
+\r
+int \r
+Gasketftruncate (int fd, long int len)\r
+{\r
+  return GasketUintnUintn (ftruncate, fd, len);\r
+}\r
+\r
+\r
+int \r
+Gasketclose (int fd)\r
+{\r
+  return GasketUintn (close, fd);\r
+}\r
+\r
+\r
+int \r
+Gasketmkdir (const char *pathname, mode_t mode)\r
+{\r
+  return GasketUintnUint16 (mkdir, (UINTN)pathname, mode);\r
+}\r
+\r
+\r
+int \r
+Gasketrmdir (const char *pathname)\r
+{\r
+  return GasketUintn (rmdir, (UINTN)pathname);\r
+}\r
+\r
+\r
+int \r
+Gasketunlink (const char *pathname)\r
+{\r
+  return GasketUintn (unlink, (UINTN)pathname);\r
+}\r
+\r
+\r
+int \r
+GasketGetErrno (void)\r
+{\r
+  return  GasketVoid (GetErrno);\r
+}\r
+\r
+\r
+DIR *\r
+Gasketopendir (const char *pathname)\r
+{\r
+  return (DIR *)(UINTN)GasketUintn (opendir, (UINTN)pathname);\r
+}\r
+\r
+\r
+void *\r
+Gasketrewinddir (DIR *dir)\r
+{\r
+  return (void *)(UINTN)GasketUintn (rewinddir, (UINTN)dir);\r
+}\r
+\r
+\r
+struct dirent *\r
+Gasketreaddir (DIR *dir)\r
+{\r
+  return (struct dirent *)(UINTN)GasketUintn (readdir, (UINTN)dir);\r
+}\r
+\r
+\r
+int \r
+Gasketclosedir (DIR *dir)\r
+{\r
+  return GasketUintn (closedir,  (UINTN)dir);\r
+}\r
+\r
+\r
+int \r
+Gasketstat (const char *path, STAT_FIX *buf)\r
+{\r
+  return GasketUintnUintn (stat, (UINTN)path, (UINTN)buf);\r
+}\r
+\r
+\r
+int \r
+Gasketstatfs (const char *path, struct statfs *buf)\r
+{\r
+  return GasketUintnUintn (statfs, (UINTN)path, (UINTN)buf);\r
+}\r
+\r
+\r
+int \r
+Gasketrename (const char *oldpath, const char *newpath)\r
+{\r
+  return GasketUintnUintn (rename, (UINTN)oldpath, (UINTN)newpath);\r
+}\r
+\r
+\r
+time_t \r
+Gasketmktime (struct tm *tm)\r
+{\r
+  return GasketUintn (mktime, (UINTN)tm);\r
+}\r
+\r
+\r
+int \r
+Gasketfsync (int fd)\r
+{\r
+  return GasketUintn (fsync, fd);\r
+}\r
+\r
+\r
+int \r
+Gasketchmod (const char *path, mode_t mode)\r
+{\r
+  return GasketUintnUint16 (chmod, (UINTN)path, mode);\r
+}\r
+\r
+\r
+int \r
+Gasketutime (const char *filename, const struct utimbuf *buf)\r
+{\r
+  return GasketUintnUintn (utime, (UINTN)filename, (UINTN)buf);\r
+}\r
+\r
+\r
+int \r
+Gaskettcflush (int fildes, int queue_selector)\r
+{\r
+  return GasketUintnUintn (tcflush, fildes, queue_selector);\r
+}\r
+\r
+\r
+EFI_STATUS \r
+GasketUgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title)\r
+{\r
+  return GasketUintnUintn (UgaCreate, (UINTN)UgaIo, (UINTN)Title);\r
+}\r
+\r
+\r
+void \r
+Gasketperror (__const char *__s)\r
+{\r
+  GasketUintn (perror, (UINTN)__s);\r
+  return;\r
+}\r
+\r
+\r
+\r
+//\r
+// ... is always an int or pointer to device specific data structure\r
+//\r
+int \r
+Gasketioctl (int fd, unsigned long int __request, ...)\r
+{\r
+  VA_LIST Marker;\r
+  \r
+  VA_START (Marker, __request);\r
+  return GasketUintnUintnUintn (ioctl, fd, __request, VA_ARG (Marker, UINTN));\r
+}\r
+\r
+\r
+int \r
+Gasketfcntl (int __fd, int __cmd, ...)\r
+{\r
+  VA_LIST Marker;\r
+  \r
+  VA_START (Marker, __cmd);\r
+  return GasketUintnUintnUintn (fcntl, __fd, __cmd, VA_ARG (Marker, UINTN));\r
+}\r
+\r
+\r
+\r
+int \r
+Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed)\r
+{\r
+  return GasketUintnUintn (cfsetispeed, (UINTN)__termios_p, __speed);\r
+}\r
+\r
+\r
+int \r
+Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed)\r
+{\r
+  return GasketUintnUintn (cfsetospeed, (UINTN)__termios_p, __speed);\r
+}\r
+\r
+\r
+int \r
+Gaskettcgetattr (int __fd, struct termios *__termios_p)\r
+{\r
+  return GasketUintnUintn (tcgetattr, __fd, (UINTN)__termios_p);\r
+}\r
+\r
\r
+int \r
+Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p)\r
+{\r
+  return GasketUintnUintnUintn (tcsetattr, __fd, __optional_actions, (UINTN)__termios_p);\r
+}\r
+\r
+\r
+int \r
+Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact)\r
+{\r
+  return GasketUintnUintn (sigaction, (UINTN)act, (UINTN)oact);\r
+}\r
+\r
+\r
+int \r
+Gasketsetcontext (const ucontext_t *ucp)\r
+{\r
+  return GasketUintn (setcontext, (UINTN)ucp);\r
+}\r
+\r
+\r
+int \r
+Gasketgetcontext (ucontext_t *ucp)\r
+{\r
+  return GasketUintn (getcontext, (UINTN)ucp);\r
+}\r
+\r
+\r
+int \r
+Gasketsigemptyset (sigset_t *set)\r
+{\r
+  return GasketUintn (sigemptyset, (UINTN)set);\r
+}\r
+\r
+\r
+int \r
+Gasketsigaltstack (const stack_t *ss, stack_t *oss)\r
+{\r
+  return GasketUintnUintn (sigaltstack, (UINTN)ss, (UINTN)oss);\r
+}\r
+\r
+\r
+\r
+RETURN_STATUS\r
+GasketUnixPeCoffGetEntryPoint (\r
+  IN     VOID  *Pe32Data,\r
+  IN OUT VOID  **EntryPoint\r
+  )\r
+{\r
+  return GasketUintnUintn (SecPeCoffGetEntryPoint, (UINTN)Pe32Data, (UINTN)EntryPoint);\r
+}\r
+\r
+\r
+\r
+VOID\r
+GasketUnixPeCoffRelocateImageExtraAction (\r
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
+  )\r
+{\r
+  GasketUintn (SecPeCoffRelocateImageExtraAction, (UINTN)ImageContext);\r
+  return;\r
+}\r
+\r
+\r
+\r
+VOID\r
+GasketPeCoffLoaderUnloadImageExtraAction (\r
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
+  )\r
+{\r
+  GasketUintn (SecPeCoffLoaderUnloadImageExtraAction, (UINTN)ImageContext);\r
+  return;\r
+}\r
+\r
+\r
+//\r
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL\r
+//\r
+\r
+EFI_STATUS \r
+EFIAPI \r
+GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)\r
+{\r
+  return GasketUintn (UgaClose, (UINTN)UgaIo);\r
+}\r
+\r
+EFI_STATUS \r
+EFIAPI \r
+GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height)\r
+{\r
+  return GasketUintnUintnUintn (UgaSize, (UINTN)UgaIo, Width, Height);\r
+}\r
+\r
+EFI_STATUS \r
+EFIAPI \r
+GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)\r
+{\r
+  return GasketUintn (UgaCheckKey, (UINTN)UgaIo);\r
+}\r
+\r
+EFI_STATUS \r
+EFIAPI \r
+GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key)\r
+{\r
+  return GasketUintnUintn (UgaGetKey, (UINTN)UgaIo, (UINTN)key);\r
+}\r
+\r
+EFI_STATUS \r
+EFIAPI \r
+GasketUgaBlt (\r
+   EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,\r
+   IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,\r
+   IN  EFI_UGA_BLT_OPERATION                   BltOperation,\r
+   IN  UINTN                                   SourceX,\r
+   IN  UINTN                                   SourceY,\r
+   IN  UINTN                                   DestinationX,\r
+   IN  UINTN                                   DestinationY,\r
+   IN  UINTN                                   Width,\r
+   IN  UINTN                                   Height,\r
+   IN  UINTN                                   Delta OPTIONAL\r
+   )\r
+{\r
+  return GasketUintn10Args (UgaBlt, (UINTN)UgaIo, (UINTN)BltBuffer, BltOperation, SourceX, SourceY, DestinationX, DestinationY, Width, Height, Delta);\r
+}\r
+\r
diff --git a/UnixPkg/Sec/Gasket.h b/UnixPkg/Sec/Gasket.h
new file mode 100644 (file)
index 0000000..8343de7
--- /dev/null
@@ -0,0 +1,141 @@
+\r
+#ifndef _GASKET_H_\r
+#define _GASKET_H_\r
+\r
+#include <Library/PeCoffLib.h>\r
+\r
+#include <Protocol/UgaDraw.h>\r
+#include <Protocol/SimpleTextIn.h>\r
+#include <Protocol/UnixUgaIo.h>\r
+\r
+\r
+//\r
+// Gasket functions for EFI_UNIX_THUNK_PROTOCOL\r
+//\r
+\r
+void GasketmsSleep (unsigned long Milliseconds);\r
+void Gasketexit (int status);\r
+void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));\r
+void GasketGetLocalTime (EFI_TIME *Time);\r
+struct tm *Gasketgmtime (const time_t *clock);\r
+long GasketGetTimeZone (void);\r
+int GasketGetDayLight (void);\r
+int Gasketpoll (struct pollfd *pfd, int nfds, int timeout);\r
+int Gasketread (int fd, void *buf, int count);\r
+int Gasketwrite (int fd, const void *buf, int count);\r
+char *Gasketgetenv (const char *name);\r
+int Gasketopen (const char *name, int flags, int mode);\r
+off_t Gasketlseek (int fd, off_t off, int whence);\r
+int Gasketftruncate (int fd, long int len);\r
+int Gasketclose (int fd);\r
+int Gasketmkdir (const char *pathname, mode_t mode);\r
+int Gasketrmdir (const char *pathname);\r
+int Gasketunlink (const char *pathname);\r
+int GasketGetErrno (void);\r
+DIR *Gasketopendir (const char *pathname);\r
+void *Gasketrewinddir (DIR *dir);\r
+struct dirent *Gasketreaddir (DIR *dir);\r
+int Gasketclosedir (DIR *dir);\r
+int Gasketstat (const char *path, STAT_FIX *buf);\r
+int Gasketstatfs (const char *path, struct statfs *buf);\r
+int Gasketrename (const char *oldpath, const char *newpath);\r
+time_t Gasketmktime (struct tm *tm);\r
+int Gasketfsync (int fd);\r
+int Gasketchmod (const char *path, mode_t mode);\r
+int Gasketutime (const char *filename, const struct utimbuf *buf);\r
+int Gaskettcflush (int fildes, int queue_selector);\r
+EFI_STATUS GasketUgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);\r
+void Gasketperror (__const char *__s);\r
+\r
+//\r
+// ... is always an int or pointer to device specific data structure\r
+//\r
+int Gasketioctl (int fd, unsigned long int __request, ...);\r
+int Gasketfcntl (int __fd, int __cmd, ...);\r
+\r
+int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);\r
+int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);\r
+int Gaskettcgetattr (int __fd, struct termios *__termios_p); \r
+int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);\r
+int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);\r
+int Gasketsetcontext (const ucontext_t *ucp);\r
+int Gasketgetcontext (ucontext_t *ucp);\r
+int Gasketsigemptyset (sigset_t *set);\r
+int Gasketsigaltstack (const stack_t *ss, stack_t *oss);\r
+\r
+RETURN_STATUS\r
+GasketUnixPeCoffGetEntryPoint (\r
+  IN     VOID  *Pe32Data,\r
+  IN OUT VOID  **EntryPoint\r
+  );\r
+\r
+VOID\r
+GasketUnixPeCoffRelocateImageExtraAction (\r
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
+  );\r
+\r
+VOID\r
+GasketPeCoffLoaderUnloadImageExtraAction (\r
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
+  );\r
+  \r
+\r
+int GasketVoid (void *api);\r
+int GasketUintn (void *api, UINTN a);\r
+int GasketUintnUintn (void *api, UINTN a, UINTN b);\r
+int GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c);\r
+int GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d);\r
+int GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j);\r
+int GasketUint64Uintn (void *api, UINT64 a, UINTN b);\r
+UINT64 GasketUintnUint64Uintn (void *api, UINTN a, UINT64 b, UINTN c);\r
+int GasketUintnUint16 (void *api, UINTN a, UINT16 b);\r
+\r
+\r
+//\r
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL\r
+//\r
+\r
+EFI_STATUS EFIAPI GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);\r
+EFI_STATUS EFIAPI GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);\r
+EFI_STATUS EFIAPI GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);\r
+EFI_STATUS EFIAPI GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);\r
+EFI_STATUS EFIAPI GasketUgaBlt (\r
+   EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,\r
+   IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,\r
+   IN  EFI_UGA_BLT_OPERATION                   BltOperation,\r
+   IN  UINTN                                   SourceX,\r
+   IN  UINTN                                   SourceY,\r
+   IN  UINTN                                   DestinationX,\r
+   IN  UINTN                                   DestinationY,\r
+   IN  UINTN                                   Width,\r
+   IN  UINTN                                   Height,\r
+   IN  UINTN                                   Delta OPTIONAL\r
+   );\r
+\r
+EFI_STATUS UgaCreate (EFI_UNIX_UGA_IO_PROTOCOL **Uga, CONST CHAR16 *Title);\r
+\r
+\r
+//\r
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL\r
+//\r
+EFI_STATUS UgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);\r
+EFI_STATUS UgaSize(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);\r
+EFI_STATUS UgaCheckKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);\r
+EFI_STATUS UgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);\r
+EFI_STATUS UgaBlt (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,\r
+       IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,\r
+       IN  EFI_UGA_BLT_OPERATION                   BltOperation,\r
+       IN  UINTN                                   SourceX,\r
+       IN  UINTN                                   SourceY,\r
+       IN  UINTN                                   DestinationX,\r
+       IN  UINTN                                   DestinationY,\r
+       IN  UINTN                                   Width,\r
+       IN  UINTN                                   Height,\r
+       IN  UINTN                                   Delta OPTIONAL\r
+  );\r
+\r
+\r
+\r
+#endif\r
+\r
+\r
index 80d033675c57929976c11e612b62ca2607fc6c8b..77e8296b0b63f721735c4cfbbaa6ec42255a830f 100644 (file)
@@ -1,5 +1,21 @@
 #------------------------------------------------------------------------------\r
 #\r
+# OS X Application requires 16 byte stack alignment. The problem is these\r
+# APIs are exposed to code that does not have this requirement via \r
+# EFI_UNIX_THUNK_PROTOCOL. So these are wrapper functions that make sure\r
+# the stack is aligned. This code should also work if the stack is already\r
+# aligned. Extra stack padding is really the same as local varaibles so \r
+# it gets freed by the leave instruction\r
+#\r
+# I basically used the compiler, added extra 16 bytes to the local stack and\r
+# made sure %esp ended in 0 before the call (16 byte algined)\r
+#\r
+# The EFI_UNIX_THUNK_PROTOCOL member functions call a C API that then calls \r
+# one of these generic assembly routines.  We do it that way to work around \r
+# some magic name changing that happens in C. For example stat() is _stat() \r
+# on Leopard and _stat$INDOE64 on Snow Leopard. That is why we pass stat()\r
+# into one of these gaskets from C code.\r
+#\r
 # Copyright (c) 2008 - 2009 Apple Inc. All rights reserved.\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 #\r
-# Abstract:\r
-#\r
-#   OS X Application requires 16 byte stack alignment. The problem is these\r
-#   APIs are exposed to code that does not have this requirement via \r
-#   EFI_UNIX_THUNK_PROTOCOL. So these are wrapper functions that make sure\r
-#   the stack is aligned. This code should also work if the stack is already\r
-#   aligned. Extra stack padding is really the same as local varaibles so \r
-#   it gets freed by the leave instruction\r
-#\r
-# I basically used the compiler, added extra 16 bytes to the local stack and\r
-# made sure %esp ended in 0 before the call (16 byte algined)\r
-#\r
-# cat t.c\r
-##include <stdio.h>\r
-##include <sys/stat.h>\r
-#\r
-#int chmod (int fd, mode_t len){\r
-#  long m = (long)fd;\r
-#}\r
-#\r
-#int Gasketchmod (int fd, mode_t len){\r
-#  return chmod (fd, len);\r
-#}\r
-#\r
-# gcc -S t.c\r
-# cat t.s\r
-# this gives you the starting point.... \r
-#\r
-#\r
 #------------------------------------------------------------------------------\r
 \r
-#include <ProcessorBind.h>\r
-\r
   .text\r
-  \r
-#\r
-#\r
-# EFI_UNIX_THUNK_PROTOCOL that gets exported\r
-#\r
-#\r
-  \r
-#------------------------------------------------------------------------------\r
-# VOID GasketmsSleep (unsigned long Milliseconds);\r
-#------------------------------------------------------------------------------    \r
-.globl _GasketmsSleep\r
-_GasketmsSleep:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _msSleep\r
-       leave\r
-       ret\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# void Gasketexit (int status);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketexit\r
-_Gasketexit:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _exit\r
-       leave\r
-       ret\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));\r
-#------------------------------------------------------------------------------\r
-.globl  _GasketSetTimer\r
-_GasketSetTimer:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $56, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, -16(%ebp)\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, -12(%ebp)\r
-       movl    16(%ebp), %eax\r
-       movl    %eax, 8(%esp)\r
-       movl    -16(%ebp), %eax\r
-       movl    -12(%ebp), %edx\r
-       movl    %eax, (%esp)\r
-       movl    %edx, 4(%esp)\r
-       call    _SetTimer\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# void GasketGetLocalTime (EFI_TIME *Time);\r
-#------------------------------------------------------------------------------\r
-.globl  _GasketGetLocalTime\r
-_GasketGetLocalTime:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _GetLocalTime\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# struct tm *Gasketgmtime (const time_t *clock);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketgmtime\r
-_Gasketgmtime:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _gmtime\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# long GasketGetTimeZone(void);\r
-#------------------------------------------------------------------------------\r
-.globl _GasketGetTimeZone\r
-_GasketGetTimeZone:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $24, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       call    _GetTimeZone\r
-       leave\r
-       ret\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int GasketGetDayLight (void);\r
-#------------------------------------------------------------------------------\r
-.globl  _GasketGetDayLight\r
-_GasketGetDayLight:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $24, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       call    _GetDayLight\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketpoll (struct pollfd *pfd, int nfds, int timeout);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketpoll\r
-_Gasketpoll:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $56, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    16(%ebp), %eax\r
-       movl    %eax, 8(%esp)\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _poll\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketread (int fd, void *buf, int count);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketread\r
-_Gasketread:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $56, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    16(%ebp), %eax\r
-       movl    %eax, 8(%esp)\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _read\r
-       leave\r
-       ret\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketwrite (int fd, const void *buf, int count);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketwrite\r
-_Gasketwrite:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $56, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    16(%ebp), %eax\r
-       movl    %eax, 8(%esp)\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _write\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# char *Gasketgetenv (const char *name);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketgetenv\r
-_Gasketgetenv:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _getenv\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketopen (const char *name, int flags, int mode);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketopen\r
-_Gasketopen:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $56, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    16(%ebp), %eax\r
-       movl    %eax, 8(%esp)\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _open\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# off_t Gasketlseek (int fd, off_t off, int whence);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketlseek\r
-_Gasketlseek:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $56, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, -16(%ebp)\r
-       movl    16(%ebp), %eax\r
-       movl    %eax, -12(%ebp)\r
-       movl    20(%ebp), %eax\r
-       movl    %eax, 12(%esp)\r
-       movl    -16(%ebp), %eax\r
-       movl    -12(%ebp), %edx\r
-       movl    %eax, 4(%esp)\r
-       movl    %edx, 8(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _lseek\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketftruncate (int fd, long int len);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketftruncate\r
-_Gasketftruncate:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _truncate\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketclose (int fd);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketclose\r
-_Gasketclose:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _close\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketmkdir (const char *pathname, mode_t mode);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketmkdir\r
-_Gasketmkdir:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _mkdir\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketrmdir (const char *pathname);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketrmdir\r
-_Gasketrmdir:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _rmdir\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketunlink (const char *pathname);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketunlink\r
-_Gasketunlink:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _unlink\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int GasketGetErrno (void);\r
-#------------------------------------------------------------------------------\r
-.globl  _GasketGetErrno\r
-_GasketGetErrno:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $24, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       call    _GetErrno\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# DIR *Gasketopendir (const char *pathname);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketopendir\r
-_Gasketopendir:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _opendir\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# void *Gasketrewinddir (DIR *dir);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketrewinddir\r
-_Gasketrewinddir:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _rewinddir\r
-       leave\r
-       ret\r
-\r
 \r
-\r
-#------------------------------------------------------------------------------\r
-# struct dirent *Gasketreaddir (DIR *dir);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketreaddir\r
-_Gasketreaddir:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _readdir\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketclosedir (DIR *dir);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketclosedir\r
-_Gasketclosedir:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _closedir\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketstat (const char *path, struct stat *buf);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketstat\r
-_Gasketstat:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _stat\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketstatfs (const char *path, struct statfs *buf);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketstatfs\r
-_Gasketstatfs:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _statfs\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketrename (const char *oldpath, const char *newpath);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketrename\r
-_Gasketrename:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _rename\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# time_t Gasketmktime (struct tm *tm);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketmktime\r
-_Gasketmktime:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _mktime\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketfsync (int fd);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketfsync\r
-_Gasketfsync:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _fsync\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketchmod (const char *path, mode_t mode);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketchmod\r
-_Gasketchmod:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $56, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movw    %ax, -12(%ebp)\r
-       movzwl  -12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _chmod\r
-       leave\r
-       ret\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketutime (const char *filename, const struct utimbuf *buf);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketutime\r
-_Gasketutime:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _rename\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gaskettcflush (int fildes, int queue_selector);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gaskettcflush\r
-_Gaskettcflush:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _rename\r
-       leave\r
-       ret\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# EFI_STATUS UgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);\r
 #------------------------------------------------------------------------------\r
-.globl _GasketUgaCreate\r
-_GasketUgaCreate:\r
-  pushl   %ebp\r
-  movl    %esp, %ebp\r
-  subl    $40, %esp         #sub extra 0x10 from the stack for the AND\r
-  and     $-16, %esp        # stack needs to end in 0xFFFFFFF0 before call\r
-  movl    12(%ebp), %eax\r
-  movl    %eax, 4(%esp)\r
-  movl    8(%ebp), %eax\r
-  movl    %eax, (%esp)\r
-  call    _UgaCreate\r
+# int GasketVoid (void *api)\r
+#------------------------------------------------------------------------------    \r
+.globl _GasketVoid\r
+_GasketVoid:\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $34, %esp           # sub extra 0x10 from the stack for the AND\r
+  and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, -12(%ebp)\r
+  movl  -12(%ebp), %eax\r
+  call  *%eax\r
   leave\r
   ret\r
 \r
-\r
-#------------------------------------------------------------------------------\r
-# void Gasketperror (__const char *__s);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketperror\r
-_Gasketperror:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _perror\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketioctl (int fd, unsigned long int __request, ...);\r
-#\r
-# ... is really int or pointer to structure, so we can treat like an int\r
-#\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketioctl\r
-_Gasketioctl:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    16(%ebp), %eax\r
-       movl    %eax, 8(%esp)\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _ioctl\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketfcntl (int __fd, int __cmd, ...);\r
-#\r
-# ... is really int or pointer to structure, so we can treat like an int\r
-#\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketfcntl\r
-_Gasketfcntl:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    16(%ebp), %eax\r
-       movl    %eax, 8(%esp)\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _fcntl\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketcfsetispeed\r
-_Gasketcfsetispeed:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp         # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp        # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _cfsetispeed\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gasketcfsetospeed\r
-_Gasketcfsetospeed:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp         # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp        # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _cfsetospeed\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gaskettcgetattr (int __fd, struct termios *__termios_p); \r
-#------------------------------------------------------------------------------\r
-.globl  _Gaskettcgetattr\r
-_Gaskettcgetattr:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp         # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp        # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _tcgetattr\r
-       leave\r
-       ret\r
-\r
-\r
-\r
-#------------------------------------------------------------------------------\r
-# int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);\r
-#------------------------------------------------------------------------------\r
-.globl  _Gaskettcsetattr\r
-_Gaskettcsetattr:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    16(%ebp), %eax\r
-       movl    %eax, 8(%esp)\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _tcsetattr\r
-       leave\r
-       ret\r
-\r
 #------------------------------------------------------------------------------\r
-# int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);\r
 #------------------------------------------------------------------------------\r
-.globl  _Gasketsigaction\r
-_Gasketsigaction:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    16(%ebp), %eax\r
-       movl    %eax, 8(%esp)\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _sigaction\r
-       leave\r
-       ret\r
-\r
+.globl _GasketUintn\r
+_GasketUintn:\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $50, %esp           # sub extra 0x10 from the stack for the AND\r
+  and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, -12(%ebp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+  movl  -12(%ebp), %eax\r
+  call  *%eax\r
+  leave\r
+  ret\r
 \r
 #------------------------------------------------------------------------------\r
-# int Gasketsetcontext (const ucontext_t *ucp);\r
 #------------------------------------------------------------------------------\r
-.globl  _Gasketsetcontext\r
-_Gasketsetcontext:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _setcontext\r
-       leave\r
-       ret\r
+.globl _GasketUintnUintn\r
+_GasketUintnUintn:\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $50, %esp           # sub extra 0x10 from the stack for the AND \r
+  and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, -12(%ebp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+  movl  -12(%ebp), %eax\r
+  call  *%eax\r
+  leave\r
+  ret\r
 \r
 #------------------------------------------------------------------------------\r
-# int Gasketgetcontext (ucontext_t *ucp);\r
 #------------------------------------------------------------------------------\r
-.globl  _Gasketgetcontext\r
-_Gasketgetcontext:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _getcontext\r
-       leave\r
-       ret\r
+.globl _GasketUintnUintnUintn\r
+_GasketUintnUintnUintn:\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $50, %esp           # sub extra 0x10 from the stack for the AND\r
+  and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, -12(%ebp)\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+  movl  -12(%ebp), %eax\r
+  call  *%eax\r
+  leave\r
+  ret\r
 \r
 #------------------------------------------------------------------------------\r
-# int Gasketsigemptyset (sigset_t *set);\r
 #------------------------------------------------------------------------------\r
-.globl  _Gasketsigemptyset\r
-_Gasketsigemptyset:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp           # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _sigemptyset\r
-       leave\r
-       ret\r
-\r
+.globl _GasketUintnUintnUintnUintn\r
+_GasketUintnUintnUintnUintn:\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $50, %esp           # sub extra 0x10 from the stack for the AND\r
+  and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, -12(%ebp)\r
+  movl  24(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+  movl  -12(%ebp), %eax\r
+  call  *%eax\r
+  leave\r
+  ret\r
 \r
 #------------------------------------------------------------------------------\r
-# int Gasketsigaltstack (const stack_t *ss, stack_t *oss);\r
 #------------------------------------------------------------------------------\r
-.globl  _Gasketsigaltstack\r
-_Gasketsigaltstack:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp         # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp        # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _sigaltstack\r
-       leave\r
-       ret\r
-\r
-#\r
-#\r
-# UGA Functions that get exported\r
-#\r
-#\r
+.globl _GasketUintn10Args\r
+_GasketUintn10Args:\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $82, %esp         # sub extra 0x10 from the stack for the AND\r
+  and   $-16, %esp        # stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax     \r
+  movl  %eax, -12(%ebp)\r
+  movl  48(%ebp), %eax\r
+  movl  %eax, 36(%esp)\r
+  movl  44(%ebp), %eax\r
+  movl  %eax, 32(%esp)\r
+  movl  40(%ebp), %eax\r
+  movl  %eax, 28(%esp)\r
+  movl  36(%ebp), %eax\r
+  movl  %eax, 24(%esp)\r
+  movl  32(%ebp), %eax\r
+  movl  %eax, 20(%esp)\r
+  movl  28(%ebp), %eax\r
+  movl  %eax, 16(%esp)\r
+  movl  24(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+  movl  -12(%ebp), %eax\r
+  call  *%eax\r
+  leave\r
+  ret\r
 \r
-#------------------------------------------------------------------------------\r
-# EFI_STATUS GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);\r
-#------------------------------------------------------------------------------    \r
-.globl _GasketUgaClose\r
-_GasketUgaClose:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp        # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp       # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-  movl %eax, (%esp)\r
-       call    _UgaClose\r
-       leave\r
-       ret\r
 \r
 #------------------------------------------------------------------------------\r
-# EFI_STATUS GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);\r
-#------------------------------------------------------------------------------\r
-.globl _GasketUgaSize\r
-_GasketUgaSize:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp\r
-       and   $-16, %esp       # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    16(%ebp), %eax\r
-       movl    %eax, 8(%esp)\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _UgaSize\r
-       leave\r
-       ret\r
-\r
-\r
 #------------------------------------------------------------------------------\r
-# EFI_STATUS GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);\r
-#------------------------------------------------------------------------------    \r
-.globl _GasketUgaCheckKey\r
-_GasketUgaCheckKey:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $40, %esp        # sub extra 0x10 from the stack for the AND\r
-       and   $-16, %esp       # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    8(%ebp), %eax\r
-  movl %eax, (%esp)\r
-       call    _UgaCheckKey\r
-       leave\r
-       ret\r
+.globl _GasketUint64Uintn\r
+_GasketUint64Uintn:\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $66, %esp           # sub extra 0x10 from the stack for the AND\r
+  and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, -32(%ebp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, -28(%ebp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, -12(%ebp)\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  -32(%ebp), %eax\r
+  movl  -28(%ebp), %edx\r
+  movl  %eax, (%esp)\r
+  movl  %edx, 4(%esp)\r
+  movl  -12(%ebp), %eax\r
+  call  *%eax\r
+  leave\r
+  ret\r
 \r
 #------------------------------------------------------------------------------\r
-# EFI_STATUS GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);\r
 #------------------------------------------------------------------------------\r
-.globl _GasketUgaGetKey\r
-_GasketUgaGetKey:\r
-  pushl   %ebp\r
-  movl    %esp, %ebp\r
-  subl    $40, %esp         #sub extra 0x10 from the stack for the AND\r
-  and     $-16, %esp        # stack needs to end in 0xFFFFFFF0 before call\r
-  movl    12(%ebp), %eax\r
-  movl    %eax, 4(%esp)\r
-  movl    8(%ebp), %eax\r
-  movl    %eax, (%esp)\r
-  call    _UgaGetKey\r
+.globl _GasketUintnUint64Uintn\r
+_GasketUintnUint64Uintn:\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $66, %esp           # sub extra 0x10 from the stack for the AND\r
+  and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, -32(%ebp)\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, -28(%ebp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, -12(%ebp)\r
+  movl  24(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  -32(%ebp), %eax\r
+  movl  -28(%ebp), %edx\r
+  movl  %eax, 4(%esp)\r
+  movl  %edx, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+  movl  -12(%ebp), %eax\r
+  call  *%eax\r
   leave\r
   ret\r
 \r
-\r
 #------------------------------------------------------------------------------\r
-# EFI_STATUS\r
-# GasketUgaBlt(\r
-#    EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,\r
-#    IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,\r
-#    IN  EFI_UGA_BLT_OPERATION                   BltOperation,\r
-#    IN  UINTN                                   SourceX,\r
-#    IN  UINTN                                   SourceY,\r
-#    IN  UINTN                                   DestinationX,\r
-#    IN  UINTN                                   DestinationY,\r
-#    IN  UINTN                                   Width,\r
-#    IN  UINTN                                   Height,\r
-#    IN  UINTN                                   Delta OPTIONAL\r
-#    );\r
 #------------------------------------------------------------------------------\r
-.globl _GasketUgaBlt\r
-_GasketUgaBlt:\r
-       pushl   %ebp\r
-       movl    %esp, %ebp\r
-       subl    $88, %esp         #sub extra 0x10 from the stack for the AND\r
-  and   $-16, %esp        # stack needs to end in 0xFFFFFFF0 before call\r
-       movl    $0, -12(%ebp)\r
-       movl    44(%ebp), %eax\r
-       movl    %eax, 36(%esp)\r
-       movl    40(%ebp), %eax\r
-       movl    %eax, 32(%esp)\r
-       movl    36(%ebp), %eax\r
-       movl    %eax, 28(%esp)\r
-       movl    32(%ebp), %eax\r
-       movl    %eax, 24(%esp)\r
-       movl    28(%ebp), %eax\r
-       movl    %eax, 20(%esp)\r
-       movl    24(%ebp), %eax\r
-       movl    %eax, 16(%esp)\r
-       movl    20(%ebp), %eax\r
-       movl    %eax, 12(%esp)\r
-       movl    16(%ebp), %eax\r
-       movl    %eax, 8(%esp)\r
-       movl    12(%ebp), %eax\r
-       movl    %eax, 4(%esp)\r
-       movl    8(%ebp), %eax\r
-       movl    %eax, (%esp)\r
-       call    _UgaBlt\r
-       leave\r
-       ret\r
+.globl _GasketUintnUint16\r
+_GasketUintnUint16:\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $66, %esp           # sub extra 0x10 from the stack for the AND\r
+  and   $-16, %esp          # stack needs to end in 0xFFFFFFF0 before call\r
+  movl  16(%ebp), %eax\r
+  movw  %ax, -28(%ebp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, -12(%ebp)\r
+  movzwl  -28(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+  movl  -12(%ebp), %eax\r
+  call  *%eax\r
+  leave\r
+  ret\r
 \r
+  .subsections_via_symbols\r
diff --git a/UnixPkg/Sec/Ia32/GasketTemplate.c b/UnixPkg/Sec/Ia32/GasketTemplate.c
new file mode 100644 (file)
index 0000000..3b88135
--- /dev/null
@@ -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);
+}
+
+
+
index 98a7a4db9df9499578ba1c5215230afdc5b3fab6..da19a4b1343c8b47b3a30efe16339d572945013e 100644 (file)
@@ -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());  
   }
index c7a72c93a6b0bbeaab3c3b4dc41b550ea0632b2c..7a120f7a0a8a94088381dc0e83deba0b4e93f5e5 100644 (file)
@@ -157,9 +157,9 @@ EFI_STATUS
 EFIAPI\r
 SecPeiReportStatusCode (\r
   IN CONST EFI_PEI_SERVICES     **PeiServices,\r
-  IN EFI_STATUS_CODE_TYPE     CodeType,\r
-  IN EFI_STATUS_CODE_VALUE    Value,\r
-  IN UINT32                   Instance,\r
+  IN EFI_STATUS_CODE_TYPE       CodeType,\r
+  IN EFI_STATUS_CODE_VALUE      Value,\r
+  IN UINT32                     Instance,\r
   IN CONST EFI_GUID             *CallerId,\r
   IN CONST EFI_STATUS_CODE_DATA *Data OPTIONAL\r
   )\r
@@ -390,25 +390,9 @@ EFIAPI
 SecUnixFdAddress (\r
   IN     UINTN                 Index,\r
   IN OUT EFI_PHYSICAL_ADDRESS  *FdBase,\r
-  IN OUT UINT64                *FdSize\r
+  IN OUT UINT64                *FdSize,\r
+  IN OUT EFI_PHYSICAL_ADDRESS  *FixUp\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  Index   - TODO: add argument description\r
-  FdBase  - TODO: add argument description\r
-  FdSize  - TODO: add argument description\r
-\r
-Returns:\r
-\r
-  TODO: add return values\r
-\r
---*/\r
 ;\r
 \r
 EFI_STATUS\r
@@ -538,4 +522,15 @@ SecPeCoffLoaderUnloadImageExtraAction (
   );\r
 \r
 \r
+\r
+VOID SetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));\r
+void msSleep (unsigned long Milliseconds);\r
+void GetLocalTime (EFI_TIME *Time);\r
+void TzSet (void);\r
+long GetTimeZone(void);\r
+int GetDayLight(void);\r
+int GetErrno(void);\r
+\r
+\r
+\r
 extern EFI_UNIX_THUNK_PROTOCOL  *gUnix;\r
index c7a9b40df7b16b2dd0d001a190229e762d0f9a9d..b745faa16d8845e33d8986c2c5c723223e705f9e 100644 (file)
@@ -36,6 +36,7 @@
   UnixThunk.c\r
   FwVol.c\r
   SecMain.c\r
+  Gasket.c\r
   \r
 [Sources.Ia32]  \r
   Ia32/Gasket.S\r
@@ -71,6 +72,7 @@
   gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareVolume\r
   gEfiUnixPkgTokenSpaceGuid.PcdUnixMemorySizeForSecMain\r
   gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareFdSize\r
+  gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress\r
 \r
 [BuildOptions.common]\r
    GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/SecMain -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o -L/usr/X11R6/lib -lXext -lX11 /usr/lib/crtn.o\r
@@ -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\r
 #\r
    XCODE:*_*_IA32_DLINK_PATH == gcc\r
-   XCODE:*_*_IA32_DLINK_FLAGS == -arch i386  -L/usr/X11R6/lib -lXext -lX11 -lIOKit -framework Carbon           \r
+   XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -o $(BIN_DIR)/SecMain -L/usr/X11R6/lib -lXext -lX11 -lIOKit -framework Carbon              \r
    XCODE:*_*_IA32_ASM_FLAGS == -arch i386 -g\r
index 386e0bc14595f56fb847b416c688bb0790cad233..2c2fb186b927382562ed354fcca5393c68d88277 100644 (file)
@@ -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;
index 5dfba7a73436e7adab2ee3c3a92f2d848a35eeea..c0f35d0729d59c094dd00576518085010f026e41 100644 (file)
@@ -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 (file)
index 0000000..bce19f3
--- /dev/null
@@ -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
+
+
+
index c3bd3d38c6170fd678176e9437b04649e06691f1..a223d8240064daeb30f0e9e3cff96a280b9913b4 100644 (file)
@@ -774,12 +774,9 @@ Returns:
   //\r
   // Open the device\r
   //\r
-  Private->fd = Private->UnixThunk->Open\r
-    (Private->Filename, Private->Mode, 0644);\r
-\r
+  Private->fd = Private->UnixThunk->Open (Private->Filename, Private->Mode, 0644);\r
   if (Private->fd < 0) {\r
-    DEBUG ((EFI_D_INFO, "PlOpenBlock: Could not open %s\n",\r
-           Private->Filename));\r
+    DEBUG ((EFI_D_INFO, "PlOpenBlock: Could not open %a\n", Private->Filename));\r
     BlockIo->Media->MediaPresent  = FALSE;\r
     Status                        = EFI_NO_MEDIA;\r
     goto Done;\r
@@ -798,16 +795,17 @@ Returns:
   // get the size of the file\r
   //\r
   Status = SetFilePointer64 (Private, 0, &FileSize, SEEK_END);\r
-\r
   if (EFI_ERROR (Status)) {\r
     FileSize = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);\r
-    DEBUG ((EFI_D_ERROR, "PlOpenBlock: Could not get filesize of %s\n", Private->Filename));\r
+    DEBUG ((EFI_D_ERROR, "PlOpenBlock: Could not get filesize of %a\n", Private->Filename));\r
     Status = EFI_UNSUPPORTED;\r
     goto Done;\r
   }\r
 \r
   if (Private->NumberOfBlocks == 0) {\r
     Private->NumberOfBlocks = DivU64x32 (FileSize, Private->BlockSize);\r
+    Private->LastBlock = Private->NumberOfBlocks - 1;\r
+    Private->Media.LastBlock = Private->LastBlock;\r
   }\r
 \r
   EndOfFile = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);\r
@@ -829,7 +827,7 @@ Returns:
     Private->UnixThunk->FTruncate (Private->fd, EndOfFile);\r
   }\r
 \r
-  DEBUG ((EFI_D_INIT, "%HPlOpenBlock: opened %s%N\n", Private->Filename));\r
+  DEBUG ((EFI_D_INIT, "%HPlOpenBlock: opened %a%N\n", Private->Filename));\r
   Status = EFI_SUCCESS;\r
 \r
 Done:\r
index a7be30c3859a08713e640a47670dc9809e7501fd..fa242eb1711b8ac7392f1f309692d41441dbaa56 100644 (file)
@@ -269,7 +269,7 @@ Returns:
     Status = EFI_UNSUPPORTED;\r
   }\r
 \r
-   //\r
+  //\r
   // Close protocol, don't use device path protocol in the Support() function\r
   //\r
   gBS->CloseProtocol (\r
index 694f2f180b3484d18cf2ccc78b9e49d67f026350..1f588d0c9a86eb29e69e3162282166f3436b1b8d 100644 (file)
@@ -50,8 +50,9 @@ Returns:
 {\r
   EFI_STATUS                  Status;\r
   EFI_PEI_PPI_DESCRIPTOR      *PpiDescriptor;\r
-  UNIX_FWH_PPI               *FwhPpi;\r
+  UNIX_FWH_PPI                *FwhPpi;\r
   EFI_PHYSICAL_ADDRESS        FdBase;\r
+  EFI_PHYSICAL_ADDRESS        FdFixUp;\r
   EFI_FIRMWARE_VOLUME_HEADER  *FvHeader;\r
   UINT64                      FdSize;\r
   UINTN                       Index;\r
@@ -75,7 +76,7 @@ Returns:
     //\r
     // Get information about all the FD's in the system\r
     //\r
-    Status = FwhPpi->UnixFwh (Index, &FdBase, &FdSize);\r
+    Status = FwhPpi->UnixFwh (Index, &FdBase, &FdSize, &FdFixUp);\r
     if (!EFI_ERROR (Status)) {\r
       //\r
       // Assume the FD starts with an FV header\r
@@ -116,7 +117,7 @@ Returns:
           PcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
           PcdGet32 (PcdUnixFlashNvStorageEventLogSize);\r
 \r
-        BuildFvHob (FdBase + PcdGet32 (PcdUnixFlashNvStorageVariableBase), FdSize);\r
+        BuildFvHob (FdFixUp + PcdGet32 (PcdUnixFlashNvStorageVariableBase), FdSize);\r
       } else {\r
         //\r
         // For other FD's just map them in.\r
index d3a15cb814f4700b9a4baa27dcdc7840d2596009..f33b00ec176fb5e0c7ea4b4fbd999507f24683a0 100644 (file)
@@ -57,9 +57,10 @@ Returns:
 // TODO:    EFI_SUCCESS - add return value to function comment\r
 {\r
   EFI_STATUS              Status;\r
-  UNIX_FWH_PPI           *UnixFwhPpi;\r
+  UNIX_FWH_PPI            *UnixFwhPpi;\r
   EFI_PEI_PPI_DESCRIPTOR  *PpiDescriptor;\r
   EFI_PHYSICAL_ADDRESS    FdBase;\r
+  EFI_PHYSICAL_ADDRESS    FdFixUp;\r
   UINT64                  FdSize;\r
 \r
   DEBUG ((EFI_D_ERROR, "NT 32 Flash Map PEIM Loaded\n"));\r
@@ -78,14 +79,14 @@ Returns:
   //\r
   // Assume that FD0 contains the Flash map.\r
   //\r
-  Status = UnixFwhPpi->UnixFwh (0, &FdBase, &FdSize);\r
+  Status = UnixFwhPpi->UnixFwh (0, &FdBase, &FdSize, &FdFixUp);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
   \r
-  PcdSet32 (PcdFlashNvStorageVariableBase, PcdGet32 (PcdUnixFlashNvStorageVariableBase) + (UINT32) FdBase);\r
-  PcdSet32 (PcdFlashNvStorageFtwWorkingBase, PcdGet32 (PcdUnixFlashNvStorageFtwWorkingBase) + (UINT32) FdBase);\r
-  PcdSet32 (PcdFlashNvStorageFtwSpareBase, PcdGet32 (PcdUnixFlashNvStorageFtwSpareBase) + (UINT32) FdBase);\r
+  PcdSet32 (PcdFlashNvStorageVariableBase, PcdGet32 (PcdUnixFlashNvStorageVariableBase) + (UINT32)FdFixUp);\r
+  PcdSet32 (PcdFlashNvStorageFtwWorkingBase, PcdGet32 (PcdUnixFlashNvStorageFtwWorkingBase) + (UINT32)FdFixUp);\r
+  PcdSet32 (PcdFlashNvStorageFtwSpareBase, PcdGet32 (PcdUnixFlashNvStorageFtwSpareBase) + (UINT32)FdFixUp);\r
 \r
   return EFI_SUCCESS;\r
 }\r
index 1de2dc52fcca9641a31c7c3a0f0a574cedeeb4ce..7fe962d1e24c67705f09fdf70beb937dd8ede501 100644 (file)
 #\r
 ################################################################################\r
 [FD.Fv_Recovery]\r
-BaseAddress   = 0x0|gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress  #The base address of the FLASH Device.\r
-Size          = 0x002a0000                                           #The size in bytes of the FLASH Device\r
+#\r
+# In OS X PEIMs are really XIP, so we need to make this address match the malloced \r
+# buffer for the FD (0x41000000). If this address does not match the FV will get\r
+# relocated in place (works, but not a great idea).\r
+#\r
+BaseAddress   = 0x41000000|gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress   #The base address of the FLASH Device.\r
+Size          = 0x002a0000|gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareFdSize  #The size in bytes of the FLASH Device\r
 ErasePolarity = 1\r
 BlockSize     = 0x10000\r
 NumBlocks     = 0x2a\r
index e39a18978fbfd05b71be55ee3b3e875511fb976a..b46c9dce973ed21365a6e96332c5880a136eac21 100644 (file)
@@ -836,7 +836,7 @@ OpenRoot:
       NewPrivateFile->IsDirectoryPath = FALSE;\r
     }\r
   } else {\r
-    struct stat finfo;\r
+    STAT_FIX finfo;\r
     int res = NewPrivateFile->UnixThunk->Stat (NewPrivateFile->FileName, &finfo);\r
     if (res == 0 && S_ISDIR(finfo.st_mode))\r
       NewPrivateFile->IsDirectoryPath = TRUE;\r
@@ -1107,7 +1107,7 @@ Returns:
   struct tm *tm;\r
   tm = UnixThunk->GmTime (&SystemTime);\r
   Time->Year   = tm->tm_year;\r
-  Time->Month  = tm->tm_mon;\r
+  Time->Month  = tm->tm_mon + 1;\r
   Time->Day    = tm->tm_mday;\r
   Time->Hour   = tm->tm_hour;\r
   Time->Minute = tm->tm_min;\r
@@ -1151,10 +1151,10 @@ Returns:
   UINTN                       NameSize;\r
   UINTN                       ResultSize;\r
   EFI_FILE_INFO               *Info;\r
-  CHAR8                      *RealFileName;\r
-  CHAR8                      *TempPointer;\r
+  CHAR8                       *RealFileName;\r
+  CHAR8                       *TempPointer;\r
   CHAR16                      *BufferFileName;\r
-  struct stat                 buf;\r
+  STAT_FIX                    buf;\r
 \r
   if (FileName != NULL) {\r
     RealFileName = FileName;\r
@@ -1724,7 +1724,7 @@ Returns:
   UINTN                             OldInfoSize;\r
   EFI_TPL                           OldTpl;\r
   mode_t                            NewAttr;\r
-  struct stat                       OldAttr;\r
+  STAT_FIX                          OldAttr;\r
   CHAR8                             *OldFileName;\r
   CHAR8                             *NewFileName;\r
   CHAR8                             *CharPointer;\r
diff --git a/UnixPkg/Xcode/xcode_project/XcodeBuild.sh b/UnixPkg/Xcode/xcode_project/XcodeBuild.sh
new file mode 100755 (executable)
index 0000000..e3827ce
--- /dev/null
@@ -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 (file)
index 0000000..f3db667
--- /dev/null
@@ -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 (file)
index 0000000..199700f
--- /dev/null
@@ -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 (executable)
index 0000000..2770019
--- /dev/null
@@ -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 $?
+
index 35e2523e0f8d651a50eb6f2dc04f802606bf575b..f28d626f9c9880a0bb78a608931d9a842e608bc5 100644 (file)
@@ -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
 ===