Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
More trampolines.
  • Loading branch information
icculus committed Feb 16, 2013
1 parent f5f3078 commit d43f6ec
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 18 deletions.
35 changes: 30 additions & 5 deletions macelf/mactrampolines.c
Expand Up @@ -533,6 +533,16 @@ static int32_t **mactrampoline___ctype_toupper_loc(void)
return &ptoupper_array;
} // mactrampoline__ctype_toupper_loc

static int mactrampoline___ctype_tolower(int ch)
{
return tolower(ch);
} // mactrampoline___ctype_tolower

static int mactrampoline___ctype_toupper(int ch)
{
return toupper(ch);
} // mactrampoline___ctype_toupper

static const uint16_t **mactrampoline___ctype_b_loc(void)
{
STUBBED("write me");
Expand Down Expand Up @@ -1782,6 +1792,12 @@ static int mactrampoline_sigaction(int sig, const void/*struct sigaction*/ *lnxa
return -1;
} // mactrampoline_sigaction

static int mactrampoline_sigprocmask(int lnxhow, const sigset_t *set, sigset_t *oset)
{
const int machow = lnxhow-1; // these are all off by one between platforms at the moment.
return sigprocmask(machow, set, oset);
} // mactrampoline_sigprocmask

static int mactrampoline_fcvt_r(double number, int ndigits, int *decpt, int *sign, char *buf, size_t len)
{
STUBBED("this is wrong: not reentrant, wrong retval");
Expand Down Expand Up @@ -1838,16 +1854,17 @@ static int mactrampoline__setjmp(jmp_buf env)
return setjmp(env);
} // mactrampoline__setjmp

static void mactrampoline_longjmp(jmp_buf env, int val)
{
longjmp(env, val);
} // mactrampoline_longjmp

static void mactrampoline__longjmp(jmp_buf env, int val)
{
longjmp(env, val);
} // mactrampoline__longjmp

static int mactrampoline___sigsetjmp(jmp_buf env, int savemask)
{
return sigsetjmp(env, savemask);
} // mactrampoline___sigsetjmp


#define LINUX_SEM_FAILED ((sem_t *)0)

static sem_t *mactrampoline_sem_open(const char *name, int lnxflags, ...)
Expand Down Expand Up @@ -2239,6 +2256,12 @@ static int mactrampoline_pthread_rwlockattr_setpshared(void/*pthread_rwlockattr_
return pthread_rwlockattr_setpshared(*(pthread_rwlockattr_t **) lnxattr, pshared);
} // mactrampoline_pthread_rwlockattr_setpshared

static int mactrampoline_pthread_sigmask(int lnxhow, const sigset_t *set, sigset_t *oset)
{
STUBBED("need to convert errors to Linux values");
const int machow = lnxhow-1; // these are all off by one between Mac and Linux at the moment.
return pthread_sigmask(machow, set, oset);
} // mactrampoline_pthread_sigmask

// pthread_key_t is always uint32_t on Linux, it's uintptr_t on Mac OS X, so
// we need to keep an array of them and use the Linux half as the index.
Expand Down Expand Up @@ -2759,6 +2782,8 @@ int build_trampolines(void)
return insert_symbol("stderr", stderr) &&
insert_symbol("stdout", stdout) &&
insert_symbol("stdin", stdin) &&
insert_symbol("environ", environ) &&
insert_symbol("__environ", environ) &&
insert_symbol("program_invocation_name", program_invocation_name)
#define MACTRAMPOLINE(typ,fn,params,args,ret) \
&& (insert_symbol(#fn, mactrampoline_##fn))
Expand Down
34 changes: 21 additions & 13 deletions macelf/mactrampolines.h
Expand Up @@ -97,6 +97,8 @@ MACTRAMPOLINE_OVERRIDE(dcgettext)
MACTRAMPOLINE_OVERRIDE(__ctype_b_loc)
MACTRAMPOLINE_OVERRIDE(__ctype_tolower_loc)
MACTRAMPOLINE_OVERRIDE(__ctype_toupper_loc)
MACTRAMPOLINE_OVERRIDE(__ctype_tolower)
MACTRAMPOLINE_OVERRIDE(__ctype_toupper)
MACTRAMPOLINE_OVERRIDE(mbsinit)
MACTRAMPOLINE_OVERRIDE(setlocale)
MACTRAMPOLINE_OVERRIDE(nl_langinfo)
Expand All @@ -118,8 +120,8 @@ MACTRAMPOLINE_OVERRIDE(closedir)
MACTRAMPOLINE_OVERRIDE(__assert_fail)
MACTRAMPOLINE_OVERRIDE(waitpid)
MACTRAMPOLINE_OVERRIDE(_setjmp)
MACTRAMPOLINE_OVERRIDE(longjmp)
MACTRAMPOLINE_OVERRIDE(_longjmp)
MACTRAMPOLINE_OVERRIDE(__sigsetjmp)
MACTRAMPOLINE_OVERRIDE(stat)
MACTRAMPOLINE_OVERRIDE(lstat)
MACTRAMPOLINE_OVERRIDE(fstat)
Expand Down Expand Up @@ -192,12 +194,13 @@ MACTRAMPOLINE_OVERRIDE(pthread_rwlockattr_destroy)
MACTRAMPOLINE_OVERRIDE(pthread_rwlockattr_getpshared)
MACTRAMPOLINE_OVERRIDE(pthread_rwlockattr_init)
MACTRAMPOLINE_OVERRIDE(pthread_rwlockattr_setpshared)
MACTRAMPOLINE_OVERRIDE(pthread_sigmask)

//MACTRAMPOLINE_OVERRIDE(pthread_attr_getschedparam)
//MACTRAMPOLINE_OVERRIDE(pthread_attr_setschedparam)
//MACTRAMPOLINE_OVERRIDE(pthread_getschedparam)
//MACTRAMPOLINE(int,pthread_setschedparam,(pthread_t a, int b, const struct sched_param *c),(a,b,c),return)
//MACTRAMPOLINE(int,pthread_sigmask,(int a, const sigset_t *b, sigset_t *c),(a,b,c),return)


// These just work as-is (pthread_t matches closely enough).
// !!! FIXME: the errors need converting, though. :(
Expand Down Expand Up @@ -366,12 +369,18 @@ MACTRAMPOLINE_OVERRIDE(endmntent)
//MACTRAMPOLINE_OVERRIDE(hasmntopt)

MACTRAMPOLINE_OVERRIDE(sigaction)
MACTRAMPOLINE_OVERRIDE(sigprocmask)

MACTRAMPOLINE_OVERRIDE(dl_iterate_phdr)


// Things that map directly, with just some stack-aligning macro glue.

//MACTRAMPOLINE(void,_Exit,(int a),(a),)
MACTRAMPOLINE(int,setjmp,(jmp_buf a),(a),return)
MACTRAMPOLINE(void,longjmp,(jmp_buf a, int b),(a,b),)
MACTRAMPOLINE(int,sigsetjmp,(sigjmp_buf a, int b),(a,b),return)
MACTRAMPOLINE(void,siglongjmp,(sigjmp_buf a, int b),(a,b),)
MACTRAMPOLINE(long,a64l,(const char *a),(a),return)
MACTRAMPOLINE(void,abort,(void),(),)
MACTRAMPOLINE(int,abs,(int a),(a),return)
Expand Down Expand Up @@ -537,26 +546,26 @@ MACTRAMPOLINE(int,killpg,(pid_t a, int b),(a,b),return)
MACTRAMPOLINE(int,pthread_kill,(pthread_t a, int b),(a,b),return)
MACTRAMPOLINE(int,raise,(int a),(a),return)
//MACTRAMPOLINE(int,sigaction,(int a, const struct sigaction *b, struct sigaction *c),(a,b,c),return)
//MACTRAMPOLINE(int,sigaddset,(sigset_t *a, int b),(a,b),return)
// sigset_t is 32 bits on Mac OS X, but a massive array on Linux. Since it's opaque data, just use the first 32-bits of it.
MACTRAMPOLINE(int,sigaddset,(sigset_t *a, int b),(a,b),return)
//MACTRAMPOLINE(int,sigaltstack,(const stack_t *a, stack_t *b),(a,b),return)
//MACTRAMPOLINE(int,sigdelset,(sigset_t *a, int b),(a,b),return)
//MACTRAMPOLINE(int,sigemptyset,(sigset_t *a),(a),return)
//MACTRAMPOLINE(int,sigfillset,(sigset_t *a),(a),return)
MACTRAMPOLINE(int,sigdelset,(sigset_t *a, int b),(a,b),return)
MACTRAMPOLINE(int,sigemptyset,(sigset_t *a),(a),return)
MACTRAMPOLINE(int,sigfillset,(sigset_t *a),(a),return)
//MACTRAMPOLINE(int,sighold,(int a),(a),return)
//MACTRAMPOLINE(int,sigignore,(int a),(a),return)
//MACTRAMPOLINE(int,siginterrupt,(int a, int b),(a,b),return)
//MACTRAMPOLINE(int,sigismember,(const sigset_t *a, int b),(a,b),return)
MACTRAMPOLINE(int,sigismember,(const sigset_t *a, int b),(a,b),return)
MACTRAMPOLINE(void,signal,(int a, void(*b)(int)),(a,b),)
//MACTRAMPOLINE(int,sigpause,(int a),(a),return)
//MACTRAMPOLINE(int,sigpending,(sigset_t *a),(a),return)
//MACTRAMPOLINE(int,sigprocmask,(int a, const sigset_t *b, sigset_t *c),(a,b,c),return)
MACTRAMPOLINE(int,sigpending,(sigset_t *a),(a),return)
//MACTRAMPOLINE(int,sigqueue,(pid_t a, int b, const union sigval c),(a,b,c),return)
//MACTRAMPOLINE(int,sigrelse,(int a),(a),return)
//MACTRAMPOLINE(void,sigset,(int a, void(*)(int)))(int b),(a,b),)
//MACTRAMPOLINE(int,sigstack,(struct sigstack *a, struct sigstack *b),(a,b),return)
//MACTRAMPOLINE(int,sigsuspend,(const sigset_t *a),(a),return)
MACTRAMPOLINE(int,sigsuspend,(const sigset_t *a),(a),return)
//MACTRAMPOLINE(int,sigtimedwait,(const sigset_t *a, siginfo_t *b, const struct timespec *c),(a,b,c),return)
//MACTRAMPOLINE(int,sigwait,(const sigset_t *a, int *b),(a,b),return)
MACTRAMPOLINE(int,sigwait,(const sigset_t *a, int *b),(a,b),return)
//MACTRAMPOLINE(int,sigwaitinfo,(const sigset_t *a, siginfo_t *b),(a,b),return)
//MACTRAMPOLINE(int,isastream,(int a),(a),return)
//MACTRAMPOLINE(int,getmsg,(int a, struct strbuf *b, struct strbuf *c, int *d),(a,b,c,d),return)
Expand Down Expand Up @@ -1112,7 +1121,7 @@ MACTRAMPOLINE(int,getpriority,(int a, id_t b),(a,b),return)
// !!! FIXME: we don't have RUSAGE_THREAD on Mac OS X.
MACTRAMPOLINE(int,getrusage,(int a, struct rusage *b),(a,b),return)
MACTRAMPOLINE(int,setpriority,(int a, id_t b, int c),(a,b,c),return)
//MACTRAMPOLINE(int,pselect,(int a, fd_set *b, fd_set *c, fd_set *d, const struct timespec *e, const sigset_t *f),(a,b,c,d,e,f),return)
MACTRAMPOLINE(int,pselect,(int a, fd_set *b, fd_set *c, fd_set *d, const struct timespec *e, const sigset_t *f),(a,b,c,d,e,f),return)
MACTRAMPOLINE(int,select,(int a, fd_set *b, fd_set *c, fd_set *d, struct timeval *e),(a,b,c,d,e),return)
//MACTRAMPOLINE(int,getitimer,(int a, struct itimerval *b),(a,b),return)
//MACTRAMPOLINE(int,setitimer,(int a, const struct itimerval *b, struct itimerval *c),(a,b,c),return)
Expand Down Expand Up @@ -1211,7 +1220,6 @@ MACTRAMPOLINE(int,ungetc,(int a, FILE *b),(a,b),return)
//MACTRAMPOLINE(struct group*,getgrent,(void),(),return)
//MACTRAMPOLINE(void,endgrent,(void),(),)
//MACTRAMPOLINE(void,setgrent,(void),(),)
//MACTRAMPOLINE(void,siglongjmp,(sigjmp_buf a, int b),(a,b),)
//MACTRAMPOLINE(int,posix_spawnattr_destroy,(posix_spawnattr_t *a),(a),return)
//MACTRAMPOLINE(int,posix_spawnattr_getsigdefault,(const posix_spawnattr_t *a, sigset_t *b),(a,b),return)
//MACTRAMPOLINE(int,posix_spawnattr_getflags,(const posix_spawnattr_t *a, short *b),(a,b),return)
Expand Down

0 comments on commit d43f6ec

Please sign in to comment.