2 * D header file for POSIX.
4 * Copyright: Copyright Sean Kelly 2005 - 2009.
5 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
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)
15 module core.sys.posix.ucontext;
17 private import core.sys.posix.config;
18 public import core.sys.posix.signal; // for sigset_t, stack_t
19 private import core.stdc.stdint : uintptr_t;
26 version (MIPS32) version = MIPS_Any;
27 version (MIPS64) version = MIPS_Any;
28 version (PPC) version = PPC_Any;
29 version (PPC64) version = PPC_Any;
30 version (RISCV32) version = RISCV_Any;
31 version (RISCV64) version = RISCV_Any;
32 version (S390) version = IBMZ_Any;
33 version (SPARC) version = SPARC_Any;
34 version (SPARC64) version = SPARC_Any;
35 version (SystemZ) version = IBMZ_Any;
36 version (X86) version = X86_Any;
37 version (X86_64) version = X86_Any;
50 mcontext_t uc_mcontext;
54 version (CRuntime_Glibc)
79 REG_CSGSFS, /* Actually short cs, gs, fs, __pad0. */
90 ushort[4] significand;
111 _libc_xmmreg[16] _xmm;
118 alias greg_t[NGREG] gregset_t;
119 alias _libc_fpstate* fpregset_t;
126 c_ulong[8] __reserved1;
134 mcontext_t uc_mcontext;
136 _libc_fpstate __fpregs_mem;
168 ushort[4] significand;
188 alias greg_t[NGREG] gregset_t;
189 alias _libc_fpstate* fpregset_t;
205 mcontext_t uc_mcontext;
207 _libc_fpstate __fpregs_mem;
217 alias c_ulong greg_t;
248 mcontext_t uc_mcontext;
252 else version (MIPS32)
260 alias greg_t[NGREG] gregset_t;
266 double[NFPREG] fp_dregs;
267 static struct fp_fregs_t
271 } fp_fregs_t[NFPREG] fp_fregs;
327 mcontext_t uc_mcontext;
331 else version (MIPS64)
339 alias greg_t[NGREG] gregset_t;
345 double[NFPREG] fp_dregs;
346 static struct fp_fregs_t
350 } fp_fregs_t[NFPREG] fp_fregs;
379 mcontext_t uc_mcontext;
389 alias c_ulong greg_t;
390 alias greg_t[NGREG] gregset_t;
429 align(16) vrregset_t vrregs;
444 char[mcontext_t.sizeof + 12] uc_reg_space = 0;
455 alias c_ulong greg_t;
456 alias greg_t[NGREG] gregset_t;
457 alias double[NFPREG] fpregset_t;
502 c_long[NVRREG+NVRREG+1] vmx_reserve;
511 mcontext_t uc_mcontext;
558 c_ulong fault_address;
561 //alias elf_fpregset_t fpregset_t;
562 alias sigcontext mcontext_t;
569 mcontext_t uc_mcontext;
571 align(8) c_ulong[128] uc_regspace;
574 else version (AArch64)
580 /* AArch64 registers */
585 /* 4K reserved for FP/SIMD state and future expansion */
586 align(16) ubyte[4096] __reserved;
589 alias sigcontext mcontext_t;
597 mcontext_t uc_mcontext;
600 else version (RISCV_Any)
604 alias c_ulong[32] __riscv_mc_gp_state;
606 struct __riscv_mc_f_ext_state
612 struct __riscv_mc_d_ext_state
618 struct __riscv_mc_q_ext_state
620 align(16) ulong[64] __f;
625 union __riscv_mc_fp_state
627 __riscv_mc_f_ext_state __f;
628 __riscv_mc_d_ext_state __d;
629 __riscv_mc_q_ext_state __q;
635 __riscv_mc_gp_state __gregs;
636 __riscv_mc_fp_state __fpregs;
645 char[1024 / 8 - sigset_t.sizeof] __reserved = 0;
646 mcontext_t uc_mcontext;
649 else version (SPARC64)
652 alias mc_greg_t = c_ulong;
653 alias mc_gregset_t = mc_greg_t[MC_NGREG];
669 mcfpu_fregs_t mcfpu_fregs;
681 mc_gregset_t mc_gregs;
691 c_ulong __uc_sigmask;
692 mcontext_t uc_mcontext;
697 /* Location of the users' stored registers relative to R0.
698 * Usage is as an index into a gregset_t array. */
725 alias greg_t = c_ulong;
726 alias gregset_t = greg_t[NGREG];
728 else version (IBMZ_Any)
730 public import core.sys.posix.signal : sigset_t;
734 alias greg_t = c_ulong;
735 alias gregset_t = align(8) greg_t[NGREG];
737 align(8) struct __psw_t
768 mcontext_t uc_mcontext;
772 alias ucontext_t = ucontext;
775 static assert(0, "unimplemented");
777 else version (CRuntime_Musl)
792 mcontext_t uc_mcontext;
807 mcontext_t uc_mcontext;
809 ulong[64] uc_regspace;
812 else version (IBMZ_Any)
826 mcontext_t uc_mcontext;
830 else version (MIPS_Any)
842 else version (MIPS64)
869 mcontext_t uc_mcontext;
885 mcontext_t uc_mcontext;
887 c_ulong[28] __fpregs_mem;
890 else version (X86_64)
902 mcontext_t uc_mcontext;
904 ulong[64] __fpregs_mem;
908 static assert(0, "unimplemented");
910 else version (FreeBSD)
912 // <machine/ucontext.h>
915 alias long __register_t;
916 alias uint __uint32_t;
917 alias ushort __uint16_t;
920 __register_t mc_onstack;
936 __uint32_t mc_trapno;
939 __register_t mc_addr;
946 __register_t mc_rflags;
950 long mc_len; /* sizeof(mcontext_t) */
958 __register_t mc_fsbase;
959 __register_t mc_gsbase;
966 alias int __register_t;
970 __register_t mc_onstack;
983 __register_t mc_trapno;
987 __register_t mc_eflags;
999 __register_t mc_fsbase;
1000 __register_t mc_gsbase;
1005 else version (AArch64)
1007 alias __register_t = long;
1011 __register_t[30] gp_x;
1014 __register_t gp_elr;
1021 ulong[2][32] fp_q; // __uint128_t
1037 else version (PPC_Any)
1039 alias size_t __register_t;
1040 alias uint __uint32_t;
1041 alias ulong __uint64_t;
1046 enum _MC_FP_VALID = 0x01;
1047 enum _MC_AV_VALID = 0x02;
1050 __uint64_t[32 * 2] mc_avec;
1051 __uint32_t[2] mc_av;
1052 __register_t[42] mc_frame;
1053 __uint64_t[33] mc_fpreg;
1054 __uint64_t[32] mc_vsxfpreg;
1059 enum UCF_SWAPPED = 0x00000001;
1063 sigset_t uc_sigmask;
1064 mcontext_t uc_mcontext;
1066 ucontext_t* uc_link;
1072 else version (NetBSD)
1079 alias __greg_t = c_ulong;
1080 alias __gregset_t = __greg_t[_NGREG];
1081 alias __fpregset_t = align(8) ubyte[512];
1086 __gregset_t __gregs;
1087 __greg_t _mc_tlsbase;
1088 __fpregset_t __fpregs;
1096 alias __greg_t = int;
1097 alias __gregset_t = __greg_t[_NGREG];
1102 struct fpchip_state_t
1106 struct fp_xmm_state_t
1108 ubyte[512] __fp_xmm;
1110 fpchip_state_t __fpchip_state;
1111 fp_xmm_state_t __fp_xmm_state;
1112 int[128] __fp_fpregs;
1114 fp_reg_set_t __fp_reg_set;
1121 __gregset_t __gregs;
1122 __fpregset_t __fpregs;
1123 __greg_t _mc_tlsbase;
1129 uint uc_flags; /* properties */
1130 ucontext_t * uc_link; /* context to resume */
1131 sigset_t uc_sigmask; /* signals blocked in this context */
1132 stack_t uc_stack; /* the stack used by this context */
1133 mcontext_t uc_mcontext; /* machine state */
1134 /+ todo #if defined(_UC_MACHINE_PAD)
1135 long __uc_pad[_UC_MACHINE_PAD];
1140 else version (OpenBSD)
1150 c_ulong[32] sc_regs;
1152 c_ulong[32] sc_fpregs;
1154 c_ulong sc_fp_control;
1155 c_long[2] sc_reserved;
1159 else version (X86_64)
1189 void* sc_fpstate; // struct fxsave64*
1195 else version (AArch64)
1242 c_ulong __sc_unused;
1249 c_ulong[32] sc_regs;
1250 c_ulong[64] sc_fpregs;
1278 void* sc_fpstate; // union savefpu*
1283 private struct trapframe
1304 else version (SPARC64)
1319 static assert(false, "Architecture not supported.");
1321 alias ucontext_t = sigcontext;
1323 else version (DragonFlyBSD)
1325 // <machine/ucontext.h>
1328 alias long __register_t;
1329 alias uint __uint32_t;
1330 alias ushort __uint16_t;
1333 __register_t mc_onstack;
1334 __register_t mc_rdi;
1335 __register_t mc_rsi;
1336 __register_t mc_rdx;
1337 __register_t mc_rcx;
1340 __register_t mc_rax;
1341 __register_t mc_rbx;
1342 __register_t mc_rbp;
1343 __register_t mc_r10;
1344 __register_t mc_r11;
1345 __register_t mc_r12;
1346 __register_t mc_r13;
1347 __register_t mc_r14;
1348 __register_t mc_r15;
1349 __register_t mc_xflags;
1350 __register_t mc_trapno;
1351 __register_t mc_addr;
1352 __register_t mc_flags;
1353 __register_t mc_err;
1354 __register_t mc_rip;
1356 __register_t mc_rflags;
1357 __register_t mc_rsp;
1366 }; // __attribute__((aligned(64)));
1370 static assert(0, "Only X86_64 support on DragonFlyBSD");
1374 enum UCF_SWAPPED = 0x00000001;
1378 sigset_t uc_sigmask;
1379 mcontext_t uc_mcontext;
1381 ucontext_t* uc_link;
1383 void function(ucontext_t *, void *) uc_cofunc;
1388 else version (Solaris)
1390 private import core.stdc.stdint;
1392 alias uint[4] upad128_t;
1399 else version (SPARC)
1404 else version (X86_64)
1415 static assert(0, "unimplemented");
1417 alias greg_t[_NGREG] gregset_t;
1444 double[32] fpu_dregs;
1450 ubyte fpu_q_entrysize;
1454 else version (SPARC)
1479 double[16] fpu_dregs;
1484 ubyte fpu_q_entrysize;
1488 else version (X86_64)
1495 upad128_t __fpr_pad;
1516 upad128_t[6] __fx_ign2;
1530 struct s_fpchip_state
1539 s_fpchip_state fpchip_state;
1541 struct s_fp_emul_space
1546 s_fp_emul_space fp_emul_space;
1549 u_fp_reg_set fp_reg_set;
1553 static assert(0, "unimplemented");
1584 alias int64_t[16] asrset_t;
1599 else version (SPARC)
1606 else version (X86_Any)
1628 else version (X86_Any)
1630 ucontext_t *uc_link;
1631 sigset_t uc_sigmask;
1633 mcontext_t uc_mcontext;
1635 c_long[4] uc_filler;
1636 else version (SPARC)
1637 c_long[23] uc_filler;
1638 else version (X86_Any)
1641 c_long[3] uc_filler;
1645 else version (CRuntime_UClibc)
1669 REG_CSGSFS, /* Actually short cs, gs, fs, __pad0. */
1676 alias sigcontext mcontext_t;
1681 ucontext_t* uc_link;
1683 mcontext_t uc_mcontext;
1684 sigset_t uc_sigmask;
1687 else version (MIPS32)
1689 alias greg_t = ulong;
1692 alias gregset_t = greg_t[NGREG];
1698 double[NFPREG] fp_dregs;
1704 _fp_fregs[NFPREG] fp_fregs;
1757 ucontext_t* uc_link;
1759 mcontext_t uc_mcontext;
1760 sigset_t uc_sigmask;
1807 c_ulong fault_address;
1810 alias sigcontext mcontext_t;
1815 ucontext_t* uc_link;
1817 mcontext_t uc_mcontext;
1818 sigset_t uc_sigmask;
1819 align(8) c_ulong[128] uc_regspace;
1823 static assert(0, "unimplemented");
1830 int getcontext(ucontext_t*);
1831 void makecontext(ucontext_t*, void function(), int, ...);
1832 int setcontext(in ucontext_t*);
1833 int swapcontext(ucontext_t*, in ucontext_t*);
1836 static if ( is( ucontext_t ) )
1838 int getcontext(ucontext_t*);
1844 void __makecontext_v2(ucontext_t*, void function(), int, ...);
1845 alias makecontext = __makecontext_v2;
1848 void makecontext(ucontext_t*, void function(), int, ...);
1851 void makecontext(ucontext_t*, void function(), int, ...);
1853 int setcontext(in ucontext_t*);
1854 int swapcontext(ucontext_t*, in ucontext_t*);
1859 int walkcontext(in ucontext_t*, int function(uintptr_t, int, void*), void*);
1860 int addrtosymstr(uintptr_t, char*, int);
1861 int printstack(int);