signals.c revision 1.2.4.3 1 1.2.4.3 rmind /* $NetBSD: signals.c,v 1.2.4.3 2010/07/03 01:20:02 rmind Exp $ */
2 1.2.4.2 rmind
3 1.2.4.2 rmind /*
4 1.2.4.2 rmind * Copyright (c) 2010 Antti Kantee. All Rights Reserved.
5 1.2.4.2 rmind *
6 1.2.4.2 rmind * Redistribution and use in source and binary forms, with or without
7 1.2.4.2 rmind * modification, are permitted provided that the following conditions
8 1.2.4.2 rmind * are met:
9 1.2.4.2 rmind * 1. Redistributions of source code must retain the above copyright
10 1.2.4.2 rmind * notice, this list of conditions and the following disclaimer.
11 1.2.4.2 rmind * 2. Redistributions in binary form must reproduce the above copyright
12 1.2.4.2 rmind * notice, this list of conditions and the following disclaimer in the
13 1.2.4.2 rmind * documentation and/or other materials provided with the distribution.
14 1.2.4.2 rmind *
15 1.2.4.2 rmind * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
16 1.2.4.2 rmind * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 1.2.4.2 rmind * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 1.2.4.2 rmind * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 1.2.4.2 rmind * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 1.2.4.2 rmind * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 1.2.4.2 rmind * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 1.2.4.2 rmind * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 1.2.4.2 rmind * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 1.2.4.2 rmind * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 1.2.4.2 rmind * SUCH DAMAGE.
26 1.2.4.2 rmind */
27 1.2.4.2 rmind
28 1.2.4.2 rmind #include <sys/cdefs.h>
29 1.2.4.3 rmind __KERNEL_RCSID(0, "$NetBSD: signals.c,v 1.2.4.3 2010/07/03 01:20:02 rmind Exp $");
30 1.2.4.2 rmind
31 1.2.4.2 rmind #include <sys/param.h>
32 1.2.4.2 rmind #include <sys/atomic.h>
33 1.2.4.2 rmind #include <sys/event.h>
34 1.2.4.2 rmind #include <sys/proc.h>
35 1.2.4.2 rmind #include <sys/signal.h>
36 1.2.4.2 rmind
37 1.2.4.2 rmind #include <rump/rump.h>
38 1.2.4.2 rmind #include <rump/rumpuser.h>
39 1.2.4.2 rmind
40 1.2.4.2 rmind #include "rumpkern_if_priv.h"
41 1.2.4.2 rmind
42 1.2.4.2 rmind const struct filterops sig_filtops;
43 1.2.4.2 rmind sigset_t sigcantmask;
44 1.2.4.2 rmind
45 1.2.4.2 rmind /* RUMP_SIGMODEL_PANIC */
46 1.2.4.2 rmind
47 1.2.4.2 rmind static void
48 1.2.4.2 rmind rumpsig_panic(pid_t target, int signo)
49 1.2.4.2 rmind {
50 1.2.4.2 rmind
51 1.2.4.2 rmind switch (signo) {
52 1.2.4.2 rmind case SIGSYS:
53 1.2.4.2 rmind break;
54 1.2.4.2 rmind default:
55 1.2.4.2 rmind panic("unhandled signal %d", signo);
56 1.2.4.2 rmind }
57 1.2.4.2 rmind }
58 1.2.4.2 rmind
59 1.2.4.2 rmind /* RUMP_SIGMODEL_IGNORE */
60 1.2.4.2 rmind
61 1.2.4.2 rmind static void
62 1.2.4.2 rmind rumpsig_ignore(pid_t target, int signo)
63 1.2.4.2 rmind {
64 1.2.4.2 rmind
65 1.2.4.2 rmind return;
66 1.2.4.2 rmind }
67 1.2.4.2 rmind
68 1.2.4.2 rmind /* RUMP_SIGMODEL_HOST */
69 1.2.4.2 rmind
70 1.2.4.2 rmind static void
71 1.2.4.2 rmind rumpsig_host(pid_t target, int signo)
72 1.2.4.2 rmind {
73 1.2.4.2 rmind int error;
74 1.2.4.2 rmind
75 1.2.4.2 rmind rumpuser_kill(target, signo, &error);
76 1.2.4.2 rmind }
77 1.2.4.2 rmind
78 1.2.4.2 rmind /* RUMP_SIGMODEL_RAISE */
79 1.2.4.2 rmind
80 1.2.4.2 rmind static void
81 1.2.4.2 rmind rumpsig_raise(pid_t target, int signo)
82 1.2.4.2 rmind {
83 1.2.4.2 rmind int error;
84 1.2.4.2 rmind
85 1.2.4.2 rmind rumpuser_kill(RUMPUSER_PID_SELF, signo, &error);
86 1.2.4.2 rmind }
87 1.2.4.2 rmind
88 1.2.4.2 rmind typedef void (*rumpsig_fn)(pid_t pid, int sig);
89 1.2.4.2 rmind
90 1.2.4.2 rmind rumpsig_fn rumpsig = rumpsig_panic;
91 1.2.4.2 rmind
92 1.2.4.2 rmind /*
93 1.2.4.2 rmind * Set signal delivery model. It would be nice if we could
94 1.2.4.2 rmind * take a functional argument. But then we'd need some
95 1.2.4.2 rmind * OS independent way to represent a signal number and also
96 1.2.4.2 rmind * a method for easy processing (parsing is boring).
97 1.2.4.2 rmind *
98 1.2.4.2 rmind * Plus, upcalls from the rump kernel into process space except
99 1.2.4.2 rmind * via rumpuser is a somewhat gray area now.
100 1.2.4.2 rmind */
101 1.2.4.2 rmind void
102 1.2.4.2 rmind rump_boot_setsigmodel(enum rump_sigmodel model)
103 1.2.4.2 rmind {
104 1.2.4.2 rmind
105 1.2.4.2 rmind switch (model) {
106 1.2.4.2 rmind case RUMP_SIGMODEL_PANIC:
107 1.2.4.2 rmind atomic_swap_ptr(&rumpsig, rumpsig_panic);
108 1.2.4.2 rmind break;
109 1.2.4.2 rmind case RUMP_SIGMODEL_IGNORE:
110 1.2.4.2 rmind atomic_swap_ptr(&rumpsig, rumpsig_ignore);
111 1.2.4.2 rmind break;
112 1.2.4.2 rmind case RUMP_SIGMODEL_HOST:
113 1.2.4.2 rmind atomic_swap_ptr(&rumpsig, rumpsig_host);
114 1.2.4.2 rmind break;
115 1.2.4.2 rmind case RUMP_SIGMODEL_RAISE:
116 1.2.4.2 rmind atomic_swap_ptr(&rumpsig, rumpsig_raise);
117 1.2.4.2 rmind break;
118 1.2.4.2 rmind }
119 1.2.4.2 rmind }
120 1.2.4.2 rmind
121 1.2.4.2 rmind void
122 1.2.4.2 rmind psignal(struct proc *p, int sig)
123 1.2.4.2 rmind {
124 1.2.4.2 rmind
125 1.2.4.2 rmind rumpsig(p->p_pid, sig);
126 1.2.4.2 rmind }
127 1.2.4.2 rmind
128 1.2.4.2 rmind void
129 1.2.4.2 rmind pgsignal(struct pgrp *pgrp, int sig, int checktty)
130 1.2.4.2 rmind {
131 1.2.4.2 rmind
132 1.2.4.2 rmind rumpsig(-pgrp->pg_id, sig);
133 1.2.4.2 rmind }
134 1.2.4.2 rmind
135 1.2.4.2 rmind void
136 1.2.4.2 rmind kpsignal(struct proc *p, ksiginfo_t *ksi, void *data)
137 1.2.4.2 rmind {
138 1.2.4.2 rmind
139 1.2.4.2 rmind rumpsig(p->p_pid, ksi->ksi_signo);
140 1.2.4.2 rmind }
141 1.2.4.2 rmind
142 1.2.4.2 rmind void
143 1.2.4.2 rmind kpgsignal(struct pgrp *pgrp, ksiginfo_t *ksi, void *data, int checkctty)
144 1.2.4.2 rmind {
145 1.2.4.2 rmind
146 1.2.4.2 rmind rumpsig(-pgrp->pg_id, ksi->ksi_signo);
147 1.2.4.2 rmind }
148 1.2.4.2 rmind
149 1.2.4.2 rmind int
150 1.2.4.2 rmind sigispending(struct lwp *l, int signo)
151 1.2.4.2 rmind {
152 1.2.4.2 rmind
153 1.2.4.2 rmind return 0;
154 1.2.4.2 rmind }
155 1.2.4.2 rmind
156 1.2.4.2 rmind void
157 1.2.4.2 rmind sigpending1(struct lwp *l, sigset_t *ss)
158 1.2.4.2 rmind {
159 1.2.4.2 rmind
160 1.2.4.2 rmind sigemptyset(ss);
161 1.2.4.2 rmind }
162 1.2.4.2 rmind
163 1.2.4.2 rmind int
164 1.2.4.2 rmind sigismasked(struct lwp *l, int sig)
165 1.2.4.2 rmind {
166 1.2.4.2 rmind
167 1.2.4.2 rmind return 0;
168 1.2.4.2 rmind }
169 1.2.4.2 rmind
170 1.2.4.2 rmind void
171 1.2.4.2 rmind sigclearall(struct proc *p, const sigset_t *mask, ksiginfoq_t *kq)
172 1.2.4.2 rmind {
173 1.2.4.2 rmind
174 1.2.4.2 rmind /* nada */
175 1.2.4.2 rmind }
176 1.2.4.2 rmind
177 1.2.4.2 rmind void
178 1.2.4.2 rmind ksiginfo_queue_drain0(ksiginfoq_t *kq)
179 1.2.4.2 rmind {
180 1.2.4.2 rmind
181 1.2.4.2 rmind if (!(CIRCLEQ_EMPTY(kq)))
182 1.2.4.2 rmind panic("how did that get there?");
183 1.2.4.2 rmind }
184 1.2.4.3 rmind
185 1.2.4.3 rmind void
186 1.2.4.3 rmind siginit(struct proc *p)
187 1.2.4.3 rmind {
188 1.2.4.3 rmind
189 1.2.4.3 rmind /* nada (?) */
190 1.2.4.3 rmind }
191