Subversion Repositories Kolibri OS

Rev

Rev 4921 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  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. # else
  96. #  include "setjmp-dj.h"
  97. # endif
  98. #endif
  99.  
  100. #ifdef __x86_64__
  101. # ifdef __CYGWIN__
  102. #  define _JBTYPE long
  103. #  define _JBLEN  32
  104. # else
  105. #  define _JBTYPE long long
  106. #  define _JBLEN  8
  107. # endif
  108. #endif
  109.  
  110. #ifdef __i960__
  111. #define _JBLEN 35
  112. #endif
  113.  
  114. #ifdef __M32R__
  115. /* Only 8 words are currently needed.  10 gives us some slop if we need
  116.    to expand.  */
  117. #define _JBLEN 10
  118. #endif
  119.  
  120. #ifdef __mips__
  121. # if defined(__mips64)
  122. #  define _JBTYPE long long
  123. # endif
  124. # ifdef __mips_soft_float
  125. #  define _JBLEN 11
  126. # else
  127. #  define _JBLEN 23
  128. # endif
  129. #endif
  130.  
  131. #ifdef __m88000__
  132. #define _JBLEN 21
  133. #endif
  134.  
  135. #ifdef __H8300__
  136. #define _JBLEN 5
  137. #define _JBTYPE int
  138. #endif
  139.  
  140. #ifdef __H8300H__
  141. /* same as H8/300 but registers are twice as big */
  142. #define _JBLEN 5
  143. #define _JBTYPE long
  144. #endif
  145.  
  146. #if defined (__H8300S__) || defined (__H8300SX__)
  147. /* same as H8/300 but registers are twice as big */
  148. #define _JBLEN 5
  149. #define _JBTYPE long
  150. #endif
  151.  
  152. #ifdef __H8500__
  153. #define _JBLEN 4
  154. #endif
  155.  
  156. #ifdef  __sh__
  157. #if __SH5__
  158. #define _JBLEN 50
  159. #define _JBTYPE long long
  160. #else
  161. #define _JBLEN 20
  162. #endif /* __SH5__ */
  163. #endif
  164.  
  165. #ifdef  __v800
  166. #define _JBLEN 28
  167. #endif
  168.  
  169. #ifdef __PPC__
  170. #ifdef __ALTIVEC__
  171. #define _JBLEN 64
  172. #else
  173. #define _JBLEN 32
  174. #endif
  175. #define _JBTYPE double
  176. #endif
  177.  
  178. #ifdef __MICROBLAZE__
  179. #define _JBLEN  20
  180. #define _JBTYPE unsigned int
  181. #endif
  182.  
  183. #ifdef __hppa__
  184. /* %r30, %r2-%r18, %r27, pad, %fr12-%fr15.
  185.    Note space exists for the FP registers, but they are not
  186.    saved.  */
  187. #define _JBLEN 28
  188. #endif
  189.  
  190. #if defined(__mn10300__) || defined(__mn10200__)
  191. #ifdef __AM33_2__
  192. #define _JBLEN 26
  193. #else
  194. /* A guess */
  195. #define _JBLEN 10
  196. #endif
  197. #endif
  198.  
  199. #ifdef __v850
  200. /* I think our setjmp is saving 15 regs at the moment.  Gives us one word
  201.    slop if we need to expand.  */
  202. #define _JBLEN 16
  203. #endif
  204.  
  205. #if defined(_C4x)
  206. #define _JBLEN 10
  207. #endif
  208. #if defined(_C3x)
  209. #define _JBLEN 9
  210. #endif
  211.  
  212. #ifdef __TMS320C6X__
  213. #define _JBLEN 13
  214. #endif
  215.  
  216. #ifdef __TIC80__
  217. #define _JBLEN 13
  218. #endif
  219.  
  220. #ifdef __D10V__
  221. #define _JBLEN 8
  222. #endif
  223.  
  224. #ifdef __D30V__
  225. #define _JBLEN ((64 /* GPR */ + (2*2) /* ACs */ + 18 /* CRs */) / 2)
  226. #define _JBTYPE double
  227. #endif
  228.  
  229. #ifdef __frv__
  230. #define _JBLEN (68/2)  /* room for 68 32-bit regs */
  231. #define _JBTYPE double
  232. #endif
  233.  
  234. #ifdef __moxie__
  235. #define _JBLEN 16
  236. #endif
  237.  
  238. #ifdef __CRX__
  239. #define _JBLEN 9
  240. #endif
  241.  
  242. #if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__))
  243. /* r6, r7, r8, r9, r10, r11, r12 (r12L, r12H),
  244.  * r13 (r13L, r13H), ra(raL, raH), sp(spL, spH) */
  245. #define _JBLEN 14
  246. #define _JBTYPE unsigned short
  247. #endif
  248.  
  249. #ifdef __fr30__
  250. #define _JBLEN 10
  251. #endif
  252.  
  253. #ifdef  __FT32__
  254. #define _JBLEN 27
  255. #endif
  256.  
  257. #ifdef __iq2000__
  258. #define _JBLEN 32
  259. #endif
  260.  
  261. #ifdef __mcore__
  262. #define _JBLEN 16
  263. #endif
  264.  
  265. #ifdef __arc__
  266. #define _JBLEN 25 /* r13-r30,blink,lp_count,lp_start,lp_end,mlo,mhi,status32 */
  267. #endif
  268.  
  269. #ifdef __MMIX__
  270. /* Using a layout compatible with GCC's built-in.  */
  271. #define _JBLEN 5
  272. #define _JBTYPE unsigned long
  273. #endif
  274.  
  275. #ifdef __mt__
  276. #define _JBLEN 16
  277. #endif
  278.  
  279. #ifdef __SPU__
  280. #define _JBLEN 50
  281. #define _JBTYPE __vector signed int
  282. #endif
  283.  
  284. #ifdef __xstormy16__
  285. /* 4 GPRs plus SP plus PC. */
  286. #define _JBLEN 8
  287. #endif
  288.  
  289. #ifdef __mep__
  290. /* 16 GPRs, pc, hi, lo */
  291. #define _JBLEN 19
  292. #endif
  293.  
  294. #ifdef __CRIS__
  295. #define _JBLEN 18
  296. #endif
  297.  
  298. #ifdef __ia64
  299. #define _JBLEN 64
  300. #endif
  301.  
  302. #ifdef __lm32__
  303. #define _JBLEN 19
  304. #endif
  305.  
  306. #ifdef __m32c__
  307. #if defined(__r8c_cpu__) || defined(__m16c_cpu__)
  308. #define _JBLEN (22/2)
  309. #else
  310. #define _JBLEN (34/2)
  311. #endif
  312. #define _JBTYPE unsigned short
  313. #endif /* __m32c__ */
  314.  
  315. #ifdef __MSP430__
  316. #define _JBLEN 9
  317.  
  318. #ifdef __MSP430X_LARGE__
  319. #define _JBTYPE unsigned long
  320. #else
  321. #define _JBTYPE unsigned short
  322. #endif
  323. #endif
  324.  
  325. #ifdef __RL78__
  326. /* Three banks of registers, SP, CS, ES, PC */
  327. #define _JBLEN (8*3+8)
  328. #define _JBTYPE unsigned char
  329. #endif
  330.  
  331. /*
  332.  * There are two versions of setjmp()/longjmp():
  333.  *   1) Compiler (gcc) built-in versions.
  334.  *   2) Function-call versions.
  335.  *
  336.  * The built-in versions are used most of the time.  When used, gcc replaces
  337.  * calls to setjmp()/longjmp() with inline assembly code.  The built-in
  338.  * versions save/restore a variable number of registers.
  339.  
  340.  * _JBLEN is set to 40 to be ultra-safe with the built-in versions.
  341.  * It only needs to be 12 for the function-call versions
  342.  * but this data structure is used by both versions.
  343.  */
  344. #ifdef __NIOS2__
  345. #define _JBLEN 40
  346. #define _JBTYPE unsigned long
  347. #endif
  348.  
  349. #ifdef __RX__
  350. #define _JBLEN 0x44
  351. #endif
  352.  
  353. #ifdef __VISIUM__
  354. /* All call-saved GP registers: r11-r19,r21,r22,r23.  */
  355. #define _JBLEN 12
  356. #endif
  357.  
  358. #ifdef _JBLEN
  359. #ifdef _JBTYPE
  360. typedef _JBTYPE jmp_buf[_JBLEN];
  361. #else
  362. typedef int jmp_buf[_JBLEN];
  363. #endif
  364. #endif
  365.  
  366. _END_STD_C
  367.  
  368. #if defined(__CYGWIN__) || defined(__rtems__)
  369. #include <signal.h>
  370.  
  371. #ifdef __cplusplus
  372. extern "C" {
  373. #endif
  374.  
  375. /* POSIX sigsetjmp/siglongjmp macros */
  376. #ifdef _JBTYPE
  377. typedef _JBTYPE sigjmp_buf[_JBLEN+1+((sizeof (_JBTYPE) + sizeof (sigset_t) - 1)
  378.                                      /sizeof (_JBTYPE))];
  379. #else
  380. typedef int sigjmp_buf[_JBLEN+1+(sizeof (sigset_t)/sizeof (int))];
  381. #endif
  382.  
  383. #define _SAVEMASK       _JBLEN
  384. #define _SIGMASK        (_JBLEN+1)
  385.  
  386. #ifdef __CYGWIN__
  387. # define _CYGWIN_WORKING_SIGSETJMP
  388. #endif
  389.  
  390. #ifdef _POSIX_THREADS
  391. #define __SIGMASK_FUNC pthread_sigmask
  392. #else
  393. #define __SIGMASK_FUNC sigprocmask
  394. #endif
  395.  
  396. #ifdef __CYGWIN__
  397. /* Per POSIX, siglongjmp has to be implemented as function.  Cygwin
  398.    provides functions for both, siglongjmp and sigsetjmp since 2.2.0. */
  399. extern void siglongjmp (sigjmp_buf, int) __attribute__ ((__noreturn__));
  400. extern int sigsetjmp (sigjmp_buf, int);
  401. #endif
  402.  
  403. #if defined(__GNUC__)
  404.  
  405. #define sigsetjmp(env, savemask) \
  406.             __extension__ \
  407.             ({ \
  408.               sigjmp_buf *_sjbuf = &(env); \
  409.               ((*_sjbuf)[_SAVEMASK] = savemask,\
  410.               __SIGMASK_FUNC (SIG_SETMASK, 0, (sigset_t *)((*_sjbuf) + _SIGMASK)),\
  411.               setjmp (*_sjbuf)); \
  412.             })
  413.  
  414. #define siglongjmp(env, val) \
  415.             __extension__ \
  416.             ({ \
  417.               sigjmp_buf *_sjbuf = &(env); \
  418.               ((((*_sjbuf)[_SAVEMASK]) ? \
  419.                __SIGMASK_FUNC (SIG_SETMASK, (sigset_t *)((*_sjbuf) + _SIGMASK), 0)\
  420.                : 0), \
  421.                longjmp (*_sjbuf, val)); \
  422.             })
  423.  
  424. #else /* !__GNUC__ */
  425.  
  426. #define sigsetjmp(env, savemask) ((env)[_SAVEMASK] = savemask,\
  427.                __SIGMASK_FUNC (SIG_SETMASK, 0, (sigset_t *) ((env) + _SIGMASK)),\
  428.                setjmp (env))
  429.  
  430. #define siglongjmp(env, val) ((((env)[_SAVEMASK])?\
  431.                __SIGMASK_FUNC (SIG_SETMASK, (sigset_t *) ((env) + _SIGMASK), 0):0),\
  432.                longjmp (env, val))
  433.  
  434. #endif
  435.  
  436. /* POSIX _setjmp/_longjmp, maintained for XSI compatibility.  These
  437.    are equivalent to sigsetjmp/siglongjmp when not saving the signal mask.
  438.    New applications should use sigsetjmp/siglongjmp instead. */
  439. #ifdef __CYGWIN__
  440. extern void _longjmp (jmp_buf, int) __attribute__ ((__noreturn__));
  441. extern int _setjmp (jmp_buf);
  442. #else
  443. #define _setjmp(env)            sigsetjmp ((env), 0)
  444. #define _longjmp(env, val)      siglongjmp ((env), (val))
  445. #endif
  446.  
  447. #ifdef __cplusplus
  448. }
  449. #endif
  450. #endif /* __CYGWIN__ or __rtems__ */
  451.