Line data Source code
1 0 : /*
2 : * Copyright (c) 2025 The Zephyr Contributors
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 : #ifndef ZEPHYR_INCLUDE_POSIX_POSIX_SIGNAL_H_
7 : #define ZEPHYR_INCLUDE_POSIX_POSIX_SIGNAL_H_
8 :
9 : #if defined(_POSIX_C_SOURCE) || defined(__DOXYGEN__)
10 :
11 : #include <zephyr/toolchain.h>
12 : #include <zephyr/sys/util.h>
13 :
14 : #ifdef __cplusplus
15 : extern "C" {
16 : #endif
17 :
18 : /* SIG_DFL must be defined by the libc signal.h */
19 : /* SIG_ERR must be defined by the libc signal.h */
20 :
21 : #if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
22 0 : #define SIG_HOLD ((void *)-2)
23 : #endif
24 :
25 : /* SIG_IGN must be defined by the libc signal.h */
26 :
27 : #if defined(_POSIX_THREADS) || defined(__DOXYGEN__)
28 :
29 : #if !defined(_PTHREAD_T_DECLARED) && !defined(__pthread_t_defined)
30 0 : typedef unsigned int pthread_t;
31 : #define _PTHREAD_T_DECLARED
32 : #define __pthread_t_defined
33 : #endif
34 :
35 : #endif /* defined(_POSIX_THREADS) || defined(__DOXYGEN__) */
36 :
37 : /* size_t must be defined by the libc stddef.h */
38 : #include <stddef.h>
39 :
40 : #if !defined(_UID_T_DECLARED) && !defined(__uid_t_defined)
41 0 : typedef int uid_t;
42 : #define _UID_T_DECLARED
43 : #define __uid_t_defined
44 : #endif
45 :
46 : /* time_t must be defined by the libc time.h */
47 : #include <time.h>
48 :
49 : #if __STDC_VERSION__ >= 201112L
50 : /* struct timespec must be defined in the libc time.h */
51 : #else
52 : #if !defined(_TIMESPEC_DECLARED) && !defined(__timespec_defined)
53 0 : struct timespec {
54 0 : time_t tv_sec;
55 0 : long tv_nsec;
56 : };
57 : #define _TIMESPEC_DECLARED
58 : #define __timespec_defined
59 : #endif
60 : #endif
61 :
62 : /* sig_atomic_t must be defined by the libc signal.h */
63 :
64 0 : #define SIGRTMIN 32
65 : #if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
66 : BUILD_ASSERT(CONFIG_POSIX_RTSIG_MAX >= 0);
67 0 : #define SIGRTMAX (SIGRTMIN + CONFIG_POSIX_RTSIG_MAX)
68 : #else
69 : #define SIGRTMAX SIGRTMIN
70 : #endif
71 :
72 : #if !defined(_SIGSET_T_DECLARED) && !defined(__sigset_t_defined)
73 0 : typedef struct {
74 0 : unsigned long sig[DIV_ROUND_UP(SIGRTMAX + 1, BITS_PER_LONG)];
75 : } sigset_t;
76 : #define _SIGSET_T_DECLARED
77 : #define __sigset_t_defined
78 : #endif
79 :
80 : #if !defined(_PID_T_DECLARED) && !defined(__pid_t_defined)
81 0 : typedef long pid_t;
82 : #define _PID_T_DECLARED
83 : #define __pid_t_defined
84 : #endif
85 :
86 : #if defined(_POSIX_THREADS) || defined(__DOXYGEN__)
87 :
88 : #if !defined(_PTHREAD_ATTR_T_DECLARED) && !defined(__pthread_attr_t_defined)
89 0 : typedef struct {
90 0 : void *stack;
91 0 : unsigned int details[2];
92 : } pthread_attr_t;
93 : #define _PTHREAD_ATTR_T_DECLARED
94 : #define __pthread_attr_t_defined
95 : #endif
96 :
97 : #endif
98 :
99 : #if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
100 :
101 : /* slightly out of order w.r.t. the specification */
102 : #if !defined(_SIGVAL_DECLARED) && !defined(__sigval_defined)
103 0 : union sigval {
104 0 : int sival_int;
105 0 : void *sival_ptr;
106 : };
107 : #define _SIGVAL_DECLARED
108 : #define __sigval_defined
109 : #endif
110 :
111 : #if !defined(_SIGEVENT_DECLARED) && !defined(__sigevent_defined)
112 0 : struct sigevent {
113 : #if defined(_POSIX_THREADS) || defined(__DOXYGEN__)
114 0 : pthread_attr_t *sigev_notify_attributes;
115 0 : void (*sigev_notify_function)(union sigval value);
116 : #endif
117 0 : union sigval sigev_value;
118 0 : int sigev_notify;
119 0 : int sigev_signo;
120 : };
121 : #define _SIGEVENT_DECLARED
122 : #define __sigevent_defined
123 : #endif
124 :
125 0 : #define SIGEV_NONE 1
126 0 : #define SIGEV_SIGNAL 2
127 0 : #define SIGEV_THREAD 3
128 :
129 : /* Signal constants are defined below */
130 :
131 : #endif /* defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__) */
132 :
133 : /* SIGRTMIN and SIGRTMAX defined above */
134 :
135 : #if !defined(_SIGINFO_T_DECLARED) && !defined(__siginfo_t_defined)
136 0 : typedef struct {
137 0 : void *si_addr;
138 : #if defined(_XOPEN_STREAMS) || defined(__DOXYGEN__)
139 0 : long si_band;
140 : #endif
141 0 : union sigval si_value;
142 0 : pid_t si_pid;
143 0 : uid_t si_uid;
144 0 : int si_signo;
145 0 : int si_code;
146 : #if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
147 0 : int si_errno;
148 : #endif
149 0 : int si_status;
150 : } siginfo_t;
151 : #define _SIGINFO_T_DECLARED
152 : #define __siginfo_t_defined
153 : #endif
154 :
155 : #if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
156 :
157 : #if !defined(_SIGACTION_DECLARED) && !defined(__sigaction_defined)
158 0 : struct sigaction {
159 : union {
160 0 : void (*sa_handler)(int sig);
161 0 : void (*sa_sigaction)(int sig, siginfo_t *info, void *context);
162 0 : };
163 0 : sigset_t sa_mask;
164 0 : int sa_flags;
165 : };
166 : #define _SIGACTION_DECLARED
167 : #define __sigaction_defined
168 : #endif
169 :
170 0 : #define SIG_BLOCK 1
171 0 : #define SIG_UNBLOCK 2
172 0 : #define SIG_SETMASK 0
173 :
174 : #if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
175 0 : #define SA_NOCLDSTOP 0x00000001
176 0 : #define SA_ONSTACK 0x00000002
177 : #endif
178 0 : #define SA_RESETHAND 0x00000004
179 0 : #define SA_RESTART 0x00000008
180 0 : #define SA_SIGINFO 0x00000010
181 : #if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
182 0 : #define SA_NOCLDWAIT 0x00000020
183 : #endif
184 0 : #define SA_NODEFER 0x00000040
185 0 : #define SS_ONSTACK 0x00000001
186 0 : #define SS_DISABLE 0x00000002
187 0 : #define MINSIGSTKSZ 4096
188 0 : #define SIGSTKSZ 4096
189 :
190 : #if !defined(_MCONTEXT_T_DECLARED) && !defined(__mcontext_t_defined)
191 0 : typedef struct {
192 : /* FIXME: there should be a much better Zephyr-specific structure that can be used here */
193 0 : unsigned long gregs[32];
194 0 : unsigned long flags;
195 : } mcontext_t;
196 : #define _MCONTEXT_T_DECLARED
197 : #define __mcontext_defined
198 : #endif
199 :
200 : #if !defined(_UCONTEXT_T_DECLARED) && !defined(__ucontext_t_defined)
201 0 : typedef struct {
202 0 : struct ucontext *uc_link;
203 0 : sigset_t uc_sigmask;
204 0 : stack_t uc_stack;
205 0 : mcontext_t uc_mcontext;
206 : } ucontext_t;
207 : #define _UCONTEXT_T_DECLARED
208 : #define __ucontext_defined
209 : #endif
210 :
211 : #if !defined(_STACK_T_DECLARED) && !defined(__stack_t_defined)
212 0 : typedef struct {
213 0 : void *ss_sp;
214 0 : size_t ss_size;
215 0 : int ss_flags;
216 : } stack_t;
217 : #define _STACK_T_DECLARED
218 : #define __stack_t_defined
219 : #endif
220 :
221 : #endif /* defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__) */
222 :
223 : /* Siginfo codes are defined below */
224 :
225 : #if !defined(_SIGHANDLER_T_DECLARED) && !defined(__sighandler_t_defined)
226 0 : typedef void (*sighandler_t)(int sig);
227 : #define _SIGHANDLER_T_DECLARED
228 : #define __sighandler_t_defined
229 : #endif
230 :
231 0 : int kill(pid_t pid, int sig);
232 : #if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
233 0 : int killpg(pid_t pgrp, int sig);
234 : #endif
235 0 : void psiginfo(const siginfo_t *info, const char *message);
236 0 : void psignal(int sig, const char *message);
237 : #if defined(_POSIX_THREADS) || defined(__DOXYGEN__)
238 0 : int pthread_kill(pthread_t thread, int sig);
239 0 : int pthread_sigmask(int how, const sigset_t *ZRESTRICT set, sigset_t *ZRESTRICT oset);
240 : #endif
241 : /* raise() must be defined by the libc signal.h */
242 : #if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
243 0 : TOOLCHAIN_DISABLE_WARNING(TOOLCHAIN_WARNING_SHADOW);
244 0 : int sigaction(int sig, const struct sigaction *ZRESTRICT act, struct sigaction *ZRESTRICT oact);
245 0 : TOOLCHAIN_ENABLE_WARNING(TOOLCHAIN_WARNING_SHADOW);
246 : #endif
247 0 : int sigaddset(sigset_t *set, int sig);
248 : #if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
249 0 : int sigaltstack(const stack_t *ZRESTRICT ss, stack_t *ZRESTRICT oss);
250 : #endif
251 0 : int sigdelset(sigset_t *set, int sig);
252 0 : int sigemptyset(sigset_t *set);
253 0 : int sigfillset(sigset_t *set);
254 : #if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
255 0 : int sighold(int sig);
256 0 : int sigignore(int sig);
257 0 : int siginterrupt(int sig, int flag);
258 : #endif
259 0 : int sigismember(const sigset_t *set, int sig);
260 : /* signal() must be defined by the libc signal.h */
261 : #if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
262 0 : int sigpause(int sig);
263 : #endif
264 0 : int sigpending(sigset_t *set);
265 0 : int sigprocmask(int how, const sigset_t *ZRESTRICT set, sigset_t *ZRESTRICT oset);
266 : #if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
267 0 : int sigqueue(pid_t pid, int sig, union sigval value);
268 : #endif
269 : #if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
270 0 : int sigrelse(int sig);
271 0 : sighandler_t sigset(int sig, sighandler_t disp);
272 : #endif
273 0 : int sigsuspend(const sigset_t *set);
274 : #if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
275 0 : int sigtimedwait(const sigset_t *ZRESTRICT set, siginfo_t *ZRESTRICT info,
276 : const struct timespec *ZRESTRICT timeout);
277 : #endif
278 0 : int sigwait(const sigset_t *ZRESTRICT set, int *ZRESTRICT sig);
279 : #if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
280 0 : int sigwaitinfo(const sigset_t *ZRESTRICT set, siginfo_t *ZRESTRICT info);
281 : #endif
282 :
283 : /* Note: only ANSI / ISO C signals are guarded below */
284 :
285 1 : #define SIGHUP 1 /**< Hangup */
286 : #if !defined(SIGINT) || defined(__DOXYGEN__)
287 1 : #define SIGINT 2 /**< Interrupt */
288 : #endif
289 1 : #define SIGQUIT 3 /**< Quit */
290 : #if !defined(SIGILL) || defined(__DOXYGEN__)
291 1 : #define SIGILL 4 /**< Illegal instruction */
292 : #endif
293 1 : #define SIGTRAP 5 /**< Trace/breakpoint trap */
294 : #if !defined(SIGABRT) || defined(__DOXYGEN__)
295 1 : #define SIGABRT 6 /**< Aborted */
296 : #endif
297 1 : #define SIGBUS 7 /**< Bus error */
298 : #if !defined(SIGFPE) || defined(__DOXYGEN__)
299 1 : #define SIGFPE 8 /**< Arithmetic exception */
300 : #endif
301 1 : #define SIGKILL 9 /**< Killed */
302 1 : #define SIGUSR1 10 /**< User-defined signal 1 */
303 : #if !defined(SIGSEGV) || defined(__DOXYGEN__)
304 1 : #define SIGSEGV 11 /**< Invalid memory reference */
305 : #endif
306 1 : #define SIGUSR2 12 /**< User-defined signal 2 */
307 1 : #define SIGPIPE 13 /**< Broken pipe */
308 1 : #define SIGALRM 14 /**< Alarm clock */
309 : #if !defined(SIGTERM) || defined(__DOXYGEN__)
310 1 : #define SIGTERM 15 /**< Terminated */
311 : #endif
312 : /* 16 not used */
313 1 : #define SIGCHLD 17 /**< Child status changed */
314 1 : #define SIGCONT 18 /**< Continued */
315 1 : #define SIGSTOP 19 /**< Stop executing */
316 1 : #define SIGTSTP 20 /**< Stopped */
317 1 : #define SIGTTIN 21 /**< Stopped (read) */
318 1 : #define SIGTTOU 22 /**< Stopped (write) */
319 1 : #define SIGURG 23 /**< Urgent I/O condition */
320 1 : #define SIGXCPU 24 /**< CPU time limit exceeded */
321 1 : #define SIGXFSZ 25 /**< File size limit exceeded */
322 1 : #define SIGVTALRM 26 /**< Virtual timer expired */
323 1 : #define SIGPROF 27 /**< Profiling timer expired */
324 : /* 28 not used */
325 1 : #define SIGPOLL 29 /**< Pollable event occurred */
326 : /* 30 not used */
327 1 : #define SIGSYS 31 /**< Bad system call */
328 :
329 : #if defined(_POSIX_REALTIME_SIGNALS) || defined(__DOXYGEN__)
330 :
331 : /* SIGILL */
332 1 : #define ILL_ILLOPC 1 /**< Illegal opcode */
333 1 : #define ILL_ILLOPN 2 /**< Illegal operand */
334 1 : #define ILL_ILLADR 3 /**< Illegal addressing mode */
335 1 : #define ILL_ILLTRP 4 /**< Illegal trap */
336 1 : #define ILL_PRVOPC 5 /**< Privileged opcode */
337 1 : #define ILL_PRVREG 6 /**< Privileged register */
338 1 : #define ILL_COPROC 7 /**< Coprocessor error */
339 1 : #define ILL_BADSTK 8 /**< Internal stack error */
340 :
341 : /* SIGFPE */
342 1 : #define FPE_INTDIV 9 /**< Integer divide by zero */
343 1 : #define FPE_INTOVF 10 /**< Integer overflow */
344 1 : #define FPE_FLTDIV 11 /**< Floating-point divide by zero */
345 1 : #define FPE_FLTOVF 12 /**< Floating-point overflow */
346 1 : #define FPE_FLTUND 13 /**< Floating-point underflow */
347 1 : #define FPE_FLTRES 15 /**< Floating-point inexact result */
348 1 : #define FPE_FLTINV 16 /**< Invalid floating-point operation */
349 1 : #define FPE_FLTSUB 17 /**< Subscript out of range */
350 :
351 : /* SIGSEGV */
352 1 : #define SEGV_MAPERR 18 /**< Address not mapped to object */
353 1 : #define SEGV_ACCERR 19 /**< Invalid permissions for mapped object */
354 :
355 : /* SIGBUS */
356 1 : #define BUS_ADRALN 20 /**< Invalid address alignment */
357 1 : #define BUS_ADRERR 21 /**< Nonexistent physical address */
358 1 : #define BUS_OBJERR 22 /**< Object-specific hardware error */
359 :
360 : #if defined(_XOPEN_SOURCE) || defined(__DOXYGEN__)
361 : /* SIGTRAP */
362 1 : #define TRAP_BRKPT 23 /**< Process breakpoint */
363 1 : #define TRAP_TRACE 24 /**< Process trace trap */
364 : #endif
365 :
366 : /* SIGCHLD */
367 1 : #define CLD_EXITED 25 /**< Child has exited */
368 1 : #define CLD_KILLED 26 /**< Child has terminated abnormally and did not create a core file */
369 1 : #define CLD_DUMPED 27 /**< Child has terminated abnormally and created a core file */
370 1 : #define CLD_TRAPPED 28 /**< Traced child has trapped */
371 1 : #define CLD_STOPPED 29 /**< Child has stopped */
372 1 : #define CLD_CONTINUED 30 /**< Stopped child has continued */
373 :
374 : #if defined(_XOPEN_STREAMS) || defined(__DOXYGEN__)
375 : /* SIGPOLL */
376 1 : #define POLL_IN 31 /**< Data input available */
377 1 : #define POLL_OUT 32 /**< Output buffers available */
378 1 : #define POLL_MSG 33 /**< Input message available */
379 1 : #define POLL_ERR 34 /**< I/O error */
380 1 : #define POLL_PRI 35 /**< High priority input available */
381 1 : #define POLL_HUP 36 /**< Device disconnected */
382 : #endif
383 :
384 : /* Any */
385 1 : #define SI_USER 37 /**< Signal sent by kill() */
386 1 : #define SI_QUEUE 38 /**< Signal sent by sigqueue() */
387 1 : #define SI_TIMER 39 /**< Signal generated by expiration of a timer set by timer_settime() */
388 1 : #define SI_ASYNCIO 40 /**< Signal generated by completion of an asynchronous I/O request */
389 1 : #define SI_MESGQ 41 /**< Signal generated by arrival of a message on an empty message queue */
390 :
391 : #endif
392 :
393 : #ifdef __cplusplus
394 : }
395 : #endif
396 :
397 : #endif /* defined(_POSIX_C_SOURCE) || defined(__DOXYGEN__) */
398 :
399 : #endif /* ZEPHYR_INCLUDE_POSIX_POSIX_SIGNAL_H_ */
|