winlin

research st: only support linux

@@ -57,227 +57,55 @@ @@ -57,227 +57,55 @@
57 /***************************************** 57 /*****************************************
58 * Platform specifics 58 * Platform specifics
59 */ 59 */
60 -#if defined (AIX)  
61 - #define MD_STACK_GROWS_DOWN  
62 - #define MD_USE_SYSV_ANON_MMAP  
63 - #define MD_ACCEPT_NB_INHERITED  
64 - #define MD_ALWAYS_UNSERIALIZED_ACCEPT  
65 -  
66 - #ifndef MD_HAVE_SOCKLEN_T  
67 - #define MD_HAVE_SOCKLEN_T  
68 - #define socklen_t unsigned long  
69 - #endif  
70 -  
71 - #define MD_SETJMP(env) _setjmp(env)  
72 - #define MD_LONGJMP(env, val) _longjmp(env, val)  
73 -  
74 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
75 - ST_BEGIN_MACRO \  
76 - if (MD_SETJMP((_thread)->context)) \  
77 - _main(); \  
78 - (_thread)->context[3] = (long) (_sp); \  
79 - ST_END_MACRO  
80 -  
81 - #define MD_GET_UTIME() \  
82 - timebasestruct_t rt; \  
83 - (void) read_real_time(&rt, TIMEBASE_SZ); \  
84 - (void) time_base_to_time(&rt, TIMEBASE_SZ); \  
85 - return (rt.tb_high * 1000000LL + rt.tb_low / 1000)  
86 - 60 +#if defined (LINUX)
  61 + /* linux ok, defined bellow */
  62 +#elif defined (AIX)
  63 + #error "AIX not supported"
87 #elif defined (CYGWIN) 64 #elif defined (CYGWIN)
88 - #define MD_STACK_GROWS_DOWN  
89 - #define MD_USE_BSD_ANON_MMAP  
90 - #define MD_ACCEPT_NB_NOT_INHERITED  
91 - #define MD_ALWAYS_UNSERIALIZED_ACCEPT  
92 -  
93 - #define MD_SETJMP(env) setjmp(env)  
94 - #define MD_LONGJMP(env, val) longjmp(env, val)  
95 -  
96 - #define MD_JB_SP 7  
97 -  
98 - #define MD_GET_SP(_t) (_t)->context[MD_JB_SP]  
99 -  
100 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
101 - ST_BEGIN_MACRO \  
102 - if (MD_SETJMP((_thread)->context)) \  
103 - _main(); \  
104 - MD_GET_SP(_thread) = (long) (_sp); \  
105 - ST_END_MACRO  
106 -  
107 - #define MD_GET_UTIME() \  
108 - struct timeval tv; \  
109 - (void) gettimeofday(&tv, NULL); \  
110 - return (tv.tv_sec * 1000000LL + tv.tv_usec)  
111 - 65 + #error "CYGWIN not supported"
112 #elif defined (DARWIN) 66 #elif defined (DARWIN)
113 - #define MD_STACK_GROWS_DOWN  
114 - #define MD_USE_BSD_ANON_MMAP  
115 - #define MD_ACCEPT_NB_INHERITED  
116 - #define MD_ALWAYS_UNSERIALIZED_ACCEPT  
117 - #define MD_HAVE_SOCKLEN_T  
118 -  
119 - #define MD_SETJMP(env) _setjmp(env)  
120 - #define MD_LONGJMP(env, val) _longjmp(env, val)  
121 -  
122 - #if defined(__ppc__)  
123 - #define MD_JB_SP 0  
124 - #elif defined(__i386__)  
125 - #define MD_JB_SP 9  
126 - #elif defined(__x86_64__)  
127 - #define MD_JB_SP 4  
128 - #else  
129 - #error Unknown CPU architecture  
130 - #endif  
131 -  
132 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
133 - ST_BEGIN_MACRO \  
134 - if (MD_SETJMP((_thread)->context)) \  
135 - _main(); \  
136 - *((long *)&((_thread)->context[MD_JB_SP])) = (long) (_sp); \  
137 - ST_END_MACRO  
138 -  
139 - #define MD_GET_UTIME() \  
140 - struct timeval tv; \  
141 - (void) gettimeofday(&tv, NULL); \  
142 - return (tv.tv_sec * 1000000LL + tv.tv_usec)  
143 - 67 + #error "DARWIN not supported"
144 #elif defined (FREEBSD) 68 #elif defined (FREEBSD)
145 - #define MD_STACK_GROWS_DOWN  
146 - #define MD_USE_BSD_ANON_MMAP  
147 - #define MD_ACCEPT_NB_INHERITED  
148 - #define MD_ALWAYS_UNSERIALIZED_ACCEPT  
149 -  
150 - #define MD_SETJMP(env) _setjmp(env)  
151 - #define MD_LONGJMP(env, val) _longjmp(env, val)  
152 -  
153 - #if defined(__i386__)  
154 - #define MD_JB_SP 2  
155 - #elif defined(__alpha__)  
156 - #define MD_JB_SP 34  
157 - #elif defined(__amd64__)  
158 - #define MD_JB_SP 2  
159 - #else  
160 - #error Unknown CPU architecture  
161 - #endif  
162 -  
163 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
164 - ST_BEGIN_MACRO \  
165 - if (MD_SETJMP((_thread)->context)) \  
166 - _main(); \  
167 - (_thread)->context[0]._jb[MD_JB_SP] = (long) (_sp); \  
168 - ST_END_MACRO  
169 -  
170 - #define MD_GET_UTIME() \  
171 - struct timeval tv; \  
172 - (void) gettimeofday(&tv, NULL); \  
173 - return (tv.tv_sec * 1000000LL + tv.tv_usec)  
174 - 69 + #error "FREEBSD not supported"
175 #elif defined (HPUX) 70 #elif defined (HPUX)
176 - #define MD_STACK_GROWS_UP  
177 - #define MD_USE_BSD_ANON_MMAP  
178 - #define MD_ACCEPT_NB_INHERITED  
179 - #define MD_ALWAYS_UNSERIALIZED_ACCEPT  
180 -  
181 - #define MD_SETJMP(env) _setjmp(env)  
182 - #define MD_LONGJMP(env, val) _longjmp(env, val)  
183 -  
184 - #ifndef __LP64__  
185 - /* 32-bit mode (ILP32 data model) */  
186 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
187 - ST_BEGIN_MACRO \  
188 - if (MD_SETJMP((_thread)->context)) \  
189 - _main(); \  
190 - ((long *)((_thread)->context))[1] = (long) (_sp); \  
191 - ST_END_MACRO  
192 - #else  
193 - /* 64-bit mode (LP64 data model) */  
194 - #define MD_STACK_PAD_SIZE 256  
195 - /* Last stack frame must be preserved */  
196 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
197 - ST_BEGIN_MACRO \  
198 - if (MD_SETJMP((_thread)->context)) \  
199 - _main(); \  
200 - memcpy((char *)(_sp) - MD_STACK_PAD_SIZE, \  
201 - ((char **)((_thread)->context))[1] - MD_STACK_PAD_SIZE, \  
202 - MD_STACK_PAD_SIZE); \  
203 - ((long *)((_thread)->context))[1] = (long) (_sp); \  
204 - ST_END_MACRO  
205 - #endif /* !__LP64__ */  
206 -  
207 - #define MD_GET_UTIME() \  
208 - struct timeval tv; \  
209 - (void) gettimeofday(&tv, NULL); \  
210 - return (tv.tv_sec * 1000000LL + tv.tv_usec)  
211 - 71 + #error "HPUX not supported"
212 #elif defined (IRIX) 72 #elif defined (IRIX)
213 - #include <sys/syssgi.h>  
214 -  
215 - #define MD_STACK_GROWS_DOWN  
216 - #define MD_USE_SYSV_ANON_MMAP  
217 - #define MD_ACCEPT_NB_INHERITED  
218 - #define MD_ALWAYS_UNSERIALIZED_ACCEPT  
219 -  
220 - #define MD_SETJMP(env) setjmp(env)  
221 - #define MD_LONGJMP(env, val) longjmp(env, val)  
222 -  
223 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
224 - ST_BEGIN_MACRO \  
225 - (void) MD_SETJMP((_thread)->context); \  
226 - (_thread)->context[JB_SP] = (long) (_sp); \  
227 - (_thread)->context[JB_PC] = (long) _main; \  
228 - ST_END_MACRO  
229 -  
230 - #define MD_GET_UTIME() \  
231 - static int inited = 0; \  
232 - static clockid_t clock_id = CLOCK_SGI_CYCLE; \  
233 - struct timespec ts; \  
234 - if (!inited) { \  
235 - if (syssgi(SGI_CYCLECNTR_SIZE) < 64) \  
236 - clock_id = CLOCK_REALTIME; \  
237 - inited = 1; \  
238 - } \  
239 - (void) clock_gettime(clock_id, &ts); \  
240 - return (ts.tv_sec * 1000000LL + ts.tv_nsec / 1000)  
241 -  
242 - /*  
243 - * Cap the stack by zeroing out the saved return address register  
244 - * value. This allows libexc, used by SpeedShop, to know when to stop  
245 - * backtracing since it won't find main, start, or any other known  
246 - * stack root function in a state thread's stack. Without this libexc  
247 - * traces right off the stack and crashes.  
248 - * The function preamble stores ra at 8(sp), this stores zero there.  
249 - * N.B. This macro is compiler/ABI dependent. It must change if ANY more  
250 - * automatic variables are added to the _st_thread_main() routine, because  
251 - * the address where ra is stored will change.  
252 - */  
253 - #if !defined(__GNUC__) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32  
254 - #define MD_CAP_STACK(var_addr) \  
255 - (((volatile __uint64_t *)(var_addr))[1] = 0)  
256 - #endif 73 + #error "IRIX not supported"
  74 +#elif defined (NETBSD)
  75 + #error "IRIX not supported"
  76 +#elif defined (OPENBSD)
  77 + #error "IRIX not supported"
  78 +#elif defined (OSF1)
  79 + #error "IRIX not supported"
  80 +#elif defined (SOLARIS)
  81 + #error "IRIX not supported"
  82 +#else
  83 + #error "Unknown OS"
  84 +#endif /* OS */
257 85
258 -#elif defined (LINUX)  
259 - /* 86 +/* linux only, defined bellow */
  87 +/*
260 * These are properties of the linux kernel and are the same on every 88 * These are properties of the linux kernel and are the same on every
261 * flavor and architecture. 89 * flavor and architecture.
262 */ 90 */
263 - #define MD_USE_BSD_ANON_MMAP  
264 - #define MD_ACCEPT_NB_NOT_INHERITED  
265 - #define MD_ALWAYS_UNSERIALIZED_ACCEPT  
266 - /* 91 +#define MD_USE_BSD_ANON_MMAP
  92 +#define MD_ACCEPT_NB_NOT_INHERITED
  93 +#define MD_ALWAYS_UNSERIALIZED_ACCEPT
  94 +/*
267 * Modern GNU/Linux is Posix.1g compliant. 95 * Modern GNU/Linux is Posix.1g compliant.
268 */ 96 */
269 - #define MD_HAVE_SOCKLEN_T 97 +#define MD_HAVE_SOCKLEN_T
270 98
271 - /* 99 +/*
272 * All architectures and flavors of linux have the gettimeofday 100 * All architectures and flavors of linux have the gettimeofday
273 * function but if you know of a faster way, use it. 101 * function but if you know of a faster way, use it.
274 */ 102 */
275 - #define MD_GET_UTIME() \ 103 +#define MD_GET_UTIME() \
276 struct timeval tv; \ 104 struct timeval tv; \
277 (void) gettimeofday(&tv, NULL); \ 105 (void) gettimeofday(&tv, NULL); \
278 return (tv.tv_sec * 1000000LL + tv.tv_usec) 106 return (tv.tv_sec * 1000000LL + tv.tv_usec)
279 107
280 - #if defined(__ia64__) 108 +#if defined(__ia64__)
281 #define MD_STACK_GROWS_DOWN 109 #define MD_STACK_GROWS_DOWN
282 110
283 /* 111 /*
@@ -305,7 +133,7 @@ @@ -305,7 +133,7 @@
305 (_thread)->context[0].__jmpbuf[0] = (long) (_sp); \ 133 (_thread)->context[0].__jmpbuf[0] = (long) (_sp); \
306 (_thread)->context[0].__jmpbuf[17] = (long) (_bsp); \ 134 (_thread)->context[0].__jmpbuf[17] = (long) (_bsp); \
307 ST_END_MACRO 135 ST_END_MACRO
308 - #elif defined(__mips__) 136 +#elif defined(__mips__)
309 #define MD_STACK_GROWS_DOWN 137 #define MD_STACK_GROWS_DOWN
310 138
311 #define MD_INIT_CONTEXT(_thread, _sp, _main) \ 139 #define MD_INIT_CONTEXT(_thread, _sp, _main) \
@@ -314,7 +142,7 @@ @@ -314,7 +142,7 @@
314 _thread->context[0].__jmpbuf[0].__pc = (__ptr_t) _main; \ 142 _thread->context[0].__jmpbuf[0].__pc = (__ptr_t) _main; \
315 _thread->context[0].__jmpbuf[0].__sp = _sp; \ 143 _thread->context[0].__jmpbuf[0].__sp = _sp; \
316 ST_END_MACRO 144 ST_END_MACRO
317 - #else /* Not IA-64 or mips */ 145 +#else /* Not IA-64 or mips */
318 /* 146 /*
319 * On linux, there are a few styles of jmpbuf format. These vary based 147 * On linux, there are a few styles of jmpbuf format. These vary based
320 * on architecture/glibc combination. 148 * on architecture/glibc combination.
@@ -431,154 +259,18 @@ @@ -431,154 +259,18 @@
431 _main(); \ 259 _main(); \
432 MD_GET_SP(_thread) = (long) (_sp); \ 260 MD_GET_SP(_thread) = (long) (_sp); \
433 ST_END_MACRO 261 ST_END_MACRO
434 - #endif /* Cases with different MD_INIT_CONTEXT */ 262 +#endif /* Cases with different MD_INIT_CONTEXT */
435 263
436 - #if defined(MD_USE_BUILTIN_SETJMP) && !defined(USE_LIBC_SETJMP) 264 +#if defined(MD_USE_BUILTIN_SETJMP) && !defined(USE_LIBC_SETJMP)
437 #define MD_SETJMP(env) _st_md_cxt_save(env) 265 #define MD_SETJMP(env) _st_md_cxt_save(env)
438 #define MD_LONGJMP(env, val) _st_md_cxt_restore(env, val) 266 #define MD_LONGJMP(env, val) _st_md_cxt_restore(env, val)
439 267
440 extern int _st_md_cxt_save(jmp_buf env); 268 extern int _st_md_cxt_save(jmp_buf env);
441 extern void _st_md_cxt_restore(jmp_buf env, int val); 269 extern void _st_md_cxt_restore(jmp_buf env, int val);
442 - #else  
443 - #define MD_SETJMP(env) setjmp(env)  
444 - #define MD_LONGJMP(env, val) longjmp(env, val)  
445 - #endif  
446 -  
447 -#elif defined (NETBSD)  
448 - #define MD_STACK_GROWS_DOWN  
449 - #define MD_USE_BSD_ANON_MMAP  
450 - #define MD_ACCEPT_NB_INHERITED  
451 - #define MD_ALWAYS_UNSERIALIZED_ACCEPT  
452 - #define MD_HAVE_SOCKLEN_T  
453 -  
454 - #define MD_SETJMP(env) _setjmp(env)  
455 - #define MD_LONGJMP(env, val) _longjmp(env, val)  
456 -  
457 - #if defined(__i386__)  
458 - #define MD_JB_SP 2  
459 - #elif defined(__alpha__)  
460 - #define MD_JB_SP 34  
461 - #elif defined(__sparc__)  
462 - #define MD_JB_SP 0  
463 - #elif defined(__vax__)  
464 - #define MD_JB_SP 2  
465 - #else  
466 - #error Unknown CPU architecture  
467 - #endif  
468 -  
469 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
470 - ST_BEGIN_MACRO \  
471 - if (MD_SETJMP((_thread)->context)) \  
472 - _main(); \  
473 - (_thread)->context[MD_JB_SP] = (long) (_sp); \  
474 - ST_END_MACRO  
475 -  
476 - #define MD_GET_UTIME() \  
477 - struct timeval tv; \  
478 - (void) gettimeofday(&tv, NULL); \  
479 - return (tv.tv_sec * 1000000LL + tv.tv_usec)  
480 -  
481 -#elif defined (OPENBSD)  
482 - #define MD_STACK_GROWS_DOWN  
483 - #define MD_USE_BSD_ANON_MMAP  
484 - #define MD_ACCEPT_NB_INHERITED  
485 - #define MD_ALWAYS_UNSERIALIZED_ACCEPT  
486 -  
487 - #define MD_SETJMP(env) _setjmp(env)  
488 - #define MD_LONGJMP(env, val) _longjmp(env, val)  
489 -  
490 - #if defined(__i386__)  
491 - #define MD_JB_SP 2  
492 - #elif defined(__alpha__)  
493 - #define MD_JB_SP 34  
494 - #elif defined(__sparc__)  
495 - #define MD_JB_SP 0  
496 - #elif defined(__amd64__)  
497 - #define MD_JB_SP 6  
498 - #else  
499 - #error Unknown CPU architecture  
500 - #endif  
501 -  
502 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
503 - ST_BEGIN_MACRO \  
504 - if (MD_SETJMP((_thread)->context)) \  
505 - _main(); \  
506 - (_thread)->context[MD_JB_SP] = (long) (_sp); \  
507 - ST_END_MACRO  
508 -  
509 - #define MD_GET_UTIME() \  
510 - struct timeval tv; \  
511 - (void) gettimeofday(&tv, NULL); \  
512 - return (tv.tv_sec * 1000000LL + tv.tv_usec)  
513 -  
514 -#elif defined (OSF1)  
515 - #include <signal.h>  
516 -  
517 - #define MD_STACK_GROWS_DOWN  
518 - #define MD_USE_SYSV_ANON_MMAP  
519 - #define MD_ACCEPT_NB_NOT_INHERITED  
520 - #define MD_ALWAYS_UNSERIALIZED_ACCEPT  
521 -  
522 - #define MD_SETJMP(env) _setjmp(env)  
523 - #define MD_LONGJMP(env, val) _longjmp(env, val)  
524 -  
525 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
526 - ST_BEGIN_MACRO \  
527 - if (MD_SETJMP((_thread)->context)) \  
528 - _main(); \  
529 - ((struct sigcontext *)((_thread)->context))->sc_sp = (long) (_sp); \  
530 - ST_END_MACRO  
531 -  
532 - #define MD_GET_UTIME() \  
533 - struct timeval tv; \  
534 - (void) gettimeofday(&tv, NULL); \  
535 - return (tv.tv_sec * 1000000LL + tv.tv_usec)  
536 -  
537 -#elif defined (SOLARIS)  
538 - #include <sys/filio.h>  
539 - extern int getpagesize(void);  
540 -  
541 - #define MD_STACK_GROWS_DOWN  
542 - #define MD_USE_SYSV_ANON_MMAP  
543 - #define MD_ACCEPT_NB_NOT_INHERITED  
544 - 270 +#else
545 #define MD_SETJMP(env) setjmp(env) 271 #define MD_SETJMP(env) setjmp(env)
546 #define MD_LONGJMP(env, val) longjmp(env, val) 272 #define MD_LONGJMP(env, val) longjmp(env, val)
547 -  
548 - #if defined(sparc) || defined(__sparc)  
549 - #ifdef _LP64  
550 - #define MD_STACK_PAD_SIZE 4095  
551 - #endif  
552 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
553 - ST_BEGIN_MACRO \  
554 - (void) MD_SETJMP((_thread)->context); \  
555 - (_thread)->context[1] = (long) (_sp); \  
556 - (_thread)->context[2] = (long) _main; \  
557 - ST_END_MACRO  
558 - #elif defined(i386) || defined(__i386)  
559 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
560 - ST_BEGIN_MACRO \  
561 - (void) MD_SETJMP((_thread)->context); \  
562 - (_thread)->context[4] = (long) (_sp); \  
563 - (_thread)->context[5] = (long) _main; \  
564 - ST_END_MACRO  
565 - #elif defined(__amd64__)  
566 - #define MD_INIT_CONTEXT(_thread, _sp, _main) \  
567 - ST_BEGIN_MACRO \  
568 - if (MD_SETJMP((_thread)->context)) \  
569 - _main(); \  
570 - (_thread)->context[6] = (long) (_sp); \  
571 - ST_END_MACRO  
572 - #else  
573 - #error Unknown CPU architecture  
574 - #endif  
575 -  
576 - #define MD_GET_UTIME() \  
577 - return (gethrtime() / 1000)  
578 -  
579 -#else  
580 - #error Unknown OS  
581 -#endif /* OS */ 273 +#endif
582 274
583 /***************************************** 275 /*****************************************
584 * Other defines 276 * Other defines