Reactos
at master 224 lines 5.6 kB view raw
1/** 2 * This file has no copyright assigned and is placed in the Public Domain. 3 * This file is part of the w64 mingw-runtime package. 4 * No warranty is given; refer to the file DISCLAIMER within this package. 5 */ 6#ifndef _INC_SETJMP 7#define _INC_SETJMP 8 9#include <vcruntime.h> 10 11#pragma pack(push,_CRT_PACKING) 12 13#ifdef __cplusplus 14extern "C" { 15#endif 16 17#if (defined(_X86_) && !defined(__x86_64)) 18 19#define _JBLEN 16 20#define _JBTYPE int 21 22 typedef struct __JUMP_BUFFER { 23 unsigned long Ebp; 24 unsigned long Ebx; 25 unsigned long Edi; 26 unsigned long Esi; 27 unsigned long Esp; 28 unsigned long Eip; 29 unsigned long Registration; 30 unsigned long TryLevel; 31 unsigned long Cookie; 32 unsigned long UnwindFunc; 33 unsigned long UnwindData[6]; 34 } _JUMP_BUFFER; 35 36#elif defined(__ia64__) 37 38 typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 { 39 __MINGW_EXTENSION __int64 LowPart; 40 __MINGW_EXTENSION __int64 HighPart; 41 } SETJMP_FLOAT128; 42 43#define _JBLEN 33 44 typedef SETJMP_FLOAT128 _JBTYPE; 45 46 typedef struct __JUMP_BUFFER { 47 48 unsigned long iAReserved[6]; 49 50 unsigned long Registration; 51 unsigned long TryLevel; 52 unsigned long Cookie; 53 unsigned long UnwindFunc; 54 55 unsigned long UnwindData[6]; 56 57 SETJMP_FLOAT128 FltS0; 58 SETJMP_FLOAT128 FltS1; 59 SETJMP_FLOAT128 FltS2; 60 SETJMP_FLOAT128 FltS3; 61 SETJMP_FLOAT128 FltS4; 62 SETJMP_FLOAT128 FltS5; 63 SETJMP_FLOAT128 FltS6; 64 SETJMP_FLOAT128 FltS7; 65 SETJMP_FLOAT128 FltS8; 66 SETJMP_FLOAT128 FltS9; 67 SETJMP_FLOAT128 FltS10; 68 SETJMP_FLOAT128 FltS11; 69 SETJMP_FLOAT128 FltS12; 70 SETJMP_FLOAT128 FltS13; 71 SETJMP_FLOAT128 FltS14; 72 SETJMP_FLOAT128 FltS15; 73 SETJMP_FLOAT128 FltS16; 74 SETJMP_FLOAT128 FltS17; 75 SETJMP_FLOAT128 FltS18; 76 SETJMP_FLOAT128 FltS19; 77 __MINGW_EXTENSION __int64 FPSR; 78 __MINGW_EXTENSION __int64 StIIP; 79 __MINGW_EXTENSION __int64 BrS0; 80 __MINGW_EXTENSION __int64 BrS1; 81 __MINGW_EXTENSION __int64 BrS2; 82 __MINGW_EXTENSION __int64 BrS3; 83 __MINGW_EXTENSION __int64 BrS4; 84 __MINGW_EXTENSION __int64 IntS0; 85 __MINGW_EXTENSION __int64 IntS1; 86 __MINGW_EXTENSION __int64 IntS2; 87 __MINGW_EXTENSION __int64 IntS3; 88 __MINGW_EXTENSION __int64 RsBSP; 89 __MINGW_EXTENSION __int64 RsPFS; 90 __MINGW_EXTENSION __int64 ApUNAT; 91 __MINGW_EXTENSION __int64 ApLC; 92 __MINGW_EXTENSION __int64 IntSp; 93 __MINGW_EXTENSION __int64 IntNats; 94 __MINGW_EXTENSION __int64 Preds; 95 96 } _JUMP_BUFFER; 97 98#elif defined(__x86_64) 99 100 typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 { 101 unsigned __int64 Part[2]; 102 } SETJMP_FLOAT128; 103 104#define _JBLEN 16 105 typedef SETJMP_FLOAT128 _JBTYPE; 106 107 typedef struct _JUMP_BUFFER { 108 unsigned __int64 Frame; 109 unsigned __int64 Rbx; 110 unsigned __int64 Rsp; 111 unsigned __int64 Rbp; 112 unsigned __int64 Rsi; 113 unsigned __int64 Rdi; 114 unsigned __int64 R12; 115 unsigned __int64 R13; 116 unsigned __int64 R14; 117 unsigned __int64 R15; 118 unsigned __int64 Rip; 119 unsigned long MxCsr; 120 unsigned short FpCsr; 121 unsigned short Spare; 122 SETJMP_FLOAT128 Xmm6; 123 SETJMP_FLOAT128 Xmm7; 124 SETJMP_FLOAT128 Xmm8; 125 SETJMP_FLOAT128 Xmm9; 126 SETJMP_FLOAT128 Xmm10; 127 SETJMP_FLOAT128 Xmm11; 128 SETJMP_FLOAT128 Xmm12; 129 SETJMP_FLOAT128 Xmm13; 130 SETJMP_FLOAT128 Xmm14; 131 SETJMP_FLOAT128 Xmm15; 132 } _JUMP_BUFFER; 133 134#elif defined(_M_ARM) 135 136#define _JBLEN 28 137#define _JBTYPE int 138 139 typedef struct _JUMP_BUFFER { 140 unsigned long Frame; 141 unsigned long R4; 142 unsigned long R5; 143 unsigned long R6; 144 unsigned long R7; 145 unsigned long R8; 146 unsigned long R9; 147 unsigned long R10; 148 unsigned long R11; 149 unsigned long Sp; 150 unsigned long Pc; 151 unsigned long Fpscr; 152 unsigned long long D[8]; // D8-D15 VFP/NEON regs 153 } _JUMP_BUFFER; 154 155#elif defined(_M_ARM64) 156 157#define _JBLEN 24 158#define _JBTYPE unsigned __int64 159 160typedef struct __JUMP_BUFFER { 161 unsigned __int64 Frame; 162 unsigned __int64 Reserved; 163 unsigned __int64 X19; 164 unsigned __int64 X20; 165 unsigned __int64 X21; 166 unsigned __int64 X22; 167 unsigned __int64 X23; 168 unsigned __int64 X24; 169 unsigned __int64 X25; 170 unsigned __int64 X26; 171 unsigned __int64 X27; 172 unsigned __int64 X28; 173 unsigned __int64 Fp; 174 unsigned __int64 Lr; 175 unsigned __int64 Sp; 176 unsigned long Fpcr; 177 unsigned long Fpsr; 178 double D[8]; 179 } _JUMP_BUFFER; 180 181#else 182 183#error Define Setjmp for this architecture! 184 185#endif 186 187#ifndef _JMP_BUF_DEFINED 188 typedef _JBTYPE jmp_buf[_JBLEN]; 189#define _JMP_BUF_DEFINED 190#endif 191 192#ifdef USE_MINGW_SETJMP_TWO_ARGS 193#ifndef _INC_SETJMPEX 194#if defined(__x86_64) 195# define mingw_getsp() \ 196 ({ void* value; __asm__ __volatile__("movq %%rsp, %[value]" : [value] "=r" (value)); value; }) 197#elif defined(_X86_) 198# define mingw_getsp() \ 199 ({ void* value; __asm__ __volatile__("movl %%esp, %[value]" : [value] "=r" (value)); value; }) 200#endif 201#define setjmp(BUF) _setjmp((BUF),mingw_getsp()) 202 int __MINGW_NOTHROW __cdecl _setjmp(jmp_buf _Buf,void *_Ctx); 203#else /* _INC_SETJMPEX */ 204#undef setjmp 205#define setjmp(BUF) _setjmpex((BUF),mingw_getsp()) 206#define setjmpex(BUF) _setjmpex((BUF),mingw_getsp()) 207 int __MINGW_NOTHROW __cdecl _setjmpex(jmp_buf _Buf,void *_Ctx); 208#endif /* _INC_SETJMPEX */ 209#else /* !USE_MINGW_SETJMP_TWO_ARGS */ 210#ifndef _INC_SETJMPEX 211#define setjmp _setjmp 212#endif 213 int __MINGW_NOTHROW __cdecl setjmp(jmp_buf _Buf); 214#endif /* !USE_MINGW_SETJMP_TWO_ARGS */ 215 216 __declspec(noreturn) __MINGW_NOTHROW void __cdecl ms_longjmp(jmp_buf _Buf,int _Value)/* throw(...)*/; 217 __declspec(noreturn) __MINGW_NOTHROW void __cdecl longjmp(jmp_buf _Buf,int _Value); 218 219#ifdef __cplusplus 220} 221#endif 222 223#pragma pack(pop) 224#endif