libc/winsup/cygwin/include/cygwin/signal.h

483 lines
13 KiB
C

/* signal.h
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#ifndef _CYGWIN_SIGNAL_H
#define _CYGWIN_SIGNAL_H
#include <bits/wordsize.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
Define a struct __mcontext, which should be identical in layout to the Win32
API type CONTEXT with the addition of oldmask and cr2 fields at the end.
*/
#ifdef __x86_64__
struct _uc_fpxreg {
__uint16_t significand[4];
__uint16_t exponent;
__uint16_t padding[3];
};
struct _uc_xmmreg {
__uint32_t element[4];
};
struct _fpstate
{
__uint16_t cwd;
__uint16_t swd;
__uint16_t ftw;
__uint16_t fop;
__uint64_t rip;
__uint64_t rdp;
__uint32_t mxcsr;
__uint32_t mxcr_mask;
struct _uc_fpxreg st[8];
struct _uc_xmmreg xmm[16];
__uint32_t padding[24];
};
struct __attribute__ ((__aligned__ (16))) __mcontext
{
__uint64_t p1home;
__uint64_t p2home;
__uint64_t p3home;
__uint64_t p4home;
__uint64_t p5home;
__uint64_t p6home;
__uint32_t ctxflags;
__uint32_t mxcsr;
__uint16_t cs;
__uint16_t ds;
__uint16_t es;
__uint16_t fs;
__uint16_t gs;
__uint16_t ss;
__uint32_t eflags;
__uint64_t dr0;
__uint64_t dr1;
__uint64_t dr2;
__uint64_t dr3;
__uint64_t dr6;
__uint64_t dr7;
__uint64_t rax;
__uint64_t rcx;
__uint64_t rdx;
__uint64_t rbx;
__uint64_t rsp;
__uint64_t rbp;
__uint64_t rsi;
__uint64_t rdi;
__uint64_t r8;
__uint64_t r9;
__uint64_t r10;
__uint64_t r11;
__uint64_t r12;
__uint64_t r13;
__uint64_t r14;
__uint64_t r15;
__uint64_t rip;
struct _fpstate fpregs;
__uint64_t vregs[52];
__uint64_t vcx;
__uint64_t dbc;
__uint64_t btr;
__uint64_t bfr;
__uint64_t etr;
__uint64_t efr;
__uint64_t oldmask;
__uint64_t cr2;
};
#else /* !x86_64 */
struct _uc_fpreg
{
__uint16_t significand[4];
__uint16_t exponent;
};
struct _fpstate
{
__uint32_t cw;
__uint32_t sw;
__uint32_t tag;
__uint32_t ipoff;
__uint32_t cssel;
__uint32_t dataoff;
__uint32_t datasel;
struct _uc_fpreg _st[8];
__uint32_t nxst;
};
struct __mcontext
{
__uint32_t ctxflags;
__uint32_t dr0;
__uint32_t dr1;
__uint32_t dr2;
__uint32_t dr3;
__uint32_t dr6;
__uint32_t dr7;
struct _fpstate fpstate;
__uint32_t gs;
__uint32_t fs;
__uint32_t es;
__uint32_t ds;
__uint32_t edi;
__uint32_t esi;
__uint32_t ebx;
__uint32_t edx;
__uint32_t ecx;
__uint32_t eax;
__uint32_t ebp;
__uint32_t eip;
__uint32_t cs;
__uint32_t eflags;
__uint32_t esp;
__uint32_t ss;
__uint32_t reserved[128];
__uint32_t oldmask;
__uint32_t cr2;
};
#endif /* !x86_64 */
/* Needed for GDB. It only compiles in the context copy code if this macro is
defined. This is not sizeof(CONTEXT) due to historical accidents. */
#ifdef __x86_64__
#define __COPY_CONTEXT_SIZE 816
#else
#define __COPY_CONTEXT_SIZE 204
#endif
typedef union sigval
{
int sival_int; /* integer signal value */
void *sival_ptr; /* pointer signal value */
} sigval_t;
typedef struct sigevent
{
sigval_t sigev_value; /* signal value */
int sigev_signo; /* signal number */
int sigev_notify; /* notification type */
void (*sigev_notify_function) (sigval_t); /* notification function */
pthread_attr_t *sigev_notify_attributes; /* notification attributes */
} sigevent_t;
#if __POSIX_VISIBLE >= 199309
#pragma pack(push,4)
struct _sigcommune
{
__uint32_t _si_code;
void *_si_read_handle;
void *_si_write_handle;
void *_si_process_handle;
__extension__ union
{
int _si_fd;
int64_t _si_pipe_unique_id;
char *_si_str;
};
};
#define __SI_PAD_SIZE 32
#ifdef __INSIDE_CYGWIN__
# ifndef max
# define max(a,b) (((a) > (b)) ? (a) : (b))
# endif /*max*/
# define __uint32_size(__x) (max(sizeof (__x) / sizeof (uint32_t), 1))
/* This padding represents the elements of the last struct in siginfo_t,
aligning the elements to the end to avoid conflicts with other struct
members. */
# define __SI_CYG_PAD (__SI_PAD_SIZE - __uint32_size (void *))
#endif /*__INSIDE_CYGWIN__*/
typedef struct
{
int si_signo; /* signal number */
int si_code; /* signal code */
pid_t si_pid; /* sender's pid */
uid_t si_uid; /* sender's uid */
int si_errno; /* errno associated with signal */
__extension__ union
{
__uint32_t __pad[__SI_PAD_SIZE]; /* plan for future growth */
struct _sigcommune _si_commune; /* cygwin ipc */
__extension__ struct
{
__extension__ union
{
sigval_t si_sigval; /* signal value */
sigval_t si_value; /* signal value */
};
__extension__ struct
{
timer_t si_tid; /* timer id */
unsigned int si_overrun; /* overrun count */
};
};
/* SIGCHLD */
__extension__ struct
{
int si_status; /* exit code */
clock_t si_utime; /* user time */
clock_t si_stime; /* system time */
};
void *si_addr; /* faulting address for core dumping
signals */
/* Cygwin internal fields */
#ifdef __INSIDE_CYGWIN__
__extension__ struct
{
__uint32_t __pad2[__SI_CYG_PAD]; /* Locate at end of struct */
void *si_cyg; /* pointer to block containing
cygwin-special info */
};
#endif /*__INSIDE_CYGWIN__*/
};
} siginfo_t;
#pragma pack(pop)
#endif /* __POSIX_VISIBLE >= 199309 */
enum
{
SI_USER = 0, /* sent by kill, raise, pthread_kill */
SI_ASYNCIO = 2, /* sent by AIO completion (currently
unimplemented) */
SI_MESGQ, /* sent by real time mesq state change
(currently unimplemented) */
SI_TIMER, /* sent by timer expiration */
SI_QUEUE, /* sent by sigqueue */
SI_KERNEL, /* sent by system */
ILL_ILLOPC = 7, /* illegal opcode */
ILL_ILLOPN, /* illegal operand */
ILL_ILLADR, /* illegal addressing mode */
ILL_ILLTRP, /* illegal trap*/
ILL_PRVOPC, /* privileged opcode */
ILL_PRVREG, /* privileged register */
ILL_COPROC, /* coprocessor error */
ILL_BADSTK, /* internal stack error */
FPE_INTDIV = 15, /* integer divide by zero */
FPE_INTOVF, /* integer overflow */
FPE_FLTDIV, /* floating point divide by zero */
FPE_FLTOVF, /* floating point overflow */
FPE_FLTUND, /* floating point underflow */
FPE_FLTRES, /* floating point inexact result */
FPE_FLTINV, /* floating point invalid operation */
FPE_FLTSUB, /* subscript out of range */
SEGV_MAPERR = 23, /* address not mapped to object */
SEGV_ACCERR, /* invalid permissions for mapped object */
BUS_ADRALN = 25, /* invalid address alignment. */
BUS_ADRERR, /* non-existant physical address. */
BUS_OBJERR, /* object specific hardware error. */
CLD_EXITED = 28, /* child has exited */
CLD_KILLED, /* child was killed */
CLD_DUMPED, /* child terminated abnormally */
CLD_TRAPPED, /* traced child has trapped */
CLD_STOPPED, /* child has stopped */
CLD_CONTINUED /* stopped child has continued */
};
#define SI_USER SI_USER
#define SI_ASYNCIO SI_ASYNCIO
#define SI_MESGQ SI_MESGQ
#define SI_TIMER SI_TIMER
#define SI_QUEUE SI_QUEUE
#define SI_KERNEL SI_KERNEL
#define ILL_ILLOPC ILL_ILLOPC
#define ILL_ILLOPN ILL_ILLOPN
#define ILL_ILLADR ILL_ILLADR
#define ILL_ILLTRP ILL_ILLTRP
#define ILL_PRVOPC ILL_PRVOPC
#define ILL_PRVREG ILL_PRVREG
#define ILL_COPROC ILL_COPROC
#define ILL_BADSTK ILL_BADSTK
#define FPE_INTDIV FPE_INTDIV
#define FPE_INTOVF FPE_INTOVF
#define FPE_FLTDIV FPE_FLTDIV
#define FPE_FLTOVF FPE_FLTOVF
#define FPE_FLTUND FPE_FLTUND
#define FPE_FLTRES FPE_FLTRES
#define FPE_FLTINV FPE_FLTINV
#define FPE_FLTSUB FPE_FLTSUB
#define SEGV_MAPERR SEGV_MAPERR
#define SEGV_ACCERR SEGV_ACCERR
#define BUS_ADRALN BUS_ADRALN
#define BUS_ADRERR BUS_ADRERR
#define BUS_OBJERR BUS_OBJERR
#define CLD_EXITED CLD_EXITED
#define CLD_KILLED CLD_KILLED
#define CLD_DUMPED CLD_DUMPED
#define CLD_TRAPPED CLD_TRAPPED
#define CLD_STOPPED CLD_STOPPED
#define CLD_CONTINUED CLD_CONTINUED
enum
{
SIGEV_SIGNAL = 0, /* a queued signal, with an application
defined value, is generated when the
event of interest occurs */
SIGEV_NONE, /* no asynchronous notification is
delivered when the event of interest
occurs */
SIGEV_THREAD /* a notification function is called to
perform notification */
};
#define SIGEV_SIGNAL SIGEV_SIGNAL
#define SIGEV_NONE SIGEV_NONE
#define SIGEV_THREAD SIGEV_THREAD
typedef void (*_sig_func_ptr)(int);
#if __POSIX_VISIBLE
struct sigaction
{
__extension__ union
{
_sig_func_ptr sa_handler; /* SIG_DFL, SIG_IGN, or pointer to a function */
#if __POSIX_VISIBLE >= 199309
void (*sa_sigaction) ( int, siginfo_t *, void * );
#endif
};
sigset_t sa_mask;
int sa_flags;
};
#define SA_NOCLDSTOP 1 /* Do not generate SIGCHLD when children
stop */
#define SA_SIGINFO 2 /* Invoke the signal catching function
with three arguments instead of one
*/
#define SA_RESTART 0x10000000 /* Restart syscall on signal return */
#define SA_ONSTACK 0x20000000 /* Call signal handler on alternate
signal stack provided by
sigaltstack(2). */
#define SA_NODEFER 0x40000000 /* Don't automatically block the signal
when its handler is being executed */
#define SA_RESETHAND 0x80000000 /* Reset to SIG_DFL on entry to handler */
#define SA_ONESHOT SA_RESETHAND /* Historical linux name */
#define SA_NOMASK SA_NODEFER /* Historical linux name */
/* Used internally by cygwin. Included here to group everything in one place.
Do not use. */
#define _SA_INTERNAL_MASK 0xf000 /* bits in this range are internal */
#endif /* __POSIX_VISIBLE */
#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809
#undef MINSIGSTKSZ
#define MINSIGSTKSZ 8192
#undef SIGSTKSZ
#define SIGSTKSZ 32768
#endif /* __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 */
#define SIGHUP 1 /* hangup */
#define SIGINT 2 /* interrupt */
#define SIGQUIT 3 /* quit */
#define SIGILL 4 /* illegal instruction (not reset when caught) */
#define SIGTRAP 5 /* trace trap (not reset when caught) */
#define SIGABRT 6 /* used by abort */
#define SIGIOT SIGABRT /* synonym for SIGABRT on most systems */
#define SIGEMT 7 /* EMT instruction */
#define SIGFPE 8 /* floating point exception */
#define SIGKILL 9 /* kill (cannot be caught or ignored) */
#define SIGBUS 10 /* bus error */
#define SIGSEGV 11 /* segmentation violation */
#define SIGSYS 12 /* bad argument to system call */
#define SIGPIPE 13 /* write on a pipe with no one to read it */
#define SIGALRM 14 /* alarm clock */
#define SIGTERM 15 /* software termination signal from kill */
#define SIGURG 16 /* urgent condition on IO channel */
#define SIGSTOP 17 /* sendable stop signal not from tty */
#define SIGTSTP 18 /* stop signal from tty */
#define SIGCONT 19 /* continue a stopped process */
#define SIGCHLD 20 /* to parent on child stop or exit */
#define SIGCLD 20 /* System V name for SIGCHLD */
#define SIGTTIN 21 /* to readers pgrp upon background tty read */
#define SIGTTOU 22 /* like TTIN for output if (tp->t_local&LTOSTOP) */
#define SIGIO 23 /* input/output possible signal */
#define SIGPOLL SIGIO /* System V name for SIGIO */
#define SIGXCPU 24 /* exceeded CPU time limit */
#define SIGXFSZ 25 /* exceeded file size limit */
#define SIGVTALRM 26 /* virtual time alarm */
#define SIGPROF 27 /* profiling time alarm */
#define SIGWINCH 28 /* window changed */
#define SIGLOST 29 /* resource lost (eg, record-lock lost) */
#define SIGPWR SIGLOST /* power failure */
#define SIGUSR1 30 /* user defined signal 1 */
#define SIGUSR2 31 /* user defined signal 2 */
#if __WORDSIZE == 64
#define NSIG 65 /* signal 0 implied */
#else
#define NSIG 33 /* signal 0 implied */
#endif
/* Real-Time signals per SUSv3. RT_SIGMAX is defined as 8 in limits.h */
#define SIGRTMIN 32
#define SIGRTMAX (NSIG - 1)
#define SIG_HOLD ((_sig_func_ptr)2) /* Signal in signal mask */
#if __POSIX_VISIBLE >= 200809
void psiginfo (const siginfo_t *, const char *);
#endif
#if __POSIX_VISIBLE
int sigwait (const sigset_t *, int *);
#endif
#if __POSIX_VISIBLE >= 199309
int sigwaitinfo (const sigset_t *, siginfo_t *);
#endif
#if __XSI_VISIBLE >= 4
int sighold (int);
int sigignore (int);
int sigrelse (int);
_sig_func_ptr sigset (int, _sig_func_ptr);
#endif
#if __POSIX_VISIBLE >= 199309
int sigqueue(pid_t, int, const union sigval);
#endif
#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809
int siginterrupt (int, int);
#endif
#ifdef __INSIDE_CYGWIN__
extern const char *sys_sigabbrev[];
extern const char *sys_siglist[];
#elif __BSD_VISIBLE
extern const char __declspec(dllimport) *sys_sigabbrev[];
extern const char __declspec(dllimport) *sys_siglist[];
#endif
#ifdef __cplusplus
}
#endif
#endif /*_CYGWIN_SIGNAL_H*/