123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 |
|
/**
* D header file for POSIX.
*
* Copyright: Public Domain
* License: Public Domain
* Authors: Sean Kelly
* Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
*/
module tango.stdc.posix.ucontext;
private import tango.stdc.posix.config;
public import tango.stdc.posix.signal; // for sigset_t, stack_t
extern (C):
//
// XOpen (XSI)
//
/*
mcontext_t
struct ucontext_t
{
ucontext_t* uc_link;
sigset_t uc_sigmask;
stack_t uc_stack;
mcontext_t uc_mcontext;
}
*/
version( linux )
{
version( X86_64 )
{
private
{
struct _libc_fpxreg
{
ushort[4] significand;
ushort exponent;
ushort[3] padding;
}
struct _libc_xmmreg
{
uint[4] element;
}
struct _libc_fpstate
{
ushort cwd;
ushort swd;
ushort ftw;
ushort fop;
ulong rip;
ulong rdp;
uint mxcsr;
uint mxcr_mask;
_libc_fpxreg[8] _st;
_libc_xmmreg[16] _xmm;
uint[24] padding;
}
const NGREG = 23;
alias c_long greg_t;
alias greg_t[NGREG] gregset_t;
alias _libc_fpstate* fpregset_t;
}
struct mcontext_t
{
gregset_t gregs;
fpregset_t fpregs;
c_ulong[8] __reserved1;
}
struct ucontext_t
{
c_ulong uc_flags;
ucontext_t* uc_link;
stack_t uc_stack;
mcontext_t uc_mcontext;
sigset_t uc_sigmask;
_libc_fpstate __fpregs_mem;
}
}
else version( X86 )
{
private
{
struct _libc_fpreg
{
ushort[4] significand;
ushort exponent;
}
struct _libc_fpstate
{
c_ulong cw;
c_ulong sw;
c_ulong tag;
c_ulong ipoff;
c_ulong cssel;
c_ulong dataoff;
c_ulong datasel;
_libc_fpreg[8] _st;
c_ulong status;
}
const NGREG = 19;
alias int greg_t;
alias greg_t[NGREG] gregset_t;
alias _libc_fpstate* fpregset_t;
}
struct mcontext_t
{
gregset_t gregs;
fpregset_t fpregs;
c_ulong oldmask;
c_ulong cr2;
}
struct ucontext_t
{
c_ulong uc_flags;
ucontext_t* uc_link;
stack_t uc_stack;
mcontext_t uc_mcontext;
sigset_t uc_sigmask;
_libc_fpstate __fpregs_mem;
}
}
}
version(darwin){
struct mcontext_t{
int undefined; /// this is architecture dependent, if you need it, then define it from the header files
}
struct stack_t{
void *ss_sp;
size_t ss_size;
int ss_flags;
}
alias uint sigset_t;
struct ucontext_t
{
int uc_onstack;
sigset_t uc_sigmask;
stack_t uc_stack;
ucontext_t* uc_link;
size_t uc_mcsize;
mcontext_t*uc_mcontext;
}
}
version( FreeBSD ) {
alias int __register_t;
alias int c_int;
struct mcontext_t { /* from /usr/include/machine/ucontext.h */
__register_t mc_onstack; /* XXX - sigcontext compat. */
__register_t mc_gs; /* machine state (struct trapframe) */
__register_t mc_fs;
__register_t mc_es;
__register_t mc_ds;
__register_t mc_edi;
__register_t mc_esi;
__register_t mc_ebp;
__register_t mc_isp;
__register_t mc_ebx;
__register_t mc_edx;
__register_t mc_ecx;
__register_t mc_eax;
__register_t mc_trapno;
__register_t mc_err;
__register_t mc_eip;
__register_t mc_cs;
__register_t mc_eflags;
__register_t mc_esp;
__register_t mc_ss;
c_int mc_len; /* sizeof(mcontext_t) */
c_int mc_fpformat;
c_int mc_ownedfp;
c_int[1] mc_spare1; /* align next field to 16 bytes */
c_int[128] mc_fpstate ; // __aligned(16)
c_int[8] mc_spare2;
}
enum {
_MC_FPFMT_NODEV = 0x10000, /* device not present or configured */
_MC_FPFMT_387 = 0x10001,
_MC_FPFMT_XMM = 0x10002,
_MC_FPOWNED_NONE = 0x20000, /* FP state not used */
_MC_FPOWNED_FPU = 0x20001, /* FP state came from FPU */
_MC_FPOWNED_PCB = 0x20002, /* FP state came from PCB */
}
alias uint sigset_t;
struct ucontext_t { /* from /usr/include/ucontext.h */
sigset_t uc_sigmask;
mcontext_t uc_mcontext;
ucontext_t* uc_link;
stack_t uc_stack;
c_int uc_flags;
c_int[4] __spare__;
}
}
version(solaris)
{
alias uint[4] upad128_t;
version( X86 )
{
const NGREG = 19;
alias int greg_t;
/*
* This definition of the floating point structure is binary
* compatible with the Intel386 psABI definition, and source
* compatible with that specification for x87-style floating point.
* It also allows SSE/SSE2 state to be accessed on machines that
* possess such hardware capabilities.
*/
struct fpregset_t {
union fp_reg_set_ {
struct fpchip_state_ {
uint[27] state; /* 287/387 saved state */
uint status; /* saved at exception */
uint mxcsr; /* SSE control and status */
uint xstatus; /* SSE mxcsr at exception */
uint[2] __pad; /* align to 128-bits */
upad128_t[8] xmm; /* %xmm0-%xmm7 */
};
fpchip_state_ fpchip_state;
struct fp_emul_space_ { /* for emulator(s) */
ubyte[246] fp_emul;
ubyte[2] fp_epad;
};
fp_emul_space_ fp_emul_space;
uint[95] f_fpregs; /* union of the above */
};
fp_reg_set_ fp_reg_set;
};
}
else version( X86_64 )
{
const NGREG = 28;
alias c_long greg_t;
struct fpregset_t {
union fp_reg_set_ {
struct fpchip_state_ {
ushort cw;
ushort sw;
ubyte fctw;
ubyte __fx_rsvd;
ushort fop;
ulong rip;
ulong rdp;
uint mxcsr;
uint mxcsr_mask;
union st_ {
ushort[5] fpr_16;
upad128_t __fpr_pad;
};
st_[8] st;
upad128_t[16] xmm;
upad128_t[6] __fx_ign2;
uint status; /* sw at exception */
uint xstatus; /* mxcsr at exception */
}
fpchip_state_ fpchip_state;
uint[130] f_fpregs;
};
fp_reg_set_ fp_reg_set;
};
}
alias greg_t[NGREG] gregset_t;
struct mcontext_t
{
gregset_t gregs; /* general register set */
fpregset_t fpregs; /* floating point register set */
}
struct stack_t
{
void* ss_sp;
size_t ss_size;
int ss_flags;
}
struct ucontext_t /* from /usr/include/sys/ucontext.h*/
{
c_ulong uc_flags;
ucontext_t *uc_link;
sigset_t uc_sigmask;
stack_t uc_stack;
mcontext_t uc_mcontext;
c_long[5] uc_filler; /* see ABI spec for Intel386 */
}
}
//
// Obsolescent (OB)
//
/*
int getcontext(ucontext_t*);
void makecontext(ucontext_t*, void function(), int, ...);
int setcontext(in ucontext_t*);
int swapcontext(ucontext_t*, in ucontext_t*);
*/
static if( is( ucontext_t ) )
{
int getcontext(ucontext_t*);
void makecontext(ucontext_t*, void function(), int, ...);
int setcontext(in ucontext_t*);
int swapcontext(ucontext_t*, in ucontext_t*);
}
|