mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-11-03 23:51:39 +01:00 
			
		
		
		
	
		
			
	
	
		
			454 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			454 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_BEGIN_STD_C
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__or1k__) || defined(__or1knd__)
							 | 
						||
| 
								 | 
							
								#define _JBLEN 31 /* 32 GPRs - r0 */
							 | 
						||
| 
								 | 
							
								#define _JBTYPE unsigned long
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__arm__) || defined(__thumb__)
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * All callee preserved registers:
							 | 
						||
| 
								 | 
							
								 * v1 - v7, fp, ip, sp, lr, f4, f5, f6, f7
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define _JBLEN 23
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__aarch64__)
							 | 
						||
| 
								 | 
							
								#define _JBLEN 22
							 | 
						||
| 
								 | 
							
								#define _JBTYPE long long
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__AVR__)
							 | 
						||
| 
								 | 
							
								#define _JBLEN 24
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __sparc__
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext).
							 | 
						||
| 
								 | 
							
								 * All else recovered by under/over(flow) handling.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define	_JBLEN	13
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __BFIN__
							 | 
						||
| 
								 | 
							
								#define _JBLEN  40
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __epiphany__
							 | 
						||
| 
								 | 
							
								/* All callee preserved registers: r4-r10,fp, sp, lr,r15, r32-r39  */
							 | 
						||
| 
								 | 
							
								#define _JBTYPE long long
							 | 
						||
| 
								 | 
							
								#define _JBLEN 10
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* necv70 was 9 as well. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__m68k__) || defined(__mc68000__)
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * onsstack,sigmask,sp,pc,psl,d2-d7,a2-a6,
							 | 
						||
| 
								 | 
							
								 * fp2-fp7	for 68881.
							 | 
						||
| 
								 | 
							
								 * All else recovered by under/over(flow) handling.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define	_JBLEN	34
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__)
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * D, X, Y are not saved.
							 | 
						||
| 
								 | 
							
								 * Only take into account the pseudo soft registers (max 32).
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define _JBLEN  32
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __nds32__
							 | 
						||
| 
								 | 
							
								/* 17 words for GPRs,
							 | 
						||
| 
								 | 
							
								   1 word for $fpcfg.freg and 30 words for FPUs
							 | 
						||
| 
								 | 
							
								   Reserved 2 words for aligement-adjustment. When storeing double-precision
							 | 
						||
| 
								 | 
							
								   floating-point register into memory, the address has to be
							 | 
						||
| 
								 | 
							
								   double-word-aligned.
							 | 
						||
| 
								 | 
							
								   Check libc/machine/nds32/setjmp.S for more information.  */
							 | 
						||
| 
								 | 
							
								#if __NDS32_EXT_FPU_SP__ || __NDS32_EXT_FPU_DP__
							 | 
						||
| 
								 | 
							
								#define	_JBLEN 50
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define _JBLEN 18
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__Z8001__) || defined(__Z8002__)
							 | 
						||
| 
								 | 
							
								/* 16 regs + pc */
							 | 
						||
| 
								 | 
							
								#define _JBLEN 20
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef _AM29K
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext).
							 | 
						||
| 
								 | 
							
								 * All else recovered by under/over(flow) handling.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define	_JBLEN	9
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __i386__
							 | 
						||
| 
								 | 
							
								# if defined(__CYGWIN__) && !defined (_JBLEN)
							 | 
						||
| 
								 | 
							
								#  define _JBLEN (13 * 4)
							 | 
						||
| 
								 | 
							
								# elif defined(__unix__) || defined(__rtems__)
							 | 
						||
| 
								 | 
							
								#  define _JBLEN	9
							 | 
						||
| 
								 | 
							
								# else
							 | 
						||
| 
								 | 
							
								#  include "setjmp-dj.h"
							 | 
						||
| 
								 | 
							
								# endif
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __x86_64__
							 | 
						||
| 
								 | 
							
								# ifdef __CYGWIN__
							 | 
						||
| 
								 | 
							
								#  define _JBTYPE long
							 | 
						||
| 
								 | 
							
								#  define _JBLEN  32
							 | 
						||
| 
								 | 
							
								# else
							 | 
						||
| 
								 | 
							
								#  define _JBTYPE long long
							 | 
						||
| 
								 | 
							
								#  define _JBLEN  8
							 | 
						||
| 
								 | 
							
								# endif
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __i960__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 35
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __M32R__
							 | 
						||
| 
								 | 
							
								/* Only 8 words are currently needed.  10 gives us some slop if we need
							 | 
						||
| 
								 | 
							
								   to expand.  */
							 | 
						||
| 
								 | 
							
								#define _JBLEN 10
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __mips__
							 | 
						||
| 
								 | 
							
								# if defined(__mips64)
							 | 
						||
| 
								 | 
							
								#  define _JBTYPE long long
							 | 
						||
| 
								 | 
							
								# endif
							 | 
						||
| 
								 | 
							
								# ifdef __mips_soft_float
							 | 
						||
| 
								 | 
							
								#  define _JBLEN 11
							 | 
						||
| 
								 | 
							
								# else
							 | 
						||
| 
								 | 
							
								#  define _JBLEN 23
							 | 
						||
| 
								 | 
							
								# endif
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __m88000__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 21
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __H8300__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 5
							 | 
						||
| 
								 | 
							
								#define _JBTYPE int
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __H8300H__
							 | 
						||
| 
								 | 
							
								/* same as H8/300 but registers are twice as big */
							 | 
						||
| 
								 | 
							
								#define _JBLEN 5
							 | 
						||
| 
								 | 
							
								#define _JBTYPE long
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined (__H8300S__) || defined (__H8300SX__)
							 | 
						||
| 
								 | 
							
								/* same as H8/300 but registers are twice as big */
							 | 
						||
| 
								 | 
							
								#define _JBLEN 5
							 | 
						||
| 
								 | 
							
								#define _JBTYPE long
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __H8500__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 4
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef  __sh__
							 | 
						||
| 
								 | 
							
								#if __SH5__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 50
							 | 
						||
| 
								 | 
							
								#define _JBTYPE long long
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define _JBLEN 20
							 | 
						||
| 
								 | 
							
								#endif /* __SH5__ */
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef  __v800
							 | 
						||
| 
								 | 
							
								#define _JBLEN 28
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __PPC__
							 | 
						||
| 
								 | 
							
								#ifdef __ALTIVEC__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 64
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define _JBLEN 32
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#define _JBTYPE double
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __MICROBLAZE__
							 | 
						||
| 
								 | 
							
								#define _JBLEN  20
							 | 
						||
| 
								 | 
							
								#define _JBTYPE unsigned int
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __hppa__
							 | 
						||
| 
								 | 
							
								/* %r30, %r2-%r18, %r27, pad, %fr12-%fr15.
							 | 
						||
| 
								 | 
							
								   Note space exists for the FP registers, but they are not
							 | 
						||
| 
								 | 
							
								   saved.  */
							 | 
						||
| 
								 | 
							
								#define _JBLEN 28
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__mn10300__) || defined(__mn10200__)
							 | 
						||
| 
								 | 
							
								#ifdef __AM33_2__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 26
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								/* A guess */
							 | 
						||
| 
								 | 
							
								#define _JBLEN 10
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __v850
							 | 
						||
| 
								 | 
							
								/* I think our setjmp is saving 15 regs at the moment.  Gives us one word
							 | 
						||
| 
								 | 
							
								   slop if we need to expand.  */
							 | 
						||
| 
								 | 
							
								#define _JBLEN 16
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(_C4x)
							 | 
						||
| 
								 | 
							
								#define _JBLEN 10
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#if defined(_C3x)
							 | 
						||
| 
								 | 
							
								#define _JBLEN 9
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __TMS320C6X__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 13
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __TIC80__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 13
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __D10V__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 8
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __D30V__
							 | 
						||
| 
								 | 
							
								#define _JBLEN ((64 /* GPR */ + (2*2) /* ACs */ + 18 /* CRs */) / 2)
							 | 
						||
| 
								 | 
							
								#define _JBTYPE double
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __frv__
							 | 
						||
| 
								 | 
							
								#define _JBLEN (68/2)  /* room for 68 32-bit regs */
							 | 
						||
| 
								 | 
							
								#define _JBTYPE double
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __moxie__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 16
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __CRX__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 9
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__))
							 | 
						||
| 
								 | 
							
								/* r6, r7, r8, r9, r10, r11, r12 (r12L, r12H), 
							 | 
						||
| 
								 | 
							
								 * r13 (r13L, r13H), ra(raL, raH), sp(spL, spH) */
							 | 
						||
| 
								 | 
							
								#define _JBLEN 14
							 | 
						||
| 
								 | 
							
								#define _JBTYPE unsigned short
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __fr30__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 10
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __iq2000__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 32
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __mcore__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 16
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __MMIX__
							 | 
						||
| 
								 | 
							
								/* Using a layout compatible with GCC's built-in.  */
							 | 
						||
| 
								 | 
							
								#define _JBLEN 5
							 | 
						||
| 
								 | 
							
								#define _JBTYPE unsigned long
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __mt__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 16
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __SPU__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 50 
							 | 
						||
| 
								 | 
							
								#define _JBTYPE __vector signed int
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __xstormy16__
							 | 
						||
| 
								 | 
							
								/* 4 GPRs plus SP plus PC. */
							 | 
						||
| 
								 | 
							
								#define _JBLEN 8
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __XTENSA__
							 | 
						||
| 
								 | 
							
								#if __XTENSA_WINDOWED_ABI__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* The jmp_buf structure for Xtensa windowed ABI holds the following
							 | 
						||
| 
								 | 
							
								   (where "proc" is the procedure that calls setjmp): 4-12 registers
							 | 
						||
| 
								 | 
							
								   from the window of proc, the 4 words from the save area at proc's $sp
							 | 
						||
| 
								 | 
							
								   (in case a subsequent alloca in proc moves $sp), and the return
							 | 
						||
| 
								 | 
							
								   address within proc.  Everything else is saved on the stack in the
							 | 
						||
| 
								 | 
							
								   normal save areas.  The jmp_buf structure is:
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  	struct jmp_buf {
							 | 
						||
| 
								 | 
							
								  	    int regs[12];
							 | 
						||
| 
								 | 
							
								  	    int save[4];
							 | 
						||
| 
								 | 
							
								  	    void *return_address;
							 | 
						||
| 
								 | 
							
								  	}
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								   See the setjmp code for details.  */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define _JBLEN		17	/* 12 + 4 + 1 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else /* __XTENSA_CALL0_ABI__ */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define _JBLEN		6	/* a0, a1, a12, a13, a14, a15 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* __XTENSA_CALL0_ABI__ */
							 | 
						||
| 
								 | 
							
								#endif /* __XTENSA__ */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __mep__
							 | 
						||
| 
								 | 
							
								/* 16 GPRs, pc, hi, lo */
							 | 
						||
| 
								 | 
							
								#define _JBLEN 19
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __CRIS__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 18
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __lm32__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 19
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __m32c__
							 | 
						||
| 
								 | 
							
								#if defined(__r8c_cpu__) || defined(__m16c_cpu__)
							 | 
						||
| 
								 | 
							
								#define _JBLEN (22/2)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define _JBLEN (34/2)
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#define _JBTYPE unsigned short
							 | 
						||
| 
								 | 
							
								#endif /* __m32c__ */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __MSP430__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 9
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __MSP430X_LARGE__
							 | 
						||
| 
								 | 
							
								#define _JBTYPE unsigned long
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define _JBTYPE unsigned short
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __RL78__
							 | 
						||
| 
								 | 
							
								/* Three banks of registers, SP, CS, ES, PC */
							 | 
						||
| 
								 | 
							
								#define _JBLEN (8*3+8)
							 | 
						||
| 
								 | 
							
								#define _JBTYPE unsigned char
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * There are two versions of setjmp()/longjmp():
							 | 
						||
| 
								 | 
							
								 *   1) Compiler (gcc) built-in versions.
							 | 
						||
| 
								 | 
							
								 *   2) Function-call versions.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * The built-in versions are used most of the time.  When used, gcc replaces
							 | 
						||
| 
								 | 
							
								 * calls to setjmp()/longjmp() with inline assembly code.  The built-in 
							 | 
						||
| 
								 | 
							
								 * versions save/restore a variable number of registers.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * _JBLEN is set to 40 to be ultra-safe with the built-in versions.
							 | 
						||
| 
								 | 
							
								 * It only needs to be 12 for the function-call versions
							 | 
						||
| 
								 | 
							
								 * but this data structure is used by both versions.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#ifdef __NIOS2__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 40
							 | 
						||
| 
								 | 
							
								#define _JBTYPE unsigned long
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __RX__
							 | 
						||
| 
								 | 
							
								#define _JBLEN 0x44
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef _JBLEN
							 | 
						||
| 
								 | 
							
								#ifdef _JBTYPE
							 | 
						||
| 
								 | 
							
								typedef	_JBTYPE jmp_buf[_JBLEN];
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								typedef	int jmp_buf[_JBLEN];
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_END_STD_C
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__CYGWIN__) || defined(__rtems__)
							 | 
						||
| 
								 | 
							
								#include <signal.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* POSIX sigsetjmp/siglongjmp macros */
							 | 
						||
| 
								 | 
							
								#ifdef _JBTYPE
							 | 
						||
| 
								 | 
							
								typedef _JBTYPE sigjmp_buf[_JBLEN+1+((sizeof (_JBTYPE) + sizeof (sigset_t) - 1)
							 | 
						||
| 
								 | 
							
												     /sizeof (_JBTYPE))];
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								typedef int sigjmp_buf[_JBLEN+1+(sizeof (sigset_t)/sizeof (int))];
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define _SAVEMASK	_JBLEN
							 | 
						||
| 
								 | 
							
								#define _SIGMASK	(_JBLEN+1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __CYGWIN__
							 | 
						||
| 
								 | 
							
								# define _CYGWIN_WORKING_SIGSETJMP
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef _POSIX_THREADS
							 | 
						||
| 
								 | 
							
								#define __SIGMASK_FUNC pthread_sigmask
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define __SIGMASK_FUNC sigprocmask
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__GNUC__)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define sigsetjmp(env, savemask) \
							 | 
						||
| 
								 | 
							
								            __extension__ \
							 | 
						||
| 
								 | 
							
								            ({ \
							 | 
						||
| 
								 | 
							
								              sigjmp_buf *_sjbuf = &(env); \
							 | 
						||
| 
								 | 
							
								              ((*_sjbuf)[_SAVEMASK] = savemask,\
							 | 
						||
| 
								 | 
							
								              __SIGMASK_FUNC (SIG_SETMASK, 0, (sigset_t *)((*_sjbuf) + _SIGMASK)),\
							 | 
						||
| 
								 | 
							
								              setjmp (*_sjbuf)); \
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define siglongjmp(env, val) \
							 | 
						||
| 
								 | 
							
								            __extension__ \
							 | 
						||
| 
								 | 
							
								            ({ \
							 | 
						||
| 
								 | 
							
								              sigjmp_buf *_sjbuf = &(env); \
							 | 
						||
| 
								 | 
							
								              ((((*_sjbuf)[_SAVEMASK]) ? \
							 | 
						||
| 
								 | 
							
								               __SIGMASK_FUNC (SIG_SETMASK, (sigset_t *)((*_sjbuf) + _SIGMASK), 0)\
							 | 
						||
| 
								 | 
							
								               : 0), \
							 | 
						||
| 
								 | 
							
								               longjmp (*_sjbuf, val)); \
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else /* !__GNUC__ */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define sigsetjmp(env, savemask) ((env)[_SAVEMASK] = savemask,\
							 | 
						||
| 
								 | 
							
								               __SIGMASK_FUNC (SIG_SETMASK, 0, (sigset_t *) ((env) + _SIGMASK)),\
							 | 
						||
| 
								 | 
							
								               setjmp (env))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define siglongjmp(env, val) ((((env)[_SAVEMASK])?\
							 | 
						||
| 
								 | 
							
								               __SIGMASK_FUNC (SIG_SETMASK, (sigset_t *) ((env) + _SIGMASK), 0):0),\
							 | 
						||
| 
								 | 
							
								               longjmp (env, val))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* POSIX _setjmp/_longjmp, maintained for XSI compatibility.  These
							 | 
						||
| 
								 | 
							
								   are equivalent to sigsetjmp/siglongjmp when not saving the signal mask.
							 | 
						||
| 
								 | 
							
								   New applications should use sigsetjmp/siglongjmp instead. */
							 | 
						||
| 
								 | 
							
								#ifdef __CYGWIN__
							 | 
						||
| 
								 | 
							
								extern void _longjmp(jmp_buf, int);
							 | 
						||
| 
								 | 
							
								extern int _setjmp(jmp_buf);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define _setjmp(env)		sigsetjmp ((env), 0)
							 | 
						||
| 
								 | 
							
								#define _longjmp(env, val)	siglongjmp ((env), (val))
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#endif /* __CYGWIN__ or __rtems__ */
							 |