1 2 _BEGIN_STD_C 3 4 #if defined(__arm__) || defined(__thumb__) 5 /* 6 * All callee preserved registers: 7 * v1 - v7, fp, ip, sp, lr, f4, f5, f6, f7 8 */ 9 #define _JBLEN 23 10 #endif 11 12 #if defined(__AVR__) 13 #define _JBLEN 24 14 #endif 15 16 #ifdef __sparc__ 17 /* 18 * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext). 19 * All else recovered by under/over(flow) handling. 20 */ 21 #define _JBLEN 13 22 #endif 23 24 /* necv70 was 9 as well. */ 25 26 #ifdef __mc68000__ 27 /* 28 * onsstack,sigmask,sp,pc,psl,d2-d7,a2-a6, 29 * fp2-fp7 for 68881. 30 * All else recovered by under/over(flow) handling. 31 */ 32 #define _JBLEN 34 33 #endif 34 35 #if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__) 36 /* 37 * D, X, Y are not saved. 38 * Only take into account the pseudo soft registers (max 32). 39 */ 40 #define _JBLEN 32 41 #endif 42 43 #if defined(__Z8001__) || defined(__Z8002__) 44 /* 16 regs + pc */ 45 #define _JBLEN 20 46 #endif 47 48 #ifdef _AM29K 49 /* 50 * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext). 51 * All else recovered by under/over(flow) handling. 52 */ 53 #define _JBLEN 9 54 #endif 55 56 #if defined(__CYGWIN__) && !defined (_JBLEN) 57 #define _JBLEN (13 * 4) 58 #elif defined (__i386__) 59 #if defined(__unix__) || defined(__rtems__) 60 # define _JBLEN 9 61 #else 62 #include "setjmp-dj.h" 63 #endif 64 #endif 65 66 #ifdef __i960__ 67 #define _JBLEN 35 68 #endif 69 70 #ifdef __M32R__ 71 /* Only 8 words are currently needed. 10 gives us some slop if we need 72 to expand. */ 73 #define _JBLEN 10 74 #endif 75 76 #ifdef __mips__ 77 #ifdef __mips64 78 #define _JBTYPE long long 79 #endif 80 #ifdef __mips_soft_float 81 #define _JBLEN 11 82 #else 83 #define _JBLEN 23 84 #endif 85 #endif 86 87 #ifdef __m88000__ 88 #define _JBLEN 21 89 #endif 90 91 #ifdef __H8300__ 92 #define _JBLEN 5 93 #define _JBTYPE int 94 #endif 95 96 #ifdef __H8300H__ 97 /* same as H8/300 but registers are twice as big */ 98 #define _JBLEN 5 99 #define _JBTYPE long 100 #endif 101 102 #if defined (__H8300S__) || defined (__H8300SX__) 103 /* same as H8/300 but registers are twice as big */ 104 #define _JBLEN 5 105 #define _JBTYPE long 106 #endif 107 108 #ifdef __H8500__ 109 #define _JBLEN 4 110 #endif 111 112 #ifdef __sh__ 113 #if __SH5__ 114 #define _JBLEN 50 115 #define _JBTYPE long long 116 #else 117 #define _JBLEN 20 118 #endif /* __SH5__ */ 119 #endif 120 121 #ifdef __v800 122 #define _JBLEN 28 123 #endif 124 125 #ifdef __PPC__ 126 #ifdef __ALTIVEC__ 127 #define _JBLEN 64 128 #else 129 #define _JBLEN 32 130 #endif 131 #define _JBTYPE double 132 #endif 133 134 #ifdef __hppa__ 135 /* %r30, %r2-%r18, %r27, pad, %fr12-%fr15. 136 Note space exists for the FP registers, but they are not 137 saved. */ 138 #define _JBLEN 28 139 #endif 140 141 #if defined(__mn10300__) || defined(__mn10200__) 142 #ifdef __AM33_2__ 143 #define _JBLEN 26 144 #else 145 /* A guess */ 146 #define _JBLEN 10 147 #endif 148 #endif 149 150 #ifdef __v850 151 /* I think our setjmp is saving 15 regs at the moment. Gives us one word 152 slop if we need to expand. */ 153 #define _JBLEN 16 154 #endif 155 156 #if defined(_C4x) 157 #define _JBLEN 10 158 #endif 159 #if defined(_C3x) 160 #define _JBLEN 9 161 #endif 162 163 #ifdef __TIC80__ 164 #define _JBLEN 13 165 #endif 166 167 #ifdef __D10V__ 168 #define _JBLEN 8 169 #endif 170 171 #ifdef __D30V__ 172 #define _JBLEN ((64 /* GPR */ + (2*2) /* ACs */ + 18 /* CRs */) / 2) 173 #define _JBTYPE double 174 #endif 175 176 #ifdef __frv__ 177 #define _JBLEN (68/2) /* room for 68 32-bit regs */ 178 #define _JBTYPE double 179 #endif 180 181 #ifdef __CRX__ 182 #define _JBLEN 9 183 #endif 184 185 #ifdef __fr30__ 186 #define _JBLEN 10 187 #endif 188 189 #ifdef __iq2000__ 190 #define _JBLEN 32 191 #endif 192 193 #ifdef __mcore__ 194 #define _JBLEN 16 195 #endif 196 197 #ifdef __MMIX__ 198 /* Using a layout compatible with GCC's built-in. */ 199 #define _JBLEN 5 200 #define _JBTYPE unsigned long 201 #endif 202 203 #ifdef __mt__ 204 #define _JBLEN 16 205 #endif 206 207 #ifdef __xstormy16__ 208 /* 4 GPRs plus SP plus PC. */ 209 #define _JBLEN 8 210 #endif 211 212 #ifdef __CRIS__ 213 #define _JBLEN 18 214 #endif 215 216 #ifdef __m32c__ 217 #if defined(__r8c_cpu__) || defined(__m16c_cpu__) 218 #define _JBLEN (22/2) 219 #else 220 #define _JBLEN (34/2) 221 #endif 222 #define _JBTYPE unsigned short 223 #endif /* __m32c__ */ 224 225 #if defined (__aeon__) || defined (__AEON__) || defined (__ba__) || defined (__BA__) 226 /* For now, save the whole register file. */ 227 #define _JBLEN 31 228 #define _JBTYPE unsigned long 229 #endif 230 231 #ifdef _JBLEN 232 #ifdef _JBTYPE 233 typedef _JBTYPE jmp_buf[_JBLEN]; 234 #else 235 typedef int jmp_buf[_JBLEN]; 236 #endif 237 #endif 238 239 _END_STD_C 240 241 #if defined(__CYGWIN__) || defined(__rtems__) 242 #include <signal.h> 243 244 #ifdef __cplusplus 245 extern "C" { 246 #endif 247 248 /* POSIX sigsetjmp/siglongjmp macros */ 249 typedef int sigjmp_buf[_JBLEN+2]; 250 251 #define _SAVEMASK _JBLEN 252 #define _SIGMASK (_JBLEN+1) 253 254 #ifdef __CYGWIN__ 255 # define _CYGWIN_WORKING_SIGSETJMP 256 #endif 257 258 #if defined(__GNUC__) 259 260 #define sigsetjmp(env, savemask) \ 261 ({ \ 262 sigjmp_buf *_sjbuf = &(env); \ 263 ((*_sjbuf)[_SAVEMASK] = savemask,\ 264 sigprocmask (SIG_SETMASK, 0, (sigset_t *)((*_sjbuf) + _SIGMASK)),\ 265 setjmp (*_sjbuf)); \ 266 }) 267 268 #define siglongjmp(env, val) \ 269 ({ \ 270 sigjmp_buf *_sjbuf = &(env); \ 271 ((((*_sjbuf)[_SAVEMASK]) ? \ 272 sigprocmask (SIG_SETMASK, (sigset_t *)((*_sjbuf) + _SIGMASK), 0)\ 273 : 0), \ 274 longjmp (*_sjbuf, val)); \ 275 }) 276 277 #else /* !__GNUC__ */ 278 279 #define sigsetjmp(env, savemask) ((env)[_SAVEMASK] = savemask,\ 280 sigprocmask (SIG_SETMASK, 0, (sigset_t *) ((env) + _SIGMASK)),\ 281 setjmp (env)) 282 283 #define siglongjmp(env, val) ((((env)[_SAVEMASK])?\ 284 sigprocmask (SIG_SETMASK, (sigset_t *) ((env) + _SIGMASK), 0):0),\ 285 longjmp (env, val)) 286 287 #endif 288 289 #ifdef __cplusplus 290 } 291 #endif 292 #endif /* __CYGWIN__ or __rtems__ */ 293