source: trunk/libs/newlib/src/newlib/libc/include/machine/setjmp.h @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

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