1/**
2 * D header file for POSIX.
3 *
4 * Copyright: Copyright Sean Kelly 2005 - 2009.
5 * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 * Authors:   Sean Kelly
7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8 */
9
10/*          Copyright Sean Kelly 2005 - 2009.
11 * Distributed under the Boost Software License, Version 1.0.
12 *    (See accompanying file LICENSE or copy at
13 *          http://www.boost.org/LICENSE_1_0.txt)
14 */
15module core.sys.posix.setjmp;
16
17import core.sys.posix.config;
18import core.sys.posix.signal; // for sigset_t
19
20version (Posix):
21extern (C) nothrow @nogc:
22@system:
23
24version (RISCV32) version = RISCV_Any;
25version (RISCV64) version = RISCV_Any;
26version (PPC) version = PPC_Any;
27version (PPC64) version = PPC_Any;
28
29//
30// Required
31//
32/*
33jmp_buf
34
35int  setjmp(ref jmp_buf);
36void longjmp(ref jmp_buf, int);
37*/
38
39version (CRuntime_Glibc)
40{
41    version (X86_64)
42    {
43        //enum JB_BX      = 0;
44        //enum JB_BP      = 1;
45        //enum JB_12      = 2;
46        //enum JB_13      = 3;
47        //enum JB_14      = 4;
48        //enum JB_15      = 5;
49        //enum JB_SP      = 6;
50        //enum JB_PC      = 7;
51        //enum JB_SIZE    = 64;
52
53        alias long[8] __jmp_buf;
54    }
55    else version (X86)
56    {
57        //enum JB_BX      = 0;
58        //enum JB_SI      = 1;
59        //enum JB_DI      = 2;
60        //enum JB_BP      = 3;
61        //enum JB_SP      = 4;
62        //enum JB_PC      = 5;
63        //enum JB_SIZE    = 24;
64
65        alias int[6] __jmp_buf;
66    }
67    else version (SPARC)
68    {
69        alias int[3] __jmp_buf;
70    }
71    else version (SPARC64)
72    {
73        alias __jmp_buf = ulong[22];
74    }
75    else version (AArch64)
76    {
77        alias long[22] __jmp_buf;
78    }
79    else version (ARM)
80    {
81        alias int[64] __jmp_buf;
82    }
83    else version (HPPA)
84    {
85        struct __jmp_buf
86        {
87            int __r3;
88            int[15] __r4_r18;
89            int __r19;
90            int __r27;
91            int __sp;
92            int __rp;
93            int __pad1;
94            double[10] __fr12_fr21;
95        }
96    }
97    else version (PPC)
98    {
99        alias int[64 + (12*4)] __jmp_buf;
100    }
101    else version (PPC64)
102    {
103        alias long[64] __jmp_buf;
104    }
105    else version (MIPS32)
106    {
107        struct __jmp_buf
108        {
109            version (MIPS_O32)
110            {
111                void * __pc;
112                void * __sp;
113                int[8] __regs;
114                void * __fp;
115                void * __gp;
116            }
117            else
118            {
119                long __pc;
120                long __sp;
121                long[8] __regs;
122                long __fp;
123                long __gp;
124            }
125            int __fpc_csr;
126            version (MIPS_N64)
127                double[8] __fpregs;
128            else
129                double[6] __fpregs;
130        }
131    }
132    else version (MIPS64)
133    {
134        struct __jmp_buf
135        {
136            long __pc;
137            long __sp;
138            long[8] __regs;
139            long __fp;
140            long __gp;
141            int __fpc_csr;
142            version (MIPS_N64)
143                double[8] __fpregs;
144            else
145                double[6] __fpregs;
146        }
147    }
148    else version (RISCV_Any)
149    {
150        struct __riscv_jmp_buf
151        {
152            c_long __pc;
153            c_long[12] __regs;
154            c_long __sp;
155            static if (__traits(getTargetInfo, "floatAbi") == "double")
156                double[12] __fpregs;
157        }
158        alias __jmp_buf = __riscv_jmp_buf[1];
159    }
160    else version (S390)
161    {
162        struct __s390_jmp_buf
163        {
164            c_long[10] __gregs;
165            c_long[4] __fpregs;
166        }
167        alias __jmp_buf = __s390_jmp_buf[1];
168    }
169    else version (SystemZ)
170    {
171        struct __s390_jmp_buf
172        {
173            c_long[10] __gregs;
174            c_long[8] __fpregs;
175        }
176        alias __jmp_buf = __s390_jmp_buf[1];
177    }
178    else
179        static assert(0, "unimplemented");
180
181    struct __jmp_buf_tag
182    {
183        __jmp_buf   __jmpbuf;
184        int         __mask_was_saved;
185        sigset_t    __saved_mask;
186    }
187
188    alias __jmp_buf_tag[1] jmp_buf;
189
190    alias _setjmp setjmp; // see XOpen block
191    void longjmp(ref jmp_buf, int);
192}
193else version (FreeBSD)
194{
195    // <machine/setjmp.h>
196    version (X86)
197    {
198        enum _JBLEN = 11;
199        struct _jmp_buf { int[_JBLEN + 1] _jb; }
200    }
201    else version (X86_64)
202    {
203        enum _JBLEN = 12;
204        struct _jmp_buf { c_long[_JBLEN] _jb; }
205    }
206    else version (SPARC)
207    {
208        enum _JBLEN = 5;
209        struct _jmp_buf { c_long[_JBLEN + 1] _jb; }
210    }
211    else version (AArch64)
212    {
213        enum _JBLEN = 31;
214        // __int128_t
215        struct _jmp_buf { long[2][_JBLEN + 1] _jb; }
216    }
217    else version (PPC_Any)
218    {
219        enum _JBLEN = 100;
220        struct _jmp_buf { long[_JBLEN + 1] _jb; }
221    }
222    else
223        static assert(0);
224    alias _jmp_buf[1] jmp_buf;
225
226    int  setjmp(ref jmp_buf);
227    void longjmp(ref jmp_buf, int);
228}
229else version (NetBSD)
230{
231    // <machine/setjmp.h>
232    version (X86)
233    {
234        enum _JBLEN = 13;
235        struct _jmp_buf { int[_JBLEN + 1] _jb; }
236    }
237    else version (X86_64)
238    {
239        enum _JBLEN = 11;
240        struct _jmp_buf { c_long[_JBLEN] _jb; }
241    }
242    else
243        static assert(0);
244    alias _jmp_buf[_JBLEN] jmp_buf;
245
246    int  setjmp(ref jmp_buf);
247    void longjmp(ref jmp_buf, int);
248}
249else version (OpenBSD)
250{
251    // <machine/setjmp.h>
252    version (X86)
253    {
254        enum _JBLEN = 10;
255    }
256    else version (X86_64)
257    {
258        enum _JBLEN = 11;
259    }
260    else version (ARM)
261    {
262        enum _JBLEN = 64;
263    }
264    else version (AArch64)
265    {
266        enum _JBLEN = 64;
267    }
268    else version (PPC)
269    {
270        enum _JBLEN = 100;
271    }
272    else version (MIPS64)
273    {
274        enum _JBLEN = 83;
275    }
276    else version (SPARC)
277    {
278        enum _JBLEN = 10;
279    }
280    else version (SPARC64)
281    {
282        enum _JBLEN = 14;
283    }
284    else
285        static assert(0);
286
287    alias jmp_buf = c_long[_JBLEN];
288
289    int  setjmp(ref jmp_buf);
290    void longjmp(ref jmp_buf, int);
291}
292else version (DragonFlyBSD)
293{
294    // <machine/setjmp.h>
295    version (X86_64)
296    {
297        enum _JBLEN = 12;
298        struct _jmp_buf { c_long[_JBLEN] _jb; }
299    }
300    else
301        static assert(0);
302    alias _jmp_buf[1] jmp_buf;
303
304    int  setjmp(ref jmp_buf);
305    void longjmp(ref jmp_buf, int);
306}
307else version (CRuntime_Bionic)
308{
309    // <machine/setjmp.h>
310    version (X86)
311    {
312        enum _JBLEN = 10;
313    }
314    else version (ARM)
315    {
316        enum _JBLEN = 64;
317    }
318    else version (AArch64)
319    {
320        enum _JBLEN = 32;
321    }
322    else version (X86_64)
323    {
324        enum _JBLEN = 11;
325    }
326    else
327    {
328        static assert(false, "Architecture not supported.");
329    }
330
331    alias c_long[_JBLEN] jmp_buf;
332
333    int  setjmp(ref jmp_buf);
334    void longjmp(ref jmp_buf, int);
335}
336else version (CRuntime_UClibc)
337{
338    version (X86_64)
339    {
340        alias long[8] __jmp_buf;
341    }
342    else version (ARM)
343    {
344        align(8) alias int[64] __jmp_buf;
345    }
346    else version (MIPS32)
347    {
348        struct __jmp_buf
349        {
350            version (MIPS_O32)
351            {
352                void * __pc;
353                void * __sp;
354                int[8] __regs;
355                void * __fp;
356                void * __gp;
357            }
358            else
359            {
360                long __pc;
361                long __sp;
362                long[8] __regs;
363                long __fp;
364                long __gp;
365            }
366            int __fpc_csr;
367            version (MIPS_N64)
368                double[8] __fpregs;
369            else
370                double[6] __fpregs;
371        }
372    }
373    else version (MIPS64)
374    {
375        struct __jmp_buf
376        {
377            long __pc;
378            long __sp;
379            long[8] __regs;
380            long __fp;
381            long __gp;
382            int __fpc_csr;
383            version (MIPS_N64)
384                double[8] __fpregs;
385            else
386                double[6] __fpregs;
387        }
388    }
389    else
390        static assert(0, "unimplemented");
391
392    struct __jmp_buf_tag
393    {
394        __jmp_buf   __jmpbuf;
395        int         __mask_was_saved;
396        sigset_t    __saved_mask;
397    }
398
399    alias __jmp_buf_tag[1] jmp_buf;
400
401    alias _setjmp setjmp;
402    void longjmp(ref jmp_buf, int);
403}
404
405//
406// C Extension (CX)
407//
408/*
409sigjmp_buf
410
411int  sigsetjmp(sigjmp_buf, int);
412void siglongjmp(sigjmp_buf, int);
413*/
414
415version (CRuntime_Glibc)
416{
417    alias jmp_buf sigjmp_buf;
418
419    int __sigsetjmp(sigjmp_buf, int);
420    alias __sigsetjmp sigsetjmp;
421    void siglongjmp(sigjmp_buf, int);
422}
423else version (FreeBSD)
424{
425    // <machine/setjmp.h>
426    version (X86)
427    {
428        struct _sigjmp_buf { int[_JBLEN + 1] _ssjb; }
429    }
430    else version (X86_64)
431    {
432        struct _sigjmp_buf { c_long[_JBLEN] _sjb; }
433    }
434    else version (SPARC)
435    {
436        enum _JBLEN         = 5;
437        enum _JB_FP         = 0;
438        enum _JB_PC         = 1;
439        enum _JB_SP         = 2;
440        enum _JB_SIGMASK    = 3;
441        enum _JB_SIGFLAG    = 5;
442        struct _sigjmp_buf { c_long[_JBLEN + 1] _sjb; }
443    }
444    else version (AArch64)
445    {
446        // __int128_t
447        struct _sigjmp_buf { long[2][_JBLEN + 1] _jb; }
448    }
449    else version (PPC_Any)
450    {
451        struct _sigjmp_buf { long[_JBLEN + 1] _sjb; }
452    }
453    else
454        static assert(0);
455    alias _sigjmp_buf[1] sigjmp_buf;
456
457    int  sigsetjmp(ref sigjmp_buf);
458    void siglongjmp(ref sigjmp_buf, int);
459}
460else version (NetBSD)
461{
462    // <machine/setjmp.h>
463    version (X86)
464    {
465        struct _sigjmp_buf { int[_JBLEN + 1] _ssjb; }
466    }
467    else version (X86_64)
468    {
469        struct _sigjmp_buf { c_long[_JBLEN] _sjb; }
470    }
471    else
472        static assert(0);
473    alias _sigjmp_buf[_JBLEN + 1] sigjmp_buf;
474
475    int  sigsetjmp(ref sigjmp_buf);
476    void siglongjmp(ref sigjmp_buf, int);
477}
478else version (OpenBSD)
479{
480    alias sigjmp_buf = c_long[_JBLEN + 1];
481
482    int  sigsetjmp(ref sigjmp_buf);
483    void siglongjmp(ref sigjmp_buf, int);
484}
485else version (DragonFlyBSD)
486{
487    // <machine/setjmp.h>
488    version (X86_64)
489    {
490        struct _sigjmp_buf { c_long[_JBLEN] _sjb; }
491    }
492    else
493        static assert(0);
494    alias _sigjmp_buf[1] sigjmp_buf;
495
496    int  sigsetjmp(ref sigjmp_buf);
497    void siglongjmp(ref sigjmp_buf, int);
498}
499else version (CRuntime_Bionic)
500{
501    alias c_long[_JBLEN + 1] sigjmp_buf;
502
503    int  sigsetjmp(ref sigjmp_buf, int);
504    void siglongjmp(ref sigjmp_buf, int);
505}
506else version (CRuntime_UClibc)
507{
508    alias jmp_buf sigjmp_buf;
509
510    int __sigsetjmp(ref sigjmp_buf, int);
511    alias __sigsetjmp sigsetjmp;
512    void siglongjmp(ref sigjmp_buf, int);
513}
514
515//
516// XOpen (XSI)
517//
518/*
519int  _setjmp(jmp_buf);
520void _longjmp(jmp_buf, int);
521*/
522
523version (CRuntime_Glibc)
524{
525    int  _setjmp(ref jmp_buf);
526    void _longjmp(ref jmp_buf, int);
527}
528else version (FreeBSD)
529{
530    int  _setjmp(ref jmp_buf);
531    void _longjmp(ref jmp_buf, int);
532}
533else version (NetBSD)
534{
535    int  _setjmp(ref jmp_buf);
536    void _longjmp(ref jmp_buf, int);
537}
538else version (OpenBSD)
539{
540    int  _setjmp(ref jmp_buf);
541    void _longjmp(ref jmp_buf, int);
542}
543else version (DragonFlyBSD)
544{
545    int  _setjmp(ref jmp_buf);
546    void _longjmp(ref jmp_buf, int);
547}
548else version (CRuntime_Bionic)
549{
550    int  _setjmp(ref jmp_buf);
551    void _longjmp(ref jmp_buf, int);
552}
553else version (CRuntime_UClibc)
554{
555    int  _setjmp(ref jmp_buf);
556    void _longjmp(ref jmp_buf, int);
557}
558