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