xref: /llvm-project/libc/include/llvm-libc-types/siginfo_t.h (revision 88a0a318e80565fef9367728b878641d261acfb6)
1 //===-- Definition of siginfo_t type --------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_LIBC_TYPES_SIGINFO_T_H
10 #define LLVM_LIBC_TYPES_SIGINFO_T_H
11 
12 #include "clock_t.h"
13 #include "pid_t.h"
14 #include "uid_t.h"
15 #include "union_sigval.h"
16 
17 #define SI_MAX_SIZE 128
18 
19 typedef struct {
20   int si_signo; /* Signal number.  */
21   int si_errno; /* If non-zero, an errno value associated with
22                    this signal, as defined in <errno.h>.  */
23   int si_code;  /* Signal code.  */
24   union {
25     int _si_pad[SI_MAX_SIZE / sizeof(int)];
26 
27     /* kill() */
28     struct {
29       pid_t si_pid; /* sender's pid */
30       uid_t si_uid; /* sender's uid */
31     } _kill;
32 
33     /* POSIX.1b timers */
34     struct {
35       int si_tid;             /* timer id */
36       int _overrun;           /* overrun count */
37       union sigval si_sigval; /* same as below */
38     } _timer;
39 
40     /* POSIX.1b signals */
41     struct {
42       pid_t si_pid; /* sender's pid */
43       uid_t si_uid; /* sender's uid */
44       union sigval si_sigval;
45     } _rt;
46 
47     /* SIGCHLD */
48     struct {
49       pid_t si_pid;  /* which child */
50       uid_t si_uid;  /* sender's uid */
51       int si_status; /* exit code */
52       clock_t si_utime;
53       clock_t si_stime;
54     } _sigchld;
55 
56     /* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGEMT */
57     struct {
58       void *si_addr;         /* faulting insn/memory ref. */
59       short int si_addr_lsb; /* Valid LSB of the reported address.  */
60       union {
61         /* used when si_code=SEGV_BNDERR */
62         struct {
63           void *_lower;
64           void *_upper;
65         } _addr_bnd;
66         /* used when si_code=SEGV_PKUERR */
67         __UINT32_TYPE__ _pkey;
68       } _bounds;
69     } _sigfault;
70 
71     /* SIGPOLL */
72     struct {
73       long int si_band; /* POLL_IN, POLL_OUT, POLL_MSG */
74       int si_fd;
75     } _sigpoll;
76 
77     /* SIGSYS */
78     struct {
79       void *_call_addr;   /* calling user insn */
80       int _syscall;       /* triggering system call number */
81       unsigned int _arch; /* AUDIT_ARCH_* of syscall */
82     } _sigsys;
83   } _sifields;
84 } siginfo_t;
85 
86 #undef SI_MAX_SIZE
87 
88 #define si_pid _sifields._kill.si_pid
89 #define si_uid _sifields._kill.si_uid
90 #define si_timerid _sifields._timer.si_tid
91 #define si_overrun _sifields._timer.si_overrun
92 #define si_status _sifields._sigchld.si_status
93 #define si_utime _sifields._sigchld.si_utime
94 #define si_stime _sifields._sigchld.si_stime
95 #define si_value _sifields._rt.si_sigval
96 #define si_int _sifields._rt.si_sigval.sival_int
97 #define si_ptr _sifields._rt.si_sigval.sival_ptr
98 #define si_addr _sifields._sigfault.si_addr
99 #define si_addr_lsb _sifields._sigfault.si_addr_lsb
100 #define si_lower _sifields._sigfault._bounds._addr_bnd._lower
101 #define si_upper _sifields._sigfault._bounds._addr_bnd._upper
102 #define si_pkey _sifields._sigfault._bounds._pkey
103 #define si_band _sifields._sigpoll.si_band
104 #define si_fd _sifields._sigpoll.si_fd
105 #define si_call_addr _sifields._sigsys._call_addr
106 #define si_syscall _sifields._sigsys._syscall
107 #define si_arch _sifields._sigsys._arch
108 
109 #endif // LLVM_LIBC_TYPES_SIGINFO_T_H
110