xref: /freebsd/sys/compat/linux/linux_signal.c (revision 19dde5cd3bfa1ac7b0980022c3a13c771f51d84d)
1c21dee17SSøren Schmidt /*-
2c21dee17SSøren Schmidt  * Copyright (c) 1994-1995 S�ren Schmidt
3c21dee17SSøren Schmidt  * All rights reserved.
4c21dee17SSøren Schmidt  *
5c21dee17SSøren Schmidt  * Redistribution and use in source and binary forms, with or without
6c21dee17SSøren Schmidt  * modification, are permitted provided that the following conditions
7c21dee17SSøren Schmidt  * are met:
8c21dee17SSøren Schmidt  * 1. Redistributions of source code must retain the above copyright
9c21dee17SSøren Schmidt  *    notice, this list of conditions and the following disclaimer
10c21dee17SSøren Schmidt  *    in this position and unchanged.
11c21dee17SSøren Schmidt  * 2. Redistributions in binary form must reproduce the above copyright
12c21dee17SSøren Schmidt  *    notice, this list of conditions and the following disclaimer in the
13c21dee17SSøren Schmidt  *    documentation and/or other materials provided with the distribution.
14c21dee17SSøren Schmidt  * 3. The name of the author may not be used to endorse or promote products
1521dc7d4fSJens Schweikhardt  *    derived from this software without specific prior written permission
16c21dee17SSøren Schmidt  *
17c21dee17SSøren Schmidt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18c21dee17SSøren Schmidt  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19c21dee17SSøren Schmidt  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20c21dee17SSøren Schmidt  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21c21dee17SSøren Schmidt  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22c21dee17SSøren Schmidt  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23c21dee17SSøren Schmidt  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24c21dee17SSøren Schmidt  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25c21dee17SSøren Schmidt  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26c21dee17SSøren Schmidt  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27c21dee17SSøren Schmidt  *
28c3aac50fSPeter Wemm  * $FreeBSD$
29c21dee17SSøren Schmidt  */
30c21dee17SSøren Schmidt 
31c21dee17SSøren Schmidt #include <sys/param.h>
32c21dee17SSøren Schmidt #include <sys/systm.h>
33fb919e4dSMark Murray #include <sys/lock.h>
34fb919e4dSMark Murray #include <sys/mutex.h>
35c21dee17SSøren Schmidt #include <sys/proc.h>
36c21dee17SSøren Schmidt #include <sys/signalvar.h>
37206a5d3aSIan Dowse #include <sys/syscallsubr.h>
38fb919e4dSMark Murray #include <sys/sysproto.h>
39c21dee17SSøren Schmidt 
40ba9ef45bSMarcel Moolenaar #include <machine/../linux/linux.h>
41ebea8660SMarcel Moolenaar #include <machine/../linux/linux_proto.h>
42ba9ef45bSMarcel Moolenaar #include <compat/linux/linux_signal.h>
43ba9ef45bSMarcel Moolenaar #include <compat/linux/linux_util.h>
44c21dee17SSøren Schmidt 
45ba9ef45bSMarcel Moolenaar void
465002a60fSMarcel Moolenaar linux_to_bsd_sigset(l_sigset_t *lss, sigset_t *bss)
47956d3333SMarcel Moolenaar {
48d66a5066SPeter Wemm 	int b, l;
49c21dee17SSøren Schmidt 
50956d3333SMarcel Moolenaar 	SIGEMPTYSET(*bss);
51956d3333SMarcel Moolenaar 	bss->__bits[0] = lss->__bits[0] & ~((1U << LINUX_SIGTBLSZ) - 1);
52956d3333SMarcel Moolenaar 	bss->__bits[1] = lss->__bits[1];
53956d3333SMarcel Moolenaar 	for (l = 1; l <= LINUX_SIGTBLSZ; l++) {
54956d3333SMarcel Moolenaar 		if (LINUX_SIGISMEMBER(*lss, l)) {
555231fb20SDavid E. O'Brien #ifdef __alpha__
565231fb20SDavid E. O'Brien 			b = _SIG_IDX(l);
575231fb20SDavid E. O'Brien #else
58956d3333SMarcel Moolenaar 			b = linux_to_bsd_signal[_SIG_IDX(l)];
595231fb20SDavid E. O'Brien #endif
60956d3333SMarcel Moolenaar 			if (b)
61956d3333SMarcel Moolenaar 				SIGADDSET(*bss, b);
62d66a5066SPeter Wemm 		}
63d66a5066SPeter Wemm 	}
64c21dee17SSøren Schmidt }
65c21dee17SSøren Schmidt 
6679363394SAndrew Gallatin void
675002a60fSMarcel Moolenaar bsd_to_linux_sigset(sigset_t *bss, l_sigset_t *lss)
68956d3333SMarcel Moolenaar {
69d66a5066SPeter Wemm 	int b, l;
70c21dee17SSøren Schmidt 
71956d3333SMarcel Moolenaar 	LINUX_SIGEMPTYSET(*lss);
72956d3333SMarcel Moolenaar 	lss->__bits[0] = bss->__bits[0] & ~((1U << LINUX_SIGTBLSZ) - 1);
73956d3333SMarcel Moolenaar 	lss->__bits[1] = bss->__bits[1];
74956d3333SMarcel Moolenaar 	for (b = 1; b <= LINUX_SIGTBLSZ; b++) {
75956d3333SMarcel Moolenaar 		if (SIGISMEMBER(*bss, b)) {
765231fb20SDavid E. O'Brien #if __alpha__
775231fb20SDavid E. O'Brien 			l = _SIG_IDX(b);
785231fb20SDavid E. O'Brien #else
79956d3333SMarcel Moolenaar 			l = bsd_to_linux_signal[_SIG_IDX(b)];
805231fb20SDavid E. O'Brien #endif
81956d3333SMarcel Moolenaar 			if (l)
82956d3333SMarcel Moolenaar 				LINUX_SIGADDSET(*lss, l);
83d66a5066SPeter Wemm 		}
84d66a5066SPeter Wemm 	}
85c21dee17SSøren Schmidt }
86c21dee17SSøren Schmidt 
87a1ebcbfbSPeter Wemm static void
885002a60fSMarcel Moolenaar linux_to_bsd_sigaction(l_sigaction_t *lsa, struct sigaction *bsa)
89d66a5066SPeter Wemm {
90956d3333SMarcel Moolenaar 
91956d3333SMarcel Moolenaar 	linux_to_bsd_sigset(&lsa->lsa_mask, &bsa->sa_mask);
928f437f44SMartin Cracauer 	bsa->sa_handler = lsa->lsa_handler;
93d66a5066SPeter Wemm 	bsa->sa_flags = 0;
948f437f44SMartin Cracauer 	if (lsa->lsa_flags & LINUX_SA_NOCLDSTOP)
95d66a5066SPeter Wemm 		bsa->sa_flags |= SA_NOCLDSTOP;
9606ebbe77SMarcel Moolenaar 	if (lsa->lsa_flags & LINUX_SA_NOCLDWAIT)
9706ebbe77SMarcel Moolenaar 		bsa->sa_flags |= SA_NOCLDWAIT;
9806ebbe77SMarcel Moolenaar 	if (lsa->lsa_flags & LINUX_SA_SIGINFO)
9906ebbe77SMarcel Moolenaar 		bsa->sa_flags |= SA_SIGINFO;
1008f437f44SMartin Cracauer 	if (lsa->lsa_flags & LINUX_SA_ONSTACK)
101d66a5066SPeter Wemm 		bsa->sa_flags |= SA_ONSTACK;
1028f437f44SMartin Cracauer 	if (lsa->lsa_flags & LINUX_SA_RESTART)
103d66a5066SPeter Wemm 		bsa->sa_flags |= SA_RESTART;
1048f437f44SMartin Cracauer 	if (lsa->lsa_flags & LINUX_SA_ONESHOT)
105d66a5066SPeter Wemm 		bsa->sa_flags |= SA_RESETHAND;
1068f437f44SMartin Cracauer 	if (lsa->lsa_flags & LINUX_SA_NOMASK)
107d66a5066SPeter Wemm 		bsa->sa_flags |= SA_NODEFER;
108d66a5066SPeter Wemm }
109d66a5066SPeter Wemm 
110a1ebcbfbSPeter Wemm static void
1115002a60fSMarcel Moolenaar bsd_to_linux_sigaction(struct sigaction *bsa, l_sigaction_t *lsa)
112d66a5066SPeter Wemm {
113956d3333SMarcel Moolenaar 
114956d3333SMarcel Moolenaar 	bsd_to_linux_sigset(&bsa->sa_mask, &lsa->lsa_mask);
1158f437f44SMartin Cracauer 	lsa->lsa_handler = bsa->sa_handler;
1168f437f44SMartin Cracauer 	lsa->lsa_restorer = NULL;	/* unsupported */
1178f437f44SMartin Cracauer 	lsa->lsa_flags = 0;
118d66a5066SPeter Wemm 	if (bsa->sa_flags & SA_NOCLDSTOP)
1198f437f44SMartin Cracauer 		lsa->lsa_flags |= LINUX_SA_NOCLDSTOP;
12006ebbe77SMarcel Moolenaar 	if (bsa->sa_flags & SA_NOCLDWAIT)
12106ebbe77SMarcel Moolenaar 		lsa->lsa_flags |= LINUX_SA_NOCLDWAIT;
12206ebbe77SMarcel Moolenaar 	if (bsa->sa_flags & SA_SIGINFO)
12306ebbe77SMarcel Moolenaar 		lsa->lsa_flags |= LINUX_SA_SIGINFO;
124d66a5066SPeter Wemm 	if (bsa->sa_flags & SA_ONSTACK)
1258f437f44SMartin Cracauer 		lsa->lsa_flags |= LINUX_SA_ONSTACK;
126d66a5066SPeter Wemm 	if (bsa->sa_flags & SA_RESTART)
1278f437f44SMartin Cracauer 		lsa->lsa_flags |= LINUX_SA_RESTART;
128d66a5066SPeter Wemm 	if (bsa->sa_flags & SA_RESETHAND)
1298f437f44SMartin Cracauer 		lsa->lsa_flags |= LINUX_SA_ONESHOT;
130d66a5066SPeter Wemm 	if (bsa->sa_flags & SA_NODEFER)
1318f437f44SMartin Cracauer 		lsa->lsa_flags |= LINUX_SA_NOMASK;
132d66a5066SPeter Wemm }
133c21dee17SSøren Schmidt 
134ba9ef45bSMarcel Moolenaar int
135b40ce416SJulian Elischer linux_do_sigaction(struct thread *td, int linux_sig, l_sigaction_t *linux_nsa,
1365002a60fSMarcel Moolenaar 		   l_sigaction_t *linux_osa)
13706ebbe77SMarcel Moolenaar {
138206a5d3aSIan Dowse 	struct sigaction act, oact, *nsa, *osa;
139206a5d3aSIan Dowse 	int error, sig;
14006ebbe77SMarcel Moolenaar 
141956d3333SMarcel Moolenaar 	if (linux_sig <= 0 || linux_sig > LINUX_NSIG)
142956d3333SMarcel Moolenaar 		return (EINVAL);
14306ebbe77SMarcel Moolenaar 
144206a5d3aSIan Dowse 	osa = (linux_osa != NULL) ? &oact : NULL;
145956d3333SMarcel Moolenaar 	if (linux_nsa != NULL) {
146206a5d3aSIan Dowse 		nsa = &act;
147ec99e322SMarcel Moolenaar 		linux_to_bsd_sigaction(linux_nsa, nsa);
148206a5d3aSIan Dowse 	} else
14906ebbe77SMarcel Moolenaar 		nsa = NULL;
15006ebbe77SMarcel Moolenaar 
1515231fb20SDavid E. O'Brien #ifndef __alpha__
152956d3333SMarcel Moolenaar 	if (linux_sig <= LINUX_SIGTBLSZ)
153206a5d3aSIan Dowse 		sig = linux_to_bsd_signal[_SIG_IDX(linux_sig)];
154956d3333SMarcel Moolenaar 	else
1555231fb20SDavid E. O'Brien #endif
156206a5d3aSIan Dowse 		sig = linux_sig;
157956d3333SMarcel Moolenaar 
158206a5d3aSIan Dowse 	error = kern_sigaction(td, sig, nsa, osa, 0);
15906ebbe77SMarcel Moolenaar 	if (error)
160956d3333SMarcel Moolenaar 		return (error);
16106ebbe77SMarcel Moolenaar 
162ec99e322SMarcel Moolenaar 	if (linux_osa != NULL)
163ec99e322SMarcel Moolenaar 		bsd_to_linux_sigaction(osa, linux_osa);
16406ebbe77SMarcel Moolenaar 
165956d3333SMarcel Moolenaar 	return (0);
16606ebbe77SMarcel Moolenaar }
16706ebbe77SMarcel Moolenaar 
1685231fb20SDavid E. O'Brien 
1695231fb20SDavid E. O'Brien #ifndef __alpha__
170c21dee17SSøren Schmidt int
171b40ce416SJulian Elischer linux_signal(struct thread *td, struct linux_signal_args *args)
172d66a5066SPeter Wemm {
1735002a60fSMarcel Moolenaar 	l_sigaction_t nsa, osa;
174d66a5066SPeter Wemm 	int error;
175d66a5066SPeter Wemm 
176d66a5066SPeter Wemm #ifdef DEBUG
17724593369SJonathan Lemon 	if (ldebug(signal))
17824593369SJonathan Lemon 		printf(ARGS(signal, "%d, %p"),
17924593369SJonathan Lemon 		    args->sig, (void *)args->handler);
180d66a5066SPeter Wemm #endif
181d66a5066SPeter Wemm 
18206ebbe77SMarcel Moolenaar 	nsa.lsa_handler = args->handler;
18306ebbe77SMarcel Moolenaar 	nsa.lsa_flags = LINUX_SA_ONESHOT | LINUX_SA_NOMASK;
184956d3333SMarcel Moolenaar 	LINUX_SIGEMPTYSET(nsa.lsa_mask);
185d66a5066SPeter Wemm 
186b40ce416SJulian Elischer 	error = linux_do_sigaction(td, args->sig, &nsa, &osa);
187b40ce416SJulian Elischer 	td->td_retval[0] = (int)osa.lsa_handler;
188d66a5066SPeter Wemm 
189956d3333SMarcel Moolenaar 	return (error);
190d66a5066SPeter Wemm }
1915231fb20SDavid E. O'Brien #endif	/*!__alpha__*/
192d66a5066SPeter Wemm 
193c21dee17SSøren Schmidt int
194b40ce416SJulian Elischer linux_rt_sigaction(struct thread *td, struct linux_rt_sigaction_args *args)
195c21dee17SSøren Schmidt {
1965002a60fSMarcel Moolenaar 	l_sigaction_t nsa, osa;
19706ebbe77SMarcel Moolenaar 	int error;
198c21dee17SSøren Schmidt 
199c21dee17SSøren Schmidt #ifdef DEBUG
20024593369SJonathan Lemon 	if (ldebug(rt_sigaction))
20124593369SJonathan Lemon 		printf(ARGS(rt_sigaction, "%ld, %p, %p, %ld"),
20224593369SJonathan Lemon 		    (long)args->sig, (void *)args->act,
2035231fb20SDavid E. O'Brien 		    (void *)args->oact, (long)args->sigsetsize);
204c21dee17SSøren Schmidt #endif
205d66a5066SPeter Wemm 
2065002a60fSMarcel Moolenaar 	if (args->sigsetsize != sizeof(l_sigset_t))
207956d3333SMarcel Moolenaar 		return (EINVAL);
20806ebbe77SMarcel Moolenaar 
209956d3333SMarcel Moolenaar 	if (args->act != NULL) {
2105002a60fSMarcel Moolenaar 		error = copyin(args->act, &nsa, sizeof(l_sigaction_t));
21106ebbe77SMarcel Moolenaar 		if (error)
212956d3333SMarcel Moolenaar 			return (error);
21306ebbe77SMarcel Moolenaar 	}
21406ebbe77SMarcel Moolenaar 
215b40ce416SJulian Elischer 	error = linux_do_sigaction(td, args->sig,
21606ebbe77SMarcel Moolenaar 				   args->act ? &nsa : NULL,
21706ebbe77SMarcel Moolenaar 				   args->oact ? &osa : NULL);
21806ebbe77SMarcel Moolenaar 
219956d3333SMarcel Moolenaar 	if (args->oact != NULL && !error) {
2205002a60fSMarcel Moolenaar 		error = copyout(&osa, args->oact, sizeof(l_sigaction_t));
22106ebbe77SMarcel Moolenaar 	}
22206ebbe77SMarcel Moolenaar 
223956d3333SMarcel Moolenaar 	return (error);
22406ebbe77SMarcel Moolenaar }
22506ebbe77SMarcel Moolenaar 
22606ebbe77SMarcel Moolenaar static int
227b40ce416SJulian Elischer linux_do_sigprocmask(struct thread *td, int how, l_sigset_t *new,
2285002a60fSMarcel Moolenaar 		     l_sigset_t *old)
22906ebbe77SMarcel Moolenaar {
230fe8cdcaeSJohn Baldwin 	sigset_t omask, nmask;
231fe8cdcaeSJohn Baldwin 	sigset_t *nmaskp;
232216af822SJohn Baldwin 	int error;
23306ebbe77SMarcel Moolenaar 
234b40ce416SJulian Elischer 	td->td_retval[0] = 0;
235d66a5066SPeter Wemm 
23619dde5cdSJohn Baldwin 	switch (how) {
23719dde5cdSJohn Baldwin 	case LINUX_SIG_BLOCK:
23819dde5cdSJohn Baldwin 		how = SIG_BLOCK;
23919dde5cdSJohn Baldwin 		break;
24019dde5cdSJohn Baldwin 	case LINUX_SIG_UNBLOCK:
24119dde5cdSJohn Baldwin 		how = SIG_UNBLOCK;
24219dde5cdSJohn Baldwin 		break;
24319dde5cdSJohn Baldwin 	case LINUX_SIG_SETMASK:
24419dde5cdSJohn Baldwin 		how = SIG_SETMASK;
24519dde5cdSJohn Baldwin 		break;
24619dde5cdSJohn Baldwin 	default:
24719dde5cdSJohn Baldwin 		return (EINVAL);
24819dde5cdSJohn Baldwin 	}
24906ebbe77SMarcel Moolenaar 	if (new != NULL) {
250fe8cdcaeSJohn Baldwin 		linux_to_bsd_sigset(new, &nmask);
251fe8cdcaeSJohn Baldwin 		nmaskp = &nmask;
252fe8cdcaeSJohn Baldwin 	} else
253fe8cdcaeSJohn Baldwin 		nmaskp = NULL;
25419dde5cdSJohn Baldwin 	error = kern_sigprocmask(td, how, nmaskp, &omask, 0);
255fe8cdcaeSJohn Baldwin 	if (error != 0 && old != NULL)
256fe8cdcaeSJohn Baldwin 		bsd_to_linux_sigset(&omask, old);
25706ebbe77SMarcel Moolenaar 
258956d3333SMarcel Moolenaar 	return (error);
25906ebbe77SMarcel Moolenaar }
26006ebbe77SMarcel Moolenaar 
2615231fb20SDavid E. O'Brien #ifndef __alpha__
26206ebbe77SMarcel Moolenaar int
263b40ce416SJulian Elischer linux_sigprocmask(struct thread *td, struct linux_sigprocmask_args *args)
26406ebbe77SMarcel Moolenaar {
2655002a60fSMarcel Moolenaar 	l_osigset_t mask;
2665002a60fSMarcel Moolenaar 	l_sigset_t set, oset;
26706ebbe77SMarcel Moolenaar 	int error;
26806ebbe77SMarcel Moolenaar 
26906ebbe77SMarcel Moolenaar #ifdef DEBUG
27024593369SJonathan Lemon 	if (ldebug(sigprocmask))
27124593369SJonathan Lemon 		printf(ARGS(sigprocmask, "%d, *, *"), args->how);
27206ebbe77SMarcel Moolenaar #endif
27306ebbe77SMarcel Moolenaar 
27406ebbe77SMarcel Moolenaar 	if (args->mask != NULL) {
2755002a60fSMarcel Moolenaar 		error = copyin(args->mask, &mask, sizeof(l_osigset_t));
27606ebbe77SMarcel Moolenaar 		if (error)
277956d3333SMarcel Moolenaar 			return (error);
278956d3333SMarcel Moolenaar 		LINUX_SIGEMPTYSET(set);
279956d3333SMarcel Moolenaar 		set.__bits[0] = mask;
28006ebbe77SMarcel Moolenaar 	}
28106ebbe77SMarcel Moolenaar 
282b40ce416SJulian Elischer 	error = linux_do_sigprocmask(td, args->how,
283956d3333SMarcel Moolenaar 				     args->mask ? &set : NULL,
284956d3333SMarcel Moolenaar 				     args->omask ? &oset : NULL);
28506ebbe77SMarcel Moolenaar 
286956d3333SMarcel Moolenaar 	if (args->omask != NULL && !error) {
287956d3333SMarcel Moolenaar 		mask = oset.__bits[0];
2885002a60fSMarcel Moolenaar 		error = copyout(&mask, args->omask, sizeof(l_osigset_t));
28906ebbe77SMarcel Moolenaar 	}
29006ebbe77SMarcel Moolenaar 
291956d3333SMarcel Moolenaar 	return (error);
29206ebbe77SMarcel Moolenaar }
2935231fb20SDavid E. O'Brien #endif	/*!__alpha__*/
29406ebbe77SMarcel Moolenaar 
29506ebbe77SMarcel Moolenaar int
296b40ce416SJulian Elischer linux_rt_sigprocmask(struct thread *td, struct linux_rt_sigprocmask_args *args)
29706ebbe77SMarcel Moolenaar {
2985002a60fSMarcel Moolenaar 	l_sigset_t set, oset;
29906ebbe77SMarcel Moolenaar 	int error;
30006ebbe77SMarcel Moolenaar 
30106ebbe77SMarcel Moolenaar #ifdef DEBUG
30224593369SJonathan Lemon 	if (ldebug(rt_sigprocmask))
30324593369SJonathan Lemon 		printf(ARGS(rt_sigprocmask, "%d, %p, %p, %ld"),
30424593369SJonathan Lemon 		    args->how, (void *)args->mask,
3055231fb20SDavid E. O'Brien 		    (void *)args->omask, (long)args->sigsetsize);
30606ebbe77SMarcel Moolenaar #endif
30706ebbe77SMarcel Moolenaar 
3085002a60fSMarcel Moolenaar 	if (args->sigsetsize != sizeof(l_sigset_t))
30906ebbe77SMarcel Moolenaar 		return EINVAL;
31006ebbe77SMarcel Moolenaar 
31106ebbe77SMarcel Moolenaar 	if (args->mask != NULL) {
3125002a60fSMarcel Moolenaar 		error = copyin(args->mask, &set, sizeof(l_sigset_t));
31306ebbe77SMarcel Moolenaar 		if (error)
314956d3333SMarcel Moolenaar 			return (error);
31506ebbe77SMarcel Moolenaar 	}
31606ebbe77SMarcel Moolenaar 
317b40ce416SJulian Elischer 	error = linux_do_sigprocmask(td, args->how,
318956d3333SMarcel Moolenaar 				     args->mask ? &set : NULL,
319956d3333SMarcel Moolenaar 				     args->omask ? &oset : NULL);
32006ebbe77SMarcel Moolenaar 
321956d3333SMarcel Moolenaar 	if (args->omask != NULL && !error) {
3225002a60fSMarcel Moolenaar 		error = copyout(&oset, args->omask, sizeof(l_sigset_t));
32306ebbe77SMarcel Moolenaar 	}
32406ebbe77SMarcel Moolenaar 
325956d3333SMarcel Moolenaar 	return (error);
326c21dee17SSøren Schmidt }
327c21dee17SSøren Schmidt 
3285231fb20SDavid E. O'Brien #ifndef __alpha__
329c21dee17SSøren Schmidt int
330b40ce416SJulian Elischer linux_sgetmask(struct thread *td, struct linux_sgetmask_args *args)
331c21dee17SSøren Schmidt {
332b40ce416SJulian Elischer 	struct proc *p = td->td_proc;
3335002a60fSMarcel Moolenaar 	l_sigset_t mask;
334956d3333SMarcel Moolenaar 
335c21dee17SSøren Schmidt #ifdef DEBUG
3365002a60fSMarcel Moolenaar 	if (ldebug(sgetmask))
3375002a60fSMarcel Moolenaar 		printf(ARGS(sgetmask, ""));
338c21dee17SSøren Schmidt #endif
339956d3333SMarcel Moolenaar 
340216af822SJohn Baldwin 	PROC_LOCK(p);
3414093529dSJeff Roberson 	bsd_to_linux_sigset(&td->td_sigmask, &mask);
342216af822SJohn Baldwin 	PROC_UNLOCK(p);
343b40ce416SJulian Elischer 	td->td_retval[0] = mask.__bits[0];
344956d3333SMarcel Moolenaar 	return (0);
345c21dee17SSøren Schmidt }
346c21dee17SSøren Schmidt 
347c21dee17SSøren Schmidt int
348b40ce416SJulian Elischer linux_ssetmask(struct thread *td, struct linux_ssetmask_args *args)
349c21dee17SSøren Schmidt {
350b40ce416SJulian Elischer 	struct proc *p = td->td_proc;
3515002a60fSMarcel Moolenaar 	l_sigset_t lset;
352956d3333SMarcel Moolenaar 	sigset_t bset;
353c21dee17SSøren Schmidt 
354c21dee17SSøren Schmidt #ifdef DEBUG
3555002a60fSMarcel Moolenaar 	if (ldebug(ssetmask))
3565002a60fSMarcel Moolenaar 		printf(ARGS(ssetmask, "%08lx"), (unsigned long)args->mask);
357c21dee17SSøren Schmidt #endif
358d66a5066SPeter Wemm 
359216af822SJohn Baldwin 	PROC_LOCK(p);
3604093529dSJeff Roberson 	bsd_to_linux_sigset(&td->td_sigmask, &lset);
361b40ce416SJulian Elischer 	td->td_retval[0] = lset.__bits[0];
362956d3333SMarcel Moolenaar 	LINUX_SIGEMPTYSET(lset);
363956d3333SMarcel Moolenaar 	lset.__bits[0] = args->mask;
364956d3333SMarcel Moolenaar 	linux_to_bsd_sigset(&lset, &bset);
3654093529dSJeff Roberson 	td->td_sigmask = bset;
3664093529dSJeff Roberson 	SIG_CANTMASK(td->td_sigmask);
3674093529dSJeff Roberson 	signotify(td);
368216af822SJohn Baldwin 	PROC_UNLOCK(p);
369956d3333SMarcel Moolenaar 	return (0);
370c21dee17SSøren Schmidt }
371c21dee17SSøren Schmidt 
3725d58e285STim J. Robbins /*
3735d58e285STim J. Robbins  * MPSAFE
3745d58e285STim J. Robbins  */
375c21dee17SSøren Schmidt int
376b40ce416SJulian Elischer linux_sigpending(struct thread *td, struct linux_sigpending_args *args)
377c21dee17SSøren Schmidt {
378b40ce416SJulian Elischer 	struct proc *p = td->td_proc;
379956d3333SMarcel Moolenaar 	sigset_t bset;
3805002a60fSMarcel Moolenaar 	l_sigset_t lset;
3815002a60fSMarcel Moolenaar 	l_osigset_t mask;
382c21dee17SSøren Schmidt 
383c21dee17SSøren Schmidt #ifdef DEBUG
38424593369SJonathan Lemon 	if (ldebug(sigpending))
38524593369SJonathan Lemon 		printf(ARGS(sigpending, "*"));
386c21dee17SSøren Schmidt #endif
387956d3333SMarcel Moolenaar 
388216af822SJohn Baldwin 	PROC_LOCK(p);
3891d9c5696SJuli Mallett 	bset = p->p_siglist;
3904093529dSJeff Roberson 	SIGSETOR(bset, td->td_siglist);
3914093529dSJeff Roberson 	SIGSETAND(bset, td->td_sigmask);
392216af822SJohn Baldwin 	PROC_UNLOCK(p);
3939d8643ecSJohn Baldwin 	bsd_to_linux_sigset(&bset, &lset);
394956d3333SMarcel Moolenaar 	mask = lset.__bits[0];
395956d3333SMarcel Moolenaar 	return (copyout(&mask, args->mask, sizeof(mask)));
396c21dee17SSøren Schmidt }
3975231fb20SDavid E. O'Brien #endif	/*!__alpha__*/
398c21dee17SSøren Schmidt 
399c21dee17SSøren Schmidt int
400b40ce416SJulian Elischer linux_kill(struct thread *td, struct linux_kill_args *args)
401c21dee17SSøren Schmidt {
402ef04503dSPeter Wemm 	struct kill_args /* {
403c21dee17SSøren Schmidt 	    int pid;
404c21dee17SSøren Schmidt 	    int signum;
405ef04503dSPeter Wemm 	} */ tmp;
406c21dee17SSøren Schmidt 
407c21dee17SSøren Schmidt #ifdef DEBUG
40824593369SJonathan Lemon 	if (ldebug(kill))
40924593369SJonathan Lemon 		printf(ARGS(kill, "%d, %d"), args->pid, args->signum);
410c21dee17SSøren Schmidt #endif
411956d3333SMarcel Moolenaar 
412956d3333SMarcel Moolenaar 	/*
413956d3333SMarcel Moolenaar 	 * Allow signal 0 as a means to check for privileges
414956d3333SMarcel Moolenaar 	 */
415956d3333SMarcel Moolenaar 	if (args->signum < 0 || args->signum > LINUX_NSIG)
4162116e6abSJohn Polstra 		return EINVAL;
417956d3333SMarcel Moolenaar 
4185231fb20SDavid E. O'Brien #ifndef __alpha__
419956d3333SMarcel Moolenaar 	if (args->signum > 0 && args->signum <= LINUX_SIGTBLSZ)
420956d3333SMarcel Moolenaar 		tmp.signum = linux_to_bsd_signal[_SIG_IDX(args->signum)];
421956d3333SMarcel Moolenaar 	else
4225231fb20SDavid E. O'Brien #endif
423956d3333SMarcel Moolenaar 		tmp.signum = args->signum;
424956d3333SMarcel Moolenaar 
425c21dee17SSøren Schmidt 	tmp.pid = args->pid;
426b40ce416SJulian Elischer 	return (kill(td, &tmp));
427c21dee17SSøren Schmidt }
428