1 
2 _BEGIN_STD_C
3 
4 #if defined(__or1k__) || defined(__or1knd__)
5 /*
6  * r1, r2, r9, r14, r16 .. r30, SR.
7  */
8 #define _JBLEN 13
9 #define _JBTYPE unsigned long
10 #endif
11 
12 #if defined(__arm__) || defined(__thumb__)
13 /*
14  * All callee preserved registers:
15  * v1 - v7, fp, ip, sp, lr, f4, f5, f6, f7
16  */
17 #define _JBLEN 23
18 #endif
19 
20 #if defined(__aarch64__)
21 #define _JBLEN 22
22 #define _JBTYPE long long
23 #endif
24 
25 #if defined(__AVR__)
26 #define _JBLEN 24
27 #endif
28 
29 #ifdef __sparc__
30 /*
31  * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext).
32  * All else recovered by under/over(flow) handling.
33  */
34 #define	_JBLEN	13
35 #endif
36 
37 #ifdef __BFIN__
38 #define _JBLEN  40
39 #endif
40 
41 #ifdef __epiphany__
42 /* All callee preserved registers: r4-r10,fp, sp, lr,r15, r32-r39  */
43 #define _JBTYPE long long
44 #define _JBLEN 10
45 #endif
46 
47 /* necv70 was 9 as well. */
48 
49 #if defined(__m68k__) || defined(__mc68000__)
50 /*
51  * onsstack,sigmask,sp,pc,psl,d2-d7,a2-a6,
52  * fp2-fp7	for 68881.
53  * All else recovered by under/over(flow) handling.
54  */
55 #define	_JBLEN	34
56 #endif
57 
58 #if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__)
59 /*
60  * D, X, Y are not saved.
61  * Only take into account the pseudo soft registers (max 32).
62  */
63 #define _JBLEN  32
64 #endif
65 
66 #ifdef __nds32__
67 /* 17 words for GPRs,
68    1 word for $fpcfg.freg and 30 words for FPUs
69    Reserved 2 words for aligement-adjustment. When storeing double-precision
70    floating-point register into memory, the address has to be
71    double-word-aligned.
72    Check libc/machine/nds32/setjmp.S for more information.  */
73 #if __NDS32_EXT_FPU_SP__ || __NDS32_EXT_FPU_DP__
74 #define	_JBLEN 50
75 #else
76 #define _JBLEN 18
77 #endif
78 #endif
79 
80 #if defined(__Z8001__) || defined(__Z8002__)
81 /* 16 regs + pc */
82 #define _JBLEN 20
83 #endif
84 
85 #ifdef _AM29K
86 /*
87  * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext).
88  * All else recovered by under/over(flow) handling.
89  */
90 #define	_JBLEN	9
91 #endif
92 
93 #ifdef __i386__
94 # if defined(__CYGWIN__) && !defined (_JBLEN)
95 #  define _JBLEN (13 * 4)
96 # elif defined(__unix__) || defined(__rtems__)
97 #  define _JBLEN	9
98 # elif defined(__iamcu__)
99 /* Intel MCU jmp_buf only covers callee-saved registers. */
100 #  define _JBLEN	6
101 # else
102 #  include "setjmp-dj.h"
103 # endif
104 #endif
105 
106 #ifdef __x86_64__
107 # ifdef __CYGWIN__
108 #  define _JBTYPE long
109 #  define _JBLEN  32
110 # else
111 #  define _JBTYPE long long
112 #  define _JBLEN  8
113 # endif
114 #endif
115 
116 #ifdef __i960__
117 #define _JBLEN 35
118 #endif
119 
120 #ifdef __M32R__
121 /* Only 8 words are currently needed.  10 gives us some slop if we need
122    to expand.  */
123 #define _JBLEN 10
124 #endif
125 
126 #ifdef __mips__
127 # if defined(__mips64)
128 #  define _JBTYPE long long
129 # endif
130 # ifdef __mips_soft_float
131 #  define _JBLEN 11
132 # else
133 #  define _JBLEN 23
134 # endif
135 #endif
136 
137 #ifdef __m88000__
138 #define _JBLEN 21
139 #endif
140 
141 #ifdef __H8300__
142 #define _JBLEN 5
143 #define _JBTYPE int
144 #endif
145 
146 #ifdef __H8300H__
147 /* same as H8/300 but registers are twice as big */
148 #define _JBLEN 5
149 #define _JBTYPE long
150 #endif
151 
152 #if defined (__H8300S__) || defined (__H8300SX__)
153 /* same as H8/300 but registers are twice as big */
154 #define _JBLEN 5
155 #define _JBTYPE long
156 #endif
157 
158 #ifdef __H8500__
159 #define _JBLEN 4
160 #endif
161 
162 #ifdef  __sh__
163 #if __SH5__
164 #define _JBLEN 50
165 #define _JBTYPE long long
166 #else
167 #define _JBLEN 20
168 #endif /* __SH5__ */
169 #endif
170 
171 #ifdef  __v800
172 #define _JBLEN 28
173 #endif
174 
175 #ifdef __PPC__
176 #ifdef __ALTIVEC__
177 #define _JBLEN 64
178 #else
179 #define _JBLEN 32
180 #endif
181 #define _JBTYPE double
182 #endif
183 
184 #ifdef __MICROBLAZE__
185 #define _JBLEN  20
186 #define _JBTYPE unsigned int
187 #endif
188 
189 #ifdef __hppa__
190 /* %r30, %r2-%r18, %r27, pad, %fr12-%fr15.
191    Note space exists for the FP registers, but they are not
192    saved.  */
193 #define _JBLEN 28
194 #endif
195 
196 #if defined(__mn10300__) || defined(__mn10200__)
197 #ifdef __AM33_2__
198 #define _JBLEN 26
199 #else
200 /* A guess */
201 #define _JBLEN 10
202 #endif
203 #endif
204 
205 #ifdef __v850
206 /* I think our setjmp is saving 15 regs at the moment.  Gives us one word
207    slop if we need to expand.  */
208 #define _JBLEN 16
209 #endif
210 
211 #if defined(_C4x)
212 #define _JBLEN 10
213 #endif
214 #if defined(_C3x)
215 #define _JBLEN 9
216 #endif
217 
218 #ifdef __TMS320C6X__
219 #define _JBLEN 13
220 #endif
221 
222 #ifdef __TIC80__
223 #define _JBLEN 13
224 #endif
225 
226 #ifdef __D10V__
227 #define _JBLEN 8
228 #endif
229 
230 #ifdef __D30V__
231 #define _JBLEN ((64 /* GPR */ + (2*2) /* ACs */ + 18 /* CRs */) / 2)
232 #define _JBTYPE double
233 #endif
234 
235 #ifdef __frv__
236 #define _JBLEN (68/2)  /* room for 68 32-bit regs */
237 #define _JBTYPE double
238 #endif
239 
240 #ifdef __moxie__
241 #define _JBLEN 19
242 #endif
243 
244 #ifdef __CRX__
245 #define _JBLEN 9
246 #endif
247 
248 #if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__))
249 /* r6, r7, r8, r9, r10, r11, r12 (r12L, r12H),
250  * r13 (r13L, r13H), ra(raL, raH), sp(spL, spH) */
251 #define _JBLEN 14
252 #define _JBTYPE unsigned short
253 #endif
254 
255 #ifdef __fr30__
256 #define _JBLEN 10
257 #endif
258 
259 #ifdef  __FT32__
260 #define _JBLEN 27
261 #endif
262 
263 #ifdef __iq2000__
264 #define _JBLEN 32
265 #endif
266 
267 #ifdef __mcore__
268 #define _JBLEN 16
269 #endif
270 
271 #ifdef __arc__
272 #define _JBLEN 25 /* r13-r30,blink,lp_count,lp_start,lp_end,mlo,mhi,status32 */
273 #endif
274 
275 #ifdef __MMIX__
276 /* Using a layout compatible with GCC's built-in.  */
277 #define _JBLEN 5
278 #define _JBTYPE unsigned long
279 #endif
280 
281 #ifdef __mt__
282 #define _JBLEN 16
283 #endif
284 
285 #ifdef __SPU__
286 #define _JBLEN 50
287 #define _JBTYPE __vector signed int
288 #endif
289 
290 #ifdef __xstormy16__
291 /* 4 GPRs plus SP plus PC. */
292 #define _JBLEN 8
293 #endif
294 
295 #ifdef __mep__
296 /* 16 GPRs, pc, hi, lo */
297 #define _JBLEN 19
298 #endif
299 
300 #ifdef __CRIS__
301 #define _JBLEN 18
302 #endif
303 
304 #ifdef __ia64
305 #define _JBLEN 64
306 #endif
307 
308 #ifdef __lm32__
309 #define _JBLEN 19
310 #endif
311 
312 #ifdef __m32c__
313 #if defined(__r8c_cpu__) || defined(__m16c_cpu__)
314 #define _JBLEN (22/2)
315 #else
316 #define _JBLEN (34/2)
317 #endif
318 #define _JBTYPE unsigned short
319 #endif /* __m32c__ */
320 
321 #ifdef __MSP430__
322 #define _JBLEN 9
323 
324 #ifdef __MSP430X_LARGE__
325 #define _JBTYPE unsigned long
326 #else
327 #define _JBTYPE unsigned short
328 #endif
329 #endif
330 
331 #ifdef __RL78__
332 /* Three banks of registers, SP, CS, ES, PC */
333 #define _JBLEN (8*3+8)
334 #define _JBTYPE unsigned char
335 #endif
336 
337 /*
338  * There are two versions of setjmp()/longjmp():
339  *   1) Compiler (gcc) built-in versions.
340  *   2) Function-call versions.
341  *
342  * The built-in versions are used most of the time.  When used, gcc replaces
343  * calls to setjmp()/longjmp() with inline assembly code.  The built-in
344  * versions save/restore a variable number of registers.
345 
346  * _JBLEN is set to 40 to be ultra-safe with the built-in versions.
347  * It only needs to be 12 for the function-call versions
348  * but this data structure is used by both versions.
349  */
350 #ifdef __NIOS2__
351 #define _JBLEN 40
352 #define _JBTYPE unsigned long
353 #endif
354 
355 #ifdef __PRU__
356 #define _JBLEN 48
357 #define _JBTYPE unsigned int
358 #endif
359 
360 #ifdef __RX__
361 #define _JBLEN 0x44
362 #endif
363 
364 #ifdef __VISIUM__
365 /* All call-saved GP registers: r11-r19,r21,r22,r23.  */
366 #define _JBLEN 12
367 #endif
368 
369 #ifdef __riscv
370 /* _JBTYPE using long long to make sure the alignment is align to 8 byte,
371    otherwise in rv32imafd, store/restore FPR may mis-align.  */
372 #define _JBTYPE long long
373 #ifdef __riscv_32e
374 #define _JBLEN ((4*sizeof(long))/sizeof(long))
375 #else
376 #define _JBLEN ((14*sizeof(long) + 12*sizeof(double))/sizeof(long))
377 #endif
378 #endif
379 
380 #ifdef _JBLEN
381 #ifdef _JBTYPE
382 typedef	_JBTYPE jmp_buf[_JBLEN];
383 #else
384 typedef	int jmp_buf[_JBLEN];
385 #endif
386 #endif
387 
388 _END_STD_C
389 
390 #if (defined(__CYGWIN__) || defined(__rtems__)) && __POSIX_VISIBLE
391 #include <signal.h>
392 
393 #ifdef __cplusplus
394 extern "C" {
395 #endif
396 
397 /* POSIX sigsetjmp/siglongjmp macros */
398 #ifdef _JBTYPE
399 typedef _JBTYPE sigjmp_buf[_JBLEN+1+((sizeof (_JBTYPE) + sizeof (sigset_t) - 1)
400 				     /sizeof (_JBTYPE))];
401 #else
402 typedef int sigjmp_buf[_JBLEN+1+(sizeof (sigset_t)/sizeof (int))];
403 #endif
404 
405 #define _SAVEMASK	_JBLEN
406 #define _SIGMASK	(_JBLEN+1)
407 
408 #ifdef __CYGWIN__
409 # define _CYGWIN_WORKING_SIGSETJMP
410 #endif
411 
412 #ifdef _POSIX_THREADS
413 #define __SIGMASK_FUNC pthread_sigmask
414 #else
415 #define __SIGMASK_FUNC sigprocmask
416 #endif
417 
418 #ifdef __CYGWIN__
419 /* Per POSIX, siglongjmp has to be implemented as function.  Cygwin
420    provides functions for both, siglongjmp and sigsetjmp since 2.2.0. */
421 extern void siglongjmp (sigjmp_buf, int) __attribute__ ((__noreturn__));
422 extern int sigsetjmp (sigjmp_buf, int);
423 #endif
424 
425 #if defined(__GNUC__)
426 
427 #define sigsetjmp(env, savemask) \
428             __extension__ \
429             ({ \
430               sigjmp_buf *_sjbuf = &(env); \
431               ((*_sjbuf)[_SAVEMASK] = savemask,\
432               __SIGMASK_FUNC (SIG_SETMASK, 0, (sigset_t *)((*_sjbuf) + _SIGMASK)),\
433               setjmp (*_sjbuf)); \
434             })
435 
436 #define siglongjmp(env, val) \
437             __extension__ \
438             ({ \
439               sigjmp_buf *_sjbuf = &(env); \
440               ((((*_sjbuf)[_SAVEMASK]) ? \
441                __SIGMASK_FUNC (SIG_SETMASK, (sigset_t *)((*_sjbuf) + _SIGMASK), 0)\
442                : 0), \
443                longjmp (*_sjbuf, val)); \
444             })
445 
446 #else /* !__GNUC__ */
447 
448 #define sigsetjmp(env, savemask) ((env)[_SAVEMASK] = savemask,\
449                __SIGMASK_FUNC (SIG_SETMASK, 0, (sigset_t *) ((env) + _SIGMASK)),\
450                setjmp (env))
451 
452 #define siglongjmp(env, val) ((((env)[_SAVEMASK])?\
453                __SIGMASK_FUNC (SIG_SETMASK, (sigset_t *) ((env) + _SIGMASK), 0):0),\
454                longjmp (env, val))
455 
456 #endif
457 
458 /* POSIX _setjmp/_longjmp, maintained for XSI compatibility.  These
459    are equivalent to sigsetjmp/siglongjmp when not saving the signal mask.
460    New applications should use sigsetjmp/siglongjmp instead. */
461 #ifdef __CYGWIN__
462 extern void _longjmp (jmp_buf, int) __attribute__ ((__noreturn__));
463 extern int _setjmp (jmp_buf);
464 #else
465 #define _setjmp(env)		sigsetjmp ((env), 0)
466 #define _longjmp(env, val)	siglongjmp ((env), (val))
467 #endif
468 
469 #ifdef __cplusplus
470 }
471 #endif
472 #endif /* (__CYGWIN__ or __rtems__) and __POSIX_VISIBLE */
473