1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

research st: refine the md.h

This commit is contained in:
winlin 2014-11-05 17:42:57 +08:00
parent 856ba07bd3
commit 0f293802c8

View file

@ -57,7 +57,6 @@
/***************************************** /*****************************************
* Platform specifics * Platform specifics
*/ */
#if defined (AIX) #if defined (AIX)
#define MD_STACK_GROWS_DOWN #define MD_STACK_GROWS_DOWN
#define MD_USE_SYSV_ANON_MMAP #define MD_USE_SYSV_ANON_MMAP
@ -86,539 +85,518 @@
return (rt.tb_high * 1000000LL + rt.tb_low / 1000) return (rt.tb_high * 1000000LL + rt.tb_low / 1000)
#elif defined (CYGWIN) #elif defined (CYGWIN)
#define MD_STACK_GROWS_DOWN #define MD_STACK_GROWS_DOWN
#define MD_USE_BSD_ANON_MMAP #define MD_USE_BSD_ANON_MMAP
#define MD_ACCEPT_NB_NOT_INHERITED #define MD_ACCEPT_NB_NOT_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT #define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_SETJMP(env) setjmp(env) #define MD_SETJMP(env) setjmp(env)
#define MD_LONGJMP(env, val) longjmp(env, val) #define MD_LONGJMP(env, val) longjmp(env, val)
#define MD_JB_SP 7 #define MD_JB_SP 7
#define MD_GET_SP(_t) (_t)->context[MD_JB_SP] #define MD_GET_SP(_t) (_t)->context[MD_JB_SP]
#define MD_INIT_CONTEXT(_thread, _sp, _main) \ #define MD_INIT_CONTEXT(_thread, _sp, _main) \
ST_BEGIN_MACRO \ ST_BEGIN_MACRO \
if (MD_SETJMP((_thread)->context)) \ if (MD_SETJMP((_thread)->context)) \
_main(); \ _main(); \
MD_GET_SP(_thread) = (long) (_sp); \ MD_GET_SP(_thread) = (long) (_sp); \
ST_END_MACRO ST_END_MACRO
#define MD_GET_UTIME() \ #define MD_GET_UTIME() \
struct timeval tv; \ struct timeval tv; \
(void) gettimeofday(&tv, NULL); \ (void) gettimeofday(&tv, NULL); \
return (tv.tv_sec * 1000000LL + tv.tv_usec) return (tv.tv_sec * 1000000LL + tv.tv_usec)
#elif defined (DARWIN) #elif defined (DARWIN)
#define MD_STACK_GROWS_DOWN
#define MD_USE_BSD_ANON_MMAP
#define MD_ACCEPT_NB_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_HAVE_SOCKLEN_T
#define MD_STACK_GROWS_DOWN #define MD_SETJMP(env) _setjmp(env)
#define MD_USE_BSD_ANON_MMAP #define MD_LONGJMP(env, val) _longjmp(env, val)
#define MD_ACCEPT_NB_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_HAVE_SOCKLEN_T
#define MD_SETJMP(env) _setjmp(env) #if defined(__ppc__)
#define MD_LONGJMP(env, val) _longjmp(env, val) #define MD_JB_SP 0
#elif defined(__i386__)
#define MD_JB_SP 9
#elif defined(__x86_64__)
#define MD_JB_SP 4
#else
#error Unknown CPU architecture
#endif
#if defined(__ppc__) #define MD_INIT_CONTEXT(_thread, _sp, _main) \
#define MD_JB_SP 0 ST_BEGIN_MACRO \
#elif defined(__i386__) if (MD_SETJMP((_thread)->context)) \
#define MD_JB_SP 9 _main(); \
#elif defined(__x86_64__) *((long *)&((_thread)->context[MD_JB_SP])) = (long) (_sp); \
#define MD_JB_SP 4 ST_END_MACRO
#else
#error Unknown CPU architecture
#endif
#define MD_INIT_CONTEXT(_thread, _sp, _main) \ #define MD_GET_UTIME() \
ST_BEGIN_MACRO \ struct timeval tv; \
if (MD_SETJMP((_thread)->context)) \ (void) gettimeofday(&tv, NULL); \
_main(); \ return (tv.tv_sec * 1000000LL + tv.tv_usec)
*((long *)&((_thread)->context[MD_JB_SP])) = (long) (_sp); \
ST_END_MACRO
#define MD_GET_UTIME() \
struct timeval tv; \
(void) gettimeofday(&tv, NULL); \
return (tv.tv_sec * 1000000LL + tv.tv_usec)
#elif defined (FREEBSD) #elif defined (FREEBSD)
#define MD_STACK_GROWS_DOWN
#define MD_USE_BSD_ANON_MMAP
#define MD_ACCEPT_NB_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_STACK_GROWS_DOWN #define MD_SETJMP(env) _setjmp(env)
#define MD_USE_BSD_ANON_MMAP #define MD_LONGJMP(env, val) _longjmp(env, val)
#define MD_ACCEPT_NB_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_SETJMP(env) _setjmp(env) #if defined(__i386__)
#define MD_LONGJMP(env, val) _longjmp(env, val) #define MD_JB_SP 2
#elif defined(__alpha__)
#define MD_JB_SP 34
#elif defined(__amd64__)
#define MD_JB_SP 2
#else
#error Unknown CPU architecture
#endif
#if defined(__i386__) #define MD_INIT_CONTEXT(_thread, _sp, _main) \
#define MD_JB_SP 2 ST_BEGIN_MACRO \
#elif defined(__alpha__) if (MD_SETJMP((_thread)->context)) \
#define MD_JB_SP 34 _main(); \
#elif defined(__amd64__) (_thread)->context[0]._jb[MD_JB_SP] = (long) (_sp); \
#define MD_JB_SP 2 ST_END_MACRO
#else
#error Unknown CPU architecture
#endif
#define MD_INIT_CONTEXT(_thread, _sp, _main) \ #define MD_GET_UTIME() \
ST_BEGIN_MACRO \ struct timeval tv; \
if (MD_SETJMP((_thread)->context)) \ (void) gettimeofday(&tv, NULL); \
_main(); \ return (tv.tv_sec * 1000000LL + tv.tv_usec)
(_thread)->context[0]._jb[MD_JB_SP] = (long) (_sp); \
ST_END_MACRO
#define MD_GET_UTIME() \
struct timeval tv; \
(void) gettimeofday(&tv, NULL); \
return (tv.tv_sec * 1000000LL + tv.tv_usec)
#elif defined (HPUX) #elif defined (HPUX)
#define MD_STACK_GROWS_UP
#define MD_USE_BSD_ANON_MMAP
#define MD_ACCEPT_NB_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_STACK_GROWS_UP #define MD_SETJMP(env) _setjmp(env)
#define MD_USE_BSD_ANON_MMAP #define MD_LONGJMP(env, val) _longjmp(env, val)
#define MD_ACCEPT_NB_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_SETJMP(env) _setjmp(env) #ifndef __LP64__
#define MD_LONGJMP(env, val) _longjmp(env, val) /* 32-bit mode (ILP32 data model) */
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
ST_BEGIN_MACRO \
if (MD_SETJMP((_thread)->context)) \
_main(); \
((long *)((_thread)->context))[1] = (long) (_sp); \
ST_END_MACRO
#else
/* 64-bit mode (LP64 data model) */
#define MD_STACK_PAD_SIZE 256
/* Last stack frame must be preserved */
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
ST_BEGIN_MACRO \
if (MD_SETJMP((_thread)->context)) \
_main(); \
memcpy((char *)(_sp) - MD_STACK_PAD_SIZE, \
((char **)((_thread)->context))[1] - MD_STACK_PAD_SIZE, \
MD_STACK_PAD_SIZE); \
((long *)((_thread)->context))[1] = (long) (_sp); \
ST_END_MACRO
#endif /* !__LP64__ */
#ifndef __LP64__ #define MD_GET_UTIME() \
/* 32-bit mode (ILP32 data model) */ struct timeval tv; \
#define MD_INIT_CONTEXT(_thread, _sp, _main) \ (void) gettimeofday(&tv, NULL); \
ST_BEGIN_MACRO \ return (tv.tv_sec * 1000000LL + tv.tv_usec)
if (MD_SETJMP((_thread)->context)) \
_main(); \
((long *)((_thread)->context))[1] = (long) (_sp); \
ST_END_MACRO
#else
/* 64-bit mode (LP64 data model) */
#define MD_STACK_PAD_SIZE 256
/* Last stack frame must be preserved */
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
ST_BEGIN_MACRO \
if (MD_SETJMP((_thread)->context)) \
_main(); \
memcpy((char *)(_sp) - MD_STACK_PAD_SIZE, \
((char **)((_thread)->context))[1] - MD_STACK_PAD_SIZE, \
MD_STACK_PAD_SIZE); \
((long *)((_thread)->context))[1] = (long) (_sp); \
ST_END_MACRO
#endif /* !__LP64__ */
#define MD_GET_UTIME() \
struct timeval tv; \
(void) gettimeofday(&tv, NULL); \
return (tv.tv_sec * 1000000LL + tv.tv_usec)
#elif defined (IRIX) #elif defined (IRIX)
#include <sys/syssgi.h>
#include <sys/syssgi.h> #define MD_STACK_GROWS_DOWN
#define MD_USE_SYSV_ANON_MMAP
#define MD_ACCEPT_NB_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_STACK_GROWS_DOWN #define MD_SETJMP(env) setjmp(env)
#define MD_USE_SYSV_ANON_MMAP #define MD_LONGJMP(env, val) longjmp(env, val)
#define MD_ACCEPT_NB_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_SETJMP(env) setjmp(env) #define MD_INIT_CONTEXT(_thread, _sp, _main) \
#define MD_LONGJMP(env, val) longjmp(env, val) ST_BEGIN_MACRO \
(void) MD_SETJMP((_thread)->context); \
(_thread)->context[JB_SP] = (long) (_sp); \
(_thread)->context[JB_PC] = (long) _main; \
ST_END_MACRO
#define MD_INIT_CONTEXT(_thread, _sp, _main) \ #define MD_GET_UTIME() \
ST_BEGIN_MACRO \ static int inited = 0; \
(void) MD_SETJMP((_thread)->context); \ static clockid_t clock_id = CLOCK_SGI_CYCLE; \
(_thread)->context[JB_SP] = (long) (_sp); \ struct timespec ts; \
(_thread)->context[JB_PC] = (long) _main; \ if (!inited) { \
ST_END_MACRO if (syssgi(SGI_CYCLECNTR_SIZE) < 64) \
clock_id = CLOCK_REALTIME; \
inited = 1; \
} \
(void) clock_gettime(clock_id, &ts); \
return (ts.tv_sec * 1000000LL + ts.tv_nsec / 1000)
#define MD_GET_UTIME() \ /*
static int inited = 0; \ * Cap the stack by zeroing out the saved return address register
static clockid_t clock_id = CLOCK_SGI_CYCLE; \ * value. This allows libexc, used by SpeedShop, to know when to stop
struct timespec ts; \ * backtracing since it won't find main, start, or any other known
if (!inited) { \ * stack root function in a state thread's stack. Without this libexc
if (syssgi(SGI_CYCLECNTR_SIZE) < 64) \ * traces right off the stack and crashes.
clock_id = CLOCK_REALTIME; \ * The function preamble stores ra at 8(sp), this stores zero there.
inited = 1; \ * N.B. This macro is compiler/ABI dependent. It must change if ANY more
} \ * automatic variables are added to the _st_thread_main() routine, because
(void) clock_gettime(clock_id, &ts); \ * the address where ra is stored will change.
return (ts.tv_sec * 1000000LL + ts.tv_nsec / 1000) */
#if !defined(__GNUC__) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32
/* #define MD_CAP_STACK(var_addr) \
* Cap the stack by zeroing out the saved return address register (((volatile __uint64_t *)(var_addr))[1] = 0)
* value. This allows libexc, used by SpeedShop, to know when to stop #endif
* backtracing since it won't find main, start, or any other known
* stack root function in a state thread's stack. Without this libexc
* traces right off the stack and crashes.
* The function preamble stores ra at 8(sp), this stores zero there.
* N.B. This macro is compiler/ABI dependent. It must change if ANY more
* automatic variables are added to the _st_thread_main() routine, because
* the address where ra is stored will change.
*/
#if !defined(__GNUC__) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32
#define MD_CAP_STACK(var_addr) \
(((volatile __uint64_t *)(var_addr))[1] = 0)
#endif
#elif defined (LINUX) #elif defined (LINUX)
/*
* These are properties of the linux kernel and are the same on every
* flavor and architecture.
*/
#define MD_USE_BSD_ANON_MMAP
#define MD_ACCEPT_NB_NOT_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
/*
* Modern GNU/Linux is Posix.1g compliant.
*/
#define MD_HAVE_SOCKLEN_T
/* /*
* These are properties of the linux kernel and are the same on every * All architectures and flavors of linux have the gettimeofday
* flavor and architecture. * function but if you know of a faster way, use it.
*/ */
#define MD_USE_BSD_ANON_MMAP #define MD_GET_UTIME() \
#define MD_ACCEPT_NB_NOT_INHERITED struct timeval tv; \
#define MD_ALWAYS_UNSERIALIZED_ACCEPT (void) gettimeofday(&tv, NULL); \
/* return (tv.tv_sec * 1000000LL + tv.tv_usec)
* Modern GNU/Linux is Posix.1g compliant.
*/
#define MD_HAVE_SOCKLEN_T
/* #if defined(__ia64__)
* All architectures and flavors of linux have the gettimeofday #define MD_STACK_GROWS_DOWN
* function but if you know of a faster way, use it.
*/
#define MD_GET_UTIME() \
struct timeval tv; \
(void) gettimeofday(&tv, NULL); \
return (tv.tv_sec * 1000000LL + tv.tv_usec)
#if defined(__ia64__) /*
#define MD_STACK_GROWS_DOWN * IA-64 architecture. Besides traditional memory call stack, IA-64
* uses general register stack. Thus each thread needs a backing store
* for register stack in addition to memory stack. Standard
* setjmp()/longjmp() cannot be used for thread context switching
* because their implementation implicitly assumes that only one
* register stack exists.
*/
#ifdef USE_LIBC_SETJMP
#undef USE_LIBC_SETJMP
#endif
#define MD_USE_BUILTIN_SETJMP
/* #define MD_STACK_PAD_SIZE 128
* IA-64 architecture. Besides traditional memory call stack, IA-64 /* Last register stack frame must be preserved */
* uses general register stack. Thus each thread needs a backing store #define MD_INIT_CONTEXT(_thread, _sp, _bsp, _main) \
* for register stack in addition to memory stack. Standard ST_BEGIN_MACRO \
* setjmp()/longjmp() cannot be used for thread context switching if (MD_SETJMP((_thread)->context)) \
* because their implementation implicitly assumes that only one _main(); \
* register stack exists. memcpy((char *)(_bsp) - MD_STACK_PAD_SIZE, \
*/ (char *)(_thread)->context[0].__jmpbuf[17] - MD_STACK_PAD_SIZE, \
#ifdef USE_LIBC_SETJMP MD_STACK_PAD_SIZE); \
#undef USE_LIBC_SETJMP (_thread)->context[0].__jmpbuf[0] = (long) (_sp); \
#endif (_thread)->context[0].__jmpbuf[17] = (long) (_bsp); \
#define MD_USE_BUILTIN_SETJMP ST_END_MACRO
#elif defined(__mips__)
#define MD_STACK_GROWS_DOWN
#define MD_STACK_PAD_SIZE 128 #define MD_INIT_CONTEXT(_thread, _sp, _main) \
/* Last register stack frame must be preserved */ ST_BEGIN_MACRO \
#define MD_INIT_CONTEXT(_thread, _sp, _bsp, _main) \ MD_SETJMP((_thread)->context); \
ST_BEGIN_MACRO \ _thread->context[0].__jmpbuf[0].__pc = (__ptr_t) _main; \
if (MD_SETJMP((_thread)->context)) \ _thread->context[0].__jmpbuf[0].__sp = _sp; \
_main(); \ ST_END_MACRO
memcpy((char *)(_bsp) - MD_STACK_PAD_SIZE, \ #else /* Not IA-64 or mips */
(char *)(_thread)->context[0].__jmpbuf[17] - MD_STACK_PAD_SIZE, \ /*
MD_STACK_PAD_SIZE); \ * On linux, there are a few styles of jmpbuf format. These vary based
(_thread)->context[0].__jmpbuf[0] = (long) (_sp); \ * on architecture/glibc combination.
(_thread)->context[0].__jmpbuf[17] = (long) (_bsp); \ *
ST_END_MACRO * Most of the glibc based toggles were lifted from:
* mozilla/nsprpub/pr/include/md/_linux.h
*/
/*
* Starting with glibc 2.4, JB_SP definitions are not public anymore.
* They, however, can still be found in glibc source tree in
* architecture-specific "jmpbuf-offsets.h" files.
* Most importantly, the content of jmp_buf is mangled by setjmp to make
* it completely opaque (the mangling can be disabled by setting the
* LD_POINTER_GUARD environment variable before application execution).
* Therefore we will use built-in _st_md_cxt_save/_st_md_cxt_restore
* functions as a setjmp/longjmp replacement wherever they are available
* unless USE_LIBC_SETJMP is defined.
*/
#if defined(__powerpc__)
#define MD_STACK_GROWS_DOWN
#elif defined(__mips__) #if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1)
#define MD_STACK_GROWS_DOWN #ifndef JB_GPR1
#define JB_GPR1 0
#endif
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_GPR1]
#else
/* not an error but certainly cause for caution */
#error "Untested use of old glibc on powerpc"
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__misc[0]
#endif /* glibc 2.1 or later */
#elif defined(__alpha)
#define MD_STACK_GROWS_DOWN
#define MD_INIT_CONTEXT(_thread, _sp, _main) \ #if defined(__GLIBC__) && __GLIBC__ >= 2
ST_BEGIN_MACRO \ #ifndef JB_SP
MD_SETJMP((_thread)->context); \ #define JB_SP 8
_thread->context[0].__jmpbuf[0].__pc = (__ptr_t) _main; \ #endif
_thread->context[0].__jmpbuf[0].__sp = _sp; \ #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
ST_END_MACRO #else
/* not an error but certainly cause for caution */
#error "Untested use of old glibc on alpha"
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
#endif
#elif defined(__mc68000__)
#define MD_STACK_GROWS_DOWN
#else /* Not IA-64 or mips */ /* m68k still uses old style sigjmp_buf */
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
#elif defined(__sparc__)
#define MD_STACK_GROWS_DOWN
/* #if defined(__GLIBC__) && __GLIBC__ >= 2
* On linux, there are a few styles of jmpbuf format. These vary based #ifndef JB_SP
* on architecture/glibc combination. #define JB_SP 0
* #endif
* Most of the glibc based toggles were lifted from: #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
* mozilla/nsprpub/pr/include/md/_linux.h #else
*/ /* not an error but certainly cause for caution */
#error "Untested use of old glic on sparc -- also using odd mozilla derived __fp"
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__fp
#endif
#elif defined(__i386__)
#define MD_STACK_GROWS_DOWN
#define MD_USE_BUILTIN_SETJMP
/* #if defined(__GLIBC__) && __GLIBC__ >= 2
* Starting with glibc 2.4, JB_SP definitions are not public anymore. #ifndef JB_SP
* They, however, can still be found in glibc source tree in #define JB_SP 4
* architecture-specific "jmpbuf-offsets.h" files. #endif
* Most importantly, the content of jmp_buf is mangled by setjmp to make #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
* it completely opaque (the mangling can be disabled by setting the #else
* LD_POINTER_GUARD environment variable before application execution). /* not an error but certainly cause for caution */
* Therefore we will use built-in _st_md_cxt_save/_st_md_cxt_restore #error "Untested use of old glibc on i386"
* functions as a setjmp/longjmp replacement wherever they are available #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
* unless USE_LIBC_SETJMP is defined. #endif
*/ #elif defined(__amd64__) || defined(__x86_64__)
#define MD_STACK_GROWS_DOWN
#define MD_USE_BUILTIN_SETJMP
#if defined(__powerpc__) #ifndef JB_RSP
#define MD_STACK_GROWS_DOWN #define JB_RSP 6
#endif
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_RSP]
#elif defined(__arm__)
#define MD_STACK_GROWS_DOWN
#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) #if defined(__GLIBC__) && __GLIBC__ >= 2
#ifndef JB_GPR1 #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[8]
#define JB_GPR1 0 #else
#endif #error "ARM/Linux pre-glibc2 not supported yet"
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_GPR1] #endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
#else #elif defined(__s390__)
/* not an error but certainly cause for caution */ #define MD_STACK_GROWS_DOWN
#error "Untested use of old glibc on powerpc"
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__misc[0]
#endif /* glibc 2.1 or later */
#elif defined(__alpha) /* There is no JB_SP in glibc at this time. (glibc 2.2.5)
#define MD_STACK_GROWS_DOWN */
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__gregs[9]
#elif defined(__hppa__)
#define MD_STACK_GROWS_UP
#if defined(__GLIBC__) && __GLIBC__ >= 2 /* yes, this is gross, unfortunately at the moment (2002/08/01) there is
#ifndef JB_SP * a bug in hppa's glibc header definition for JB_SP, so we can't
#define JB_SP 8 * use that...
#endif */
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP] #define MD_GET_SP(_t) (*(long *)(((char *)&(_t)->context[0].__jmpbuf[0]) + 76))
#else #else
/* not an error but certainly cause for caution */ #error "Unknown CPU architecture"
#error "Untested use of old glibc on alpha" #endif /* Cases with common MD_INIT_CONTEXT and different SP locations */
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
#endif
#elif defined(__mc68000__) #define MD_INIT_CONTEXT(_thread, _sp, _main) \
#define MD_STACK_GROWS_DOWN ST_BEGIN_MACRO \
if (MD_SETJMP((_thread)->context)) \
_main(); \
MD_GET_SP(_thread) = (long) (_sp); \
ST_END_MACRO
#endif /* Cases with different MD_INIT_CONTEXT */
/* m68k still uses old style sigjmp_buf */ #if defined(MD_USE_BUILTIN_SETJMP) && !defined(USE_LIBC_SETJMP)
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp #define MD_SETJMP(env) _st_md_cxt_save(env)
#define MD_LONGJMP(env, val) _st_md_cxt_restore(env, val)
#elif defined(__sparc__) extern int _st_md_cxt_save(jmp_buf env);
#define MD_STACK_GROWS_DOWN extern void _st_md_cxt_restore(jmp_buf env, int val);
#else
#if defined(__GLIBC__) && __GLIBC__ >= 2 #define MD_SETJMP(env) setjmp(env)
#ifndef JB_SP #define MD_LONGJMP(env, val) longjmp(env, val)
#define JB_SP 0 #endif
#endif
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
#else
/* not an error but certainly cause for caution */
#error "Untested use of old glic on sparc -- also using odd mozilla derived __fp"
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__fp
#endif
#elif defined(__i386__)
#define MD_STACK_GROWS_DOWN
#define MD_USE_BUILTIN_SETJMP
#if defined(__GLIBC__) && __GLIBC__ >= 2
#ifndef JB_SP
#define JB_SP 4
#endif
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
#else
/* not an error but certainly cause for caution */
#error "Untested use of old glibc on i386"
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
#endif
#elif defined(__amd64__) || defined(__x86_64__)
#define MD_STACK_GROWS_DOWN
#define MD_USE_BUILTIN_SETJMP
#ifndef JB_RSP
#define JB_RSP 6
#endif
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_RSP]
#elif defined(__arm__)
#define MD_STACK_GROWS_DOWN
#if defined(__GLIBC__) && __GLIBC__ >= 2
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[20]
#else
#error "ARM/Linux pre-glibc2 not supported yet"
#endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
#elif defined(__s390__)
#define MD_STACK_GROWS_DOWN
/* There is no JB_SP in glibc at this time. (glibc 2.2.5)
*/
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__gregs[9]
#elif defined(__hppa__)
#define MD_STACK_GROWS_UP
/* yes, this is gross, unfortunately at the moment (2002/08/01) there is
* a bug in hppa's glibc header definition for JB_SP, so we can't
* use that...
*/
#define MD_GET_SP(_t) (*(long *)(((char *)&(_t)->context[0].__jmpbuf[0]) + 76))
#else
#error "Unknown CPU architecture"
#endif /* Cases with common MD_INIT_CONTEXT and different SP locations */
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
ST_BEGIN_MACRO \
if (MD_SETJMP((_thread)->context)) \
_main(); \
MD_GET_SP(_thread) = (long) (_sp); \
ST_END_MACRO
#endif /* Cases with different MD_INIT_CONTEXT */
#if defined(MD_USE_BUILTIN_SETJMP) && !defined(USE_LIBC_SETJMP)
#define MD_SETJMP(env) _st_md_cxt_save(env)
#define MD_LONGJMP(env, val) _st_md_cxt_restore(env, val)
extern int _st_md_cxt_save(jmp_buf env);
extern void _st_md_cxt_restore(jmp_buf env, int val);
#else
#define MD_SETJMP(env) setjmp(env)
#define MD_LONGJMP(env, val) longjmp(env, val)
#endif
#elif defined (NETBSD) #elif defined (NETBSD)
#define MD_STACK_GROWS_DOWN
#define MD_USE_BSD_ANON_MMAP
#define MD_ACCEPT_NB_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_HAVE_SOCKLEN_T
#define MD_STACK_GROWS_DOWN #define MD_SETJMP(env) _setjmp(env)
#define MD_USE_BSD_ANON_MMAP #define MD_LONGJMP(env, val) _longjmp(env, val)
#define MD_ACCEPT_NB_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_HAVE_SOCKLEN_T
#define MD_SETJMP(env) _setjmp(env) #if defined(__i386__)
#define MD_LONGJMP(env, val) _longjmp(env, val) #define MD_JB_SP 2
#elif defined(__alpha__)
#define MD_JB_SP 34
#elif defined(__sparc__)
#define MD_JB_SP 0
#elif defined(__vax__)
#define MD_JB_SP 2
#else
#error Unknown CPU architecture
#endif
#if defined(__i386__) #define MD_INIT_CONTEXT(_thread, _sp, _main) \
#define MD_JB_SP 2 ST_BEGIN_MACRO \
#elif defined(__alpha__) if (MD_SETJMP((_thread)->context)) \
#define MD_JB_SP 34 _main(); \
#elif defined(__sparc__) (_thread)->context[MD_JB_SP] = (long) (_sp); \
#define MD_JB_SP 0 ST_END_MACRO
#elif defined(__vax__)
#define MD_JB_SP 2
#else
#error Unknown CPU architecture
#endif
#define MD_INIT_CONTEXT(_thread, _sp, _main) \ #define MD_GET_UTIME() \
ST_BEGIN_MACRO \ struct timeval tv; \
if (MD_SETJMP((_thread)->context)) \ (void) gettimeofday(&tv, NULL); \
_main(); \ return (tv.tv_sec * 1000000LL + tv.tv_usec)
(_thread)->context[MD_JB_SP] = (long) (_sp); \
ST_END_MACRO
#define MD_GET_UTIME() \
struct timeval tv; \
(void) gettimeofday(&tv, NULL); \
return (tv.tv_sec * 1000000LL + tv.tv_usec)
#elif defined (OPENBSD) #elif defined (OPENBSD)
#define MD_STACK_GROWS_DOWN
#define MD_USE_BSD_ANON_MMAP
#define MD_ACCEPT_NB_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_STACK_GROWS_DOWN #define MD_SETJMP(env) _setjmp(env)
#define MD_USE_BSD_ANON_MMAP #define MD_LONGJMP(env, val) _longjmp(env, val)
#define MD_ACCEPT_NB_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_SETJMP(env) _setjmp(env) #if defined(__i386__)
#define MD_LONGJMP(env, val) _longjmp(env, val) #define MD_JB_SP 2
#elif defined(__alpha__)
#define MD_JB_SP 34
#elif defined(__sparc__)
#define MD_JB_SP 0
#elif defined(__amd64__)
#define MD_JB_SP 6
#else
#error Unknown CPU architecture
#endif
#if defined(__i386__) #define MD_INIT_CONTEXT(_thread, _sp, _main) \
#define MD_JB_SP 2 ST_BEGIN_MACRO \
#elif defined(__alpha__) if (MD_SETJMP((_thread)->context)) \
#define MD_JB_SP 34 _main(); \
#elif defined(__sparc__) (_thread)->context[MD_JB_SP] = (long) (_sp); \
#define MD_JB_SP 0 ST_END_MACRO
#elif defined(__amd64__)
#define MD_JB_SP 6
#else
#error Unknown CPU architecture
#endif
#define MD_INIT_CONTEXT(_thread, _sp, _main) \ #define MD_GET_UTIME() \
ST_BEGIN_MACRO \ struct timeval tv; \
if (MD_SETJMP((_thread)->context)) \ (void) gettimeofday(&tv, NULL); \
_main(); \ return (tv.tv_sec * 1000000LL + tv.tv_usec)
(_thread)->context[MD_JB_SP] = (long) (_sp); \
ST_END_MACRO
#define MD_GET_UTIME() \
struct timeval tv; \
(void) gettimeofday(&tv, NULL); \
return (tv.tv_sec * 1000000LL + tv.tv_usec)
#elif defined (OSF1) #elif defined (OSF1)
#include <signal.h>
#include <signal.h> #define MD_STACK_GROWS_DOWN
#define MD_USE_SYSV_ANON_MMAP
#define MD_ACCEPT_NB_NOT_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_STACK_GROWS_DOWN #define MD_SETJMP(env) _setjmp(env)
#define MD_USE_SYSV_ANON_MMAP #define MD_LONGJMP(env, val) _longjmp(env, val)
#define MD_ACCEPT_NB_NOT_INHERITED
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
#define MD_SETJMP(env) _setjmp(env) #define MD_INIT_CONTEXT(_thread, _sp, _main) \
#define MD_LONGJMP(env, val) _longjmp(env, val) ST_BEGIN_MACRO \
if (MD_SETJMP((_thread)->context)) \
_main(); \
((struct sigcontext *)((_thread)->context))->sc_sp = (long) (_sp); \
ST_END_MACRO
#define MD_INIT_CONTEXT(_thread, _sp, _main) \ #define MD_GET_UTIME() \
ST_BEGIN_MACRO \ struct timeval tv; \
if (MD_SETJMP((_thread)->context)) \ (void) gettimeofday(&tv, NULL); \
_main(); \ return (tv.tv_sec * 1000000LL + tv.tv_usec)
((struct sigcontext *)((_thread)->context))->sc_sp = (long) (_sp); \
ST_END_MACRO
#define MD_GET_UTIME() \
struct timeval tv; \
(void) gettimeofday(&tv, NULL); \
return (tv.tv_sec * 1000000LL + tv.tv_usec)
#elif defined (SOLARIS) #elif defined (SOLARIS)
#include <sys/filio.h>
extern int getpagesize(void);
#include <sys/filio.h> #define MD_STACK_GROWS_DOWN
extern int getpagesize(void); #define MD_USE_SYSV_ANON_MMAP
#define MD_ACCEPT_NB_NOT_INHERITED
#define MD_STACK_GROWS_DOWN #define MD_SETJMP(env) setjmp(env)
#define MD_USE_SYSV_ANON_MMAP #define MD_LONGJMP(env, val) longjmp(env, val)
#define MD_ACCEPT_NB_NOT_INHERITED
#define MD_SETJMP(env) setjmp(env) #if defined(sparc) || defined(__sparc)
#define MD_LONGJMP(env, val) longjmp(env, val) #ifdef _LP64
#define MD_STACK_PAD_SIZE 4095
#endif
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
ST_BEGIN_MACRO \
(void) MD_SETJMP((_thread)->context); \
(_thread)->context[1] = (long) (_sp); \
(_thread)->context[2] = (long) _main; \
ST_END_MACRO
#elif defined(i386) || defined(__i386)
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
ST_BEGIN_MACRO \
(void) MD_SETJMP((_thread)->context); \
(_thread)->context[4] = (long) (_sp); \
(_thread)->context[5] = (long) _main; \
ST_END_MACRO
#elif defined(__amd64__)
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
ST_BEGIN_MACRO \
if (MD_SETJMP((_thread)->context)) \
_main(); \
(_thread)->context[6] = (long) (_sp); \
ST_END_MACRO
#else
#error Unknown CPU architecture
#endif
#if defined(sparc) || defined(__sparc) #define MD_GET_UTIME() \
#ifdef _LP64 return (gethrtime() / 1000)
#define MD_STACK_PAD_SIZE 4095
#endif
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
ST_BEGIN_MACRO \
(void) MD_SETJMP((_thread)->context); \
(_thread)->context[1] = (long) (_sp); \
(_thread)->context[2] = (long) _main; \
ST_END_MACRO
#elif defined(i386) || defined(__i386)
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
ST_BEGIN_MACRO \
(void) MD_SETJMP((_thread)->context); \
(_thread)->context[4] = (long) (_sp); \
(_thread)->context[5] = (long) _main; \
ST_END_MACRO
#elif defined(__amd64__)
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
ST_BEGIN_MACRO \
if (MD_SETJMP((_thread)->context)) \
_main(); \
(_thread)->context[6] = (long) (_sp); \
ST_END_MACRO
#else
#error Unknown CPU architecture
#endif
#define MD_GET_UTIME() \
return (gethrtime() / 1000)
#else #else
#error Unknown OS #error Unknown OS
#endif /* OS */ #endif /* OS */
/*****************************************
* Other defines
*/
#if !defined(MD_HAVE_POLL) && !defined(MD_DONT_HAVE_POLL) #if !defined(MD_HAVE_POLL) && !defined(MD_DONT_HAVE_POLL)
#define MD_HAVE_POLL #define MD_HAVE_POLL
#endif #endif
#ifndef MD_STACK_PAD_SIZE #ifndef MD_STACK_PAD_SIZE
#define MD_STACK_PAD_SIZE 128 #define MD_STACK_PAD_SIZE 128
#endif #endif
#if !defined(MD_HAVE_SOCKLEN_T) && !defined(socklen_t) #if !defined(MD_HAVE_SOCKLEN_T) && !defined(socklen_t)
#define socklen_t int #define socklen_t int
#endif #endif
#ifndef MD_CAP_STACK #ifndef MD_CAP_STACK
#define MD_CAP_STACK(var_addr) #define MD_CAP_STACK(var_addr)
#endif #endif
#endif /* !__ST_MD_H__ */ #endif /* !__ST_MD_H__ */