Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / signalvar.h @ 14

History | View | Annotate | Download (9.55 KB)

1
/*        $NetBSD: signalvar.h,v 1.86 2014/05/15 07:11:30 uebayasi Exp $        */
2

    
3
/*
4
 * Copyright (c) 1991, 1993
5
 *        The Regents of the University of California.  All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 * 2. Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
15
 * 3. Neither the name of the University nor the names of its contributors
16
 *    may be used to endorse or promote products derived from this software
17
 *    without specific prior written permission.
18
 *
19
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
 * SUCH DAMAGE.
30
 *
31
 *        @(#)signalvar.h        8.6 (Berkeley) 2/19/95
32
 */
33

    
34
#ifndef        _SYS_SIGNALVAR_H_
35
#define        _SYS_SIGNALVAR_H_
36

    
37
#include <sys/siginfo.h>
38
#include <sys/queue.h>
39
#include <sys/mutex.h>
40

    
41
/*
42
 * Kernel signal definitions and data structures,
43
 * not exported to user programs.
44
 */
45

    
46
/*
47
 * Queue of signals.
48
 */
49
typedef TAILQ_HEAD(ksiginfoq, ksiginfo) ksiginfoq_t;
50

    
51
/*
52
 * Process signal actions, possibly shared between processes.
53
 */
54
struct sigacts {
55
        struct sigact_sigdesc {
56
                struct sigaction sd_sigact;
57
                const void        *sd_tramp;
58
                int                sd_vers;
59
        } sa_sigdesc[NSIG];                /* disposition of signals */
60

    
61
        int                sa_refcnt;        /* reference count */
62
        kmutex_t        sa_mutex;        /* lock on sa_refcnt */
63
};
64

    
65
/*
66
 * Pending signals, per LWP and per process.
67
 */
68
typedef struct sigpend {
69
        ksiginfoq_t        sp_info;
70
        sigset_t        sp_set;
71
} sigpend_t;
72

    
73
/*
74
 * Process signal state.
75
 */
76
struct sigctx {
77
        int                ps_signo;        /* for core dump/debugger XXX */
78
        int                ps_code;        /* for core dump/debugger XXX */
79
        int                ps_lwp;                /* for core dump/debugger XXX */
80
        void                *ps_sigcode;        /* address of signal trampoline */
81
        sigset_t        ps_sigignore;        /* Signals being ignored. */
82
        sigset_t        ps_sigcatch;        /* Signals being caught by user. */
83
};
84

    
85
#if !defined(__minix)
86
/* additional signal action values, used only temporarily/internally */
87
#define        SIG_CATCH        (void (*)(int))2
88
#endif /* !defined(__minix) */
89

    
90
/*
91
 * get signal action for process and signal; currently only for current process
92
 */
93
#define SIGACTION(p, sig)        (p->p_sigacts->sa_sigdesc[(sig)].sd_sigact)
94
#define        SIGACTION_PS(ps, sig)        (ps->sa_sigdesc[(sig)].sd_sigact)
95

    
96
/*
97
 * Signal properties and actions.
98
 * The array below categorizes the signals and their default actions
99
 * according to the following properties:
100
 */
101
#define        SA_KILL                0x0001                /* terminates process by default */
102
#define        SA_CORE                0x0002                /* ditto and coredumps */
103
#define        SA_STOP                0x0004                /* suspend process */
104
#define        SA_TTYSTOP        0x0008                /* ditto, from tty */
105
#define        SA_IGNORE        0x0010                /* ignore by default */
106
#define        SA_CONT                0x0020                /* continue if suspended */
107
#define        SA_CANTMASK        0x0040                /* non-maskable, catchable */
108
#define        SA_NORESET        0x0080                /* not reset when caught */
109
#define        SA_TOLWP        0x0100                /* to LWP that generated, if local */
110
#define        SA_TOALL        0x0200                /* always to all LWPs */
111

    
112
#ifdef _KERNEL
113

    
114
#include <sys/systm.h>                        /* for copyin_t/copyout_t */
115

    
116
extern sigset_t contsigmask, sigcantmask;
117

    
118
struct vnode;
119
struct coredump_iostate;
120

    
121
/*
122
 * Machine-independent functions:
123
 */
124
int        coredump_netbsd(struct lwp *, struct coredump_iostate *);
125
void        execsigs(struct proc *);
126
int        issignal(struct lwp *);
127
void        pgsignal(struct pgrp *, int, int);
128
void        kpgsignal(struct pgrp *, struct ksiginfo *, void *, int);
129
void        postsig(int);
130
void        psignal(struct proc *, int);
131
void        kpsignal(struct proc *, struct ksiginfo *, void *);
132
void        child_psignal(struct proc *, int);
133
void        siginit(struct proc *);
134
void        trapsignal(struct lwp *, struct ksiginfo *);
135
void        sigexit(struct lwp *, int) __dead;
136
void        killproc(struct proc *, const char *);
137
void        setsigvec(struct proc *, int, struct sigaction *);
138
int        killpg1(struct lwp *, struct ksiginfo *, int, int);
139
void        proc_unstop(struct proc *p);
140

    
141
int        sigaction1(struct lwp *, int, const struct sigaction *,
142
            struct sigaction *, const void *, int);
143
int        sigprocmask1(struct lwp *, int, const sigset_t *, sigset_t *);
144
void        sigpending1(struct lwp *, sigset_t *);
145
void        sigsuspendsetup(struct lwp *, const sigset_t *);
146
void        sigsuspendteardown(struct lwp *);
147
int        sigsuspend1(struct lwp *, const sigset_t *);
148
int        sigaltstack1(struct lwp *, const struct sigaltstack *,
149
            struct sigaltstack *);
150
int        sigismasked(struct lwp *, int);
151

    
152
int        sigget(sigpend_t *, ksiginfo_t *, int, const sigset_t *);
153
void        sigclear(sigpend_t *, const sigset_t *, ksiginfoq_t *);
154
void        sigclearall(struct proc *, const sigset_t *, ksiginfoq_t *);
155

    
156
void        kpsignal2(struct proc *, ksiginfo_t *);
157

    
158
void        signal_init(void);
159

    
160
struct sigacts        *sigactsinit(struct proc *, int);
161
void        sigactsunshare(struct proc *);
162
void        sigactsfree(struct sigacts *);
163

    
164
void        kpsendsig(struct lwp *, const struct ksiginfo *, const sigset_t *);
165
void        sendsig_reset(struct lwp *, int);
166
void        sendsig(const struct ksiginfo *, const sigset_t *);
167

    
168
ksiginfo_t        *ksiginfo_alloc(struct proc *, ksiginfo_t *, int);
169
void        ksiginfo_free(ksiginfo_t *);
170
void        ksiginfo_queue_drain0(ksiginfoq_t *);
171

    
172
struct sys_____sigtimedwait50_args;
173
int        sigtimedwait1(struct lwp *, const struct sys_____sigtimedwait50_args *,
174
    register_t *, copyin_t, copyout_t, copyin_t, copyout_t);
175

    
176
void        signotify(struct lwp *);
177
int        sigispending(struct lwp *, int);
178

    
179
/*
180
 * Machine-dependent functions:
181
 */
182
void        sendsig_sigcontext(const struct ksiginfo *, const sigset_t *);
183
void        sendsig_siginfo(const struct ksiginfo *, const sigset_t *);
184

    
185
extern        struct pool ksiginfo_pool;
186

    
187
/*
188
 * Modularity / compatibility.
189
 */
190
extern void        (*sendsig_sigcontext_vec)(const struct ksiginfo *,
191
                                          const sigset_t *);
192
extern int        (*coredump_vec)(struct lwp *, const char *);
193

    
194
/*
195
 * firstsig:
196
 *
197
 *         Return the first signal in a signal set.
198
 */
199
static inline int
200
firstsig(const sigset_t *ss)
201
{
202
        int sig;
203

    
204
        sig = ffs(ss->__bits[0]);
205
        if (sig != 0)
206
                return (sig);
207
#if NSIG > 33
208
        sig = ffs(ss->__bits[1]);
209
        if (sig != 0)
210
                return (sig + 32);
211
#endif
212
#if NSIG > 65
213
        sig = ffs(ss->__bits[2]);
214
        if (sig != 0)
215
                return (sig + 64);
216
#endif
217
#if NSIG > 97
218
        sig = ffs(ss->__bits[3]);
219
        if (sig != 0)
220
                return (sig + 96);
221
#endif
222
        return (0);
223
}
224

    
225
static inline void
226
ksiginfo_queue_init(ksiginfoq_t *kq)
227
{
228
        TAILQ_INIT(kq);
229
}
230

    
231
static inline void
232
ksiginfo_queue_drain(ksiginfoq_t *kq)
233
{
234
        if (!TAILQ_EMPTY(kq))
235
                ksiginfo_queue_drain0(kq);
236
}
237

    
238
#endif        /* _KERNEL */
239

    
240
#ifdef        _KERNEL
241
#ifdef        SIGPROP
242
const int sigprop[NSIG] = {
243
        0,                                        /* 0 unused */
244
        SA_KILL,                                /* 1 SIGHUP */
245
        SA_KILL,                                /* 2 SIGINT */
246
        SA_KILL|SA_CORE,                        /* 3 SIGQUIT */
247
        SA_KILL|SA_CORE|SA_NORESET|SA_TOLWP,        /* 4 SIGILL */
248
        SA_KILL|SA_CORE|SA_NORESET|SA_TOLWP,        /* 5 SIGTRAP */
249
        SA_KILL|SA_CORE,                        /* 6 SIGABRT */
250
        SA_KILL|SA_CORE|SA_TOLWP,                /* 7 SIGEMT */
251
        SA_KILL|SA_CORE|SA_TOLWP,                /* 8 SIGFPE */
252
        SA_KILL|SA_CANTMASK|SA_TOALL,                /* 9 SIGKILL */
253
        SA_KILL|SA_CORE|SA_TOLWP,                /* 10 SIGBUS */
254
        SA_KILL|SA_CORE|SA_TOLWP,                /* 11 SIGSEGV */
255
        SA_KILL|SA_CORE|SA_TOLWP,                /* 12 SIGSYS */
256
        SA_KILL,                                /* 13 SIGPIPE */
257
        SA_KILL,                                /* 14 SIGALRM */
258
        SA_KILL,                                /* 15 SIGTERM */
259
        SA_IGNORE,                                /* 16 SIGURG */
260
        SA_STOP|SA_CANTMASK|SA_TOALL,                /* 17 SIGSTOP */
261
        SA_STOP|SA_TTYSTOP|SA_TOALL,                /* 18 SIGTSTP */
262
        SA_IGNORE|SA_CONT|SA_TOALL,                /* 19 SIGCONT */
263
        SA_IGNORE,                                /* 20 SIGCHLD */
264
        SA_STOP|SA_TTYSTOP|SA_TOALL,                /* 21 SIGTTIN */
265
        SA_STOP|SA_TTYSTOP|SA_TOALL,                /* 22 SIGTTOU */
266
        SA_IGNORE,                                /* 23 SIGIO */
267
        SA_KILL,                                /* 24 SIGXCPU */
268
        SA_KILL,                                /* 25 SIGXFSZ */
269
        SA_KILL,                                /* 26 SIGVTALRM */
270
        SA_KILL,                                /* 27 SIGPROF */
271
        SA_IGNORE,                                /* 28 SIGWINCH  */
272
        SA_IGNORE,                                /* 29 SIGINFO */
273
        SA_KILL,                                /* 30 SIGUSR1 */
274
        SA_KILL,                                /* 31 SIGUSR2 */
275
        SA_IGNORE|SA_NORESET,                        /* 32 SIGPWR */
276
        SA_KILL,                                /* 33 SIGRTMIN + 0 */
277
        SA_KILL,                                /* 34 SIGRTMIN + 1 */
278
        SA_KILL,                                /* 35 SIGRTMIN + 2 */
279
        SA_KILL,                                /* 36 SIGRTMIN + 3 */
280
        SA_KILL,                                /* 37 SIGRTMIN + 4 */
281
        SA_KILL,                                /* 38 SIGRTMIN + 5 */
282
        SA_KILL,                                /* 39 SIGRTMIN + 6 */
283
        SA_KILL,                                /* 40 SIGRTMIN + 7 */
284
        SA_KILL,                                /* 41 SIGRTMIN + 8 */
285
        SA_KILL,                                /* 42 SIGRTMIN + 9 */
286
        SA_KILL,                                /* 43 SIGRTMIN + 10 */
287
        SA_KILL,                                /* 44 SIGRTMIN + 11 */
288
        SA_KILL,                                /* 45 SIGRTMIN + 12 */
289
        SA_KILL,                                /* 46 SIGRTMIN + 13 */
290
        SA_KILL,                                /* 47 SIGRTMIN + 14 */
291
        SA_KILL,                                /* 48 SIGRTMIN + 15 */
292
        SA_KILL,                                /* 49 SIGRTMIN + 16 */
293
        SA_KILL,                                /* 50 SIGRTMIN + 17 */
294
        SA_KILL,                                /* 51 SIGRTMIN + 18 */
295
        SA_KILL,                                /* 52 SIGRTMIN + 19 */
296
        SA_KILL,                                /* 53 SIGRTMIN + 20 */
297
        SA_KILL,                                /* 54 SIGRTMIN + 21 */
298
        SA_KILL,                                /* 55 SIGRTMIN + 22 */
299
        SA_KILL,                                /* 56 SIGRTMIN + 23 */
300
        SA_KILL,                                /* 57 SIGRTMIN + 24 */
301
        SA_KILL,                                /* 58 SIGRTMIN + 25 */
302
        SA_KILL,                                /* 59 SIGRTMIN + 26 */
303
        SA_KILL,                                /* 60 SIGRTMIN + 27 */
304
        SA_KILL,                                /* 61 SIGRTMIN + 28 */
305
        SA_KILL,                                /* 62 SIGRTMIN + 29 */
306
        SA_KILL,                                /* 63 SIGRTMIN + 30 */
307
};
308
#undef        SIGPROP
309
#else
310
extern const int sigprop[NSIG];
311
#endif        /* SIGPROP */
312
#endif        /* _KERNEL */
313
#endif        /* !_SYS_SIGNALVAR_H_ */