From 7ee3b61338de1fa592227c719eca20f7813ea606 Mon Sep 17 00:00:00 2001 From: AJFISH Date: Sun, 6 Dec 2009 02:00:37 +0000 Subject: [PATCH] Added support for Xcode on Snow Leopard. Upaded with bug fixes for Snow Leopard. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9519 6f19259b-4bc3-4df7-8a09-765794883524 --- UnixPkg/.gdbinit | 8 + .../FvbServicesRuntimeDxe/FWBlockService.c | 24 +- .../FvbServicesRuntimeDxe/FwBlockService.h | 10 +- UnixPkg/Include/Ppi/UnixFwh.h | 4 +- UnixPkg/Include/Protocol/UnixThunk.h | 83 +- .../PeiUnixPeCoffExtraActionLib.c | 2 +- UnixPkg/Sec/Gasket.c | 418 ++++++ UnixPkg/Sec/Gasket.h | 141 +++ UnixPkg/Sec/Ia32/Gasket.S | 1128 +++-------------- UnixPkg/Sec/Ia32/GasketTemplate.c | 142 +++ UnixPkg/Sec/SecMain.c | 35 +- UnixPkg/Sec/SecMain.h | 37 +- UnixPkg/Sec/SecMain.inf | 4 +- UnixPkg/Sec/UgaX11.c | 33 +- UnixPkg/Sec/UnixThunk.c | 74 +- UnixPkg/Sec/X64/Gasket.S | 1026 +++++++++++++++ UnixPkg/UnixBlockIoDxe/UnixBlockIo.c | 14 +- UnixPkg/UnixBusDriverDxe/UnixBusDriver.c | 2 +- UnixPkg/UnixFirmwareVolumePei/UnixFwh.c | 7 +- UnixPkg/UnixFlashMapPei/FlashMap.c | 11 +- UnixPkg/UnixPkg.fdf | 9 +- .../UnixSimpleFileSystem.c | 12 +- UnixPkg/Xcode/xcode_project/XcodeBuild.sh | 14 + .../xcode_project.xcodeproj/default.pbxuser | 191 +++ .../xcode_project.xcodeproj/project.pbxproj | 122 ++ UnixPkg/build.sh | 96 ++ UnixPkg/readme.txt | 26 + 27 files changed, 2564 insertions(+), 1109 deletions(-) create mode 100644 UnixPkg/.gdbinit create mode 100644 UnixPkg/Sec/Gasket.c create mode 100644 UnixPkg/Sec/Gasket.h create mode 100644 UnixPkg/Sec/Ia32/GasketTemplate.c create mode 100644 UnixPkg/Sec/X64/Gasket.S create mode 100755 UnixPkg/Xcode/xcode_project/XcodeBuild.sh create mode 100644 UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/default.pbxuser create mode 100644 UnixPkg/Xcode/xcode_project/xcode_project.xcodeproj/project.pbxproj create mode 100755 UnixPkg/build.sh 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 #include +#include #include #include +#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 + +#include +#include +#include + + +// +// 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 -##include -# -#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 - .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
+Portions 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. + +**/ + + +#include +#include + +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 +##include +# +#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 + + .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 = ""; + }; +/* 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 /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 === -- 2.39.2