/* * Signal context definitions * * Copyright 1995 Alexandre Julliard */ #ifndef __WINE_SIG_CONTEXT_H #define __WINE_SIG_CONTEXT_H #ifdef __i386__ #ifdef linux typedef struct { unsigned short sc_gs, __gsh; unsigned short sc_fs, __fsh; unsigned short sc_es, __esh; unsigned short sc_ds, __dsh; unsigned long sc_edi; unsigned long sc_esi; unsigned long sc_ebp; unsigned long sc_esp; unsigned long sc_ebx; unsigned long sc_edx; unsigned long sc_ecx; unsigned long sc_eax; unsigned long sc_trapno; unsigned long sc_err; unsigned long sc_eip; unsigned short sc_cs, __csh; unsigned long sc_eflags; unsigned long esp_at_signal; unsigned short sc_ss, __ssh; unsigned long i387; unsigned long oldmask; unsigned long cr2; } SIGCONTEXT; #define __HAVE_SIGCONTEXT #define HANDLER_DEF(name) void name (int signal, SIGCONTEXT context) #define HANDLER_CONTEXT (&context) #endif /* linux */ #ifdef BSDI #define EAX_sig(context) ((context)->tf_eax) #define EBX_sig(context) ((context)->tf_ebx) #define ECX_sig(context) ((context)->tf_ecx) #define EDX_sig(context) ((context)->tf_edx) #define ESI_sig(context) ((context)->tf_esi) #define EDI_sig(context) ((context)->tf_edi) #define EBP_sig(context) ((context)->tf_ebp) #define CS_sig(context) ((context)->tf_cs) #define DS_sig(context) ((context)->tf_ds) #define ES_sig(context) ((context)->tf_es) #define SS_sig(context) ((context)->tf_ss) #include typedef struct trapframe SIGCONTEXT; #define __HAVE_SIGCONTEXT #define HANDLER_DEF(name) void name(int signal, int code, SIGCONTEXT *context) #define HANDLER_CONTEXT context #define EFL_sig(context) ((context)->tf_eflags) #define EIP_sig(context) (*((unsigned long*)&(context)->tf_eip)) #define ESP_sig(context) (*((unsigned long*)&(context)->tf_esp)) #endif /* bsdi */ #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) #include typedef struct sigcontext SIGCONTEXT; #define __HAVE_SIGCONTEXT #define HANDLER_DEF(name) void name(int signal, int code, SIGCONTEXT *context) #define HANDLER_CONTEXT context #endif /* FreeBSD */ #if defined(__svr4__) || defined(_SCO_DS) #include #ifdef _SCO_DS #include #endif #include typedef struct ucontext SIGCONTEXT; #define __HAVE_SIGCONTEXT #define HANDLER_DEF(name) void name(int signal, void *siginfo, SIGCONTEXT *context) #define HANDLER_CONTEXT context #endif /* svr4 || SCO_DS */ #ifdef __EMX__ typedef unsigned long ULONG; typedef unsigned short USHORT; typedef struct _fpreg /* Note 1 */ { ULONG losig; ULONG hisig; USHORT signexp; } FPREG; typedef FPREG *PFPREG; typedef struct _CONTEXT /* Note 1 */ { ULONG ContextFlags; ULONG ctx_env[7]; FPREG ctx_stack[8]; ULONG ctx_SegGs; ULONG ctx_SegFs; ULONG ctx_SegEs; ULONG ctx_SegDs; ULONG ctx_RegEdi; ULONG ctx_RegEsi; ULONG ctx_RegEax; ULONG ctx_RegEbx; ULONG ctx_RegEcx; ULONG ctx_RegEdx; ULONG ctx_RegEbp; ULONG ctx_RegEip; ULONG ctx_SegCs; ULONG ctx_EFlags; ULONG ctx_RegEsp; ULONG ctx_SegSs; } SIGCONTEXT; #define __HAVE_SIGCONTEXT /*typedef CONTEXTRECORD *PCONTEXTRECORD;*/ #endif /* __EMX__ */ #if defined(linux) || defined(__NetBSD__) || defined(__FreeBSD__) \ || defined(__OpenBSD__) #define EAX_sig(context) ((context)->sc_eax) #define EBX_sig(context) ((context)->sc_ebx) #define ECX_sig(context) ((context)->sc_ecx) #define EDX_sig(context) ((context)->sc_edx) #define ESI_sig(context) ((context)->sc_esi) #define EDI_sig(context) ((context)->sc_edi) #define EBP_sig(context) ((context)->sc_ebp) #define CS_sig(context) ((context)->sc_cs) #define DS_sig(context) ((context)->sc_ds) #define ES_sig(context) ((context)->sc_es) #define SS_sig(context) ((context)->sc_ss) #ifdef linux /* FS and GS are now in the sigcontext struct of FreeBSD, but not * saved by the exception handling. duh. */ #define FS_sig(context) ((context)->sc_fs) #define GS_sig(context) ((context)->sc_gs) #define CR2_sig(context) ((context)->cr2) #define TRAP_sig(context) ((context)->sc_trapno) #endif #ifndef __FreeBSD__ #define EFL_sig(context) ((context)->sc_eflags) #else #define EFL_sig(context) ((context)->sc_efl) /* FreeBSD, see i386/i386/traps.c::trap_pfault va->err kludge */ #define CR2_sig(context) ((context)->sc_err) #endif #define EIP_sig(context) (*((unsigned long*)&(context)->sc_eip)) #define ESP_sig(context) (*((unsigned long*)&(context)->sc_esp)) #endif /* linux || __NetBSD__ || __FreeBSD__ || __OpenBSD__ */ #if defined(__svr4__) || defined(_SCO_DS) #ifdef _SCO_DS #define gregs regs #endif #define EAX_sig(context) ((context)->uc_mcontext.gregs[EAX]) #define EBX_sig(context) ((context)->uc_mcontext.gregs[EBX]) #define ECX_sig(context) ((context)->uc_mcontext.gregs[ECX]) #define EDX_sig(context) ((context)->uc_mcontext.gregs[EDX]) #define ESI_sig(context) ((context)->uc_mcontext.gregs[ESI]) #define EDI_sig(context) ((context)->uc_mcontext.gregs[EDI]) #define EBP_sig(context) ((context)->uc_mcontext.gregs[EBP]) #define CS_sig(context) ((context)->uc_mcontext.gregs[CS]) #define DS_sig(context) ((context)->uc_mcontext.gregs[DS]) #define ES_sig(context) ((context)->uc_mcontext.gregs[ES]) #define SS_sig(context) ((context)->uc_mcontext.gregs[SS]) #define FS_sig(context) ((context)->uc_mcontext.gregs[FS]) #define GS_sig(context) ((context)->uc_mcontext.gregs[GS]) #define EFL_sig(context) ((context)->uc_mcontext.gregs[EFL]) #define EIP_sig(context) ((context)->uc_mcontext.gregs[EIP]) #ifdef R_ESP #define ESP_sig(context) ((context)->uc_mcontext.gregs[R_ESP]) #else #define ESP_sig(context) ((context)->uc_mcontext.gregs[ESP]) #endif #ifdef TRAPNO #define TRAP_sig(context) ((context)->uc_mcontext.gregs[TRAPNO]) #endif #endif /* svr4 || SCO_DS */ #ifdef __EMX__ #define EAX_sig(context) ((context)->ctx_RegEax) #define EBX_sig(context) ((context)->ctx_RegEbx) #define ECX_sig(context) ((context)->ctx_RegEcx) #define EDX_sig(context) ((context)->ctx_RegEdx) #define ESI_sig(context) ((context)->ctx_RegEsi) #define EDI_sig(context) ((context)->ctx_RegEdi) #define EBP_sig(context) ((context)->ctx_RegEbp) #define ESP_sig(context) ((context)->ctx_RegEsp) #define CS_sig(context) ((context)->ctx_SegCs) #define DS_sig(context) ((context)->ctx_SegDs) #define ES_sig(context) ((context)->ctx_SegEs) #define SS_sig(context) ((context)->ctx_SegSs) #define FS_sig(context) ((context)->ctx_SegFs) #define GS_sig(context) ((context)->ctx_SegGs) #define EFL_sig(context) ((context)->ctx_EFlags) #define EIP_sig(context) ((context)->ctx_RegEip) #endif /* __EMX__ */ /* Generic definitions */ #define AX_sig(context) (*(WORD*)&EAX_sig(context)) #define BX_sig(context) (*(WORD*)&EBX_sig(context)) #define CX_sig(context) (*(WORD*)&ECX_sig(context)) #define DX_sig(context) (*(WORD*)&EDX_sig(context)) #define SI_sig(context) (*(WORD*)&ESI_sig(context)) #define DI_sig(context) (*(WORD*)&EDI_sig(context)) #define BP_sig(context) (*(WORD*)&EBP_sig(context)) #define AL_sig(context) (*(BYTE*)&EAX_sig(context)) #define AH_sig(context) (*((BYTE*)&EAX_sig(context)+1)) #define BL_sig(context) (*(BYTE*)&EBX_sig(context)) #define BH_sig(context) (*((BYTE*)&EBX_sig(context)+1)) #define CL_sig(context) (*(BYTE*)&ECX_sig(context)) #define CH_sig(context) (*((BYTE*)&ECX_sig(context)+1)) #define DL_sig(context) (*(BYTE*)&EDX_sig(context)) #define DH_sig(context) (*((BYTE*)&EDX_sig(context)+1)) #define IP_sig(context) (*(WORD*)&EIP_sig(context)) #define SP_sig(context) (*(WORD*)&ESP_sig(context)) #define FL_sig(context) (*(WORD*)&EFL_sig(context)) #ifdef FS_sig #include "syslevel.h" #define HANDLER_INIT() \ do { int fs = IS_SELECTOR_SYSTEM(CS_sig(HANDLER_CONTEXT)) ? \ FS_sig(HANDLER_CONTEXT) : SYSLEVEL_Win16CurrentTeb; \ if (!fs) fs = SYSLEVEL_EmergencyTeb; \ SET_FS(fs); } while (0) #else #define HANDLER_INIT() /* nothing */ #endif #else /* __i386__ */ #define HANDLER_DEF(name) void name (int signal) #define HANDLER_INIT() /* nothing */ #endif /* __i386__ */ #ifndef __HAVE_SIGCONTEXT /* empty entry for non x86 architectures mostly. */ typedef DWORD SIGCONTEXT; #define HANDLER_CONTEXT 0 #endif #endif /* __WINE_SIG_CONTEXT_H */