2017-11-01 17:08:43 +03:00
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2012-10-04 21:20:15 +04:00
# ifndef _UAPI_ASM_GENERIC_SIGINFO_H
# define _UAPI_ASM_GENERIC_SIGINFO_H
# include <linux/compiler.h>
# include <linux/types.h>
typedef union sigval {
int sival_int ;
void __user * sival_ptr ;
} sigval_t ;
/*
* This is the size ( including padding ) of the part of the
* struct siginfo that is before the union .
*/
# ifndef __ARCH_SI_PREAMBLE_SIZE
# define __ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int))
# endif
# define SI_MAX_SIZE 128
# ifndef SI_PAD_SIZE
# define SI_PAD_SIZE ((SI_MAX_SIZE - __ARCH_SI_PREAMBLE_SIZE) / sizeof(int))
# endif
/*
* The default " si_band " type is " long " , as specified by POSIX .
* However , some architectures want to override this to " int "
* for historical compatibility reasons , so we allow that .
*/
# ifndef __ARCH_SI_BAND_T
# define __ARCH_SI_BAND_T long
# endif
# ifndef __ARCH_SI_CLOCK_T
# define __ARCH_SI_CLOCK_T __kernel_clock_t
# endif
# ifndef __ARCH_SI_ATTRIBUTES
# define __ARCH_SI_ATTRIBUTES
# endif
typedef struct siginfo {
int si_signo ;
2017-07-10 00:14:25 +03:00
# ifndef __ARCH_HAS_SWAPPED_SIGINFO
2012-10-04 21:20:15 +04:00
int si_errno ;
int si_code ;
2017-07-10 00:14:25 +03:00
# else
int si_code ;
int si_errno ;
# endif
2012-10-04 21:20:15 +04:00
union {
int _pad [ SI_PAD_SIZE ] ;
/* kill() */
struct {
__kernel_pid_t _pid ; /* sender's pid */
2017-07-10 04:08:13 +03:00
__kernel_uid32_t _uid ; /* sender's uid */
2012-10-04 21:20:15 +04:00
} _kill ;
/* POSIX.1b timers */
struct {
__kernel_timer_t _tid ; /* timer id */
int _overrun ; /* overrun count */
sigval_t _sigval ; /* same as below */
int _sys_private ; /* not to be passed to user */
} _timer ;
/* POSIX.1b signals */
struct {
__kernel_pid_t _pid ; /* sender's pid */
2017-07-10 04:08:13 +03:00
__kernel_uid32_t _uid ; /* sender's uid */
2012-10-04 21:20:15 +04:00
sigval_t _sigval ;
} _rt ;
/* SIGCHLD */
struct {
__kernel_pid_t _pid ; /* which child */
2017-07-10 04:08:13 +03:00
__kernel_uid32_t _uid ; /* sender's uid */
2012-10-04 21:20:15 +04:00
int _status ; /* exit code */
__ARCH_SI_CLOCK_T _utime ;
__ARCH_SI_CLOCK_T _stime ;
} _sigchld ;
2017-06-27 00:24:37 +03:00
/* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGEMT */
2012-10-04 21:20:15 +04:00
struct {
void __user * _addr ; /* faulting insn/memory ref. */
# ifdef __ARCH_SI_TRAPNO
int _trapno ; /* TRAP # which caused the signal */
2017-07-31 22:53:59 +03:00
# endif
# ifdef __ia64__
int _imm ; /* immediate value for "break" */
unsigned int _flags ; /* see ia64 si_flags */
unsigned long _isr ; /* isr */
2012-10-04 21:20:15 +04:00
# endif
2018-04-02 22:45:42 +03:00
# define __ADDR_BND_PKEY_PAD (__alignof__(void *) < sizeof(short) ? \
sizeof ( short ) : __alignof__ ( void * ) )
2016-02-13 00:02:12 +03:00
union {
2017-07-31 18:08:59 +03:00
/*
* used when si_code = BUS_MCEERR_AR or
* used when si_code = BUS_MCEERR_AO
*/
short _addr_lsb ; /* LSB of the reported address */
2016-02-13 00:02:12 +03:00
/* used when si_code=SEGV_BNDERR */
struct {
2018-04-02 22:45:42 +03:00
char _dummy_bnd [ __ADDR_BND_PKEY_PAD ] ;
2016-02-13 00:02:12 +03:00
void __user * _lower ;
void __user * _upper ;
} _addr_bnd ;
/* used when si_code=SEGV_PKUERR */
2017-07-31 18:08:59 +03:00
struct {
2018-04-02 22:45:42 +03:00
char _dummy_pkey [ __ADDR_BND_PKEY_PAD ] ;
2017-07-31 18:08:59 +03:00
__u32 _pkey ;
} _addr_pkey ;
2016-02-13 00:02:12 +03:00
} ;
2012-10-04 21:20:15 +04:00
} _sigfault ;
/* SIGPOLL */
struct {
__ARCH_SI_BAND_T _band ; /* POLL_IN, POLL_OUT, POLL_MSG */
int _fd ;
} _sigpoll ;
/* SIGSYS */
struct {
void __user * _call_addr ; /* calling user insn */
int _syscall ; /* triggering system call number */
unsigned int _arch ; /* AUDIT_ARCH_* of syscall */
} _sigsys ;
} _sifields ;
} __ARCH_SI_ATTRIBUTES siginfo_t ;
/*
* How these fields are to be accessed .
*/
# define si_pid _sifields._kill._pid
# define si_uid _sifields._kill._uid
# define si_tid _sifields._timer._tid
# define si_overrun _sifields._timer._overrun
# define si_sys_private _sifields._timer._sys_private
# define si_status _sifields._sigchld._status
# define si_utime _sifields._sigchld._utime
# define si_stime _sifields._sigchld._stime
# define si_value _sifields._rt._sigval
# define si_int _sifields._rt._sigval.sival_int
# define si_ptr _sifields._rt._sigval.sival_ptr
# define si_addr _sifields._sigfault._addr
# ifdef __ARCH_SI_TRAPNO
# define si_trapno _sifields._sigfault._trapno
# endif
# define si_addr_lsb _sifields._sigfault._addr_lsb
2014-11-14 18:18:19 +03:00
# define si_lower _sifields._sigfault._addr_bnd._lower
# define si_upper _sifields._sigfault._addr_bnd._upper
2017-07-31 18:08:59 +03:00
# define si_pkey _sifields._sigfault._addr_pkey._pkey
2012-10-04 21:20:15 +04:00
# define si_band _sifields._sigpoll._band
# define si_fd _sifields._sigpoll._fd
# define si_call_addr _sifields._sigsys._call_addr
# define si_syscall _sifields._sigsys._syscall
# define si_arch _sifields._sigsys._arch
/*
* si_code values
* Digital reserves positive values for kernel - generated signals .
*/
# define SI_USER 0 /* sent by kill, sigsend, raise */
# define SI_KERNEL 0x80 /* sent by the kernel from somewhere */
# define SI_QUEUE -1 /* sent by sigqueue */
2017-07-17 06:36:59 +03:00
# define SI_TIMER -2 /* sent by timer expiration */
# define SI_MESGQ -3 /* sent by real time mesq state change */
2012-10-04 21:20:15 +04:00
# define SI_ASYNCIO -4 /* sent by AIO completion */
2017-07-17 06:36:59 +03:00
# define SI_SIGIO -5 /* sent by queued SIGIO */
2012-10-04 21:20:15 +04:00
# define SI_TKILL -6 /* sent by tkill system call */
# define SI_DETHREAD -7 /* sent by execve() killing subsidiary threads */
2017-07-24 22:46:09 +03:00
# define SI_ASYNCNL -60 /* sent by glibc async name lookup completion */
2012-10-04 21:20:15 +04:00
# define SI_FROMUSER(siptr) ((siptr)->si_code <= 0)
# define SI_FROMKERNEL(siptr) ((siptr)->si_code > 0)
/*
* SIGILL si_codes
*/
2017-07-17 06:36:59 +03:00
# define ILL_ILLOPC 1 /* illegal opcode */
# define ILL_ILLOPN 2 /* illegal operand */
# define ILL_ILLADR 3 /* illegal addressing mode */
# define ILL_ILLTRP 4 /* illegal trap */
# define ILL_PRVOPC 5 /* privileged opcode */
# define ILL_PRVREG 6 /* privileged register */
# define ILL_COPROC 7 /* coprocessor error */
# define ILL_BADSTK 8 /* internal stack error */
2018-03-15 15:30:51 +03:00
# define ILL_BADIADDR 9 /* unimplemented instruction address */
# define __ILL_BREAK 10 /* illegal break */
# define __ILL_BNDMOD 11 /* bundle-update (modification) in progress */
2018-01-14 03:57:14 +03:00
# define NSIGILL 11
2012-10-04 21:20:15 +04:00
/*
* SIGFPE si_codes
*/
2017-07-17 06:36:59 +03:00
# define FPE_INTDIV 1 /* integer divide by zero */
# define FPE_INTOVF 2 /* integer overflow */
# define FPE_FLTDIV 3 /* floating point divide by zero */
# define FPE_FLTOVF 4 /* floating point overflow */
# define FPE_FLTUND 5 /* floating point underflow */
# define FPE_FLTRES 6 /* floating point inexact result */
# define FPE_FLTINV 7 /* floating point invalid operation */
# define FPE_FLTSUB 8 /* subscript out of range */
2018-03-15 15:30:51 +03:00
# define __FPE_DECOVF 9 /* decimal overflow */
# define __FPE_DECDIV 10 /* decimal division by zero */
# define __FPE_DECERR 11 /* packed decimal error */
# define __FPE_INVASC 12 /* invalid ASCII digit */
# define __FPE_INVDEC 13 /* invalid decimal digit */
2018-03-01 20:44:06 +03:00
# define FPE_FLTUNK 14 /* undiagnosed floating-point exception */
2018-01-14 04:32:43 +03:00
# define FPE_CONDTRAP 15 /* trap on condition */
# define NSIGFPE 15
2012-10-04 21:20:15 +04:00
/*
* SIGSEGV si_codes
*/
2017-07-17 06:36:59 +03:00
# define SEGV_MAPERR 1 /* address not mapped to object */
# define SEGV_ACCERR 2 /* invalid permissions for mapped object */
2018-03-09 13:31:48 +03:00
# define SEGV_BNDERR 3 /* failed address bound checks */
2018-01-14 03:57:14 +03:00
# ifdef __ia64__
# define __SEGV_PSTKOVF 4 /* paragraph stack overflow */
# else
# define SEGV_PKUERR 4 /* failed protection key checks */
# endif
2018-02-21 20:15:43 +03:00
# define SEGV_ACCADI 5 /* ADI not enabled for mapped object */
# define SEGV_ADIDERR 6 /* Disrupting MCD error */
# define SEGV_ADIPERR 7 /* Precise MCD exception */
# define NSIGSEGV 7
2012-10-04 21:20:15 +04:00
/*
* SIGBUS si_codes
*/
2017-07-17 06:36:59 +03:00
# define BUS_ADRALN 1 /* invalid address alignment */
# define BUS_ADRERR 2 /* non-existent physical address */
# define BUS_OBJERR 3 /* object specific hardware error */
2012-10-04 21:20:15 +04:00
/* hardware memory error consumed on a machine check: action required */
2018-03-09 13:31:48 +03:00
# define BUS_MCEERR_AR 4
2012-10-04 21:20:15 +04:00
/* hardware memory error detected in process but not consumed: action optional*/
2017-07-17 06:36:59 +03:00
# define BUS_MCEERR_AO 5
2012-10-04 21:20:15 +04:00
# define NSIGBUS 5
/*
* SIGTRAP si_codes
*/
2017-07-17 06:36:59 +03:00
# define TRAP_BRKPT 1 /* process breakpoint */
# define TRAP_TRACE 2 /* process trace trap */
# define TRAP_BRANCH 3 /* process taken branch trap */
# define TRAP_HWBKPT 4 /* hardware breakpoint/watchpoint */
2018-04-18 00:18:25 +03:00
# define TRAP_UNK 5 /* undiagnosed trap */
# define NSIGTRAP 5
2012-10-04 21:20:15 +04:00
2017-06-26 21:09:03 +03:00
/*
2018-02-07 02:39:27 +03:00
* There is an additional set of SIGTRAP si_codes used by ptrace
* that are of the form : ( ( PTRACE_EVENT_XXX < < 8 ) | SIGTRAP )
2017-06-26 21:09:03 +03:00
*/
2012-10-04 21:20:15 +04:00
/*
* SIGCHLD si_codes
*/
2017-07-17 06:36:59 +03:00
# define CLD_EXITED 1 /* child has exited */
# define CLD_KILLED 2 /* child was killed */
# define CLD_DUMPED 3 /* child terminated abnormally */
# define CLD_TRAPPED 4 /* traced child has trapped */
# define CLD_STOPPED 5 /* child has stopped */
# define CLD_CONTINUED 6 /* stopped child has continued */
2012-10-04 21:20:15 +04:00
# define NSIGCHLD 6
/*
2017-06-29 17:28:50 +03:00
* SIGPOLL ( or any other signal without signal specific si_codes ) si_codes
2012-10-04 21:20:15 +04:00
*/
2017-07-17 06:36:59 +03:00
# define POLL_IN 1 /* data input available */
# define POLL_OUT 2 /* output buffers available */
# define POLL_MSG 3 /* input message available */
# define POLL_ERR 4 /* i/o error */
# define POLL_PRI 5 /* high priority input available */
# define POLL_HUP 6 /* device disconnected */
2012-10-04 21:20:15 +04:00
# define NSIGPOLL 6
/*
* SIGSYS si_codes
*/
2017-07-17 06:36:59 +03:00
# define SYS_SECCOMP 1 /* seccomp triggered */
# define NSIGSYS 1
2012-10-04 21:20:15 +04:00
/*
* sigevent definitions
*
* It seems likely that SIGEV_THREAD will have to be handled from
* userspace , libpthread transmuting it to SIGEV_SIGNAL , which the
* thread manager then catches and does the appropriate nonsense .
* However , everything is written out here so as to not get lost .
*/
# define SIGEV_SIGNAL 0 /* notify via signal */
# define SIGEV_NONE 1 /* other notification: meaningless */
# define SIGEV_THREAD 2 /* deliver via thread creation */
# define SIGEV_THREAD_ID 4 /* deliver to thread */
/*
* This works because the alignment is ok on all current architectures
* but we leave open this being overridden in the future
*/
# ifndef __ARCH_SIGEV_PREAMBLE_SIZE
# define __ARCH_SIGEV_PREAMBLE_SIZE (sizeof(int) * 2 + sizeof(sigval_t))
# endif
# define SIGEV_MAX_SIZE 64
# define SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE - __ARCH_SIGEV_PREAMBLE_SIZE) \
/ sizeof ( int ) )
typedef struct sigevent {
sigval_t sigev_value ;
int sigev_signo ;
int sigev_notify ;
union {
int _pad [ SIGEV_PAD_SIZE ] ;
int _tid ;
struct {
void ( * _function ) ( sigval_t ) ;
void * _attribute ; /* really pthread_attr_t */
} _sigev_thread ;
} _sigev_un ;
} sigevent_t ;
# define sigev_notify_function _sigev_un._sigev_thread._function
# define sigev_notify_attributes _sigev_un._sigev_thread._attribute
# define sigev_notify_thread_id _sigev_un._tid
# endif /* _UAPI_ASM_GENERIC_SIGINFO_H */