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