winlin

Merge branch 'srs.master'

@@ -252,10 +252,7 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then @@ -252,10 +252,7 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
252 ( 252 (
253 rm -rf ${SRS_OBJS}/st-1.9 && cd ${SRS_OBJS} && 253 rm -rf ${SRS_OBJS}/st-1.9 && cd ${SRS_OBJS} &&
254 unzip -q ../3rdparty/st-1.9.zip && cd st-1.9 && 254 unzip -q ../3rdparty/st-1.9.zip && cd st-1.9 &&
255 - echo "we alaways patch the st, for we may build srs under arm directly" &&  
256 - echo "the 1.st.arm.patch is ok for x86 because it's only modify code under macro linux arm" &&  
257 - patch -p0 < ../../3rdparty/patches/1.st.arm.patch &&  
258 - make ${_ST_MAKE} && 255 + make ${_ST_MAKE} EXTRA_CFLAGS="-DMD_HAVE_EPOLL" &&
259 cd .. && rm -rf st && ln -sf st-1.9/obj st && 256 cd .. && rm -rf st && ln -sf st-1.9/obj st &&
260 cd .. && rm -f ${SRS_OBJS}/_flag.st.arm.tmp 257 cd .. && rm -f ${SRS_OBJS}/_flag.st.arm.tmp
261 ) 258 )
@@ -33,25 +33,20 @@ void func0() @@ -33,25 +33,20 @@ void func0()
33 }; 33 };
34 */ 34 */
35 #if defined(__amd64__) || defined(__x86_64__) 35 #if defined(__amd64__) || defined(__x86_64__)
36 - /**  
37 - here, the __jmp_buf is 8*8=64 bytes  
38 - # if __WORDSIZE == 64  
39 - typedef long int __jmp_buf[8];  
40 - */  
41 - /**  
42 - the layout for setjmp of x86_64  
43 - #  
44 - # The jmp_buf is assumed to contain the following, in order:  
45 - # %rbx  
46 - # %rsp (post-return)  
47 - # %rbp  
48 - # %r12  
49 - # %r13  
50 - # %r14  
51 - # %r15  
52 - # <return address>  
53 - # 36 + // http://ftp.gnu.org/gnu/glibc/glibc-2.12.2.tar.xz
  37 + // http://ftp.gnu.org/gnu/glibc/glibc-2.12.1.tar.gz
  38 + /*
  39 + * Starting with glibc 2.4, JB_SP definitions are not public anymore.
  40 + * They, however, can still be found in glibc source tree in
  41 + * architecture-specific "jmpbuf-offsets.h" files.
  42 + * Most importantly, the content of jmp_buf is mangled by setjmp to make
  43 + * it completely opaque (the mangling can be disabled by setting the
  44 + * LD_POINTER_GUARD environment variable before application execution).
  45 + * Therefore we will use built-in _st_md_cxt_save/_st_md_cxt_restore
  46 + * functions as a setjmp/longjmp replacement wherever they are available
  47 + * unless USE_LIBC_SETJMP is defined.
54 */ 48 */
  49 + // for glibc 2.4+, it's not possible to get and set the sp in jmp_buf
55 register long int rsp0 asm("rsp"); 50 register long int rsp0 asm("rsp");
56 51
57 int ret = setjmp(env_func1); 52 int ret = setjmp(env_func1);
@@ -64,7 +59,9 @@ void func0() @@ -64,7 +59,9 @@ void func0()
64 printf("\n"); 59 printf("\n");
65 60
66 func1(); 61 func1();
67 -#else 62 +#endif
  63 +
  64 +#if defined(__arm__)
68 /** 65 /**
69 /usr/arm-linux-gnueabi/include/bits/setjmp.h 66 /usr/arm-linux-gnueabi/include/bits/setjmp.h
70 #ifndef _ASM 67 #ifndef _ASM
@@ -115,13 +112,18 @@ void func0() @@ -115,13 +112,18 @@ void func0()
115 #endif 112 #endif
116 } 113 }
117 114
  115 +extern uintptr_t _jmpbuf_sp (__jmp_buf regs);
118 int main(int argc, char** argv) { 116 int main(int argc, char** argv) {
119 #if defined(__amd64__) || defined(__x86_64__) 117 #if defined(__amd64__) || defined(__x86_64__)
120 - printf("x86_64 sizeof(long int)=%d, sizeof(long)=%d, sizeof(int)=%d, __WORDSIZE=%d\n",  
121 - (int)sizeof(long int), (int)sizeof(long), (int)sizeof(int), (int)__WORDSIZE); 118 + printf("x86_64 sizeof(long int)=%d, sizeof(long)=%d, "
  119 + "sizeof(int)=%d, __WORDSIZE=%d, __GLIBC__=%d, __GLIBC_MINOR__=%d\n",
  120 + (int)sizeof(long int), (int)sizeof(long), (int)sizeof(int),
  121 + (int)__WORDSIZE, (int)__GLIBC__, (int)__GLIBC_MINOR__);
122 #else 122 #else
123 - printf("arm sizeof(long int)=%d, sizeof(long)=%d, sizeof(int)=%d\n",  
124 - (int)sizeof(long int), (int)sizeof(long), (int)sizeof(int)); 123 + printf("arm sizeof(long int)=%d, sizeof(long)=%d, "
  124 + "sizeof(int)=%d, __GLIBC__=%d,__GLIBC_MINOR__=%d\n",
  125 + (int)sizeof(long int), (int)sizeof(long), (int)sizeof(int),
  126 + (int)__GLIBC__, (int)__GLIBC_MINOR__);
125 #endif 127 #endif
126 128
127 func0(); 129 func0();
@@ -51,7 +51,7 @@ EXTRA_OBJS = $(TARGETDIR)/md.o @@ -51,7 +51,7 @@ EXTRA_OBJS = $(TARGETDIR)/md.o
51 51
52 CFLAGS = 52 CFLAGS =
53 OTHER_FLAGS += -Wall -g -O0 53 OTHER_FLAGS += -Wall -g -O0
54 -DEFINES = -D$(OS) -DDEBUG -DMD_HAVE_EPOLL 54 +DEFINES = -D$(OS) -DDEBUG -DMD_HAVE_EPOLL -DMALLOC_STACK
55 55
56 ########################## 56 ##########################
57 # Other possible defines: 57 # Other possible defines:
@@ -3,289 +3,9 @@ @@ -3,289 +3,9 @@
3 * All Rights Reserved. 3 * All Rights Reserved.
4 */ 4 */
5 5
6 -#if defined(__ia64__)  
7 -  
8 -/*  
9 - * The internal __jmp_buf layout is different from one used  
10 - * by setjmp()/longjmp().  
11 - *  
12 - * Offset Description  
13 - * ------ -----------  
14 - * 0x000 stack pointer (r12)  
15 - * 0x008 gp (r1)  
16 - * 0x010 caller's unat  
17 - * 0x018 fpsr  
18 - * 0x020 r4  
19 - * 0x028 r5  
20 - * 0x030 r6  
21 - * 0x038 r7  
22 - * 0x040 rp (b0)  
23 - * 0x048 b1  
24 - * 0x050 b2  
25 - * 0x058 b3  
26 - * 0x060 b4  
27 - * 0x068 b5  
28 - * 0x070 ar.pfs  
29 - * 0x078 ar.lc  
30 - * 0x080 pr  
31 - * 0x088 ar.bsp  
32 - * 0x090 ar.unat  
33 - * 0x098 &__jmp_buf  
34 - * 0x0a0 ar.rsc  
35 - * 0x0a8 ar.rnat  
36 - * 0x0b0 f2  
37 - * 0x0c0 f3  
38 - * 0x0d0 f4  
39 - * 0x0e0 f5  
40 - * 0x0f0 f16  
41 - * 0x100 f17  
42 - * 0x110 f18  
43 - * 0x120 f19  
44 - * 0x130 f20  
45 - * 0x130 f21  
46 - * 0x140 f22  
47 - * 0x150 f23  
48 - * 0x160 f24  
49 - * 0x170 f25  
50 - * 0x180 f26  
51 - * 0x190 f27  
52 - * 0x1a0 f28  
53 - * 0x1b0 f29  
54 - * 0x1c0 f30  
55 - * 0x1d0 f31  
56 - *  
57 - * Note that the address of __jmp_buf is saved but not used: we assume  
58 - * that the jmp_buf data structure is never moved around in memory.  
59 - */  
60 -  
61 -/*  
62 - * Implemented according to "IA-64 Software Conventions and Runtime  
63 - * Architecture Guide", Chapter 10: "Context Management".  
64 - */  
65 -  
66 - .text  
67 - .psr abi64  
68 - .psr lsb  
69 - .lsb  
70 -  
71 - /* _st_md_cxt_save(__jmp_buf env) */  
72 - .align 32  
73 - .global _st_md_cxt_save  
74 - .proc _st_md_cxt_save  
75 -_st_md_cxt_save:  
76 - alloc r14 = ar.pfs,1,0,0,0  
77 - mov r16 = ar.unat  
78 - ;;  
79 - mov r17 = ar.fpsr  
80 - mov r2 = in0  
81 - add r3 = 8,in0  
82 - ;;  
83 - st8.spill.nta [r2] = sp,16 // r12 (sp)  
84 - ;;  
85 - st8.spill.nta [r3] = gp,16 // r1 (gp)  
86 - ;;  
87 - st8.nta [r2] = r16,16 // save caller's unat  
88 - st8.nta [r3] = r17,16 // save fpsr  
89 - add r8 = 0xb0,in0  
90 - ;;  
91 - st8.spill.nta [r2] = r4,16 // r4  
92 - ;;  
93 - st8.spill.nta [r3] = r5,16 // r5  
94 - add r9 = 0xc0,in0  
95 - ;;  
96 - stf.spill.nta [r8] = f2,32  
97 - stf.spill.nta [r9] = f3,32  
98 - mov r15 = rp  
99 - ;;  
100 - stf.spill.nta [r8] = f4,32  
101 - stf.spill.nta [r9] = f5,32  
102 - mov r17 = b1  
103 - ;;  
104 - stf.spill.nta [r8] = f16,32  
105 - stf.spill.nta [r9] = f17,32  
106 - mov r18 = b2  
107 - ;;  
108 - stf.spill.nta [r8] = f18,32  
109 - stf.spill.nta [r9] = f19,32  
110 - mov r19 = b3  
111 - ;;  
112 - stf.spill.nta [r8] = f20,32  
113 - stf.spill.nta [r9] = f21,32  
114 - mov r20 = b4  
115 - ;;  
116 - stf.spill.nta [r8] = f22,32  
117 - stf.spill.nta [r9] = f23,32  
118 - mov r21 = b5  
119 - ;;  
120 - stf.spill.nta [r8] = f24,32  
121 - stf.spill.nta [r9] = f25,32  
122 - mov r22 = ar.lc  
123 - ;;  
124 - stf.spill.nta [r8] = f26,32  
125 - stf.spill.nta [r9] = f27,32  
126 - mov r24 = pr  
127 - ;;  
128 - stf.spill.nta [r8] = f28,32  
129 - stf.spill.nta [r9] = f29,32  
130 - ;;  
131 - stf.spill.nta [r8] = f30  
132 - stf.spill.nta [r9] = f31  
133 -  
134 - st8.spill.nta [r2] = r6,16 // r6  
135 - ;;  
136 - st8.spill.nta [r3] = r7,16 // r7  
137 - ;;  
138 - mov r23 = ar.bsp  
139 - mov r25 = ar.unat  
140 -  
141 - st8.nta [r2] = r15,16 // b0  
142 - st8.nta [r3] = r17,16 // b1  
143 - ;;  
144 - st8.nta [r2] = r18,16 // b2  
145 - st8.nta [r3] = r19,16 // b3  
146 - mov r26 = ar.rsc  
147 - ;;  
148 - st8.nta [r2] = r20,16 // b4  
149 - st8.nta [r3] = r21,16 // b5  
150 - ;;  
151 - st8.nta [r2] = r14,16 // ar.pfs  
152 - st8.nta [r3] = r22,16 // ar.lc  
153 - ;;  
154 - st8.nta [r2] = r24,16 // pr  
155 - st8.nta [r3] = r23,16 // ar.bsp  
156 - ;;  
157 - st8.nta [r2] = r25,16 // ar.unat  
158 - st8.nta [r3] = in0,16 // &__jmp_buf (just in case)  
159 - ;;  
160 - st8.nta [r2] = r26 // ar.rsc  
161 - ;;  
162 - flushrs // flush dirty regs to backing store  
163 - ;;  
164 - and r27 = ~0x3,r26 // clear ar.rsc.mode  
165 - ;;  
166 - mov ar.rsc = r27 // put RSE in enforced lazy mode  
167 - ;;  
168 - mov r28 = ar.rnat  
169 - ;;  
170 - st8.nta [r3] = r28 // ar.rnat  
171 - mov ar.rsc = r26 // restore ar.rsc  
172 - ;;  
173 - mov r8 = 0  
174 - br.ret.sptk.few b0  
175 - .endp _st_md_cxt_save  
176 -  
177 -  
178 -/****************************************************************/  
179 -  
180 - /* _st_md_cxt_restore(__jmp_buf env, int val) */  
181 - .global _st_md_cxt_restore  
182 - .proc _st_md_cxt_restore  
183 -_st_md_cxt_restore:  
184 - alloc r8 = ar.pfs,2,0,0,0  
185 - add r2 = 0x88,in0 // r2 <- &jmpbuf.ar_bsp  
186 - mov r16 = ar.rsc  
187 - ;;  
188 - flushrs // flush dirty regs to backing store  
189 - ;;  
190 - and r17 = ~0x3,r16 // clear ar.rsc.mode  
191 - ;;  
192 - mov ar.rsc = r17 // put RSE in enforced lazy mode  
193 - ;;  
194 - invala // invalidate the ALAT  
195 - ;;  
196 - ld8 r23 = [r2],8 // r23 <- jmpbuf.ar_bsp  
197 - ;;  
198 - mov ar.bspstore = r23 // write BSPSTORE  
199 - ld8 r25 = [r2],24 // r25 <- jmpbuf.ar_unat  
200 - ;;  
201 - ld8 r26 = [r2],-8 // r26 <- jmpbuf.ar_rnat  
202 - ;;  
203 - mov ar.rnat = r26 // write RNAT  
204 - ld8 r27 = [r2] // r27 <- jmpbuf.ar_rsc  
205 - ;;  
206 - mov ar.rsc = r27 // write RSE control  
207 - mov r2 = in0  
208 - ;;  
209 - mov ar.unat = r25 // write ar.unat  
210 - add r3 = 8,in0  
211 - ;;  
212 - ld8.fill.nta sp = [r2],16 // r12 (sp)  
213 - ld8.fill.nta gp = [r3],16 // r1 (gp)  
214 - ;;  
215 - ld8.nta r16 = [r2],16 // caller's unat  
216 - ld8.nta r17 = [r3],16 // fpsr  
217 - ;;  
218 - ld8.fill.nta r4 = [r2],16 // r4  
219 - ld8.fill.nta r5 = [r3],16 // r5  
220 - ;;  
221 - ld8.fill.nta r6 = [r2],16 // r6  
222 - ld8.fill.nta r7 = [r3],16 // r7  
223 - ;;  
224 - mov ar.unat = r16 // restore caller's unat  
225 - mov ar.fpsr = r17 // restore fpsr  
226 - ;;  
227 - ld8.nta r16 = [r2],16 // b0  
228 - ld8.nta r17 = [r3],16 // b1  
229 - ;;  
230 - ld8.nta r18 = [r2],16 // b2  
231 - ld8.nta r19 = [r3],16 // b3  
232 - ;;  
233 - ld8.nta r20 = [r2],16 // b4  
234 - ld8.nta r21 = [r3],16 // b5  
235 - ;;  
236 - ld8.nta r11 = [r2],16 // ar.pfs  
237 - ld8.nta r22 = [r3],72 // ar.lc  
238 - ;;  
239 - ld8.nta r24 = [r2],48 // pr  
240 - mov b0 = r16  
241 - ;;  
242 - ldf.fill.nta f2 = [r2],32  
243 - ldf.fill.nta f3 = [r3],32  
244 - mov b1 = r17  
245 - ;;  
246 - ldf.fill.nta f4 = [r2],32  
247 - ldf.fill.nta f5 = [r3],32  
248 - mov b2 = r18  
249 - ;;  
250 - ldf.fill.nta f16 = [r2],32  
251 - ldf.fill.nta f17 = [r3],32  
252 - mov b3 = r19  
253 - ;;  
254 - ldf.fill.nta f18 = [r2],32  
255 - ldf.fill.nta f19 = [r3],32  
256 - mov b4 = r20  
257 - ;;  
258 - ldf.fill.nta f20 = [r2],32  
259 - ldf.fill.nta f21 = [r3],32  
260 - mov b5 = r21  
261 - ;;  
262 - ldf.fill.nta f22 = [r2],32  
263 - ldf.fill.nta f23 = [r3],32  
264 - mov ar.lc = r22  
265 - ;;  
266 - ldf.fill.nta f24 = [r2],32  
267 - ldf.fill.nta f25 = [r3],32  
268 - cmp.eq p6,p7 = 0,in1  
269 - ;;  
270 - ldf.fill.nta f26 = [r2],32  
271 - ldf.fill.nta f27 = [r3],32  
272 - mov ar.pfs = r11  
273 - ;;  
274 - ldf.fill.nta f28 = [r2],32  
275 - ldf.fill.nta f29 = [r3],32  
276 - ;;  
277 - ldf.fill.nta f30 = [r2]  
278 - ldf.fill.nta f31 = [r3]  
279 -(p6) mov r8 = 1  
280 -(p7) mov r8 = in1  
281 -  
282 - mov pr = r24,-1  
283 - br.ret.sptk.few b0  
284 - .endp _st_md_cxt_restore  
285 -  
286 /****************************************************************/ 6 /****************************************************************/
287 7
288 -#elif defined(__i386__) 8 +#if defined(__i386__)
289 9
290 /* 10 /*
291 * Internal __jmp_buf layout 11 * Internal __jmp_buf layout
@@ -105,35 +105,7 @@ @@ -105,35 +105,7 @@
105 (void) gettimeofday(&tv, NULL); \ 105 (void) gettimeofday(&tv, NULL); \
106 return (tv.tv_sec * 1000000LL + tv.tv_usec) 106 return (tv.tv_sec * 1000000LL + tv.tv_usec)
107 107
108 -#if defined(__ia64__)  
109 - #define MD_STACK_GROWS_DOWN  
110 -  
111 - /*  
112 - * IA-64 architecture. Besides traditional memory call stack, IA-64  
113 - * uses general register stack. Thus each thread needs a backing store  
114 - * for register stack in addition to memory stack. Standard  
115 - * setjmp()/longjmp() cannot be used for thread context switching  
116 - * because their implementation implicitly assumes that only one  
117 - * register stack exists.  
118 - */  
119 - #ifdef USE_LIBC_SETJMP  
120 - #undef USE_LIBC_SETJMP  
121 - #endif  
122 - #define MD_USE_BUILTIN_SETJMP  
123 -  
124 - #define MD_STACK_PAD_SIZE 128  
125 - /* Last register stack frame must be preserved */  
126 - #define MD_INIT_CONTEXT(_thread, _sp, _bsp, _main) \  
127 - ST_BEGIN_MACRO \  
128 - if (MD_SETJMP((_thread)->context)) \  
129 - _main(); \  
130 - memcpy((char *)(_bsp) - MD_STACK_PAD_SIZE, \  
131 - (char *)(_thread)->context[0].__jmpbuf[17] - MD_STACK_PAD_SIZE, \  
132 - MD_STACK_PAD_SIZE); \  
133 - (_thread)->context[0].__jmpbuf[0] = (long) (_sp); \  
134 - (_thread)->context[0].__jmpbuf[17] = (long) (_bsp); \  
135 - ST_END_MACRO  
136 -#elif defined(__mips__) 108 +#if defined(__mips__)
137 #define MD_STACK_GROWS_DOWN 109 #define MD_STACK_GROWS_DOWN
138 110
139 #define MD_INIT_CONTEXT(_thread, _sp, _main) \ 111 #define MD_INIT_CONTEXT(_thread, _sp, _main) \
@@ -142,7 +114,7 @@ @@ -142,7 +114,7 @@
142 _thread->context[0].__jmpbuf[0].__pc = (__ptr_t) _main; \ 114 _thread->context[0].__jmpbuf[0].__pc = (__ptr_t) _main; \
143 _thread->context[0].__jmpbuf[0].__sp = _sp; \ 115 _thread->context[0].__jmpbuf[0].__sp = _sp; \
144 ST_END_MACRO 116 ST_END_MACRO
145 -#else /* Not IA-64 or mips */ 117 +#else /* Not or mips */
146 /* 118 /*
147 * On linux, there are a few styles of jmpbuf format. These vary based 119 * On linux, there are a few styles of jmpbuf format. These vary based
148 * on architecture/glibc combination. 120 * on architecture/glibc combination.
@@ -161,51 +133,7 @@ @@ -161,51 +133,7 @@
161 * functions as a setjmp/longjmp replacement wherever they are available 133 * functions as a setjmp/longjmp replacement wherever they are available
162 * unless USE_LIBC_SETJMP is defined. 134 * unless USE_LIBC_SETJMP is defined.
163 */ 135 */
164 - #if defined(__powerpc__)  
165 - #define MD_STACK_GROWS_DOWN  
166 -  
167 - #if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1)  
168 - #ifndef JB_GPR1  
169 - #define JB_GPR1 0  
170 - #endif  
171 - #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_GPR1]  
172 - #else  
173 - /* not an error but certainly cause for caution */  
174 - #error "Untested use of old glibc on powerpc"  
175 - #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__misc[0]  
176 - #endif /* glibc 2.1 or later */  
177 - #elif defined(__alpha)  
178 - #define MD_STACK_GROWS_DOWN  
179 -  
180 - #if defined(__GLIBC__) && __GLIBC__ >= 2  
181 - #ifndef JB_SP  
182 - #define JB_SP 8  
183 - #endif  
184 - #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]  
185 - #else  
186 - /* not an error but certainly cause for caution */  
187 - #error "Untested use of old glibc on alpha"  
188 - #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp  
189 - #endif  
190 - #elif defined(__mc68000__)  
191 - #define MD_STACK_GROWS_DOWN  
192 -  
193 - /* m68k still uses old style sigjmp_buf */  
194 - #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp  
195 - #elif defined(__sparc__)  
196 - #define MD_STACK_GROWS_DOWN  
197 -  
198 - #if defined(__GLIBC__) && __GLIBC__ >= 2  
199 - #ifndef JB_SP  
200 - #define JB_SP 0  
201 - #endif  
202 - #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]  
203 - #else  
204 - /* not an error but certainly cause for caution */  
205 - #error "Untested use of old glic on sparc -- also using odd mozilla derived __fp"  
206 - #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__fp  
207 - #endif  
208 - #elif defined(__i386__) 136 + #if defined(__i386__)
209 #define MD_STACK_GROWS_DOWN 137 #define MD_STACK_GROWS_DOWN
210 #define MD_USE_BUILTIN_SETJMP 138 #define MD_USE_BUILTIN_SETJMP
211 139
@@ -235,20 +163,6 @@ @@ -235,20 +163,6 @@
235 #else 163 #else
236 #error "ARM/Linux pre-glibc2 not supported yet" 164 #error "ARM/Linux pre-glibc2 not supported yet"
237 #endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */ 165 #endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
238 - #elif defined(__s390__)  
239 - #define MD_STACK_GROWS_DOWN  
240 -  
241 - /* There is no JB_SP in glibc at this time. (glibc 2.2.5)  
242 - */  
243 - #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__gregs[9]  
244 - #elif defined(__hppa__)  
245 - #define MD_STACK_GROWS_UP  
246 -  
247 - /* yes, this is gross, unfortunately at the moment (2002/08/01) there is  
248 - * a bug in hppa's glibc header definition for JB_SP, so we can't  
249 - * use that...  
250 - */  
251 - #define MD_GET_SP(_t) (*(long *)(((char *)&(_t)->context[0].__jmpbuf[0]) + 76))  
252 #else 166 #else
253 #error "Unknown CPU architecture" 167 #error "Unknown CPU architecture"
254 #endif /* Cases with common MD_INIT_CONTEXT and different SP locations */ 168 #endif /* Cases with common MD_INIT_CONTEXT and different SP locations */
@@ -262,12 +176,14 @@ @@ -262,12 +176,14 @@
262 #endif /* Cases with different MD_INIT_CONTEXT */ 176 #endif /* Cases with different MD_INIT_CONTEXT */
263 177
264 #if defined(MD_USE_BUILTIN_SETJMP) && !defined(USE_LIBC_SETJMP) 178 #if defined(MD_USE_BUILTIN_SETJMP) && !defined(USE_LIBC_SETJMP)
  179 + /* i386/x86_64 */
265 #define MD_SETJMP(env) _st_md_cxt_save(env) 180 #define MD_SETJMP(env) _st_md_cxt_save(env)
266 #define MD_LONGJMP(env, val) _st_md_cxt_restore(env, val) 181 #define MD_LONGJMP(env, val) _st_md_cxt_restore(env, val)
267 182
268 extern int _st_md_cxt_save(jmp_buf env); 183 extern int _st_md_cxt_save(jmp_buf env);
269 extern void _st_md_cxt_restore(jmp_buf env, int val); 184 extern void _st_md_cxt_restore(jmp_buf env, int val);
270 #else 185 #else
  186 + /* arm/mips */
271 #define MD_SETJMP(env) setjmp(env) 187 #define MD_SETJMP(env) setjmp(env)
272 #define MD_LONGJMP(env, val) longjmp(env, val) 188 #define MD_LONGJMP(env, val) longjmp(env, val)
273 #endif 189 #endif