diff options
27 files changed, 2564 insertions, 1109 deletions
diff --git a/UnixPkg/.gdbinit b/UnixPkg/.gdbinit new file mode 100644 index 0000000000..173818c0e7 --- /dev/null +++ b/UnixPkg/.gdbinit @@ -0,0 +1,8 @@ +set confirm off +set output-radix 16 +b SecGdbScriptBreak +command +silent +source SecMain.gdb +c +end diff --git a/UnixPkg/FvbServicesRuntimeDxe/FWBlockService.c b/UnixPkg/FvbServicesRuntimeDxe/FWBlockService.c index 30723c5d72..c316d7c2ac 100644 --- a/UnixPkg/FvbServicesRuntimeDxe/FWBlockService.c +++ b/UnixPkg/FvbServicesRuntimeDxe/FWBlockService.c @@ -226,7 +226,7 @@ Returns: EFI_STATUS
FvbGetVolumeAttributes (
IN UINTN Instance,
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
IN ESAL_FWB_GLOBAL *Global,
IN BOOLEAN Virtual
)
@@ -560,10 +560,10 @@ Returns: {
EFI_FVB_ATTRIBUTES_2 Attributes;
- UINTN LbaAddress;
- UINTN LbaLength;
- EFI_STATUS Status;
- UINT8 Data;
+ UINTN LbaAddress;
+ UINTN LbaLength;
+ EFI_STATUS Status;
+ UINT8 Data;
//
// Check if the FV is write enabled
@@ -596,7 +596,7 @@ Returns: EFI_STATUS
FvbSetVolumeAttributes (
IN UINTN Instance,
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
IN ESAL_FWB_GLOBAL *Global,
IN BOOLEAN Virtual
)
@@ -629,10 +629,10 @@ Returns: EFI_FW_VOL_INSTANCE *FwhInstance = NULL;
EFI_FVB_ATTRIBUTES_2 OldAttributes;
EFI_FVB_ATTRIBUTES_2 *AttribPtr;
- UINT32 Capabilities;
- UINT32 OldStatus;
- UINT32 NewStatus;
- EFI_STATUS Status;
+ UINT32 Capabilities;
+ UINT32 OldStatus;
+ UINT32 NewStatus;
+ EFI_STATUS Status;
EFI_FVB_ATTRIBUTES_2 UnchangedAttributes;
@@ -809,7 +809,7 @@ EFI_STATUS EFIAPI
FvbProtocolGetAttributes (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes
)
/*++
@@ -836,7 +836,7 @@ EFI_STATUS EFIAPI
FvbProtocolSetAttributes (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
)
/*++
diff --git a/UnixPkg/FvbServicesRuntimeDxe/FwBlockService.h b/UnixPkg/FvbServicesRuntimeDxe/FwBlockService.h index b87192dfde..5c9fc9f86b 100644 --- a/UnixPkg/FvbServicesRuntimeDxe/FwBlockService.h +++ b/UnixPkg/FvbServicesRuntimeDxe/FwBlockService.h @@ -102,7 +102,7 @@ FvbEraseBlock ( EFI_STATUS
FvbSetVolumeAttributes (
IN UINTN Instance,
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
IN ESAL_FWB_GLOBAL *Global,
IN BOOLEAN Virtual
)
@@ -111,7 +111,7 @@ FvbSetVolumeAttributes ( EFI_STATUS
FvbGetVolumeAttributes (
IN UINTN Instance,
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
IN ESAL_FWB_GLOBAL *Global,
IN BOOLEAN Virtual
)
@@ -162,7 +162,7 @@ EFI_STATUS EFIAPI
FvbProtocolGetAttributes (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes
)
;
@@ -170,7 +170,7 @@ EFI_STATUS EFIAPI
FvbProtocolSetAttributes (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
)
;
@@ -178,7 +178,7 @@ EFI_STATUS EFIAPI
FvbProtocolGetPhysicalAddress (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- OUT EFI_PHYSICAL_ADDRESS *Address
+ OUT EFI_PHYSICAL_ADDRESS *Address
)
;
diff --git a/UnixPkg/Include/Ppi/UnixFwh.h b/UnixPkg/Include/Ppi/UnixFwh.h index 1deed11454..a989c8a0aa 100644 --- a/UnixPkg/Include/Ppi/UnixFwh.h +++ b/UnixPkg/Include/Ppi/UnixFwh.h @@ -34,7 +34,8 @@ EFI_STATUS (EFIAPI *UNIX_FWH_INFORMATION) (
IN UINTN Index,
IN OUT EFI_PHYSICAL_ADDRESS *FdBase,
- IN OUT UINT64 *FdSize
+ IN OUT UINT64 *FdSize,
+ IN OUT EFI_PHYSICAL_ADDRESS *FixUp
);
/*++
@@ -47,6 +48,7 @@ Arguments: Index - Which FD, starts at zero.
FdSize - Size of the FD in bytes
FdBase - Start address of the FD. Assume it points to an FV Header
+ FixUp - Difference between actual FD address and build address
Returns:
EFI_SUCCESS - Return the Base address and size of the FV
diff --git a/UnixPkg/Include/Protocol/UnixThunk.h b/UnixPkg/Include/Protocol/UnixThunk.h index 29a9791292..93e77e8f5d 100644 --- a/UnixPkg/Include/Protocol/UnixThunk.h +++ b/UnixPkg/Include/Protocol/UnixThunk.h @@ -62,11 +62,80 @@ Abstract: #include <utime.h> #include <dlfcn.h> +#include <ucontext.h> #include <Base.h> #include <Library/PeCoffLib.h> +#if __APPLE__ +// +// EFI packing is not compatible witht he default OS packing for struct stat. +// st_size is 64-bit but starts on a 32-bit offset in the structure. The compiler +// flags used to produce compatible EFI images, break struct stat +// +#pragma pack(4) + +#if __DARWIN_64_BIT_INO_T + +typedef struct stat_fix { \ + dev_t st_dev; /* [XSI] ID of device containing file */ + mode_t st_mode; /* [XSI] Mode of file (see below) */ + nlink_t st_nlink; /* [XSI] Number of hard links */ + __darwin_ino64_t st_ino; /* [XSI] File serial number */ + uid_t st_uid; /* [XSI] User ID of the file */ + gid_t st_gid; /* [XSI] Group ID of the file */ + dev_t st_rdev; /* [XSI] Device ID */ + __DARWIN_STRUCT_STAT64_TIMES + off_t st_size; /* [XSI] file size, in bytes */ + blkcnt_t st_blocks; /* [XSI] blocks allocated for file */ + blksize_t st_blksize; /* [XSI] optimal blocksize for I/O */ + __uint32_t st_flags; /* user defined flags for file */ + __uint32_t st_gen; /* file generation number */ + __int32_t st_lspare; /* RESERVED: DO NOT USE! */ + __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */ +} STAT_FIX; + +#else /* !__DARWIN_64_BIT_INO_T */ + +typedef struct stat_fix { + dev_t st_dev; /* [XSI] ID of device containing file */ + ino_t st_ino; /* [XSI] File serial number */ + mode_t st_mode; /* [XSI] Mode of file (see below) */ + nlink_t st_nlink; /* [XSI] Number of hard links */ + uid_t st_uid; /* [XSI] User ID of the file */ + gid_t st_gid; /* [XSI] Group ID of the file */ + dev_t st_rdev; /* [XSI] Device ID */ +#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) + struct timespec st_atimespec; /* time of last access */ + struct timespec st_mtimespec; /* time of last data modification */ + struct timespec st_ctimespec; /* time of last status change */ +#else + time_t st_atime; /* [XSI] Time of last access */ + long st_atimensec; /* nsec of last access */ + time_t st_mtime; /* [XSI] Last data modification time */ + long st_mtimensec; /* last data modification nsec */ + time_t st_ctime; /* [XSI] Time of last status change */ + long st_ctimensec; /* nsec of last status change */ +#endif + off_t st_size; /* [XSI] file size, in bytes */ + blkcnt_t st_blocks; /* [XSI] blocks allocated for file */ + blksize_t st_blksize; /* [XSI] optimal blocksize for I/O */ + __uint32_t st_flags; /* user defined flags for file */ + __uint32_t st_gen; /* file generation number */ + __int32_t st_lspare; /* RESERVED: DO NOT USE! */ + __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */ +} STAT_FIX; + +#pragma pack() +#endif + +#else + + typedef struct stat STAT_FIX; + +#endif + #define EFI_UNIX_THUNK_PROTOCOL_GUID \ { \ 0xf2e98868, 0x8985, 0x11db, {0x9a, 0x59, 0x00, 0x40, 0xd0, 0x2b, 0x18, 0x35 } \ @@ -115,8 +184,8 @@ typedef int (*UnixOpen) (const char *name, int flags, int mode); typedef -long int -(*UnixSeek) (int fd, long int off, int whence); +off_t +(*UnixSeek) (int fd, off_t off, int whence); typedef int (*UnixFtruncate) (int fd, long int len); @@ -150,7 +219,7 @@ int (*UnixCloseDir)(DIR *dir); typedef int -(*UnixStat)(const char *path, struct stat *buf); +(*UnixStat)(const char *path, STAT_FIX *buf); typedef int (*UnixStatFs)(const char *path, struct statfs *buf); @@ -213,7 +282,7 @@ int (*UnixTcsetattr) (int __fd, int __optional_actions, __const struct termios *__termios_p); -typedef +typedef VOID * (*UnixDlopen) (const char *FileName, int Flag); @@ -230,20 +299,20 @@ VOID * // Work functions to enable source level debug in the emulator // -typedef +typedef RETURN_STATUS (EFIAPI *UnixPeCoffGetEntryPoint) ( IN VOID *Pe32Data, IN OUT VOID **EntryPoint ); -typedef +typedef VOID (EFIAPI *UnixPeCoffRelocateImageExtraAction) ( IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext ); -typedef +typedef VOID (EFIAPI *UnixPeCoffLoaderUnloadImageExtraAction) ( IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext diff --git a/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c b/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c index dea03fb142..f3a481b3d2 100644 --- a/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c +++ b/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c @@ -87,7 +87,7 @@ PeCoffLoaderRelocateImageExtraAction ( if (mUnix == NULL) {
UnixPeCoffGetUnixThunkStucture ();
}
- mUnix->PeCoffRelocateImageExtraAction (ImageContext);
+ mUnix->PeCoffRelocateImageExtraAction (ImageContext);
}
diff --git a/UnixPkg/Sec/Gasket.c b/UnixPkg/Sec/Gasket.c new file mode 100644 index 0000000000..30f06a2479 --- /dev/null +++ b/UnixPkg/Sec/Gasket.c @@ -0,0 +1,418 @@ +
+#include "SecMain.h"
+#include "Gasket.h"
+
+//
+// Gasket functions for EFI_UNIX_THUNK_PROTOCOL
+//
+
+void
+GasketmsSleep (unsigned long Milliseconds)
+{
+ GasketUintn (msSleep, Milliseconds);
+ return;
+}
+
+void
+Gasketexit (int status)
+{
+ GasketUintn (exit, status);
+ return;
+}
+
+
+void
+GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs))
+{
+ GasketUint64Uintn (SetTimer, PeriodMs, (UINTN)CallBack);
+ return;
+}
+
+
+void
+GasketGetLocalTime (EFI_TIME *Time)
+{
+ GasketUintn (GetLocalTime, (UINTN)Time);
+ return;
+}
+
+
+struct tm *
+Gasketgmtime (const time_t *clock)
+{
+ return (struct tm *)(UINTN)GasketUintn (localtime, (UINTN)clock);
+}
+
+
+long
+GasketGetTimeZone (void)
+{
+ return GasketVoid (GetTimeZone);
+}
+
+
+int
+GasketGetDayLight (void)
+{
+ return GasketVoid (GetDayLight);
+}
+
+
+int
+Gasketpoll (struct pollfd *pfd, int nfds, int timeout)
+{
+ return GasketUintnUintnUintn (poll, (UINTN)pfd, nfds, timeout);
+}
+
+
+int
+Gasketread (int fd, void *buf, int count)
+{
+ return GasketUintnUintnUintn (read, fd, (UINTN)buf, count);
+}
+
+
+int
+Gasketwrite (int fd, const void *buf, int count)
+{
+ return GasketUintnUintnUintn (write, fd, (UINTN)buf, count);
+}
+
+
+char *
+Gasketgetenv (const char *name)
+{
+ return (char *)(UINTN)GasketUintn (getenv, (UINTN)name);
+}
+
+
+int
+Gasketopen (const char *name, int flags, int mode)
+{
+ return GasketUintnUintnUintn (open, (UINTN)name, flags, mode);
+}
+
+
+off_t
+Gasketlseek (int fd, off_t off, int whence)
+{
+ if (sizeof off == 8) {
+ return GasketUintnUint64Uintn (lseek, fd, off, whence);
+ } else if (sizeof off == 4) {
+ return GasketUintnUintnUintn (lseek, fd, off, whence);
+ }
+}
+
+
+int
+Gasketftruncate (int fd, long int len)
+{
+ return GasketUintnUintn (ftruncate, fd, len);
+}
+
+
+int
+Gasketclose (int fd)
+{
+ return GasketUintn (close, fd);
+}
+
+
+int
+Gasketmkdir (const char *pathname, mode_t mode)
+{
+ return GasketUintnUint16 (mkdir, (UINTN)pathname, mode);
+}
+
+
+int
+Gasketrmdir (const char *pathname)
+{
+ return GasketUintn (rmdir, (UINTN)pathname);
+}
+
+
+int
+Gasketunlink (const char *pathname)
+{
+ return GasketUintn (unlink, (UINTN)pathname);
+}
+
+
+int
+GasketGetErrno (void)
+{
+ return GasketVoid (GetErrno);
+}
+
+
+DIR *
+Gasketopendir (const char *pathname)
+{
+ return (DIR *)(UINTN)GasketUintn (opendir, (UINTN)pathname);
+}
+
+
+void *
+Gasketrewinddir (DIR *dir)
+{
+ return (void *)(UINTN)GasketUintn (rewinddir, (UINTN)dir);
+}
+
+
+struct dirent *
+Gasketreaddir (DIR *dir)
+{
+ return (struct dirent *)(UINTN)GasketUintn (readdir, (UINTN)dir);
+}
+
+
+int
+Gasketclosedir (DIR *dir)
+{
+ return GasketUintn (closedir, (UINTN)dir);
+}
+
+
+int
+Gasketstat (const char *path, STAT_FIX *buf)
+{
+ return GasketUintnUintn (stat, (UINTN)path, (UINTN)buf);
+}
+
+
+int
+Gasketstatfs (const char *path, struct statfs *buf)
+{
+ return GasketUintnUintn (statfs, (UINTN)path, (UINTN)buf);
+}
+
+
+int
+Gasketrename (const char *oldpath, const char *newpath)
+{
+ return GasketUintnUintn (rename, (UINTN)oldpath, (UINTN)newpath);
+}
+
+
+time_t
+Gasketmktime (struct tm *tm)
+{
+ return GasketUintn (mktime, (UINTN)tm);
+}
+
+
+int
+Gasketfsync (int fd)
+{
+ return GasketUintn (fsync, fd);
+}
+
+
+int
+Gasketchmod (const char *path, mode_t mode)
+{
+ return GasketUintnUint16 (chmod, (UINTN)path, mode);
+}
+
+
+int
+Gasketutime (const char *filename, const struct utimbuf *buf)
+{
+ return GasketUintnUintn (utime, (UINTN)filename, (UINTN)buf);
+}
+
+
+int
+Gaskettcflush (int fildes, int queue_selector)
+{
+ return GasketUintnUintn (tcflush, fildes, queue_selector);
+}
+
+
+EFI_STATUS
+GasketUgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title)
+{
+ return GasketUintnUintn (UgaCreate, (UINTN)UgaIo, (UINTN)Title);
+}
+
+
+void
+Gasketperror (__const char *__s)
+{
+ GasketUintn (perror, (UINTN)__s);
+ return;
+}
+
+
+
+//
+// ... is always an int or pointer to device specific data structure
+//
+int
+Gasketioctl (int fd, unsigned long int __request, ...)
+{
+ VA_LIST Marker;
+
+ VA_START (Marker, __request);
+ return GasketUintnUintnUintn (ioctl, fd, __request, VA_ARG (Marker, UINTN));
+}
+
+
+int
+Gasketfcntl (int __fd, int __cmd, ...)
+{
+ VA_LIST Marker;
+
+ VA_START (Marker, __cmd);
+ return GasketUintnUintnUintn (fcntl, __fd, __cmd, VA_ARG (Marker, UINTN));
+}
+
+
+
+int
+Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed)
+{
+ return GasketUintnUintn (cfsetispeed, (UINTN)__termios_p, __speed);
+}
+
+
+int
+Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed)
+{
+ return GasketUintnUintn (cfsetospeed, (UINTN)__termios_p, __speed);
+}
+
+
+int
+Gaskettcgetattr (int __fd, struct termios *__termios_p)
+{
+ return GasketUintnUintn (tcgetattr, __fd, (UINTN)__termios_p);
+}
+
+
+int
+Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p)
+{
+ return GasketUintnUintnUintn (tcsetattr, __fd, __optional_actions, (UINTN)__termios_p);
+}
+
+
+int
+Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact)
+{
+ return GasketUintnUintn (sigaction, (UINTN)act, (UINTN)oact);
+}
+
+
+int
+Gasketsetcontext (const ucontext_t *ucp)
+{
+ return GasketUintn (setcontext, (UINTN)ucp);
+}
+
+
+int
+Gasketgetcontext (ucontext_t *ucp)
+{
+ return GasketUintn (getcontext, (UINTN)ucp);
+}
+
+
+int
+Gasketsigemptyset (sigset_t *set)
+{
+ return GasketUintn (sigemptyset, (UINTN)set);
+}
+
+
+int
+Gasketsigaltstack (const stack_t *ss, stack_t *oss)
+{
+ return GasketUintnUintn (sigaltstack, (UINTN)ss, (UINTN)oss);
+}
+
+
+
+RETURN_STATUS
+GasketUnixPeCoffGetEntryPoint (
+ IN VOID *Pe32Data,
+ IN OUT VOID **EntryPoint
+ )
+{
+ return GasketUintnUintn (SecPeCoffGetEntryPoint, (UINTN)Pe32Data, (UINTN)EntryPoint);
+}
+
+
+
+VOID
+GasketUnixPeCoffRelocateImageExtraAction (
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
+ )
+{
+ GasketUintn (SecPeCoffRelocateImageExtraAction, (UINTN)ImageContext);
+ return;
+}
+
+
+
+VOID
+GasketPeCoffLoaderUnloadImageExtraAction (
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
+ )
+{
+ GasketUintn (SecPeCoffLoaderUnloadImageExtraAction, (UINTN)ImageContext);
+ return;
+}
+
+
+//
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
+//
+
+EFI_STATUS
+EFIAPI
+GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
+{
+ return GasketUintn (UgaClose, (UINTN)UgaIo);
+}
+
+EFI_STATUS
+EFIAPI
+GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height)
+{
+ return GasketUintnUintnUintn (UgaSize, (UINTN)UgaIo, Width, Height);
+}
+
+EFI_STATUS
+EFIAPI
+GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
+{
+ return GasketUintn (UgaCheckKey, (UINTN)UgaIo);
+}
+
+EFI_STATUS
+EFIAPI
+GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key)
+{
+ return GasketUintnUintn (UgaGetKey, (UINTN)UgaIo, (UINTN)key);
+}
+
+EFI_STATUS
+EFIAPI
+GasketUgaBlt (
+ EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
+ IN EFI_UGA_BLT_OPERATION BltOperation,
+ IN UINTN SourceX,
+ IN UINTN SourceY,
+ IN UINTN DestinationX,
+ IN UINTN DestinationY,
+ IN UINTN Width,
+ IN UINTN Height,
+ IN UINTN Delta OPTIONAL
+ )
+{
+ return GasketUintn10Args (UgaBlt, (UINTN)UgaIo, (UINTN)BltBuffer, BltOperation, SourceX, SourceY, DestinationX, DestinationY, Width, Height, Delta);
+}
+
diff --git a/UnixPkg/Sec/Gasket.h b/UnixPkg/Sec/Gasket.h new file mode 100644 index 0000000000..8343de7feb --- /dev/null +++ b/UnixPkg/Sec/Gasket.h @@ -0,0 +1,141 @@ +
+#ifndef _GASKET_H_
+#define _GASKET_H_
+
+#include <Library/PeCoffLib.h>
+
+#include <Protocol/UgaDraw.h>
+#include <Protocol/SimpleTextIn.h>
+#include <Protocol/UnixUgaIo.h>
+
+
+//
+// Gasket functions for EFI_UNIX_THUNK_PROTOCOL
+//
+
+void GasketmsSleep (unsigned long Milliseconds);
+void Gasketexit (int status);
+void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
+void GasketGetLocalTime (EFI_TIME *Time);
+struct tm *Gasketgmtime (const time_t *clock);
+long GasketGetTimeZone (void);
+int GasketGetDayLight (void);
+int Gasketpoll (struct pollfd *pfd, int nfds, int timeout);
+int Gasketread (int fd, void *buf, int count);
+int Gasketwrite (int fd, const void *buf, int count);
+char *Gasketgetenv (const char *name);
+int Gasketopen (const char *name, int flags, int mode);
+off_t Gasketlseek (int fd, off_t off, int whence);
+int Gasketftruncate (int fd, long int len);
+int Gasketclose (int fd);
+int Gasketmkdir (const char *pathname, mode_t mode);
+int Gasketrmdir (const char *pathname);
+int Gasketunlink (const char *pathname);
+int GasketGetErrno (void);
+DIR *Gasketopendir (const char *pathname);
+void *Gasketrewinddir (DIR *dir);
+struct dirent *Gasketreaddir (DIR *dir);
+int Gasketclosedir (DIR *dir);
+int Gasketstat (const char *path, STAT_FIX *buf);
+int Gasketstatfs (const char *path, struct statfs *buf);
+int Gasketrename (const char *oldpath, const char *newpath);
+time_t Gasketmktime (struct tm *tm);
+int Gasketfsync (int fd);
+int Gasketchmod (const char *path, mode_t mode);
+int Gasketutime (const char *filename, const struct utimbuf *buf);
+int Gaskettcflush (int fildes, int queue_selector);
+EFI_STATUS GasketUgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);
+void Gasketperror (__const char *__s);
+
+//
+// ... is always an int or pointer to device specific data structure
+//
+int Gasketioctl (int fd, unsigned long int __request, ...);
+int Gasketfcntl (int __fd, int __cmd, ...);
+
+int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);
+int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);
+int Gaskettcgetattr (int __fd, struct termios *__termios_p);
+int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);
+int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);
+int Gasketsetcontext (const ucontext_t *ucp);
+int Gasketgetcontext (ucontext_t *ucp);
+int Gasketsigemptyset (sigset_t *set);
+int Gasketsigaltstack (const stack_t *ss, stack_t *oss);
+
+RETURN_STATUS
+GasketUnixPeCoffGetEntryPoint (
+ IN VOID *Pe32Data,
+ IN OUT VOID **EntryPoint
+ );
+
+VOID
+GasketUnixPeCoffRelocateImageExtraAction (
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
+ );
+
+VOID
+GasketPeCoffLoaderUnloadImageExtraAction (
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
+ );
+
+
+int GasketVoid (void *api);
+int GasketUintn (void *api, UINTN a);
+int GasketUintnUintn (void *api, UINTN a, UINTN b);
+int GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c);
+int GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d);
+int GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j);
+int GasketUint64Uintn (void *api, UINT64 a, UINTN b);
+UINT64 GasketUintnUint64Uintn (void *api, UINTN a, UINT64 b, UINTN c);
+int GasketUintnUint16 (void *api, UINTN a, UINT16 b);
+
+
+//
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
+//
+
+EFI_STATUS EFIAPI GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+EFI_STATUS EFIAPI GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
+EFI_STATUS EFIAPI GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+EFI_STATUS EFIAPI GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
+EFI_STATUS EFIAPI GasketUgaBlt (
+ EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
+ IN EFI_UGA_BLT_OPERATION BltOperation,
+ IN UINTN SourceX,
+ IN UINTN SourceY,
+ IN UINTN DestinationX,
+ IN UINTN DestinationY,
+ IN UINTN Width,
+ IN UINTN Height,
+ IN UINTN Delta OPTIONAL
+ );
+
+EFI_STATUS UgaCreate (EFI_UNIX_UGA_IO_PROTOCOL **Uga, CONST CHAR16 *Title);
+
+
+//
+// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
+//
+EFI_STATUS UgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+EFI_STATUS UgaSize(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
+EFI_STATUS UgaCheckKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
+EFI_STATUS UgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
+EFI_STATUS UgaBlt (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
+ IN EFI_UGA_BLT_OPERATION BltOperation,
+ IN UINTN SourceX,
+ IN UINTN SourceY,
+ IN UINTN DestinationX,
+ IN UINTN DestinationY,
+ IN UINTN Width,
+ IN UINTN Height,
+ IN UINTN Delta OPTIONAL
+ );
+
+
+
+#endif
+
+
diff --git a/UnixPkg/Sec/Ia32/Gasket.S b/UnixPkg/Sec/Ia32/Gasket.S index 80d033675c..77e8296b0b 100644 --- a/UnixPkg/Sec/Ia32/Gasket.S +++ b/UnixPkg/Sec/Ia32/Gasket.S @@ -1,5 +1,21 @@ #------------------------------------------------------------------------------
#
+# OS X Application requires 16 byte stack alignment. The problem is these
+# APIs are exposed to code that does not have this requirement via
+# EFI_UNIX_THUNK_PROTOCOL. So these are wrapper functions that make sure
+# the stack is aligned. This code should also work if the stack is already
+# aligned. Extra stack padding is really the same as local varaibles so
+# it gets freed by the leave instruction
+#
+# I basically used the compiler, added extra 16 bytes to the local stack and
+# made sure %esp ended in 0 before the call (16 byte algined)
+#
+# The EFI_UNIX_THUNK_PROTOCOL member functions call a C API that then calls
+# one of these generic assembly routines. We do it that way to work around
+# some magic name changing that happens in C. For example stat() is _stat()
+# on Leopard and _stat$INDOE64 on Snow Leopard. That is why we pass stat()
+# into one of these gaskets from C code.
+#
# Copyright (c) 2008 - 2009 Apple Inc. All rights reserved.
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
@@ -9,975 +25,213 @@ # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
-# Abstract:
-#
-# OS X Application requires 16 byte stack alignment. The problem is these
-# APIs are exposed to code that does not have this requirement via
-# EFI_UNIX_THUNK_PROTOCOL. So these are wrapper functions that make sure
-# the stack is aligned. This code should also work if the stack is already
-# aligned. Extra stack padding is really the same as local varaibles so
-# it gets freed by the leave instruction
-#
-# I basically used the compiler, added extra 16 bytes to the local stack and
-# made sure %esp ended in 0 before the call (16 byte algined)
-#
-# cat t.c
-##include <stdio.h>
-##include <sys/stat.h>
-#
-#int chmod (int fd, mode_t len){
-# long m = (long)fd;
-#}
-#
-#int Gasketchmod (int fd, mode_t len){
-# return chmod (fd, len);
-#}
-#
-# gcc -S t.c
-# cat t.s
-# this gives you the starting point....
-#
-#
#------------------------------------------------------------------------------
-#include <ProcessorBind.h>
-
.text
-
-#
-#
-# EFI_UNIX_THUNK_PROTOCOL that gets exported
-#
-#
-
-#------------------------------------------------------------------------------
-# VOID GasketmsSleep (unsigned long Milliseconds);
-#------------------------------------------------------------------------------
-.globl _GasketmsSleep
-_GasketmsSleep:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _msSleep
- leave
- ret
-
-
-#------------------------------------------------------------------------------
-# void Gasketexit (int status);
-#------------------------------------------------------------------------------
-.globl _Gasketexit
-_Gasketexit:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _exit
- leave
- ret
-
-
-#------------------------------------------------------------------------------
-# void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
-#------------------------------------------------------------------------------
-.globl _GasketSetTimer
-_GasketSetTimer:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, -16(%ebp)
- movl 12(%ebp), %eax
- movl %eax, -12(%ebp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl -16(%ebp), %eax
- movl -12(%ebp), %edx
- movl %eax, (%esp)
- movl %edx, 4(%esp)
- call _SetTimer
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# void GasketGetLocalTime (EFI_TIME *Time);
-#------------------------------------------------------------------------------
-.globl _GasketGetLocalTime
-_GasketGetLocalTime:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _GetLocalTime
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# struct tm *Gasketgmtime (const time_t *clock);
-#------------------------------------------------------------------------------
-.globl _Gasketgmtime
-_Gasketgmtime:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _gmtime
- leave
- ret
-
-
-
-
-#------------------------------------------------------------------------------
-# long GasketGetTimeZone(void);
-#------------------------------------------------------------------------------
-.globl _GasketGetTimeZone
-_GasketGetTimeZone:
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- call _GetTimeZone
- leave
- ret
-
-
-#------------------------------------------------------------------------------
-# int GasketGetDayLight (void);
-#------------------------------------------------------------------------------
-.globl _GasketGetDayLight
-_GasketGetDayLight:
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- call _GetDayLight
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketpoll (struct pollfd *pfd, int nfds, int timeout);
-#------------------------------------------------------------------------------
-.globl _Gasketpoll
-_Gasketpoll:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _poll
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketread (int fd, void *buf, int count);
-#------------------------------------------------------------------------------
-.globl _Gasketread
-_Gasketread:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _read
- leave
- ret
-
-
-#------------------------------------------------------------------------------
-# int Gasketwrite (int fd, const void *buf, int count);
-#------------------------------------------------------------------------------
-.globl _Gasketwrite
-_Gasketwrite:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _write
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# char *Gasketgetenv (const char *name);
-#------------------------------------------------------------------------------
-.globl _Gasketgetenv
-_Gasketgetenv:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _getenv
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketopen (const char *name, int flags, int mode);
-#------------------------------------------------------------------------------
-.globl _Gasketopen
-_Gasketopen:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _open
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# off_t Gasketlseek (int fd, off_t off, int whence);
-#------------------------------------------------------------------------------
-.globl _Gasketlseek
-_Gasketlseek:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, -16(%ebp)
- movl 16(%ebp), %eax
- movl %eax, -12(%ebp)
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl -16(%ebp), %eax
- movl -12(%ebp), %edx
- movl %eax, 4(%esp)
- movl %edx, 8(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _lseek
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketftruncate (int fd, long int len);
-#------------------------------------------------------------------------------
-.globl _Gasketftruncate
-_Gasketftruncate:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _truncate
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketclose (int fd);
-#------------------------------------------------------------------------------
-.globl _Gasketclose
-_Gasketclose:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _close
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketmkdir (const char *pathname, mode_t mode);
-#------------------------------------------------------------------------------
-.globl _Gasketmkdir
-_Gasketmkdir:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _mkdir
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketrmdir (const char *pathname);
-#------------------------------------------------------------------------------
-.globl _Gasketrmdir
-_Gasketrmdir:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _rmdir
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketunlink (const char *pathname);
-#------------------------------------------------------------------------------
-.globl _Gasketunlink
-_Gasketunlink:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _unlink
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int GasketGetErrno (void);
-#------------------------------------------------------------------------------
-.globl _GasketGetErrno
-_GasketGetErrno:
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- call _GetErrno
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# DIR *Gasketopendir (const char *pathname);
-#------------------------------------------------------------------------------
-.globl _Gasketopendir
-_Gasketopendir:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _opendir
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# void *Gasketrewinddir (DIR *dir);
-#------------------------------------------------------------------------------
-.globl _Gasketrewinddir
-_Gasketrewinddir:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _rewinddir
- leave
- ret
-
-
-#------------------------------------------------------------------------------
-# struct dirent *Gasketreaddir (DIR *dir);
-#------------------------------------------------------------------------------
-.globl _Gasketreaddir
-_Gasketreaddir:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _readdir
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketclosedir (DIR *dir);
-#------------------------------------------------------------------------------
-.globl _Gasketclosedir
-_Gasketclosedir:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _closedir
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketstat (const char *path, struct stat *buf);
-#------------------------------------------------------------------------------
-.globl _Gasketstat
-_Gasketstat:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _stat
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketstatfs (const char *path, struct statfs *buf);
-#------------------------------------------------------------------------------
-.globl _Gasketstatfs
-_Gasketstatfs:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _statfs
- leave
- ret
-
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketrename (const char *oldpath, const char *newpath);
-#------------------------------------------------------------------------------
-.globl _Gasketrename
-_Gasketrename:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _rename
- leave
- ret
-
-
-
-
-#------------------------------------------------------------------------------
-# time_t Gasketmktime (struct tm *tm);
-#------------------------------------------------------------------------------
-.globl _Gasketmktime
-_Gasketmktime:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _mktime
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketfsync (int fd);
-#------------------------------------------------------------------------------
-.globl _Gasketfsync
-_Gasketfsync:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _fsync
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketchmod (const char *path, mode_t mode);
-#------------------------------------------------------------------------------
-.globl _Gasketchmod
-_Gasketchmod:
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movw %ax, -12(%ebp)
- movzwl -12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _chmod
- leave
- ret
-
-#------------------------------------------------------------------------------
-# int Gasketutime (const char *filename, const struct utimbuf *buf);
-#------------------------------------------------------------------------------
-.globl _Gasketutime
-_Gasketutime:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _rename
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gaskettcflush (int fildes, int queue_selector);
-#------------------------------------------------------------------------------
-.globl _Gaskettcflush
-_Gaskettcflush:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _rename
- leave
- ret
-
-
-#------------------------------------------------------------------------------
-# EFI_STATUS UgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);
#------------------------------------------------------------------------------
-.globl _GasketUgaCreate
-_GasketUgaCreate:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp #sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaCreate
+# int GasketVoid (void *api)
+#------------------------------------------------------------------------------
+.globl _GasketVoid
+_GasketVoid:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $34, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl -12(%ebp), %eax
+ call *%eax
leave
ret
-
-#------------------------------------------------------------------------------
-# void Gasketperror (__const char *__s);
-#------------------------------------------------------------------------------
-.globl _Gasketperror
-_Gasketperror:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _perror
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketioctl (int fd, unsigned long int __request, ...);
-#
-# ... is really int or pointer to structure, so we can treat like an int
-#
-#------------------------------------------------------------------------------
-.globl _Gasketioctl
-_Gasketioctl:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _ioctl
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketfcntl (int __fd, int __cmd, ...);
-#
-# ... is really int or pointer to structure, so we can treat like an int
-#
-#------------------------------------------------------------------------------
-.globl _Gasketfcntl
-_Gasketfcntl:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _fcntl
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);
-#------------------------------------------------------------------------------
-.globl _Gasketcfsetispeed
-_Gasketcfsetispeed:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _cfsetispeed
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);
-#------------------------------------------------------------------------------
-.globl _Gasketcfsetospeed
-_Gasketcfsetospeed:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _cfsetospeed
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gaskettcgetattr (int __fd, struct termios *__termios_p);
-#------------------------------------------------------------------------------
-.globl _Gaskettcgetattr
-_Gaskettcgetattr:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _tcgetattr
- leave
- ret
-
-
-
-#------------------------------------------------------------------------------
-# int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);
-#------------------------------------------------------------------------------
-.globl _Gaskettcsetattr
-_Gaskettcsetattr:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _tcsetattr
- leave
- ret
-
#------------------------------------------------------------------------------
-# int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);
#------------------------------------------------------------------------------
-.globl _Gasketsigaction
-_Gasketsigaction:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _sigaction
- leave
- ret
-
+.globl _GasketUintn
+_GasketUintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $50, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# int Gasketsetcontext (const ucontext_t *ucp);
#------------------------------------------------------------------------------
-.globl _Gasketsetcontext
-_Gasketsetcontext:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _setcontext
- leave
- ret
+.globl _GasketUintnUintn
+_GasketUintnUintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $50, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# int Gasketgetcontext (ucontext_t *ucp);
#------------------------------------------------------------------------------
-.globl _Gasketgetcontext
-_Gasketgetcontext:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _getcontext
- leave
- ret
+.globl _GasketUintnUintnUintn
+_GasketUintnUintnUintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $50, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# int Gasketsigemptyset (sigset_t *set);
#------------------------------------------------------------------------------
-.globl _Gasketsigemptyset
-_Gasketsigemptyset:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _sigemptyset
- leave
- ret
-
+.globl _GasketUintnUintnUintnUintn
+_GasketUintnUintnUintnUintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $50, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 24(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# int Gasketsigaltstack (const stack_t *ss, stack_t *oss);
#------------------------------------------------------------------------------
-.globl _Gasketsigaltstack
-_Gasketsigaltstack:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _sigaltstack
- leave
- ret
-
-#
-#
-# UGA Functions that get exported
-#
-#
+.globl _GasketUintn10Args
+_GasketUintn10Args:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $82, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 48(%ebp), %eax
+ movl %eax, 36(%esp)
+ movl 44(%ebp), %eax
+ movl %eax, 32(%esp)
+ movl 40(%ebp), %eax
+ movl %eax, 28(%esp)
+ movl 36(%ebp), %eax
+ movl %eax, 24(%esp)
+ movl 32(%ebp), %eax
+ movl %eax, 20(%esp)
+ movl 28(%ebp), %eax
+ movl %eax, 16(%esp)
+ movl 24(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
-#------------------------------------------------------------------------------
-# EFI_STATUS GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
-#------------------------------------------------------------------------------
-.globl _GasketUgaClose
-_GasketUgaClose:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaClose
- leave
- ret
#------------------------------------------------------------------------------
-# EFI_STATUS GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
-#------------------------------------------------------------------------------
-.globl _GasketUgaSize
-_GasketUgaSize:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaSize
- leave
- ret
-
-
#------------------------------------------------------------------------------
-# EFI_STATUS GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
-#------------------------------------------------------------------------------
-.globl _GasketUgaCheckKey
-_GasketUgaCheckKey:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp # sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaCheckKey
- leave
- ret
+.globl _GasketUint64Uintn
+_GasketUint64Uintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $66, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, -32(%ebp)
+ movl 16(%ebp), %eax
+ movl %eax, -28(%ebp)
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl -32(%ebp), %eax
+ movl -28(%ebp), %edx
+ movl %eax, (%esp)
+ movl %edx, 4(%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
#------------------------------------------------------------------------------
-# EFI_STATUS GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
#------------------------------------------------------------------------------
-.globl _GasketUgaGetKey
-_GasketUgaGetKey:
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp #sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaGetKey
+.globl _GasketUintnUint64Uintn
+_GasketUintnUint64Uintn:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $66, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, -32(%ebp)
+ movl 20(%ebp), %eax
+ movl %eax, -28(%ebp)
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movl 24(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl -32(%ebp), %eax
+ movl -28(%ebp), %edx
+ movl %eax, 4(%esp)
+ movl %edx, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
leave
ret
-
#------------------------------------------------------------------------------
-# EFI_STATUS
-# GasketUgaBlt(
-# EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
-# IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
-# IN EFI_UGA_BLT_OPERATION BltOperation,
-# IN UINTN SourceX,
-# IN UINTN SourceY,
-# IN UINTN DestinationX,
-# IN UINTN DestinationY,
-# IN UINTN Width,
-# IN UINTN Height,
-# IN UINTN Delta OPTIONAL
-# );
#------------------------------------------------------------------------------
-.globl _GasketUgaBlt
-_GasketUgaBlt:
- pushl %ebp
- movl %esp, %ebp
- subl $88, %esp #sub extra 0x10 from the stack for the AND
- and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
- movl $0, -12(%ebp)
- movl 44(%ebp), %eax
- movl %eax, 36(%esp)
- movl 40(%ebp), %eax
- movl %eax, 32(%esp)
- movl 36(%ebp), %eax
- movl %eax, 28(%esp)
- movl 32(%ebp), %eax
- movl %eax, 24(%esp)
- movl 28(%ebp), %eax
- movl %eax, 20(%esp)
- movl 24(%ebp), %eax
- movl %eax, 16(%esp)
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call _UgaBlt
- leave
- ret
+.globl _GasketUintnUint16
+_GasketUintnUint16:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $66, %esp # sub extra 0x10 from the stack for the AND
+ and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movw %ax, -28(%ebp)
+ movl 8(%ebp), %eax
+ movl %eax, -12(%ebp)
+ movzwl -28(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ movl -12(%ebp), %eax
+ call *%eax
+ leave
+ ret
+ .subsections_via_symbols
diff --git a/UnixPkg/Sec/Ia32/GasketTemplate.c b/UnixPkg/Sec/Ia32/GasketTemplate.c new file mode 100644 index 0000000000..3b88135a58 --- /dev/null +++ b/UnixPkg/Sec/Ia32/GasketTemplate.c @@ -0,0 +1,142 @@ +/** @file + Template file used to create Gasket.S + + This file is built on the command line via gcc GasketTemplate.c -S + and it will create GasketTemplate.s and this was used to create + Gasket.S. You still have to add the extra stack alignment code to + the assembly functions. + +Copyright (c) 2006 - 2009, Intel Corporation<BR> +Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR> +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + + +#include <stdint.h> +#include <sys/stat.h> + +typedef int8_t INT8; +typedef uint8_t UINT8; +typedef int16_t INT16; +typedef uint16_t UINT16; +typedef int32_t INT32; +typedef uint32_t UINT32; +typedef int64_t INT64; +typedef uint64_t UINT64; +typedef UINT32 UINTN; + + +typedef int (*GASKET_VOID) (); +typedef int (*GASKET_UINTN) (UINTN); +typedef int (*GASKET_UINTN_UINTN) (UINTN, UINTN); +typedef int (*GASKET_UINTN_UINTN_UINTN) (UINTN, UINTN, UINTN); +typedef int (*GASKET_UINTN_UINTN_UINTN_UINTN) (UINTN, UINTN, UINTN, UINTN); +typedef int (*GASKET_UINTN_10ARGS) (UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN); +typedef int (*GASKET_UINT64_UINTN) (UINT64, UINTN); +typedef UINT64 (*GASKET_UINTN_UINT64_UINTN) (UINTN, UINT64, UINTN); +typedef int (*GASKET_UINTN_UINT16) (UINTN, UINT16); + +int GasketVoid (void *api); +int GasketUintn (void *api, UINTN a); +int GasketUintnUintn (void *api, UINTN a, UINTN b); +int GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c); +int GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d); +int GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j); +int GasketUint64Uintn (void *api, UINT64 a, UINTN b); +UINT64 GasketUintnUiny64Uintn (void *api, UINTN a, UINT64 b, UINTN c); +int GasketUintnUint16 (void *api, UINTN a, UINT16 b); + + + +int +GasketVoid (void *api) +{ + GASKET_VOID func; + + func = (GASKET_VOID)api; + return func (); +} + +int +GasketUintn (void *api, UINTN a) +{ + GASKET_UINTN func; + + func = (GASKET_UINTN)api; + return func (a); +} + +int +GasketUintnUintn (void *api, UINTN a, UINTN b) +{ + GASKET_UINTN_UINTN func; + + func = (GASKET_UINTN_UINTN)api; + return func (a, b); +} + + +int +GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c) +{ + GASKET_UINTN_UINTN_UINTN func; + + func = (GASKET_UINTN_UINTN_UINTN)api; + return func (a, b, c); +} + +int +GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d) +{ + GASKET_UINTN_UINTN_UINTN_UINTN func; + + func = (GASKET_UINTN_UINTN_UINTN_UINTN)api; + return func (a, b, c, d); +} + +int +GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j) +{ + GASKET_UINTN_10ARGS func; + + func = (GASKET_UINTN_10ARGS)api; + return func (a, b, c, d, e, f, g, h, i, j); +} + + +int +GasketUint64Uintn (void *api, UINT64 a, UINTN b) +{ + GASKET_UINT64_UINTN func; + + func = (GASKET_UINT64_UINTN)api; + return func (a, b); +} + +UINT64 +GasketUintnUiny64Uintn (void *api, UINTN a, UINT64 b, UINTN c) +{ + GASKET_UINTN_UINT64_UINTN func; + + func = (GASKET_UINTN_UINT64_UINTN)api; + return func (a, b, c); +} + +int +GasketUintnUint16 (void *api, UINTN a, UINT16 b) +{ + GASKET_UINTN_UINT16 func; + + func = (GASKET_UINTN_UINT16)api; + return func (a, b); +} + + + diff --git a/UnixPkg/Sec/SecMain.c b/UnixPkg/Sec/SecMain.c index 98a7a4db9d..da19a4b134 100644 --- a/UnixPkg/Sec/SecMain.c +++ b/UnixPkg/Sec/SecMain.c @@ -89,7 +89,6 @@ EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = { &mSecTemporaryRamSupportPpi }, { - EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, &gUnixFwhPpiGuid, &mSecFwhInformationPpi @@ -142,6 +141,7 @@ MapFile ( IN OUT EFI_PHYSICAL_ADDRESS *BaseAddress, OUT UINT64 *Length ); + EFI_STATUS EFIAPI SecNt32PeCoffRelocateImage ( @@ -200,7 +200,7 @@ Returns: // symbols when we load every PE/COFF image. // Index = strlen (*Argv); - gGdbWorkingFileName = malloc (Index + strlen(".gdb")); + gGdbWorkingFileName = malloc (Index + strlen(".gdb") + 1); strcpy (gGdbWorkingFileName, *Argv); strcat (gGdbWorkingFileName, ".gdb"); #endif @@ -783,6 +783,12 @@ Returns: if (EFI_ERROR (Status)) { return Status; } + + Status = PeCoffLoaderRelocateImage (&ImageContext); + if (EFI_ERROR (Status)) { + return Status; + } + SecPeCoffRelocateImageExtraAction (&ImageContext); @@ -823,7 +829,8 @@ EFIAPI SecUnixFdAddress ( IN UINTN Index, IN OUT EFI_PHYSICAL_ADDRESS *FdBase, - IN OUT UINT64 *FdSize + IN OUT UINT64 *FdSize, + IN OUT EFI_PHYSICAL_ADDRESS *FixUp ) /*++ @@ -835,6 +842,7 @@ Arguments: Index - Which FD, starts at zero. FdSize - Size of the FD in bytes FdBase - Start address of the FD. Assume it points to an FV Header + FixUp - Difference between actual FD address and build address Returns: EFI_SUCCESS - Return the Base address and size of the FV @@ -848,11 +856,21 @@ Returns: *FdBase = gFdInfo[Index].Address; *FdSize = gFdInfo[Index].Size; + *FixUp = 0; if (*FdBase == 0 && *FdSize == 0) { return EFI_UNSUPPORTED; } + if (Index == 0) { + // + // FD 0 has XIP code and well known PCD values + // If the memory buffer could not be allocated at the FD build address + // the Fixup is the difference. + // + *FixUp = *FdBase - FixedPcdGet32 (PcdUnixFdBaseAddress); + } + return EFI_SUCCESS; } @@ -1109,13 +1127,6 @@ SecPeCoffRelocateImageExtraAction ( IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext ) { - EFI_STATUS Status; - - Status = PeCoffLoaderRelocateImage (ImageContext); - if (EFI_ERROR (Status)) { - PrintLoadAddress (ImageContext); - return; - } #ifdef __APPLE__ PrintLoadAddress (ImageContext); @@ -1186,10 +1197,10 @@ SecPeCoffRelocateImageExtraAction ( (unsigned long)ImageContext->ImageAddress, (unsigned long)ImageContext->EntryPoint); - Handle = dlopen(ImageContext->PdbPointer, RTLD_NOW); + Handle = dlopen (ImageContext->PdbPointer, RTLD_NOW); if (Handle) { - Entry = dlsym(Handle, "_ModuleEntryPoint"); + Entry = dlsym (Handle, "_ModuleEntryPoint"); } else { printf("%s\n", dlerror()); } diff --git a/UnixPkg/Sec/SecMain.h b/UnixPkg/Sec/SecMain.h index c7a72c93a6..7a120f7a0a 100644 --- a/UnixPkg/Sec/SecMain.h +++ b/UnixPkg/Sec/SecMain.h @@ -157,9 +157,9 @@ EFI_STATUS EFIAPI
SecPeiReportStatusCode (
IN CONST EFI_PEI_SERVICES **PeiServices,
- IN EFI_STATUS_CODE_TYPE CodeType,
- IN EFI_STATUS_CODE_VALUE Value,
- IN UINT32 Instance,
+ IN EFI_STATUS_CODE_TYPE CodeType,
+ IN EFI_STATUS_CODE_VALUE Value,
+ IN UINT32 Instance,
IN CONST EFI_GUID *CallerId,
IN CONST EFI_STATUS_CODE_DATA *Data OPTIONAL
)
@@ -390,25 +390,9 @@ EFIAPI SecUnixFdAddress (
IN UINTN Index,
IN OUT EFI_PHYSICAL_ADDRESS *FdBase,
- IN OUT UINT64 *FdSize
+ IN OUT UINT64 *FdSize,
+ IN OUT EFI_PHYSICAL_ADDRESS *FixUp
)
-/*++
-
-Routine Description:
-
- TODO: Add function description
-
-Arguments:
-
- Index - TODO: add argument description
- FdBase - TODO: add argument description
- FdSize - TODO: add argument description
-
-Returns:
-
- TODO: add return values
-
---*/
;
EFI_STATUS
@@ -538,4 +522,15 @@ SecPeCoffLoaderUnloadImageExtraAction ( );
+
+VOID SetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
+void msSleep (unsigned long Milliseconds);
+void GetLocalTime (EFI_TIME *Time);
+void TzSet (void);
+long GetTimeZone(void);
+int GetDayLight(void);
+int GetErrno(void);
+
+
+
extern EFI_UNIX_THUNK_PROTOCOL *gUnix;
diff --git a/UnixPkg/Sec/SecMain.inf b/UnixPkg/Sec/SecMain.inf index c7a9b40df7..b745faa16d 100644 --- a/UnixPkg/Sec/SecMain.inf +++ b/UnixPkg/Sec/SecMain.inf @@ -36,6 +36,7 @@ UnixThunk.c
FwVol.c
SecMain.c
+ Gasket.c
[Sources.Ia32]
Ia32/Gasket.S
@@ -71,6 +72,7 @@ gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareVolume
gEfiUnixPkgTokenSpaceGuid.PcdUnixMemorySizeForSecMain
gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareFdSize
+ gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress
[BuildOptions.common]
GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/SecMain -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o -L/usr/X11R6/lib -lXext -lX11 /usr/lib/crtn.o
@@ -83,5 +85,5 @@ # Need to do this link via gcc and not ld as the pathing to libraries changes from OS version to OS version
#
XCODE:*_*_IA32_DLINK_PATH == gcc
- XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -L/usr/X11R6/lib -lXext -lX11 -lIOKit -framework Carbon
+ XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -o $(BIN_DIR)/SecMain -L/usr/X11R6/lib -lXext -lX11 -lIOKit -framework Carbon
XCODE:*_*_IA32_ASM_FLAGS == -arch i386 -g
diff --git a/UnixPkg/Sec/UgaX11.c b/UnixPkg/Sec/UgaX11.c index 386e0bc145..2c2fb186b9 100644 --- a/UnixPkg/Sec/UgaX11.c +++ b/UnixPkg/Sec/UgaX11.c @@ -123,19 +123,17 @@ TryCreateShmImage(UGA_IO_PRIVATE *drv) drv->xshm_info.shmid = shmget (IPC_PRIVATE, drv->image->bytes_per_line * drv->image->height, IPC_CREAT | 0777); - if (drv->xshm_info.shmid < 0) - { - XDestroyImage(drv->image); - return 0; - } + if (drv->xshm_info.shmid < 0) { + XDestroyImage(drv->image); + return 0; + } drv->image_data = shmat (drv->xshm_info.shmid, NULL, 0); - if(!drv->image_data) - { - shmctl (drv->xshm_info.shmid, IPC_RMID, NULL); - XDestroyImage(drv->image); - return 0; - } + if(!drv->image_data) { + shmctl (drv->xshm_info.shmid, IPC_RMID, NULL); + XDestroyImage(drv->image); + return 0; + } #ifndef __APPLE__ // @@ -149,12 +147,11 @@ TryCreateShmImage(UGA_IO_PRIVATE *drv) drv->xshm_info.shmaddr = (char*)drv->image_data; drv->image->data = (char*)drv->image_data; - if (!XShmAttach (drv->display, &drv->xshm_info)) - { - shmdt (drv->image_data); - XDestroyImage(drv->image); - return 0; - } + if (!XShmAttach (drv->display, &drv->xshm_info)) { + shmdt (drv->image_data); + XDestroyImage(drv->image); + return 0; + } return 1; } @@ -386,7 +383,7 @@ UgaCheckKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo) } EFI_STATUS -UgaGetKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key) +UgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key) { UGA_IO_PRIVATE *drv = (UGA_IO_PRIVATE *)UgaIo; EFI_STATUS status; diff --git a/UnixPkg/Sec/UnixThunk.c b/UnixPkg/Sec/UnixThunk.c index 5dfba7a734..c0f35d0729 100644 --- a/UnixPkg/Sec/UnixThunk.c +++ b/UnixPkg/Sec/UnixThunk.c @@ -36,6 +36,10 @@ Abstract: #include "Uefi.h" #include "Library/UnixLib.h" +#ifdef __APPLE__ +#include "Gasket.h" +#endif + int settimer_initialized; struct timeval settimer_timeval; void (*settimer_callback)(UINT64 delta); @@ -150,74 +154,6 @@ GetErrno(void) return errno; } -#if __APPLE__ -void GasketmsSleep (unsigned long Milliseconds); -void Gasketexit (int status); -void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs)); -void GasketGetLocalTime (EFI_TIME *Time); -struct tm *Gasketgmtime (const time_t *clock); -long GasketGetTimeZone (void); -int GasketGetDayLight (void); -int Gasketpoll (struct pollfd *pfd, int nfds, int timeout); -int Gasketread (int fd, void *buf, int count); -int Gasketwrite (int fd, const void *buf, int count); -char *Gasketgetenv (const char *name); -int Gasketopen (const char *name, int flags, int mode); -off_t Gasketlseek (int fd, off_t off, int whence); -int Gasketftruncate (int fd, long int len); -int Gasketclose (int fd); -int Gasketmkdir (const char *pathname, mode_t mode); -int Gasketrmdir (const char *pathname); -int Gasketunlink (const char *pathname); -int GasketGetErrno (void); -DIR *Gasketopendir (const char *pathname); -void *Gasketrewinddir (DIR *dir); -struct dirent *Gasketreaddir (DIR *dir); -int Gasketclosedir (DIR *dir); -int Gasketstat (const char *path, struct stat *buf); -int Gasketstatfs (const char *path, struct statfs *buf); -int Gasketrename (const char *oldpath, const char *newpath); -time_t Gasketmktime (struct tm *tm); -int Gasketfsync (int fd); -int Gasketchmod (const char *path, mode_t mode); -int Gasketutime (const char *filename, const struct utimbuf *buf); -int Gaskettcflush (int fildes, int queue_selector); -EFI_STATUS GasketUgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title); -void Gasketperror (__const char *__s); - -// -// ... is always an int or pointer to device specific data structure -// -int Gasketioctl (int fd, unsigned long int __request, ...); -int Gasketfcntl (int __fd, int __cmd, ...); - -int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed); -int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed); -int Gaskettcgetattr (int __fd, struct termios *__termios_p); -int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p); -int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact); -int Gasketsetcontext (const ucontext_t *ucp); -int Gasketgetcontext (ucontext_t *ucp); -int Gasketsigemptyset (sigset_t *set); -int Gasketsigaltstack (const stack_t *ss, stack_t *oss); - -RETURN_STATUS -GasketUnixPeCoffGetEntryPoint ( - IN VOID *Pe32Data, - IN OUT VOID **EntryPoint - ); - -VOID -GasketUnixPeCoffRelocateImageExtraAction ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ); - -VOID -GasketPeCoffLoaderUnloadImageExtraAction ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ); - -#endif extern EFI_STATUS UgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title); @@ -303,7 +239,7 @@ EFI_UNIX_THUNK_PROTOCOL mUnixThunkTable = { rewinddir, readdir, closedir, - stat, + (UnixStat)stat, statfs, rename, mktime, diff --git a/UnixPkg/Sec/X64/Gasket.S b/UnixPkg/Sec/X64/Gasket.S new file mode 100644 index 0000000000..bce19f3d0d --- /dev/null +++ b/UnixPkg/Sec/X64/Gasket.S @@ -0,0 +1,1026 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2008-2009 Apple Inc. All rights reserved. +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# Abstract: +# +# EFI uses a simplified version of the MSFT calling convention, and every one else, +# Mac OS X, BSD, Linux, uses a different one. We can skip dealing with floating point +# other than making sure non volatile registers are preserved. +# +# Register for arguments +# MSFT Every One Else +# ---- -------------- +# rcx rdi +# rdx rsi +# r8 rdx +# r9 rcx +# r8 +# r9 +# +# Callee saved registers +# MSFT Every One Else +# ---- -------------- +# rbx rbx +# rbp rbp +# r12-r15 r12-r15 +# rsi +# rdi +# xmm6-xmm15 +# +# cat t.c +##include <stdio.h> +##include <sys/stat.h> +# +#int chmod (int fd, mode_t len){ +# long m = (long)fd; +#} +# +#int Gasketchmod (int fd, mode_t len){ +# return chmod (fd, len); +#} +# +# gcc -arch x86_64 -S t.c +# cat t.s +# this gives you the starting point.... +# +# +#------------------------------------------------------------------------------ + +#include <ProcessorBind.h> + + .text + +# +# +# EFI_UNIX_THUNK_PROTOCOL that gets exported +# +# + +#------------------------------------------------------------------------------ +# VOID GasketmsSleep (unsigned long Milliseconds); +#------------------------------------------------------------------------------ +.globl _GasketmsSleep +_GasketmsSleep: + pushl %rbp + movq %rsp, %rbp # does leave use rbp or rsp??? + subq $148, %rsp + + # save registers the OS X will think are volatile + movaps %xmm6, -8(%rbp) + movaps %xmm7, -24(%rbp) + movaps %xmm8, -40(%rbp) + movaps %xmm9, -56(%rbp) + movaps %xmm10, -72(%rbp) + movaps %xmm11, -88(%rbp) + movaps %xmm12, -104(%rbp) + movaps %xmm13, -120(%rbp) + movaps %xmm14, -136(%rbp) + movaps %xmm15, -152(%rbp) + movq %rsi, -160(%rbp) + movq %rdi, -168(%rbp) + + movq %rcx, %rdi + call _msSleep + + movaps -8(%rbp), %xmm6, + movaps -24(%rbp), %xmm7 + movaps -40(%rbp), %xmm8 + movaps -56(%rbp), %xmm9 + movaps -72(%rbp), %xmm10 + movaps -88(%rbp), %xmm11 + movaps -104(%rbp), %xmm12 + movaps -120(%rbp), %xmm13 + movaps -136(%rbp), %xmm14 + movaps -152(%rbp), %xmm15 + movq -160(%rbp), %rsi + movq -168(%rbp), %rdi + + leave + ret + + +#------------------------------------------------------------------------------ +# void Gasketexit (int status); +#------------------------------------------------------------------------------ +.globl _Gasketexit +_Gasketexit: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _exit + leave + ret + + +#------------------------------------------------------------------------------ +# void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs)); +#------------------------------------------------------------------------------ +.globl _GasketSetTimer +_GasketSetTimer: + pushl %ebp + movl %esp, %ebp + subl $56, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, -16(%ebp) + movl 12(%ebp), %eax + movl %eax, -12(%ebp) + movl 16(%ebp), %eax + movl %eax, 8(%esp) + movl -16(%ebp), %eax + movl -12(%ebp), %edx + movl %eax, (%esp) + movl %edx, 4(%esp) + call _SetTimer + leave + ret + + + +#------------------------------------------------------------------------------ +# void GasketGetLocalTime (EFI_TIME *Time); +#------------------------------------------------------------------------------ +.globl _GasketGetLocalTime +_GasketGetLocalTime: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _GetLocalTime + leave + ret + + + +#------------------------------------------------------------------------------ +# struct tm *Gasketgmtime (const time_t *clock); +#------------------------------------------------------------------------------ +.globl _Gasketgmtime +_Gasketgmtime: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _gmtime + leave + ret + + + + +#------------------------------------------------------------------------------ +# long GasketGetTimeZone(void); +#------------------------------------------------------------------------------ +.globl _GasketGetTimeZone +_GasketGetTimeZone: + pushl %ebp + movl %esp, %ebp + subl $24, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + call _GetTimeZone + leave + ret + + +#------------------------------------------------------------------------------ +# int GasketGetDayLight (void); +#------------------------------------------------------------------------------ +.globl _GasketGetDayLight +_GasketGetDayLight: + pushl %ebp + movl %esp, %ebp + subl $24, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + call _GetDayLight + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketpoll (struct pollfd *pfd, int nfds, int timeout); +#------------------------------------------------------------------------------ +.globl _Gasketpoll +_Gasketpoll: + pushl %ebp + movl %esp, %ebp + subl $56, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 16(%ebp), %eax + movl %eax, 8(%esp) + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _poll + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketread (int fd, void *buf, int count); +#------------------------------------------------------------------------------ +.globl _Gasketread +_Gasketread: + pushl %ebp + movl %esp, %ebp + subl $56, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 16(%ebp), %eax + movl %eax, 8(%esp) + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _read + leave + ret + + +#------------------------------------------------------------------------------ +# int Gasketwrite (int fd, const void *buf, int count); +#------------------------------------------------------------------------------ +.globl _Gasketwrite +_Gasketwrite: + pushl %ebp + movl %esp, %ebp + subl $56, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 16(%ebp), %eax + movl %eax, 8(%esp) + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _write + leave + ret + + + +#------------------------------------------------------------------------------ +# char *Gasketgetenv (const char *name); +#------------------------------------------------------------------------------ +.globl _Gasketgetenv +_Gasketgetenv: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _getenv + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketopen (const char *name, int flags, int mode); +#------------------------------------------------------------------------------ +.globl _Gasketopen +_Gasketopen: + pushl %ebp + movl %esp, %ebp + subl $56, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 16(%ebp), %eax + movl %eax, 8(%esp) + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _open + leave + ret + + + +#------------------------------------------------------------------------------ +# off_t Gasketlseek (int fd, off_t off, int whence); +#------------------------------------------------------------------------------ +.globl _Gasketlseek +_Gasketlseek: + pushl %ebp + movl %esp, %ebp + subl $56, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, -16(%ebp) + movl 16(%ebp), %eax + movl %eax, -12(%ebp) + movl 20(%ebp), %eax + movl %eax, 12(%esp) + movl -16(%ebp), %eax + movl -12(%ebp), %edx + movl %eax, 4(%esp) + movl %edx, 8(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _lseek + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketftruncate (int fd, long int len); +#------------------------------------------------------------------------------ +.globl _Gasketftruncate +_Gasketftruncate: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _truncate + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketclose (int fd); +#------------------------------------------------------------------------------ +.globl _Gasketclose +_Gasketclose: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _close + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketmkdir (const char *pathname, mode_t mode); +#------------------------------------------------------------------------------ +.globl _Gasketmkdir +_Gasketmkdir: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _mkdir + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketrmdir (const char *pathname); +#------------------------------------------------------------------------------ +.globl _Gasketrmdir +_Gasketrmdir: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _rmdir + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketunlink (const char *pathname); +#------------------------------------------------------------------------------ +.globl _Gasketunlink +_Gasketunlink: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _unlink + leave + ret + + + +#------------------------------------------------------------------------------ +# int GasketGetErrno (void); +#------------------------------------------------------------------------------ +.globl _GasketGetErrno +_GasketGetErrno: + pushl %ebp + movl %esp, %ebp + subl $24, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + call _GetErrno + leave + ret + + + +#------------------------------------------------------------------------------ +# DIR *Gasketopendir (const char *pathname); +#------------------------------------------------------------------------------ +.globl _Gasketopendir +_Gasketopendir: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _opendir + leave + ret + + + +#------------------------------------------------------------------------------ +# void *Gasketrewinddir (DIR *dir); +#------------------------------------------------------------------------------ +.globl _Gasketrewinddir +_Gasketrewinddir: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _rewinddir + leave + ret + + + +#------------------------------------------------------------------------------ +# struct dirent *Gasketreaddir (DIR *dir); +#------------------------------------------------------------------------------ +.globl _Gasketreaddir +_Gasketreaddir: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _readdir + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketclosedir (DIR *dir); +#------------------------------------------------------------------------------ +.globl _Gasketclosedir +_Gasketclosedir: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _closedir + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketstat (const char *path, struct stat *buf); +#------------------------------------------------------------------------------ +.globl _Gasketstat +_Gasketstat: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _stat + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketstatfs (const char *path, struct statfs *buf); +#------------------------------------------------------------------------------ +.globl _Gasketstatfs +_Gasketstatfs: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _statfs + leave + ret + + + + +#------------------------------------------------------------------------------ +# int Gasketrename (const char *oldpath, const char *newpath); +#------------------------------------------------------------------------------ +.globl _Gasketrename +_Gasketrename: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _rename + leave + ret + + + + +#------------------------------------------------------------------------------ +# time_t Gasketmktime (struct tm *tm); +#------------------------------------------------------------------------------ +.globl _Gasketmktime +_Gasketmktime: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _mktime + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketfsync (int fd); +#------------------------------------------------------------------------------ +.globl _Gasketfsync +_Gasketfsync: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _fsync + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketchmod (const char *path, mode_t mode); +#------------------------------------------------------------------------------ +.globl _Gasketchmod +_Gasketchmod: + pushl %ebp + movl %esp, %ebp + subl $56, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movw %ax, -12(%ebp) + movzwl -12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _chmod + leave + ret + +#------------------------------------------------------------------------------ +# int Gasketutime (const char *filename, const struct utimbuf *buf); +#------------------------------------------------------------------------------ +.globl _Gasketutime +_Gasketutime: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _rename + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gaskettcflush (int fildes, int queue_selector); +#------------------------------------------------------------------------------ +.globl _Gaskettcflush +_Gaskettcflush: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _rename + leave + ret + + +#------------------------------------------------------------------------------ +# EFI_STATUS UgaCreate (struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title); +#------------------------------------------------------------------------------ +.globl _GasketUgaCreate +_GasketUgaCreate: + pushl %ebp + movl %esp, %ebp + subl $40, %esp #sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _UgaCreate + leave + ret + + +#------------------------------------------------------------------------------ +# void Gasketperror (__const char *__s); +#------------------------------------------------------------------------------ +.globl _Gasketperror +_Gasketperror: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _perror + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketioctl (int fd, unsigned long int __request, ...); +# +# ... is really int or pointer to structure, so we can treat like an int +# +#------------------------------------------------------------------------------ +.globl _Gasketioctl +_Gasketioctl: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 16(%ebp), %eax + movl %eax, 8(%esp) + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _ioctl + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketfcntl (int __fd, int __cmd, ...); +# +# ... is really int or pointer to structure, so we can treat like an int +# +#------------------------------------------------------------------------------ +.globl _Gasketfcntl +_Gasketfcntl: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 16(%ebp), %eax + movl %eax, 8(%esp) + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _fcntl + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed); +#------------------------------------------------------------------------------ +.globl _Gasketcfsetispeed +_Gasketcfsetispeed: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _cfsetispeed + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed); +#------------------------------------------------------------------------------ +.globl _Gasketcfsetospeed +_Gasketcfsetospeed: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _cfsetospeed + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gaskettcgetattr (int __fd, struct termios *__termios_p); +#------------------------------------------------------------------------------ +.globl _Gaskettcgetattr +_Gaskettcgetattr: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _tcgetattr + leave + ret + + + +#------------------------------------------------------------------------------ +# int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p); +#------------------------------------------------------------------------------ +.globl _Gaskettcsetattr +_Gaskettcsetattr: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 16(%ebp), %eax + movl %eax, 8(%esp) + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _tcsetattr + leave + ret + +#------------------------------------------------------------------------------ +# int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact); +#------------------------------------------------------------------------------ +.globl _Gasketsigaction +_Gasketsigaction: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 16(%ebp), %eax + movl %eax, 8(%esp) + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _sigaction + leave + ret + + +#------------------------------------------------------------------------------ +# int Gasketsetcontext (const ucontext_t *ucp); +#------------------------------------------------------------------------------ +.globl _Gasketsetcontext +_Gasketsetcontext: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _setcontext + leave + ret + +#------------------------------------------------------------------------------ +# int Gasketgetcontext (ucontext_t *ucp); +#------------------------------------------------------------------------------ +.globl _Gasketgetcontext +_Gasketgetcontext: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _getcontext + leave + ret + +#------------------------------------------------------------------------------ +# int Gasketsigemptyset (sigset_t *set); +#------------------------------------------------------------------------------ +.globl _Gasketsigemptyset +_Gasketsigemptyset: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _sigemptyset + leave + ret + + +#------------------------------------------------------------------------------ +# int Gasketsigaltstack (const stack_t *ss, stack_t *oss); +#------------------------------------------------------------------------------ +.globl _Gasketsigaltstack +_Gasketsigaltstack: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _sigaltstack + leave + ret + +# +# +# UGA Functions that get exported +# +# + +#------------------------------------------------------------------------------ +# EFI_STATUS GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo); +#------------------------------------------------------------------------------ +.globl _GasketUgaClose +_GasketUgaClose: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _UgaClose + leave + ret + +#------------------------------------------------------------------------------ +# EFI_STATUS GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height); +#------------------------------------------------------------------------------ +.globl _GasketUgaSize +_GasketUgaSize: + pushl %ebp + movl %esp, %ebp + subl $40, %esp + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 16(%ebp), %eax + movl %eax, 8(%esp) + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _UgaSize + leave + ret + + +#------------------------------------------------------------------------------ +# EFI_STATUS GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo); +#------------------------------------------------------------------------------ +.globl _GasketUgaCheckKey +_GasketUgaCheckKey: + pushl %ebp + movl %esp, %ebp + subl $40, %esp # sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 8(%ebp), %eax + movl %eax, (%esp) + call _UgaCheckKey + leave + ret + +#------------------------------------------------------------------------------ +# EFI_STATUS GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key); +#------------------------------------------------------------------------------ +.globl _GasketUgaGetKey +_GasketUgaGetKey: + pushl %ebp + movl %esp, %ebp + subl $40, %esp #sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _UgaGetKey + leave + ret + + +#------------------------------------------------------------------------------ +# EFI_STATUS +# GasketUgaBlt( +# EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, +# IN EFI_UGA_PIXEL *BltBuffer OPTIONAL, +# IN EFI_UGA_BLT_OPERATION BltOperation, +# IN UINTN SourceX, +# IN UINTN SourceY, +# IN UINTN DestinationX, +# IN UINTN DestinationY, +# IN UINTN Width, +# IN UINTN Height, +# IN UINTN Delta OPTIONAL +# ); +#------------------------------------------------------------------------------ +.globl _GasketUgaBlt +_GasketUgaBlt: + pushl %ebp + movl %esp, %ebp + subl $88, %esp #sub extra 0x10 from the stack for the AND + and $-16, %esp # stack needs to end in 0xFFFFFFF0 before call + movl $0, -12(%ebp) + movl 44(%ebp), %eax + movl %eax, 36(%esp) + movl 40(%ebp), %eax + movl %eax, 32(%esp) + movl 36(%ebp), %eax + movl %eax, 28(%esp) + movl 32(%ebp), %eax + movl %eax, 24(%esp) + movl 28(%ebp), %eax + movl %eax, 20(%esp) + movl 24(%ebp), %eax + movl %eax, 16(%esp) + movl 20(%ebp), %eax + movl %eax, 12(%esp) + movl 16(%ebp), %eax + movl %eax, 8(%esp) + movl 12(%ebp), %eax + movl %eax, 4(%esp) + movl 8(%ebp), %eax + movl %eax, (%esp) + call _UgaBlt + leave + ret + + + diff --git a/UnixPkg/UnixBlockIoDxe/UnixBlockIo.c b/UnixPkg/UnixBlockIoDxe/UnixBlockIo.c index c3bd3d38c6..a223d82400 100644 --- a/UnixPkg/UnixBlockIoDxe/UnixBlockIo.c +++ b/UnixPkg/UnixBlockIoDxe/UnixBlockIo.c @@ -774,12 +774,9 @@ Returns: //
// Open the device
//
- Private->fd = Private->UnixThunk->Open
- (Private->Filename, Private->Mode, 0644);
-
+ Private->fd = Private->UnixThunk->Open (Private->Filename, Private->Mode, 0644);
if (Private->fd < 0) {
- DEBUG ((EFI_D_INFO, "PlOpenBlock: Could not open %s\n",
- Private->Filename));
+ DEBUG ((EFI_D_INFO, "PlOpenBlock: Could not open %a\n", Private->Filename));
BlockIo->Media->MediaPresent = FALSE;
Status = EFI_NO_MEDIA;
goto Done;
@@ -798,16 +795,17 @@ Returns: // get the size of the file
//
Status = SetFilePointer64 (Private, 0, &FileSize, SEEK_END);
-
if (EFI_ERROR (Status)) {
FileSize = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);
- DEBUG ((EFI_D_ERROR, "PlOpenBlock: Could not get filesize of %s\n", Private->Filename));
+ DEBUG ((EFI_D_ERROR, "PlOpenBlock: Could not get filesize of %a\n", Private->Filename));
Status = EFI_UNSUPPORTED;
goto Done;
}
if (Private->NumberOfBlocks == 0) {
Private->NumberOfBlocks = DivU64x32 (FileSize, Private->BlockSize);
+ Private->LastBlock = Private->NumberOfBlocks - 1;
+ Private->Media.LastBlock = Private->LastBlock;
}
EndOfFile = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);
@@ -829,7 +827,7 @@ Returns: Private->UnixThunk->FTruncate (Private->fd, EndOfFile);
}
- DEBUG ((EFI_D_INIT, "%HPlOpenBlock: opened %s%N\n", Private->Filename));
+ DEBUG ((EFI_D_INIT, "%HPlOpenBlock: opened %a%N\n", Private->Filename));
Status = EFI_SUCCESS;
Done:
diff --git a/UnixPkg/UnixBusDriverDxe/UnixBusDriver.c b/UnixPkg/UnixBusDriverDxe/UnixBusDriver.c index a7be30c385..fa242eb171 100644 --- a/UnixPkg/UnixBusDriverDxe/UnixBusDriver.c +++ b/UnixPkg/UnixBusDriverDxe/UnixBusDriver.c @@ -269,7 +269,7 @@ Returns: Status = EFI_UNSUPPORTED;
}
- //
+ //
// Close protocol, don't use device path protocol in the Support() function
//
gBS->CloseProtocol (
diff --git a/UnixPkg/UnixFirmwareVolumePei/UnixFwh.c b/UnixPkg/UnixFirmwareVolumePei/UnixFwh.c index 694f2f180b..1f588d0c9a 100644 --- a/UnixPkg/UnixFirmwareVolumePei/UnixFwh.c +++ b/UnixPkg/UnixFirmwareVolumePei/UnixFwh.c @@ -50,8 +50,9 @@ Returns: {
EFI_STATUS Status;
EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;
- UNIX_FWH_PPI *FwhPpi;
+ UNIX_FWH_PPI *FwhPpi;
EFI_PHYSICAL_ADDRESS FdBase;
+ EFI_PHYSICAL_ADDRESS FdFixUp;
EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
UINT64 FdSize;
UINTN Index;
@@ -75,7 +76,7 @@ Returns: //
// Get information about all the FD's in the system
//
- Status = FwhPpi->UnixFwh (Index, &FdBase, &FdSize);
+ Status = FwhPpi->UnixFwh (Index, &FdBase, &FdSize, &FdFixUp);
if (!EFI_ERROR (Status)) {
//
// Assume the FD starts with an FV header
@@ -116,7 +117,7 @@ Returns: PcdGet32 (PcdFlashNvStorageFtwSpareSize) +
PcdGet32 (PcdUnixFlashNvStorageEventLogSize);
- BuildFvHob (FdBase + PcdGet32 (PcdUnixFlashNvStorageVariableBase), FdSize);
+ BuildFvHob (FdFixUp + PcdGet32 (PcdUnixFlashNvStorageVariableBase), FdSize);
} else {
//
// For other FD's just map them in.
diff --git a/UnixPkg/UnixFlashMapPei/FlashMap.c b/UnixPkg/UnixFlashMapPei/FlashMap.c index d3a15cb814..f33b00ec17 100644 --- a/UnixPkg/UnixFlashMapPei/FlashMap.c +++ b/UnixPkg/UnixFlashMapPei/FlashMap.c @@ -57,9 +57,10 @@ Returns: // TODO: EFI_SUCCESS - add return value to function comment
{
EFI_STATUS Status;
- UNIX_FWH_PPI *UnixFwhPpi;
+ UNIX_FWH_PPI *UnixFwhPpi;
EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;
EFI_PHYSICAL_ADDRESS FdBase;
+ EFI_PHYSICAL_ADDRESS FdFixUp;
UINT64 FdSize;
DEBUG ((EFI_D_ERROR, "NT 32 Flash Map PEIM Loaded\n"));
@@ -78,14 +79,14 @@ Returns: //
// Assume that FD0 contains the Flash map.
//
- Status = UnixFwhPpi->UnixFwh (0, &FdBase, &FdSize);
+ Status = UnixFwhPpi->UnixFwh (0, &FdBase, &FdSize, &FdFixUp);
if (EFI_ERROR (Status)) {
return Status;
}
- PcdSet32 (PcdFlashNvStorageVariableBase, PcdGet32 (PcdUnixFlashNvStorageVariableBase) + (UINT32) FdBase);
- PcdSet32 (PcdFlashNvStorageFtwWorkingBase, PcdGet32 (PcdUnixFlashNvStorageFtwWorkingBase) + (UINT32) FdBase);
- PcdSet32 (PcdFlashNvStorageFtwSpareBase, PcdGet32 (PcdUnixFlashNvStorageFtwSpareBase) + (UINT32) FdBase);
+ PcdSet32 (PcdFlashNvStorageVariableBase, PcdGet32 (PcdUnixFlashNvStorageVariableBase) + (UINT32)FdFixUp);
+ PcdSet32 (PcdFlashNvStorageFtwWorkingBase, PcdGet32 (PcdUnixFlashNvStorageFtwWorkingBase) + (UINT32)FdFixUp);
+ PcdSet32 (PcdFlashNvStorageFtwSpareBase, PcdGet32 (PcdUnixFlashNvStorageFtwSpareBase) + (UINT32)FdFixUp);
return EFI_SUCCESS;
}
diff --git a/UnixPkg/UnixPkg.fdf b/UnixPkg/UnixPkg.fdf index 1de2dc52fc..7fe962d1e2 100644 --- a/UnixPkg/UnixPkg.fdf +++ b/UnixPkg/UnixPkg.fdf @@ -25,8 +25,13 @@ #
################################################################################
[FD.Fv_Recovery]
-BaseAddress = 0x0|gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress #The base address of the FLASH Device.
-Size = 0x002a0000 #The size in bytes of the FLASH Device
+#
+# In OS X PEIMs are really XIP, so we need to make this address match the malloced
+# buffer for the FD (0x41000000). If this address does not match the FV will get
+# relocated in place (works, but not a great idea).
+#
+BaseAddress = 0x41000000|gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress #The base address of the FLASH Device.
+Size = 0x002a0000|gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareFdSize #The size in bytes of the FLASH Device
ErasePolarity = 1
BlockSize = 0x10000
NumBlocks = 0x2a
diff --git a/UnixPkg/UnixSimpleFileSystemDxe/UnixSimpleFileSystem.c b/UnixPkg/UnixSimpleFileSystemDxe/UnixSimpleFileSystem.c index e39a18978f..b46c9dce97 100644 --- a/UnixPkg/UnixSimpleFileSystemDxe/UnixSimpleFileSystem.c +++ b/UnixPkg/UnixSimpleFileSystemDxe/UnixSimpleFileSystem.c @@ -836,7 +836,7 @@ OpenRoot: NewPrivateFile->IsDirectoryPath = FALSE;
}
} else {
- struct stat finfo;
+ STAT_FIX finfo;
int res = NewPrivateFile->UnixThunk->Stat (NewPrivateFile->FileName, &finfo);
if (res == 0 && S_ISDIR(finfo.st_mode))
NewPrivateFile->IsDirectoryPath = TRUE;
@@ -1107,7 +1107,7 @@ Returns: struct tm *tm;
tm = UnixThunk->GmTime (&SystemTime);
Time->Year = tm->tm_year;
- Time->Month = tm->tm_mon;
+ Time->Month = tm->tm_mon + 1;
Time->Day = tm->tm_mday;
Time->Hour = tm->tm_hour;
Time->Minute = tm->tm_min;
@@ -1151,10 +1151,10 @@ Returns: UINTN NameSize;
UINTN ResultSize;
EFI_FILE_INFO *Info;
- CHAR8 *RealFileName;
- CHAR8 *TempPointer;
+ CHAR8 *RealFileName;
+ CHAR8 *TempPointer;
CHAR16 *BufferFileName;
- struct stat buf;
+ STAT_FIX buf;
if (FileName != NULL) {
RealFileName = FileName;
@@ -1724,7 +1724,7 @@ Returns: UINTN OldInfoSize;
EFI_TPL OldTpl;
mode_t NewAttr;
- struct stat OldAttr;
+ STAT_FIX OldAttr;
CHAR8 *OldFileName;
CHAR8 *NewFileName;
CHAR8 *CharPointer;
diff --git a/UnixPkg/Xcode/xcode_project/XcodeBuild.sh b/UnixPkg/Xcode/xcode_project/XcodeBuild.sh new file mode 100755 index 0000000000..e3827cec1f --- /dev/null +++ b/UnixPkg/Xcode/xcode_project/XcodeBuild.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# +# External makefile Xcode project project uses this script to build and clean from the Xcode GUI +# + +# force exit on error +set -e + +# +# Source the workspace and set up the environment varaibles we need +# +cd ../.. +echo `pwd` +./build.sh diff --git a/UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/default.pbxuser b/UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/default.pbxuser new file mode 100644 index 0000000000..f3db667599 --- /dev/null +++ b/UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/default.pbxuser @@ -0,0 +1,191 @@ +// !$*UTF8*$! +{ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + activeBuildConfigurationName = Debug; + activeExecutable = BA11A1010FB10BCE00D06FEC /* SecMain.dll */; + activeTarget = D28A88AD04BDD90700651E21 /* xcode_project */; + breakpoints = ( + BA11A11A0FB10E0700D06FEC /* SecGdbScriptBreak */, + ); + codeSenseManager = BA11A0FE0FB10B4800D06FEC /* Code sense */; + executables = ( + BA11A1010FB10BCE00D06FEC /* SecMain.dll */, + ); + perUserDictionary = { + "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 20, + 198, + 20, + 99, + 99, + 29, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXBreakpointsDataSource_ActionID, + PBXBreakpointsDataSource_TypeID, + PBXBreakpointsDataSource_BreakpointID, + PBXBreakpointsDataSource_UseID, + PBXBreakpointsDataSource_LocationID, + PBXBreakpointsDataSource_ConditionID, + PBXBreakpointsDataSource_IgnoreCountID, + PBXBreakpointsDataSource_ContinueID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; + PBXFileTableDataSourceColumnWidthsKey = ( + 22, + 300, + 229, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXExecutablesDataSource_ActiveFlagID, + PBXExecutablesDataSource_NameID, + PBXExecutablesDataSource_CommentsID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 341, + 20, + 48, + 43, + 43, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + PBXFileDataSource_Target_ColumnID, + ); + }; + PBXPerProjectTemplateStateSaveDate = 263260969; + PBXWorkspaceStateSaveDate = 263260969; + }; + sourceControlManager = BA11A0FD0FB10B4800D06FEC /* Source Control */; + userBuildSettings = { + }; + }; + BA11A0FD0FB10B4800D06FEC /* Source Control */ = { + isa = PBXSourceControlManager; + fallbackIsa = XCSourceControlManager; + isSCMEnabled = 0; + repositoryNamesForRoots = { + }; + scmConfiguration = { + }; + }; + BA11A0FE0FB10B4800D06FEC /* Code sense */ = { + isa = PBXCodeSenseManager; + indexTemplatePath = ""; + }; + BA11A1010FB10BCE00D06FEC /* SecMain.dll */ = { + isa = PBXExecutable; + activeArgIndices = ( + ); + argumentStrings = ( + ); + autoAttachOnCrash = 1; + breakpointsEnabled = 1; + configStateDict = { + "PBXLSLaunchAction-0" = { + PBXLSLaunchAction = 0; + PBXLSLaunchStartAction = 1; + PBXLSLaunchStdioStyle = 2; + PBXLSLaunchStyle = 0; + class = PBXLSRunLaunchConfig; + commandLineArgs = ( + ); + displayName = "Executable Runner"; + environment = { + }; + identifier = com.apple.Xcode.launch.runConfig; + remoteHostInfo = ""; + startActionInfo = ""; + }; + "PBXLSLaunchAction-1" = { + PBXLSLaunchAction = 1; + PBXLSLaunchStartAction = 1; + PBXLSLaunchStdioStyle = 2; + PBXLSLaunchStyle = 0; + class = PBXGDB_LaunchConfig; + commandLineArgs = ( + ); + displayName = GDB; + environment = { + }; + identifier = com.apple.Xcode.launch.GDBMI_Config; + remoteHostInfo = ""; + startActionInfo = ""; + }; + }; + customDataFormattersEnabled = 0; + dataTipCustomDataFormattersEnabled = 1; + dataTipShowTypeColumn = 1; + dataTipSortType = 0; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + ); + executableSystemSymbolLevel = 0; + executableUserSymbolLevel = 0; + launchableReference = BA11A1020FB10BCE00D06FEC /* SecMain.dll */; + libgmallocEnabled = 0; + name = SecMain.dll; + savedGlobals = { + }; + showTypeColumn = 0; + sourceDirectories = ( + ); + startupPath = ../../../Build/Unix/DEBUG_XCODE32/IA32; + }; + BA11A1020FB10BCE00D06FEC /* SecMain.dll */ = { + isa = PBXFileReference; + lastKnownFileType = "compiled.mach-o.executable"; + name = SecMain.dll; + path = ../../../Build/Unix/DEBUG_XCODE32/IA32/SecMain; + sourceTree = SOURCE_ROOT; + }; + BA11A11A0FB10E0700D06FEC /* SecGdbScriptBreak */ = { + isa = PBXSymbolicBreakpoint; + actions = ( + BA11A11E0FB10E2200D06FEC /* XCBreakpointCommandAction */, + ); + breakpointStyle = 1; + continueAfterActions = 1; + countType = 0; + delayBeforeContinue = 0; + hitCount = 0; + ignoreCount = 0; + location = SecMain; + modificationTime = 263261853.260195; + originalNumberOfMultipleMatches = 1; + state = 1; + symbolName = SecGdbScriptBreak; + }; + BA11A11E0FB10E2200D06FEC /* XCBreakpointCommandAction */ = { + isa = XCBreakpointCommandAction; + command = "source SecMain.gdb"; + fallbackIsa = XCBreakpointAction; + logCommand = 0; + useDebuggerSideImplementation = 1; + }; + D28A88AD04BDD90700651E21 /* xcode_project */ = { + activeExec = 0; + }; +} diff --git a/UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/project.pbxproj b/UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..199700f9ce --- /dev/null +++ b/UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/project.pbxproj @@ -0,0 +1,122 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXFileReference section */ + F27EDBED101FA6FC0097B575 /* PciIoKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PciIoKit.h; path = ../../Sec/PciIoKit.h; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* xcode_project */ = { + isa = PBXGroup; + children = ( + F27EDBED101FA6FC0097B575 /* PciIoKit.h */, + ); + name = xcode_project; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXLegacyTarget section */ + D28A88AD04BDD90700651E21 /* xcode_project */ = { + isa = PBXLegacyTarget; + buildArgumentsString = "$(ACTION)"; + buildConfigurationList = 1DEB918F08733D9F0010E9CD /* Build configuration list for PBXLegacyTarget "xcode_project" */; + buildPhases = ( + ); + buildToolPath = ./XcodeBuild.sh; + buildWorkingDirectory = ""; + dependencies = ( + ); + name = xcode_project; + passBuildSettingsInEnvironment = 1; + productName = xcode_project; + }; +/* End PBXLegacyTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB919308733D9F0010E9CD /* Build configuration list for PBXProject "xcode_project" */; + compatibilityVersion = "Xcode 3.1"; + hasScannedForEncodings = 1; + mainGroup = 08FB7794FE84155DC02AAC07 /* xcode_project */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D28A88AD04BDD90700651E21 /* xcode_project */, + ); + }; +/* End PBXProject section */ + +/* Begin XCBuildConfiguration section */ + 1DEB919008733D9F0010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = xcode_project; + }; + name = Debug; + }; + 1DEB919108733D9F0010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = xcode_project; + }; + name = Release; + }; + 1DEB919408733D9F0010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; + PREBINDING = NO; + SDKROOT = macosx10.6; + }; + name = Debug; + }; + 1DEB919508733D9F0010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = macosx10.6; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB918F08733D9F0010E9CD /* Build configuration list for PBXLegacyTarget "xcode_project" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB919008733D9F0010E9CD /* Debug */, + 1DEB919108733D9F0010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB919308733D9F0010E9CD /* Build configuration list for PBXProject "xcode_project" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB919408733D9F0010E9CD /* Debug */, + 1DEB919508733D9F0010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/UnixPkg/build.sh b/UnixPkg/build.sh new file mode 100755 index 0000000000..2770019a1f --- /dev/null +++ b/UnixPkg/build.sh @@ -0,0 +1,96 @@ +#!/bin/bash +# +# Copyright (c) 2008 - 2009, Apple, Inc. All rights reserved. +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +set -e +shopt -s nocasematch + + + +# +# Setup workspace if it is not set +# +if [ -z "$WORKSPACE" ] +then + echo Initializing workspace + cd .. + export EDK_TOOLS_PATH=`pwd`/BaseTools + echo $EDK_TOOLS_PATH + source edksetup.sh BaseTools +else + echo Building from: $WORKSPACE +fi + +# +# Pick a default tool type for a given OS +# +TARGET_TOOLS=MYTOOLS +case `uname` in + CYGWIN*) echo Cygwin not fully supported yet. ;; + Darwin*) + Major=$(uname -r | cut -f 1 -d '.') + if [[ $Major == 9 ]] + then + echo UnixPkg requires Snow Leopard or later OS + exit 1 + else + TARGET_TOOLS=XCODE32 + fi + ;; + Linux*) TARGET_TOOLS=ELFGCC ;; + +esac + +BUILD_ROOT_ARCH=$WORKSPACE/Build/Unix/DEBUG_"$TARGET_TOOLS"/IA32 + +if [[ ! -f `which build` || ! -f `which GenFv` ]]; +then + # build the tools if they don't yet exist + echo Building tools + make -C $WORKSPACE/BaseTools +else + echo using prebuilt tools +fi + + +for arg in "$@" +do + if [[ $arg == run ]]; then + case `uname` in + Darwin*) + # + # On Darwin we can't use dlopen, so we have to load the real PE/COFF images. + # This .gdbinit script sets a breakpoint that loads symbols for the PE/COFFEE + # images that get loaded in SecMain + # + cp $WORKSPACE/UnixPkg/.gdbinit $WORKSPACE/Build/Unix/DEBUG_"$TARGET_TOOLS"/IA32 + ;; + esac + + /usr/bin/gdb $BUILD_ROOT_ARCH/SecMain -q -cd=$BUILD_ROOT_ARCH + exit + fi + + if [[ $arg == cleanall ]]; then + make -C $WORKSPACE/BaseTools clean + fi +done + + +# +# Build the edk2 UnixPkg +# +echo $PATH +echo `which build` +build -p $WORKSPACE/EdkShellPkg/EdkShellPkg.dsc -a IA32 -t $TARGET_TOOLS $1 $2 $3 $4 $5 $6 $7 $8 +build -p $WORKSPACE/UnixPkg/UnixPkg.dsc -a IA32 -t $TARGET_TOOLS $1 $2 $3 $4 $5 $6 $7 $8 +exit $? + diff --git a/UnixPkg/readme.txt b/UnixPkg/readme.txt index 35e2523e0f..f28d626f9c 100644 --- a/UnixPkg/readme.txt +++ b/UnixPkg/readme.txt @@ -20,6 +20,32 @@ UnixPkg is built with following command: Notes: ELFGCC is defined in <Workspace>/Conf/tools_def.txt file. This tool chain use native gcc/binutil instead of cross-compiler like UNIXGCC tool chain. +On Mac OS X you can cd into UnixPkg directory and execute ./build.sh to build. This does not require +setting up the environment like running the build command. Note Snow Leopard or later is required. +This script should also work for any *INUX, but has not been tested. + +./build.sh run will lanuch the emulator in gdb so you can source level debug via gdb. + + +Notes: +===== +On Mac OS X Snow Leopard you can use Xcode 3.2 as a GUI debugger. +Launch Xcode and open UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj +Under the build menu chose build and debug. shift-cmd-B shows the build results. + +Under most *INUX the EFI executables are placed in the emulated EFI memory by the EFI PE/COFF loader +but dlopen() is used to also load the image into the process to support source level debug. +The entry point for the image is moved from the EFI emulator memory into the dlopen() image. This +is not the case for Mac OS X. On Mac OS X a debugger script is used and the real EFI images in +the emulator are the ones being debugged. + +Also on Mac OS X the stack alignment requirements for IA-32 are 16 bytes and this is more strict +than the EFI ABI. To work around this gasket code was introduced to ensure the stack is always +16 byte aligned when making any POSIX call on Mac OS X. + +To build PE/COFF images with Xcode 3.2 and extra tool call mtoc is required to convert Mach-O +images into PE/COFF images. The tool only supports EFI PE/COFF images and the instructions on +how to download it are on the edk2 website. FAQ === |