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
This commit is contained in:
AJFISH 2009-12-06 02:00:37 +00:00
parent 2ef2b01e07
commit 7ee3b61338
27 changed files with 2581 additions and 1126 deletions

8
UnixPkg/.gdbinit Normal file
View File

@ -0,0 +1,8 @@
set confirm off
set output-radix 16
b SecGdbScriptBreak
command
silent
source SecMain.gdb
c
end

View File

@ -226,7 +226,7 @@ Returns:
EFI_STATUS EFI_STATUS
FvbGetVolumeAttributes ( FvbGetVolumeAttributes (
IN UINTN Instance, IN UINTN Instance,
OUT EFI_FVB_ATTRIBUTES_2 *Attributes, OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
IN ESAL_FWB_GLOBAL *Global, IN ESAL_FWB_GLOBAL *Global,
IN BOOLEAN Virtual IN BOOLEAN Virtual
) )
@ -560,10 +560,10 @@ Returns:
{ {
EFI_FVB_ATTRIBUTES_2 Attributes; EFI_FVB_ATTRIBUTES_2 Attributes;
UINTN LbaAddress; UINTN LbaAddress;
UINTN LbaLength; UINTN LbaLength;
EFI_STATUS Status; EFI_STATUS Status;
UINT8 Data; UINT8 Data;
// //
// Check if the FV is write enabled // Check if the FV is write enabled
@ -596,7 +596,7 @@ Returns:
EFI_STATUS EFI_STATUS
FvbSetVolumeAttributes ( FvbSetVolumeAttributes (
IN UINTN Instance, IN UINTN Instance,
IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes, IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
IN ESAL_FWB_GLOBAL *Global, IN ESAL_FWB_GLOBAL *Global,
IN BOOLEAN Virtual IN BOOLEAN Virtual
) )
@ -629,10 +629,10 @@ Returns:
EFI_FW_VOL_INSTANCE *FwhInstance = NULL; EFI_FW_VOL_INSTANCE *FwhInstance = NULL;
EFI_FVB_ATTRIBUTES_2 OldAttributes; EFI_FVB_ATTRIBUTES_2 OldAttributes;
EFI_FVB_ATTRIBUTES_2 *AttribPtr; EFI_FVB_ATTRIBUTES_2 *AttribPtr;
UINT32 Capabilities; UINT32 Capabilities;
UINT32 OldStatus; UINT32 OldStatus;
UINT32 NewStatus; UINT32 NewStatus;
EFI_STATUS Status; EFI_STATUS Status;
EFI_FVB_ATTRIBUTES_2 UnchangedAttributes; EFI_FVB_ATTRIBUTES_2 UnchangedAttributes;
@ -809,7 +809,7 @@ EFI_STATUS
EFIAPI EFIAPI
FvbProtocolGetAttributes ( FvbProtocolGetAttributes (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 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 EFIAPI
FvbProtocolSetAttributes ( FvbProtocolSetAttributes (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
) )
/*++ /*++

View File

@ -102,7 +102,7 @@ FvbEraseBlock (
EFI_STATUS EFI_STATUS
FvbSetVolumeAttributes ( FvbSetVolumeAttributes (
IN UINTN Instance, IN UINTN Instance,
IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes, IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
IN ESAL_FWB_GLOBAL *Global, IN ESAL_FWB_GLOBAL *Global,
IN BOOLEAN Virtual IN BOOLEAN Virtual
) )
@ -111,7 +111,7 @@ FvbSetVolumeAttributes (
EFI_STATUS EFI_STATUS
FvbGetVolumeAttributes ( FvbGetVolumeAttributes (
IN UINTN Instance, IN UINTN Instance,
OUT EFI_FVB_ATTRIBUTES_2 *Attributes, OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
IN ESAL_FWB_GLOBAL *Global, IN ESAL_FWB_GLOBAL *Global,
IN BOOLEAN Virtual IN BOOLEAN Virtual
) )
@ -162,7 +162,7 @@ EFI_STATUS
EFIAPI EFIAPI
FvbProtocolGetAttributes ( FvbProtocolGetAttributes (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 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 EFIAPI
FvbProtocolSetAttributes ( FvbProtocolSetAttributes (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 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 EFIAPI
FvbProtocolGetPhysicalAddress ( FvbProtocolGetPhysicalAddress (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
OUT EFI_PHYSICAL_ADDRESS *Address OUT EFI_PHYSICAL_ADDRESS *Address
) )
; ;

View File

@ -34,7 +34,8 @@ EFI_STATUS
(EFIAPI *UNIX_FWH_INFORMATION) ( (EFIAPI *UNIX_FWH_INFORMATION) (
IN UINTN Index, IN UINTN Index,
IN OUT EFI_PHYSICAL_ADDRESS *FdBase, 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. Index - Which FD, starts at zero.
FdSize - Size of the FD in bytes FdSize - Size of the FD in bytes
FdBase - Start address of the FD. Assume it points to an FV Header FdBase - Start address of the FD. Assume it points to an FV Header
FixUp - Difference between actual FD address and build address
Returns: Returns:
EFI_SUCCESS - Return the Base address and size of the FV EFI_SUCCESS - Return the Base address and size of the FV

View File

@ -62,11 +62,80 @@ Abstract:
#include <utime.h> #include <utime.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <ucontext.h>
#include <Base.h> #include <Base.h>
#include <Library/PeCoffLib.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 \ #define EFI_UNIX_THUNK_PROTOCOL_GUID \
{ \ { \
0xf2e98868, 0x8985, 0x11db, {0x9a, 0x59, 0x00, 0x40, 0xd0, 0x2b, 0x18, 0x35 } \ 0xf2e98868, 0x8985, 0x11db, {0x9a, 0x59, 0x00, 0x40, 0xd0, 0x2b, 0x18, 0x35 } \
@ -115,8 +184,8 @@ typedef
int int
(*UnixOpen) (const char *name, int flags, int mode); (*UnixOpen) (const char *name, int flags, int mode);
typedef typedef
long int off_t
(*UnixSeek) (int fd, long int off, int whence); (*UnixSeek) (int fd, off_t off, int whence);
typedef typedef
int int
(*UnixFtruncate) (int fd, long int len); (*UnixFtruncate) (int fd, long int len);
@ -150,7 +219,7 @@ int
(*UnixCloseDir)(DIR *dir); (*UnixCloseDir)(DIR *dir);
typedef typedef
int int
(*UnixStat)(const char *path, struct stat *buf); (*UnixStat)(const char *path, STAT_FIX *buf);
typedef typedef
int int
(*UnixStatFs)(const char *path, struct statfs *buf); (*UnixStatFs)(const char *path, struct statfs *buf);
@ -213,7 +282,7 @@ int
(*UnixTcsetattr) (int __fd, int __optional_actions, (*UnixTcsetattr) (int __fd, int __optional_actions,
__const struct termios *__termios_p); __const struct termios *__termios_p);
typedef typedef
VOID * VOID *
(*UnixDlopen) (const char *FileName, int Flag); (*UnixDlopen) (const char *FileName, int Flag);
@ -230,20 +299,20 @@ VOID *
// Work functions to enable source level debug in the emulator // Work functions to enable source level debug in the emulator
// //
typedef typedef
RETURN_STATUS RETURN_STATUS
(EFIAPI *UnixPeCoffGetEntryPoint) ( (EFIAPI *UnixPeCoffGetEntryPoint) (
IN VOID *Pe32Data, IN VOID *Pe32Data,
IN OUT VOID **EntryPoint IN OUT VOID **EntryPoint
); );
typedef typedef
VOID VOID
(EFIAPI *UnixPeCoffRelocateImageExtraAction) ( (EFIAPI *UnixPeCoffRelocateImageExtraAction) (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
); );
typedef typedef
VOID VOID
(EFIAPI *UnixPeCoffLoaderUnloadImageExtraAction) ( (EFIAPI *UnixPeCoffLoaderUnloadImageExtraAction) (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext

View File

@ -87,7 +87,7 @@ PeCoffLoaderRelocateImageExtraAction (
if (mUnix == NULL) { if (mUnix == NULL) {
UnixPeCoffGetUnixThunkStucture (); UnixPeCoffGetUnixThunkStucture ();
} }
mUnix->PeCoffRelocateImageExtraAction (ImageContext); mUnix->PeCoffRelocateImageExtraAction (ImageContext);
} }

418
UnixPkg/Sec/Gasket.c Normal file
View File

@ -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);
}

141
UnixPkg/Sec/Gasket.h Normal file
View File

@ -0,0 +1,141 @@
#ifndef _GASKET_H_
#define _GASKET_H_
#include <Library/PeCoffLib.h>
#include <Protocol/UgaDraw.h>
#include <Protocol/SimpleTextIn.h>
#include <Protocol/UnixUgaIo.h>
//
// Gasket functions for EFI_UNIX_THUNK_PROTOCOL
//
void GasketmsSleep (unsigned long Milliseconds);
void Gasketexit (int status);
void GasketSetTimer (UINT64 PeriodMs, VOID (*CallBack)(UINT64 DeltaMs));
void GasketGetLocalTime (EFI_TIME *Time);
struct tm *Gasketgmtime (const time_t *clock);
long GasketGetTimeZone (void);
int GasketGetDayLight (void);
int Gasketpoll (struct pollfd *pfd, int nfds, int timeout);
int Gasketread (int fd, void *buf, int count);
int Gasketwrite (int fd, const void *buf, int count);
char *Gasketgetenv (const char *name);
int Gasketopen (const char *name, int flags, int mode);
off_t Gasketlseek (int fd, off_t off, int whence);
int Gasketftruncate (int fd, long int len);
int Gasketclose (int fd);
int Gasketmkdir (const char *pathname, mode_t mode);
int Gasketrmdir (const char *pathname);
int Gasketunlink (const char *pathname);
int GasketGetErrno (void);
DIR *Gasketopendir (const char *pathname);
void *Gasketrewinddir (DIR *dir);
struct dirent *Gasketreaddir (DIR *dir);
int Gasketclosedir (DIR *dir);
int Gasketstat (const char *path, STAT_FIX *buf);
int Gasketstatfs (const char *path, struct statfs *buf);
int Gasketrename (const char *oldpath, const char *newpath);
time_t Gasketmktime (struct tm *tm);
int Gasketfsync (int fd);
int Gasketchmod (const char *path, mode_t mode);
int Gasketutime (const char *filename, const struct utimbuf *buf);
int Gaskettcflush (int fildes, int queue_selector);
EFI_STATUS GasketUgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);
void Gasketperror (__const char *__s);
//
// ... is always an int or pointer to device specific data structure
//
int Gasketioctl (int fd, unsigned long int __request, ...);
int Gasketfcntl (int __fd, int __cmd, ...);
int Gasketcfsetispeed (struct termios *__termios_p, speed_t __speed);
int Gasketcfsetospeed (struct termios *__termios_p, speed_t __speed);
int Gaskettcgetattr (int __fd, struct termios *__termios_p);
int Gaskettcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p);
int Gasketsigaction (int sig, const struct sigaction *act, struct sigaction *oact);
int Gasketsetcontext (const ucontext_t *ucp);
int Gasketgetcontext (ucontext_t *ucp);
int Gasketsigemptyset (sigset_t *set);
int Gasketsigaltstack (const stack_t *ss, stack_t *oss);
RETURN_STATUS
GasketUnixPeCoffGetEntryPoint (
IN VOID *Pe32Data,
IN OUT VOID **EntryPoint
);
VOID
GasketUnixPeCoffRelocateImageExtraAction (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
);
VOID
GasketPeCoffLoaderUnloadImageExtraAction (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
);
int GasketVoid (void *api);
int GasketUintn (void *api, UINTN a);
int GasketUintnUintn (void *api, UINTN a, UINTN b);
int GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c);
int GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d);
int GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j);
int GasketUint64Uintn (void *api, UINT64 a, UINTN b);
UINT64 GasketUintnUint64Uintn (void *api, UINTN a, UINT64 b, UINTN c);
int GasketUintnUint16 (void *api, UINTN a, UINT16 b);
//
// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
//
EFI_STATUS EFIAPI GasketUgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
EFI_STATUS EFIAPI GasketUgaSize (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
EFI_STATUS EFIAPI GasketUgaCheckKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
EFI_STATUS EFIAPI GasketUgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
EFI_STATUS EFIAPI GasketUgaBlt (
EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
IN EFI_UGA_BLT_OPERATION BltOperation,
IN UINTN SourceX,
IN UINTN SourceY,
IN UINTN DestinationX,
IN UINTN DestinationY,
IN UINTN Width,
IN UINTN Height,
IN UINTN Delta OPTIONAL
);
EFI_STATUS UgaCreate (EFI_UNIX_UGA_IO_PROTOCOL **Uga, CONST CHAR16 *Title);
//
// Gasket functions for EFI_UNIX_UGA_IO_PROTOCOL
//
EFI_STATUS UgaClose (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
EFI_STATUS UgaSize(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, UINT32 Width, UINT32 Height);
EFI_STATUS UgaCheckKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo);
EFI_STATUS UgaGetKey (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo, EFI_INPUT_KEY *key);
EFI_STATUS UgaBlt (EFI_UNIX_UGA_IO_PROTOCOL *UgaIo,
IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
IN EFI_UGA_BLT_OPERATION BltOperation,
IN UINTN SourceX,
IN UINTN SourceY,
IN UINTN DestinationX,
IN UINTN DestinationY,
IN UINTN Width,
IN UINTN Height,
IN UINTN Delta OPTIONAL
);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,142 @@
/** @file
Template file used to create Gasket.S
This file is built on the command line via gcc GasketTemplate.c -S
and it will create GasketTemplate.s and this was used to create
Gasket.S. You still have to add the extra stack alignment code to
the assembly functions.
Copyright (c) 2006 - 2009, Intel Corporation<BR>
Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR>
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include <stdint.h>
#include <sys/stat.h>
typedef int8_t INT8;
typedef uint8_t UINT8;
typedef int16_t INT16;
typedef uint16_t UINT16;
typedef int32_t INT32;
typedef uint32_t UINT32;
typedef int64_t INT64;
typedef uint64_t UINT64;
typedef UINT32 UINTN;
typedef int (*GASKET_VOID) ();
typedef int (*GASKET_UINTN) (UINTN);
typedef int (*GASKET_UINTN_UINTN) (UINTN, UINTN);
typedef int (*GASKET_UINTN_UINTN_UINTN) (UINTN, UINTN, UINTN);
typedef int (*GASKET_UINTN_UINTN_UINTN_UINTN) (UINTN, UINTN, UINTN, UINTN);
typedef int (*GASKET_UINTN_10ARGS) (UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN, UINTN);
typedef int (*GASKET_UINT64_UINTN) (UINT64, UINTN);
typedef UINT64 (*GASKET_UINTN_UINT64_UINTN) (UINTN, UINT64, UINTN);
typedef int (*GASKET_UINTN_UINT16) (UINTN, UINT16);
int GasketVoid (void *api);
int GasketUintn (void *api, UINTN a);
int GasketUintnUintn (void *api, UINTN a, UINTN b);
int GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c);
int GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d);
int GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j);
int GasketUint64Uintn (void *api, UINT64 a, UINTN b);
UINT64 GasketUintnUiny64Uintn (void *api, UINTN a, UINT64 b, UINTN c);
int GasketUintnUint16 (void *api, UINTN a, UINT16 b);
int
GasketVoid (void *api)
{
GASKET_VOID func;
func = (GASKET_VOID)api;
return func ();
}
int
GasketUintn (void *api, UINTN a)
{
GASKET_UINTN func;
func = (GASKET_UINTN)api;
return func (a);
}
int
GasketUintnUintn (void *api, UINTN a, UINTN b)
{
GASKET_UINTN_UINTN func;
func = (GASKET_UINTN_UINTN)api;
return func (a, b);
}
int
GasketUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c)
{
GASKET_UINTN_UINTN_UINTN func;
func = (GASKET_UINTN_UINTN_UINTN)api;
return func (a, b, c);
}
int
GasketUintnUintnUintnUintn (void *api, UINTN a, UINTN b, UINTN c, UINTN d)
{
GASKET_UINTN_UINTN_UINTN_UINTN func;
func = (GASKET_UINTN_UINTN_UINTN_UINTN)api;
return func (a, b, c, d);
}
int
GasketUintn10Args (void *api, UINTN a, UINTN b, UINTN c, UINTN d, UINTN e, UINTN f, UINTN g, UINTN h, UINTN i, UINTN j)
{
GASKET_UINTN_10ARGS func;
func = (GASKET_UINTN_10ARGS)api;
return func (a, b, c, d, e, f, g, h, i, j);
}
int
GasketUint64Uintn (void *api, UINT64 a, UINTN b)
{
GASKET_UINT64_UINTN func;
func = (GASKET_UINT64_UINTN)api;
return func (a, b);
}
UINT64
GasketUintnUiny64Uintn (void *api, UINTN a, UINT64 b, UINTN c)
{
GASKET_UINTN_UINT64_UINTN func;
func = (GASKET_UINTN_UINT64_UINTN)api;
return func (a, b, c);
}
int
GasketUintnUint16 (void *api, UINTN a, UINT16 b)
{
GASKET_UINTN_UINT16 func;
func = (GASKET_UINTN_UINT16)api;
return func (a, b);
}

View File

@ -89,7 +89,6 @@ EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
&mSecTemporaryRamSupportPpi &mSecTemporaryRamSupportPpi
}, },
{ {
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
&gUnixFwhPpiGuid, &gUnixFwhPpiGuid,
&mSecFwhInformationPpi &mSecFwhInformationPpi
@ -142,6 +141,7 @@ MapFile (
IN OUT EFI_PHYSICAL_ADDRESS *BaseAddress, IN OUT EFI_PHYSICAL_ADDRESS *BaseAddress,
OUT UINT64 *Length OUT UINT64 *Length
); );
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SecNt32PeCoffRelocateImage ( SecNt32PeCoffRelocateImage (
@ -200,7 +200,7 @@ Returns:
// symbols when we load every PE/COFF image. // symbols when we load every PE/COFF image.
// //
Index = strlen (*Argv); Index = strlen (*Argv);
gGdbWorkingFileName = malloc (Index + strlen(".gdb")); gGdbWorkingFileName = malloc (Index + strlen(".gdb") + 1);
strcpy (gGdbWorkingFileName, *Argv); strcpy (gGdbWorkingFileName, *Argv);
strcat (gGdbWorkingFileName, ".gdb"); strcat (gGdbWorkingFileName, ".gdb");
#endif #endif
@ -783,6 +783,12 @@ Returns:
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Status = PeCoffLoaderRelocateImage (&ImageContext);
if (EFI_ERROR (Status)) {
return Status;
}
SecPeCoffRelocateImageExtraAction (&ImageContext); SecPeCoffRelocateImageExtraAction (&ImageContext);
@ -823,7 +829,8 @@ EFIAPI
SecUnixFdAddress ( SecUnixFdAddress (
IN UINTN Index, IN UINTN Index,
IN OUT EFI_PHYSICAL_ADDRESS *FdBase, 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. Index - Which FD, starts at zero.
FdSize - Size of the FD in bytes FdSize - Size of the FD in bytes
FdBase - Start address of the FD. Assume it points to an FV Header FdBase - Start address of the FD. Assume it points to an FV Header
FixUp - Difference between actual FD address and build address
Returns: Returns:
EFI_SUCCESS - Return the Base address and size of the FV EFI_SUCCESS - Return the Base address and size of the FV
@ -848,11 +856,21 @@ Returns:
*FdBase = gFdInfo[Index].Address; *FdBase = gFdInfo[Index].Address;
*FdSize = gFdInfo[Index].Size; *FdSize = gFdInfo[Index].Size;
*FixUp = 0;
if (*FdBase == 0 && *FdSize == 0) { if (*FdBase == 0 && *FdSize == 0) {
return EFI_UNSUPPORTED; 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; return EFI_SUCCESS;
} }
@ -1109,13 +1127,6 @@ SecPeCoffRelocateImageExtraAction (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
) )
{ {
EFI_STATUS Status;
Status = PeCoffLoaderRelocateImage (ImageContext);
if (EFI_ERROR (Status)) {
PrintLoadAddress (ImageContext);
return;
}
#ifdef __APPLE__ #ifdef __APPLE__
PrintLoadAddress (ImageContext); PrintLoadAddress (ImageContext);
@ -1186,10 +1197,10 @@ SecPeCoffRelocateImageExtraAction (
(unsigned long)ImageContext->ImageAddress, (unsigned long)ImageContext->ImageAddress,
(unsigned long)ImageContext->EntryPoint); (unsigned long)ImageContext->EntryPoint);
Handle = dlopen(ImageContext->PdbPointer, RTLD_NOW); Handle = dlopen (ImageContext->PdbPointer, RTLD_NOW);
if (Handle) { if (Handle) {
Entry = dlsym(Handle, "_ModuleEntryPoint"); Entry = dlsym (Handle, "_ModuleEntryPoint");
} else { } else {
printf("%s\n", dlerror()); printf("%s\n", dlerror());
} }

View File

@ -157,9 +157,9 @@ EFI_STATUS
EFIAPI EFIAPI
SecPeiReportStatusCode ( SecPeiReportStatusCode (
IN CONST EFI_PEI_SERVICES **PeiServices, IN CONST EFI_PEI_SERVICES **PeiServices,
IN EFI_STATUS_CODE_TYPE CodeType, IN EFI_STATUS_CODE_TYPE CodeType,
IN EFI_STATUS_CODE_VALUE Value, IN EFI_STATUS_CODE_VALUE Value,
IN UINT32 Instance, IN UINT32 Instance,
IN CONST EFI_GUID *CallerId, IN CONST EFI_GUID *CallerId,
IN CONST EFI_STATUS_CODE_DATA *Data OPTIONAL IN CONST EFI_STATUS_CODE_DATA *Data OPTIONAL
) )
@ -390,25 +390,9 @@ EFIAPI
SecUnixFdAddress ( SecUnixFdAddress (
IN UINTN Index, IN UINTN Index,
IN OUT EFI_PHYSICAL_ADDRESS *FdBase, 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 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; extern EFI_UNIX_THUNK_PROTOCOL *gUnix;

View File

@ -36,6 +36,7 @@
UnixThunk.c UnixThunk.c
FwVol.c FwVol.c
SecMain.c SecMain.c
Gasket.c
[Sources.Ia32] [Sources.Ia32]
Ia32/Gasket.S Ia32/Gasket.S
@ -71,6 +72,7 @@
gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareVolume gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareVolume
gEfiUnixPkgTokenSpaceGuid.PcdUnixMemorySizeForSecMain gEfiUnixPkgTokenSpaceGuid.PcdUnixMemorySizeForSecMain
gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareFdSize gEfiUnixPkgTokenSpaceGuid.PcdUnixFirmwareFdSize
gEfiUnixPkgTokenSpaceGuid.PcdUnixFdBaseAddress
[BuildOptions.common] [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 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 # 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_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 XCODE:*_*_IA32_ASM_FLAGS == -arch i386 -g

View File

@ -123,19 +123,17 @@ TryCreateShmImage(UGA_IO_PRIVATE *drv)
drv->xshm_info.shmid = shmget drv->xshm_info.shmid = shmget
(IPC_PRIVATE, drv->image->bytes_per_line * drv->image->height, (IPC_PRIVATE, drv->image->bytes_per_line * drv->image->height,
IPC_CREAT | 0777); IPC_CREAT | 0777);
if (drv->xshm_info.shmid < 0) if (drv->xshm_info.shmid < 0) {
{ XDestroyImage(drv->image);
XDestroyImage(drv->image); return 0;
return 0; }
}
drv->image_data = shmat (drv->xshm_info.shmid, NULL, 0); drv->image_data = shmat (drv->xshm_info.shmid, NULL, 0);
if(!drv->image_data) if(!drv->image_data) {
{ shmctl (drv->xshm_info.shmid, IPC_RMID, NULL);
shmctl (drv->xshm_info.shmid, IPC_RMID, NULL); XDestroyImage(drv->image);
XDestroyImage(drv->image); return 0;
return 0; }
}
#ifndef __APPLE__ #ifndef __APPLE__
// //
@ -149,12 +147,11 @@ TryCreateShmImage(UGA_IO_PRIVATE *drv)
drv->xshm_info.shmaddr = (char*)drv->image_data; drv->xshm_info.shmaddr = (char*)drv->image_data;
drv->image->data = (char*)drv->image_data; drv->image->data = (char*)drv->image_data;
if (!XShmAttach (drv->display, &drv->xshm_info)) if (!XShmAttach (drv->display, &drv->xshm_info)) {
{ shmdt (drv->image_data);
shmdt (drv->image_data); XDestroyImage(drv->image);
XDestroyImage(drv->image); return 0;
return 0; }
}
return 1; return 1;
} }
@ -386,7 +383,7 @@ UgaCheckKey(EFI_UNIX_UGA_IO_PROTOCOL *UgaIo)
} }
EFI_STATUS 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; UGA_IO_PRIVATE *drv = (UGA_IO_PRIVATE *)UgaIo;
EFI_STATUS status; EFI_STATUS status;

View File

@ -36,6 +36,10 @@ Abstract:
#include "Uefi.h" #include "Uefi.h"
#include "Library/UnixLib.h" #include "Library/UnixLib.h"
#ifdef __APPLE__
#include "Gasket.h"
#endif
int settimer_initialized; int settimer_initialized;
struct timeval settimer_timeval; struct timeval settimer_timeval;
void (*settimer_callback)(UINT64 delta); void (*settimer_callback)(UINT64 delta);
@ -150,74 +154,6 @@ GetErrno(void)
return errno; 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 extern EFI_STATUS
UgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title); UgaCreate(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo, CONST CHAR16 *Title);
@ -303,7 +239,7 @@ EFI_UNIX_THUNK_PROTOCOL mUnixThunkTable = {
rewinddir, rewinddir,
readdir, readdir,
closedir, closedir,
stat, (UnixStat)stat,
statfs, statfs,
rename, rename,
mktime, mktime,

1026
UnixPkg/Sec/X64/Gasket.S Normal file

File diff suppressed because it is too large Load Diff

View File

@ -774,12 +774,9 @@ Returns:
// //
// Open the device // Open the device
// //
Private->fd = Private->UnixThunk->Open Private->fd = Private->UnixThunk->Open (Private->Filename, Private->Mode, 0644);
(Private->Filename, Private->Mode, 0644);
if (Private->fd < 0) { if (Private->fd < 0) {
DEBUG ((EFI_D_INFO, "PlOpenBlock: Could not open %s\n", DEBUG ((EFI_D_INFO, "PlOpenBlock: Could not open %a\n", Private->Filename));
Private->Filename));
BlockIo->Media->MediaPresent = FALSE; BlockIo->Media->MediaPresent = FALSE;
Status = EFI_NO_MEDIA; Status = EFI_NO_MEDIA;
goto Done; goto Done;
@ -798,16 +795,17 @@ Returns:
// get the size of the file // get the size of the file
// //
Status = SetFilePointer64 (Private, 0, &FileSize, SEEK_END); Status = SetFilePointer64 (Private, 0, &FileSize, SEEK_END);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
FileSize = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize); 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; Status = EFI_UNSUPPORTED;
goto Done; goto Done;
} }
if (Private->NumberOfBlocks == 0) { if (Private->NumberOfBlocks == 0) {
Private->NumberOfBlocks = DivU64x32 (FileSize, Private->BlockSize); Private->NumberOfBlocks = DivU64x32 (FileSize, Private->BlockSize);
Private->LastBlock = Private->NumberOfBlocks - 1;
Private->Media.LastBlock = Private->LastBlock;
} }
EndOfFile = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize); EndOfFile = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);
@ -829,7 +827,7 @@ Returns:
Private->UnixThunk->FTruncate (Private->fd, EndOfFile); 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; Status = EFI_SUCCESS;
Done: Done:

View File

@ -269,7 +269,7 @@ Returns:
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
} }
// //
// Close protocol, don't use device path protocol in the Support() function // Close protocol, don't use device path protocol in the Support() function
// //
gBS->CloseProtocol ( gBS->CloseProtocol (

View File

@ -50,8 +50,9 @@ Returns:
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor; EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;
UNIX_FWH_PPI *FwhPpi; UNIX_FWH_PPI *FwhPpi;
EFI_PHYSICAL_ADDRESS FdBase; EFI_PHYSICAL_ADDRESS FdBase;
EFI_PHYSICAL_ADDRESS FdFixUp;
EFI_FIRMWARE_VOLUME_HEADER *FvHeader; EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
UINT64 FdSize; UINT64 FdSize;
UINTN Index; UINTN Index;
@ -75,7 +76,7 @@ Returns:
// //
// Get information about all the FD's in the system // 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)) { if (!EFI_ERROR (Status)) {
// //
// Assume the FD starts with an FV header // Assume the FD starts with an FV header
@ -116,7 +117,7 @@ Returns:
PcdGet32 (PcdFlashNvStorageFtwSpareSize) + PcdGet32 (PcdFlashNvStorageFtwSpareSize) +
PcdGet32 (PcdUnixFlashNvStorageEventLogSize); PcdGet32 (PcdUnixFlashNvStorageEventLogSize);
BuildFvHob (FdBase + PcdGet32 (PcdUnixFlashNvStorageVariableBase), FdSize); BuildFvHob (FdFixUp + PcdGet32 (PcdUnixFlashNvStorageVariableBase), FdSize);
} else { } else {
// //
// For other FD's just map them in. // For other FD's just map them in.

View File

@ -57,9 +57,10 @@ Returns:
// TODO: EFI_SUCCESS - add return value to function comment // TODO: EFI_SUCCESS - add return value to function comment
{ {
EFI_STATUS Status; EFI_STATUS Status;
UNIX_FWH_PPI *UnixFwhPpi; UNIX_FWH_PPI *UnixFwhPpi;
EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor; EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;
EFI_PHYSICAL_ADDRESS FdBase; EFI_PHYSICAL_ADDRESS FdBase;
EFI_PHYSICAL_ADDRESS FdFixUp;
UINT64 FdSize; UINT64 FdSize;
DEBUG ((EFI_D_ERROR, "NT 32 Flash Map PEIM Loaded\n")); DEBUG ((EFI_D_ERROR, "NT 32 Flash Map PEIM Loaded\n"));
@ -78,14 +79,14 @@ Returns:
// //
// Assume that FD0 contains the Flash map. // Assume that FD0 contains the Flash map.
// //
Status = UnixFwhPpi->UnixFwh (0, &FdBase, &FdSize); Status = UnixFwhPpi->UnixFwh (0, &FdBase, &FdSize, &FdFixUp);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
PcdSet32 (PcdFlashNvStorageVariableBase, PcdGet32 (PcdUnixFlashNvStorageVariableBase) + (UINT32) FdBase); PcdSet32 (PcdFlashNvStorageVariableBase, PcdGet32 (PcdUnixFlashNvStorageVariableBase) + (UINT32)FdFixUp);
PcdSet32 (PcdFlashNvStorageFtwWorkingBase, PcdGet32 (PcdUnixFlashNvStorageFtwWorkingBase) + (UINT32) FdBase); PcdSet32 (PcdFlashNvStorageFtwWorkingBase, PcdGet32 (PcdUnixFlashNvStorageFtwWorkingBase) + (UINT32)FdFixUp);
PcdSet32 (PcdFlashNvStorageFtwSpareBase, PcdGet32 (PcdUnixFlashNvStorageFtwSpareBase) + (UINT32) FdBase); PcdSet32 (PcdFlashNvStorageFtwSpareBase, PcdGet32 (PcdUnixFlashNvStorageFtwSpareBase) + (UINT32)FdFixUp);
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -25,8 +25,13 @@
# #
################################################################################ ################################################################################
[FD.Fv_Recovery] [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 ErasePolarity = 1
BlockSize = 0x10000 BlockSize = 0x10000
NumBlocks = 0x2a NumBlocks = 0x2a

View File

@ -836,7 +836,7 @@ OpenRoot:
NewPrivateFile->IsDirectoryPath = FALSE; NewPrivateFile->IsDirectoryPath = FALSE;
} }
} else { } else {
struct stat finfo; STAT_FIX finfo;
int res = NewPrivateFile->UnixThunk->Stat (NewPrivateFile->FileName, &finfo); int res = NewPrivateFile->UnixThunk->Stat (NewPrivateFile->FileName, &finfo);
if (res == 0 && S_ISDIR(finfo.st_mode)) if (res == 0 && S_ISDIR(finfo.st_mode))
NewPrivateFile->IsDirectoryPath = TRUE; NewPrivateFile->IsDirectoryPath = TRUE;
@ -1107,7 +1107,7 @@ Returns:
struct tm *tm; struct tm *tm;
tm = UnixThunk->GmTime (&SystemTime); tm = UnixThunk->GmTime (&SystemTime);
Time->Year = tm->tm_year; Time->Year = tm->tm_year;
Time->Month = tm->tm_mon; Time->Month = tm->tm_mon + 1;
Time->Day = tm->tm_mday; Time->Day = tm->tm_mday;
Time->Hour = tm->tm_hour; Time->Hour = tm->tm_hour;
Time->Minute = tm->tm_min; Time->Minute = tm->tm_min;
@ -1151,10 +1151,10 @@ Returns:
UINTN NameSize; UINTN NameSize;
UINTN ResultSize; UINTN ResultSize;
EFI_FILE_INFO *Info; EFI_FILE_INFO *Info;
CHAR8 *RealFileName; CHAR8 *RealFileName;
CHAR8 *TempPointer; CHAR8 *TempPointer;
CHAR16 *BufferFileName; CHAR16 *BufferFileName;
struct stat buf; STAT_FIX buf;
if (FileName != NULL) { if (FileName != NULL) {
RealFileName = FileName; RealFileName = FileName;
@ -1724,7 +1724,7 @@ Returns:
UINTN OldInfoSize; UINTN OldInfoSize;
EFI_TPL OldTpl; EFI_TPL OldTpl;
mode_t NewAttr; mode_t NewAttr;
struct stat OldAttr; STAT_FIX OldAttr;
CHAR8 *OldFileName; CHAR8 *OldFileName;
CHAR8 *NewFileName; CHAR8 *NewFileName;
CHAR8 *CharPointer; CHAR8 *CharPointer;

View File

@ -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

View File

@ -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;
};
}

View File

@ -0,0 +1,122 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 45;
objects = {
/* Begin PBXFileReference section */
F27EDBED101FA6FC0097B575 /* PciIoKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PciIoKit.h; path = ../../Sec/PciIoKit.h; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */
/* Begin PBXGroup section */
08FB7794FE84155DC02AAC07 /* xcode_project */ = {
isa = PBXGroup;
children = (
F27EDBED101FA6FC0097B575 /* PciIoKit.h */,
);
name = xcode_project;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXLegacyTarget section */
D28A88AD04BDD90700651E21 /* xcode_project */ = {
isa = PBXLegacyTarget;
buildArgumentsString = "$(ACTION)";
buildConfigurationList = 1DEB918F08733D9F0010E9CD /* Build configuration list for PBXLegacyTarget "xcode_project" */;
buildPhases = (
);
buildToolPath = ./XcodeBuild.sh;
buildWorkingDirectory = "";
dependencies = (
);
name = xcode_project;
passBuildSettingsInEnvironment = 1;
productName = xcode_project;
};
/* End PBXLegacyTarget section */
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 1DEB919308733D9F0010E9CD /* Build configuration list for PBXProject "xcode_project" */;
compatibilityVersion = "Xcode 3.1";
hasScannedForEncodings = 1;
mainGroup = 08FB7794FE84155DC02AAC07 /* xcode_project */;
projectDirPath = "";
projectRoot = "";
targets = (
D28A88AD04BDD90700651E21 /* xcode_project */,
);
};
/* End PBXProject section */
/* Begin XCBuildConfiguration section */
1DEB919008733D9F0010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = xcode_project;
};
name = Debug;
};
1DEB919108733D9F0010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = YES;
GCC_ENABLE_FIX_AND_CONTINUE = NO;
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
PRODUCT_NAME = xcode_project;
};
name = Release;
};
1DEB919408733D9F0010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
ONLY_ACTIVE_ARCH = YES;
PREBINDING = NO;
SDKROOT = macosx10.6;
};
name = Debug;
};
1DEB919508733D9F0010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PREBINDING = NO;
SDKROOT = macosx10.6;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
1DEB918F08733D9F0010E9CD /* Build configuration list for PBXLegacyTarget "xcode_project" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB919008733D9F0010E9CD /* Debug */,
1DEB919108733D9F0010E9CD /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
1DEB919308733D9F0010E9CD /* Build configuration list for PBXProject "xcode_project" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB919408733D9F0010E9CD /* Debug */,
1DEB919508733D9F0010E9CD /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
}

96
UnixPkg/build.sh Executable file
View File

@ -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 $?

View File

@ -20,6 +20,32 @@ UnixPkg is built with following command:
Notes: ELFGCC is defined in <Workspace>/Conf/tools_def.txt file. This tool chain use native gcc/binutil instead of Notes: ELFGCC is defined in <Workspace>/Conf/tools_def.txt file. This tool chain use native gcc/binutil instead of
cross-compiler like UNIXGCC tool chain. 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 FAQ
=== ===