git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9519 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			380 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			380 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| Copyright (c) 2004 - 2009, Intel Corporation                                                         
 | |
| Portions copyright (c) 2008-2009 Apple Inc.<BR>
 | |
| All rights reserved. This program and the accompanying materials                          
 | |
| are licensed and made available under the terms and conditions of the BSD License         
 | |
| which accompanies this distribution.  The full text of the license may be found at        
 | |
| http://opensource.org/licenses/bsd-license.php                                            
 | |
|                                                                                           
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | |
| 
 | |
| Module Name:
 | |
| 
 | |
|   UnixThunk.h
 | |
| 
 | |
| Abstract:
 | |
| 
 | |
|   This protocol allows an EFI driver in the Unix emulation environment
 | |
|   to make Posix calls.
 | |
| 
 | |
|   NEVER make an Unix call directly, always make the call via this protocol.
 | |
| 
 | |
|   There are no This pointers on the protocol member functions as they map
 | |
|   exactly into Unix system calls.
 | |
| 
 | |
| --*/
 | |
| 
 | |
| #ifndef _UNIX_THUNK_H_
 | |
| #define _UNIX_THUNK_H_
 | |
| 
 | |
| #include <sys/termios.h>
 | |
| #include <stdio.h>
 | |
| #include <sys/time.h>
 | |
| 
 | |
| #if __CYGWIN__
 | |
| #include <sys/dirent.h>
 | |
| #else
 | |
| #include <sys/dir.h>
 | |
| #endif
 | |
| 
 | |
| #include <unistd.h>
 | |
| #include <poll.h>
 | |
| #include <sys/types.h>
 | |
| #include <sys/stat.h>
 | |
| #include <fcntl.h>
 | |
| #include <time.h>
 | |
| #include <signal.h>
 | |
| #include <errno.h>
 | |
| #include <string.h>
 | |
| #include <stdlib.h>
 | |
| #include <sys/ioctl.h>
 | |
| 
 | |
| #ifdef __APPLE__
 | |
| #include <sys/param.h>
 | |
| #include <sys/mount.h>
 | |
| #define _XOPEN_SOURCE
 | |
| #else
 | |
| #include <termio.h>
 | |
| #include <sys/vfs.h>
 | |
| #endif 
 | |
| 
 | |
| #include <utime.h>
 | |
| #include <dlfcn.h>
 | |
| #include <ucontext.h>
 | |
| 
 | |
| #include <Base.h>
 | |
| #include <Library/PeCoffLib.h>
 | |
| 
 | |
| 
 | |
| #if __APPLE__
 | |
| //
 | |
| // EFI packing is not compatible witht he default OS packing for struct stat.
 | |
| // st_size is 64-bit but starts on a 32-bit offset in the structure. The compiler
 | |
| // flags used to produce compatible EFI images, break struct stat
 | |
| //
 | |
| #pragma pack(4)
 | |
| 
 | |
| #if __DARWIN_64_BIT_INO_T
 | |
| 
 | |
| typedef struct stat_fix { \
 | |
| 	dev_t		st_dev;			/* [XSI] ID of device containing file */ 
 | |
| 	mode_t		st_mode;		/* [XSI] Mode of file (see below) */ 
 | |
| 	nlink_t		st_nlink;		/* [XSI] Number of hard links */ 
 | |
| 	__darwin_ino64_t st_ino;		/* [XSI] File serial number */ 
 | |
| 	uid_t		st_uid;			/* [XSI] User ID of the file */ 
 | |
| 	gid_t		st_gid;			/* [XSI] Group ID of the file */ 
 | |
| 	dev_t		st_rdev;		/* [XSI] Device ID */ 
 | |
| 	__DARWIN_STRUCT_STAT64_TIMES 
 | |
| 	off_t		st_size;		/* [XSI] file size, in bytes */ 
 | |
| 	blkcnt_t	st_blocks;		/* [XSI] blocks allocated for file */ 
 | |
| 	blksize_t	st_blksize;		/* [XSI] optimal blocksize for I/O */ 
 | |
| 	__uint32_t	st_flags;		/* user defined flags for file */ 
 | |
| 	__uint32_t	st_gen;			/* file generation number */ 
 | |
| 	__int32_t	st_lspare;		/* RESERVED: DO NOT USE! */ 
 | |
| 	__int64_t	st_qspare[2];		/* RESERVED: DO NOT USE! */ 
 | |
| } STAT_FIX;
 | |
| 
 | |
| #else /* !__DARWIN_64_BIT_INO_T */
 | |
| 
 | |
| typedef struct stat_fix {
 | |
| 	dev_t	 	st_dev;		/* [XSI] ID of device containing file */
 | |
| 	ino_t	  	st_ino;		/* [XSI] File serial number */
 | |
| 	mode_t	 	st_mode;	/* [XSI] Mode of file (see below) */
 | |
| 	nlink_t		st_nlink;	/* [XSI] Number of hard links */
 | |
| 	uid_t		st_uid;		/* [XSI] User ID of the file */
 | |
| 	gid_t		st_gid;		/* [XSI] Group ID of the file */
 | |
| 	dev_t		st_rdev;	/* [XSI] Device ID */
 | |
| #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
 | |
| 	struct	timespec st_atimespec;	/* time of last access */
 | |
| 	struct	timespec st_mtimespec;	/* time of last data modification */
 | |
| 	struct	timespec st_ctimespec;	/* time of last status change */
 | |
| #else
 | |
| 	time_t		st_atime;	/* [XSI] Time of last access */
 | |
| 	long		st_atimensec;	/* nsec of last access */
 | |
| 	time_t		st_mtime;	/* [XSI] Last data modification time */
 | |
| 	long		st_mtimensec;	/* last data modification nsec */
 | |
| 	time_t		st_ctime;	/* [XSI] Time of last status change */
 | |
| 	long		st_ctimensec;	/* nsec of last status change */
 | |
| #endif
 | |
| 	off_t		st_size;	/* [XSI] file size, in bytes */
 | |
| 	blkcnt_t	st_blocks;	/* [XSI] blocks allocated for file */
 | |
| 	blksize_t	st_blksize;	/* [XSI] optimal blocksize for I/O */
 | |
| 	__uint32_t	st_flags;	/* user defined flags for file */
 | |
| 	__uint32_t	st_gen;		/* file generation number */
 | |
| 	__int32_t	st_lspare;	/* RESERVED: DO NOT USE! */
 | |
| 	__int64_t	st_qspare[2];	/* RESERVED: DO NOT USE! */
 | |
| } STAT_FIX;
 | |
| 
 | |
| #pragma pack()
 | |
| #endif
 | |
| 
 | |
| #else 
 | |
| 
 | |
|   typedef struct stat STAT_FIX;
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #define EFI_UNIX_THUNK_PROTOCOL_GUID \
 | |
|   { \
 | |
|     0xf2e98868, 0x8985, 0x11db, {0x9a, 0x59, 0x00, 0x40, 0xd0, 0x2b, 0x18, 0x35 } \
 | |
|   }
 | |
| 
 | |
| typedef
 | |
| VOID
 | |
| (*UnixSleep) (
 | |
|   unsigned long Milliseconds
 | |
|   );
 | |
| 
 | |
| typedef
 | |
| VOID
 | |
| (*UnixExit) (
 | |
|   int status  // exit code for all threads
 | |
|   );
 | |
| 
 | |
| typedef
 | |
| VOID
 | |
| (*UnixSetTimer) (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
 | |
| typedef
 | |
| VOID
 | |
| (*UnixGetLocalTime) (EFI_TIME *Time);
 | |
| typedef
 | |
| struct tm *
 | |
| (*UnixGmTime)(const time_t *timep);
 | |
| typedef
 | |
| long
 | |
| (*UnixGetTimeZone)(void);
 | |
| typedef
 | |
| int
 | |
| (*UnixGetDayLight)(void);
 | |
| typedef
 | |
| int
 | |
| (*UnixPoll)(struct pollfd *pfd, int nfds, int timeout);
 | |
| typedef
 | |
| int
 | |
| (*UnixRead) (int fd, void *buf, int count);
 | |
| typedef
 | |
| int
 | |
| (*UnixWrite) (int fd, const void *buf, int count);
 | |
| typedef
 | |
| char *
 | |
| (*UnixGetenv) (const char *var);
 | |
| typedef
 | |
| int
 | |
| (*UnixOpen) (const char *name, int flags, int mode);
 | |
| typedef
 | |
| off_t
 | |
| (*UnixSeek) (int fd, off_t off, int whence);
 | |
| typedef
 | |
| int
 | |
| (*UnixFtruncate) (int fd, long int len);
 | |
| typedef
 | |
| int
 | |
| (*UnixClose) (int fd);
 | |
| 
 | |
| typedef
 | |
| int
 | |
| (*UnixMkdir)(const char *pathname, mode_t mode);
 | |
| typedef
 | |
| int
 | |
| (*UnixRmDir)(const char *pathname);
 | |
| typedef
 | |
| int
 | |
| (*UnixUnLink)(const char *pathname);
 | |
| typedef
 | |
| int
 | |
| (*UnixGetErrno)(VOID);
 | |
| typedef
 | |
| DIR *
 | |
| (*UnixOpenDir)(const char *pathname);
 | |
| typedef
 | |
| void
 | |
| (*UnixRewindDir)(DIR *dir);
 | |
| typedef
 | |
| struct dirent *
 | |
| (*UnixReadDir)(DIR *dir);
 | |
| typedef
 | |
| int
 | |
| (*UnixCloseDir)(DIR *dir);
 | |
| typedef
 | |
| int
 | |
| (*UnixStat)(const char *path, STAT_FIX *buf);
 | |
| typedef
 | |
| int
 | |
| (*UnixStatFs)(const char *path, struct statfs *buf);
 | |
| typedef
 | |
| int
 | |
| (*UnixRename)(const char *oldpath, const char *newpath);
 | |
| typedef
 | |
| time_t
 | |
| (*UnixMkTime)(struct tm *tm);
 | |
| typedef
 | |
| int
 | |
| (*UnixFSync)(int fd);
 | |
| typedef
 | |
| int
 | |
| (*UnixChmod)(const char *path, mode_t mode);
 | |
| typedef
 | |
| int
 | |
| (*UnixUTime)(const char *filename, const struct utimbuf *buf);
 | |
| 
 | |
| struct _EFI_UNIX_UGA_IO_PROTOCOL;
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (*UnixUgaCreate)(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo,
 | |
| 		 CONST CHAR16 *Title);
 | |
| 
 | |
| typedef
 | |
| int
 | |
| (*UnixTcflush) (int fildes, int queue_selector);
 | |
| 
 | |
| typedef
 | |
| void
 | |
| (*UnixPerror) (__const char *__s);
 | |
| 
 | |
| typedef 
 | |
| int 
 | |
| #if __CYGWIN__
 | |
| (*UnixIoCtl) (int fd, int __request, ...);
 | |
| #else
 | |
| (*UnixIoCtl) (int fd, unsigned long int __request, ...);
 | |
| #endif
 | |
| 
 | |
| typedef 
 | |
| int 
 | |
| (*UnixFcntl) (int __fd, int __cmd, ...);
 | |
| 
 | |
| typedef
 | |
| int 
 | |
| (*UnixCfsetispeed) (struct termios *__termios_p, speed_t __speed);
 | |
| 
 | |
| typedef 
 | |
| int 
 | |
| (*UnixCfsetospeed) (struct termios *__termios_p, speed_t __speed);
 | |
| 
 | |
| typedef
 | |
| int 
 | |
| (*UnixTcgetattr) (int __fd, struct termios *__termios_p);
 | |
| 
 | |
| typedef 
 | |
| int 
 | |
| (*UnixTcsetattr) (int __fd, int __optional_actions,
 | |
| 		      __const struct termios *__termios_p);
 | |
| 
 | |
| typedef 
 | |
| VOID *
 | |
| (*UnixDlopen) (const char *FileName, int Flag);
 | |
| 
 | |
| typedef
 | |
| char *
 | |
| (*UnixDlerror) (VOID);
 | |
| 
 | |
| typedef 
 | |
| VOID *
 | |
| (*UnixDlsym) (VOID* Handle, const char* Symbol);
 | |
| 
 | |
| 
 | |
| //
 | |
| // Work functions to enable source level debug in the emulator
 | |
| //
 | |
| 
 | |
| typedef 
 | |
| RETURN_STATUS
 | |
| (EFIAPI *UnixPeCoffGetEntryPoint) (
 | |
|   IN     VOID  *Pe32Data,
 | |
|   IN OUT VOID  **EntryPoint
 | |
|   );
 | |
| 
 | |
| typedef 
 | |
| VOID
 | |
| (EFIAPI *UnixPeCoffRelocateImageExtraAction) (
 | |
|   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
 | |
|   );
 | |
| 
 | |
| typedef 
 | |
| VOID
 | |
| (EFIAPI *UnixPeCoffLoaderUnloadImageExtraAction) (
 | |
|   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
 | |
|   );
 | |
| 
 | |
| 
 | |
| 
 | |
| #define EFI_UNIX_THUNK_PROTOCOL_SIGNATURE SIGNATURE_32 ('L', 'N', 'X', 'T')
 | |
| 
 | |
| typedef struct _EFI_UNIX_THUNK_PROTOCOL {
 | |
|   UINT64                              Signature;
 | |
| 
 | |
|   UnixSleep                           Sleep;
 | |
|   UnixExit                    	      Exit;
 | |
|   UnixSetTimer                        SetTimer;
 | |
|   UnixGetLocalTime		                GetLocalTime;
 | |
|   UnixGmTime                          GmTime;
 | |
|   UnixGetTimeZone                     GetTimeZone;
 | |
|   UnixGetDayLight                     GetDayLight;
 | |
|   UnixPoll	                          Poll;
 | |
|   UnixRead                           Read;
 | |
|   UnixWrite                          Write;
 | |
|   UnixGetenv                         Getenv;
 | |
|   UnixOpen                           Open;
 | |
|   UnixSeek                           Lseek;
 | |
|   UnixFtruncate                      FTruncate;
 | |
|   UnixClose                          Close;
 | |
|   UnixMkdir                           MkDir;
 | |
|   UnixRmDir                           RmDir;
 | |
|   UnixUnLink                          UnLink;
 | |
|   UnixGetErrno                        GetErrno;
 | |
|   UnixOpenDir                         OpenDir;
 | |
|   UnixRewindDir                       RewindDir;
 | |
|   UnixReadDir                         ReadDir;
 | |
|   UnixCloseDir                        CloseDir;
 | |
|   UnixStat                            Stat;
 | |
|   UnixStatFs                          StatFs;
 | |
|   UnixRename                          Rename;
 | |
|   UnixMkTime                          MkTime;
 | |
|   UnixFSync                           FSync;
 | |
|   UnixChmod                           Chmod;
 | |
|   UnixUTime                           UTime;
 | |
|   UnixTcflush                         Tcflush;
 | |
|   UnixUgaCreate			                  UgaCreate;
 | |
|   UnixPerror                          Perror;
 | |
|   UnixIoCtl                           IoCtl;
 | |
|   UnixFcntl                           Fcntl;
 | |
|   UnixCfsetispeed                     Cfsetispeed;
 | |
|   UnixCfsetospeed                     Cfsetospeed;
 | |
|   UnixTcgetattr                       Tcgetattr;
 | |
|   UnixTcsetattr                       Tcsetattr;
 | |
|   UnixDlopen                          Dlopen;
 | |
|   UnixDlerror                         Dlerror;
 | |
|   UnixDlsym                           Dlsym;
 | |
|   UnixPeCoffGetEntryPoint                 PeCoffGetEntryPoint;
 | |
|   UnixPeCoffRelocateImageExtraAction      PeCoffRelocateImageExtraAction;
 | |
|   UnixPeCoffLoaderUnloadImageExtraAction  PeCoffUnloadImageExtraAction;
 | |
| 	
 | |
| 	
 | |
| } EFI_UNIX_THUNK_PROTOCOL;
 | |
| 
 | |
| extern EFI_GUID gEfiUnixThunkProtocolGuid;
 | |
| 
 | |
| #endif
 |