diff options
Diffstat (limited to 'unwind.h')
-rw-r--r-- | unwind.h | 176 |
1 files changed, 176 insertions, 0 deletions
@@ -25,6 +25,182 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if __i386__ + +struct jmp { + unsigned eip; + unsigned esp; + unsigned ebp; + unsigned ebx; + unsigned esi; + unsigned edi; +}; + +#elif __x86_64__ + +struct jmp { + unsigned long rip; + unsigned long rsp; + unsigned long rbp; + unsigned long rbx; + unsigned long r12; + unsigned long r13; + unsigned long r14; + unsigned long r15; +#if __CYGWIN__ + unsigned long rsi; + unsigned long rdi; +#endif +}; + +#elif __arm__ && !__thumb__ + +struct jmp { + unsigned long r4; + unsigned long r5; + unsigned long r6; + unsigned long r7; + unsigned long r8; + unsigned long r9; + unsigned long r10; + unsigned long fp; + unsigned long sp; + unsigned long lr; +}; + +#elif __arm__ && __thumb__ + +struct jmp { + unsigned long lr; + unsigned long r4; + unsigned long r5; + unsigned long r6; + unsigned long r7; + unsigned long r8; + unsigned long r9; + unsigned long r10; + unsigned long fp; + unsigned long sp; +}; + +#elif __PPC64__ + +struct jmp { + unsigned long r1; + unsigned long r2; + unsigned long r11; + unsigned long r12; + unsigned long r13; + unsigned long r14; + unsigned long r15; + unsigned long r16; + unsigned long r17; + unsigned long r18; + unsigned long r19; + unsigned long r20; + unsigned long r21; + unsigned long r22; + unsigned long r23; + unsigned long r24; + unsigned long r25; + unsigned long r26; + unsigned long r27; + unsigned long r28; + unsigned long r29; + unsigned long r30; + unsigned long r31; +}; + +#elif __aarch64__ + +struct jmp { + unsigned long x19; + unsigned long x20; + unsigned long x21; + unsigned long x22; + unsigned long x23; + unsigned long x24; + unsigned long x25; + unsigned long x26; + unsigned long x27; + unsigned long x28; + unsigned long x29; + unsigned long x30; + unsigned long d8; + unsigned long d9; + unsigned long d10; + unsigned long d11; + unsigned long d12; + unsigned long d13; + unsigned long d14; + unsigned long d15; + unsigned long x16; +}; + +/* Jump buffer contains: + x19-x28, x29(fp), x30(lr), (x31)sp, d8-d15. Other registers are not + saved. */ + +#else +#error port me! +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +int jmp_save(struct jmp *); +void jmp_restore(struct jmp *, int); + +#ifdef __cplusplus +} +#endif + +#if CONFIG_DEBUG_SUPPORT +#define EJ_DBG_MEMB int ds; +#else +#define EJ_DBG_MEMB +#endif + +#define EJ_OPT_MEMB EJ_DBG_MEMB + +#if HAVE_POSIX_SIGS + +typedef struct { + struct jmp jb; + volatile sig_atomic_t se; + volatile small_sigset_t blocked; + volatile val de; + volatile int gc; + val **volatile gc_pt; + EJ_OPT_MEMB + volatile int rv; +} extended_jmp_buf; + +#else + +typedef struct { + struct jmp jb; + volatile val de; + volatile int gc; + val **volatile gc_pt; + EJ_OPT_MEMB + volatile int rv; +} extended_jmp_buf; + +#endif + +#define extended_setjmp(EJB) \ + (jmp_save(&(EJB).jb) \ + ? ((EJB).rv) \ + : (extjmp_save(&(EJB)), 0)) + +#define extended_longjmp(EJB, ARG) \ + ((EJB).rv = (ARG), extjmp_restore(&(EJB)), jmp_restore(&(EJB).jb, 1)) + +void extjmp_save(extended_jmp_buf *ejb); +void extjmp_restore(extended_jmp_buf *); + typedef union uw_frame uw_frame_t; typedef enum uw_frtype { UW_BLOCK, UW_CAPTURED_BLOCK, UW_MENV, UW_CATCH, UW_HANDLE, |