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