Xenomai 3.3.2
Loading...
Searching...
No Matches
signal.h
1/*
2 * Copyright (C) 2006 Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>.
3 * Copyright (C) 2013 Philippe Gerum <rpm@xenomai.org>.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
18 */
19#ifndef _COBALT_UAPI_SIGNAL_H
20#define _COBALT_UAPI_SIGNAL_H
21
22/*
23 * Those are pseudo-signals only available with pthread_kill() to
24 * suspend/resume/unblock threads synchronously, force them out of
25 * primary mode or even demote them to the SCHED_OTHER class via the
26 * low-level nucleus interface. Can't block those signals, queue them,
27 * or even set them in a sigset. Those are nasty, strictly anti-POSIX
28 * things; we do provide them nevertheless only because we are mean
29 * people doing harmful code for no valid reason. Can't go against
30 * your nature, right? Nah... (this said, don't blame us for POSIX,
31 * we are not _that_ mean).
32 */
33#define SIGSUSP (SIGRTMAX + 1)
34#define SIGRESM (SIGRTMAX + 2)
35#define SIGRELS (SIGRTMAX + 3)
36#define SIGKICK (SIGRTMAX + 4)
37#define SIGDEMT (SIGRTMAX + 5)
38
39/*
40 * Regular POSIX signals with specific handling by Xenomai.
41 */
42#define SIGSHADOW SIGWINCH
43#define sigshadow_action(code) ((code) & 0xff)
44#define sigshadow_arg(code) (((code) >> 8) & 0xff)
45#define sigshadow_int(action, arg) ((action) | ((arg) << 8))
46
47/* SIGSHADOW action codes. */
48#define SIGSHADOW_ACTION_HARDEN 1
49#define SIGSHADOW_ACTION_BACKTRACE 2
50#define SIGSHADOW_ACTION_HOME 3
51#define SIGSHADOW_BACKTRACE_DEPTH 16
52
53#define SIGDEBUG SIGXCPU
54#define sigdebug_code(si) ((si)->si_value.sival_int)
55#define sigdebug_reason(si) (sigdebug_code(si) & 0xff)
56#define sigdebug_marker 0xfccf0000
57#define sigdebug_marked(si) \
58 ((sigdebug_code(si) & 0xffff0000) == sigdebug_marker)
59
60/* Possible values of sigdebug_reason() */
61#define SIGDEBUG_UNDEFINED 0
62#define SIGDEBUG_MIGRATE_SIGNAL 1
63#define SIGDEBUG_MIGRATE_SYSCALL 2
64#define SIGDEBUG_MIGRATE_FAULT 3
65#define SIGDEBUG_MIGRATE_PRIOINV 4
66#define SIGDEBUG_NOMLOCK 5
67#define SIGDEBUG_WATCHDOG 6
68#define SIGDEBUG_RESCNT_IMBALANCE 7
69#define SIGDEBUG_LOCK_BREAK 8
70#define SIGDEBUG_MUTEX_SLEEP 9
71
72#define COBALT_DELAYMAX 2147483647U
73
74/*
75 * Internal accessors to extra siginfo/sigevent fields, extending some
76 * existing base field. The extra data should be grouped in a
77 * dedicated struct type. The extra space is taken from the padding
78 * area available from the original structure definitions.
79 *
80 * e.g. getting the address of the following extension to
81 * _sifields._rt from siginfo_t,
82 *
83 * struct bar {
84 * int foo;
85 * };
86 *
87 * would be noted as:
88 *
89 * siginfo_t si;
90 * struct bar *p = __cobalt_si_extra(&si, _rt, struct bar);
91 *
92 * This code is shared between kernel and user space. Proper
93 * definitions of siginfo_t and sigevent_t should have been read prior
94 * to including this file.
95 *
96 * CAUTION: this macro does not handle alignment issues for the extra
97 * data. The extra type definition should take care of this.
98 */
99#ifdef __OPTIMIZE__
100extern void *__siginfo_overflow(void);
101static inline
102const void *__check_si_overflow(size_t fldsz, size_t extrasz, const void *p)
103{
104 siginfo_t *si __attribute__((unused));
105
106 if (fldsz + extrasz <= sizeof(si->_sifields))
107 return p;
108
109 return __siginfo_overflow();
110}
111#define __cobalt_si_extra(__si, __basefield, __type) \
112 ((__type *)__check_si_overflow(sizeof(__si->_sifields.__basefield), \
113 sizeof(__type), &(__si->_sifields.__basefield) + 1))
114#else
115#define __cobalt_si_extra(__si, __basefield, __type) \
116 ((__type *)((&__si->_sifields.__basefield) + 1))
117#endif
118
119/* Same approach, this time for extending sigevent_t. */
120
121#ifdef __OPTIMIZE__
122extern void *__sigevent_overflow(void);
123static inline
124const void *__check_sev_overflow(size_t fldsz, size_t extrasz, const void *p)
125{
126 sigevent_t *sev __attribute__((unused));
127
128 if (fldsz + extrasz <= sizeof(sev->_sigev_un))
129 return p;
130
131 return __sigevent_overflow();
132}
133#define __cobalt_sev_extra(__sev, __basefield, __type) \
134 ((__type *)__check_sev_overflow(sizeof(__sev->_sigev_un.__basefield), \
135 sizeof(__type), &(__sev->_sigev_un.__basefield) + 1))
136#else
137#define __cobalt_sev_extra(__sev, __basefield, __type) \
138 ((__type *)((&__sev->_sigev_un.__basefield) + 1))
139#endif
140
141#endif /* !_COBALT_UAPI_SIGNAL_H */