ibcs2_signal.c revision 92761
111397Sswallace/*
211397Sswallace * Copyright (c) 1995 Scott Bartram
311605Sswallace * Copyright (c) 1995 Steven Wallace
43584Ssos * All rights reserved.
53584Ssos *
63584Ssos * Redistribution and use in source and binary forms, with or without
73584Ssos * modification, are permitted provided that the following conditions
83584Ssos * are met:
93584Ssos * 1. Redistributions of source code must retain the above copyright
1011397Sswallace *    notice, this list of conditions and the following disclaimer.
113584Ssos * 2. Redistributions in binary form must reproduce the above copyright
123584Ssos *    notice, this list of conditions and the following disclaimer in the
133584Ssos *    documentation and/or other materials provided with the distribution.
1411397Sswallace * 3. The name of the author may not be used to endorse or promote products
1511397Sswallace *    derived from this software without specific prior written permission
163584Ssos *
1711397Sswallace * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1811397Sswallace * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1911397Sswallace * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2011397Sswallace * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2111397Sswallace * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2211397Sswallace * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2311397Sswallace * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2411397Sswallace * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2511397Sswallace * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2611397Sswallace * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711574Sswallace *
2850477Speter * $FreeBSD: head/sys/i386/ibcs2/ibcs2_signal.c 92761 2002-03-20 05:48:58Z alfred $
293584Ssos */
303584Ssos
313584Ssos#include <sys/param.h>
323584Ssos#include <sys/systm.h>
3376166Smarkm#include <sys/lock.h>
3476166Smarkm#include <sys/mutex.h>
353584Ssos#include <sys/signalvar.h>
3611397Sswallace#include <sys/sysproto.h>
373584Ssos
3811397Sswallace#include <i386/ibcs2/ibcs2_types.h>
3911397Sswallace#include <i386/ibcs2/ibcs2_signal.h>
4011397Sswallace#include <i386/ibcs2/ibcs2_proto.h>
4111397Sswallace#include <i386/ibcs2/ibcs2_xenix.h>
4211397Sswallace#include <i386/ibcs2/ibcs2_util.h>
433584Ssos
4451793Smarcel#define sigemptyset(s)		SIGEMPTYSET(*(s))
4551793Smarcel#define sigismember(s, n)	SIGISMEMBER(*(s), n)
4651793Smarcel#define sigaddset(s, n)		SIGADDSET(*(s), n)
473584Ssos
4811397Sswallace#define	ibcs2_sigmask(n)	(1 << ((n) - 1))
4911397Sswallace#define ibcs2_sigemptyset(s)	bzero((s), sizeof(*(s)))
5011397Sswallace#define ibcs2_sigismember(s, n)	(*(s) & ibcs2_sigmask(n))
5111397Sswallace#define ibcs2_sigaddset(s, n)	(*(s) |= ibcs2_sigmask(n))
523584Ssos
5392761Salfredstatic void ibcs2_to_bsd_sigset(const ibcs2_sigset_t *, sigset_t *);
5492761Salfredstatic void bsd_to_ibcs2_sigset(const sigset_t *, ibcs2_sigset_t *);
5592761Salfredstatic void ibcs2_to_bsd_sigaction(struct ibcs2_sigaction *,
5692761Salfred					struct sigaction *);
5792761Salfredstatic void bsd_to_ibcs2_sigaction(struct sigaction *,
5892761Salfred					struct ibcs2_sigaction *);
5911397Sswallace
6051793Smarcelint bsd_to_ibcs2_sig[IBCS2_SIGTBLSZ] = {
6111397Sswallace	IBCS2_SIGHUP,		/* 1 */
6211397Sswallace	IBCS2_SIGINT,		/* 2 */
6311397Sswallace	IBCS2_SIGQUIT,		/* 3 */
6411397Sswallace	IBCS2_SIGILL,		/* 4 */
6511397Sswallace	IBCS2_SIGTRAP,		/* 5 */
6611397Sswallace	IBCS2_SIGABRT,		/* 6 */
6711397Sswallace	IBCS2_SIGEMT,		/* 7 */
6811397Sswallace	IBCS2_SIGFPE,		/* 8 */
6911397Sswallace	IBCS2_SIGKILL,		/* 9 */
7011397Sswallace	IBCS2_SIGBUS,		/* 10 */
7111397Sswallace	IBCS2_SIGSEGV,		/* 11 */
7211397Sswallace	IBCS2_SIGSYS,		/* 12 */
7311397Sswallace	IBCS2_SIGPIPE,		/* 13 */
7411397Sswallace	IBCS2_SIGALRM,		/* 14 */
7511397Sswallace	IBCS2_SIGTERM,		/* 15 */
7611397Sswallace	0,			/* 16 - SIGURG */
7711397Sswallace	IBCS2_SIGSTOP,		/* 17 */
7811397Sswallace	IBCS2_SIGTSTP,		/* 18 */
7911397Sswallace	IBCS2_SIGCONT,		/* 19 */
8011397Sswallace	IBCS2_SIGCLD,		/* 20 */
8111397Sswallace	IBCS2_SIGTTIN,		/* 21 */
8211397Sswallace	IBCS2_SIGTTOU,		/* 22 */
8311397Sswallace	IBCS2_SIGPOLL,		/* 23 */
8411397Sswallace	0,			/* 24 - SIGXCPU */
8511397Sswallace	0,			/* 25 - SIGXFSZ */
8611397Sswallace	IBCS2_SIGVTALRM,	/* 26 */
8711397Sswallace	IBCS2_SIGPROF,		/* 27 */
8811397Sswallace	IBCS2_SIGWINCH,		/* 28 */
8911397Sswallace	0,			/* 29 */
9011397Sswallace	IBCS2_SIGUSR1,		/* 30 */
9111397Sswallace	IBCS2_SIGUSR2,		/* 31 */
9251793Smarcel	0			/* 32 */
933584Ssos};
943584Ssos
9551793Smarcelstatic int ibcs2_to_bsd_sig[IBCS2_SIGTBLSZ] = {
9611397Sswallace	SIGHUP,			/* 1 */
9711397Sswallace	SIGINT,			/* 2 */
9811397Sswallace	SIGQUIT,		/* 3 */
9911397Sswallace	SIGILL,			/* 4 */
10011397Sswallace	SIGTRAP,		/* 5 */
10111397Sswallace	SIGABRT,		/* 6 */
10211397Sswallace	SIGEMT,			/* 7 */
10311397Sswallace	SIGFPE,			/* 8 */
10411397Sswallace	SIGKILL,		/* 9 */
10511397Sswallace	SIGBUS,			/* 10 */
10611397Sswallace	SIGSEGV,		/* 11 */
10711397Sswallace	SIGSYS,			/* 12 */
10811397Sswallace	SIGPIPE,		/* 13 */
10911397Sswallace	SIGALRM,		/* 14 */
11011397Sswallace	SIGTERM,		/* 15 */
11111397Sswallace	SIGUSR1,		/* 16 */
11211397Sswallace	SIGUSR2,		/* 17 */
11311397Sswallace	SIGCHLD,		/* 18 */
11411397Sswallace	0,			/* 19 - SIGPWR */
11511397Sswallace	SIGWINCH,		/* 20 */
11611397Sswallace	0,			/* 21 */
11711397Sswallace	SIGIO,			/* 22 */
11811397Sswallace	SIGSTOP,		/* 23 */
11911397Sswallace	SIGTSTP,		/* 24 */
12011397Sswallace	SIGCONT,		/* 25 */
12111397Sswallace	SIGTTIN,		/* 26 */
12211397Sswallace	SIGTTOU,		/* 27 */
12311397Sswallace	SIGVTALRM,		/* 28 */
12411397Sswallace	SIGPROF,		/* 29 */
12511397Sswallace	0,			/* 30 */
12611397Sswallace	0,			/* 31 */
12751793Smarcel	0			/* 32 */
1283584Ssos};
1293584Ssos
13011397Sswallacevoid
13111397Sswallaceibcs2_to_bsd_sigset(iss, bss)
13211397Sswallace	const ibcs2_sigset_t *iss;
13311397Sswallace	sigset_t *bss;
1343584Ssos{
13511397Sswallace	int i, newsig;
13611397Sswallace
13711397Sswallace	sigemptyset(bss);
13851793Smarcel	for (i = 1; i <= IBCS2_SIGTBLSZ; i++) {
13911397Sswallace		if (ibcs2_sigismember(iss, i)) {
14051793Smarcel			newsig = ibcs2_to_bsd_sig[_SIG_IDX(i)];
14111397Sswallace			if (newsig)
14211397Sswallace				sigaddset(bss, newsig);
14311397Sswallace		}
1443584Ssos	}
1453584Ssos}
1463584Ssos
14711397Sswallacestatic void
14811397Sswallacebsd_to_ibcs2_sigset(bss, iss)
14911397Sswallace	const sigset_t *bss;
15011397Sswallace	ibcs2_sigset_t *iss;
1513584Ssos{
15211397Sswallace	int i, newsig;
1533584Ssos
15411397Sswallace	ibcs2_sigemptyset(iss);
15551793Smarcel	for (i = 1; i <= IBCS2_SIGTBLSZ; i++) {
15611397Sswallace		if (sigismember(bss, i)) {
15751793Smarcel			newsig = bsd_to_ibcs2_sig[_SIG_IDX(i)];
15811397Sswallace			if (newsig)
15911397Sswallace				ibcs2_sigaddset(iss, newsig);
16011397Sswallace		}
1613584Ssos	}
1623584Ssos}
1633584Ssos
16411397Sswallacestatic void
16511397Sswallaceibcs2_to_bsd_sigaction(isa, bsa)
16611397Sswallace	struct ibcs2_sigaction *isa;
16711397Sswallace	struct sigaction *bsa;
16811397Sswallace{
16911397Sswallace
17048620Scracauer	bsa->sa_handler = isa->isa_handler;
17148620Scracauer	ibcs2_to_bsd_sigset(&isa->isa_mask, &bsa->sa_mask);
17211574Sswallace	bsa->sa_flags = 0;	/* ??? SA_NODEFER */
17348620Scracauer	if ((isa->isa_flags & IBCS2_SA_NOCLDSTOP) != 0)
17411397Sswallace		bsa->sa_flags |= SA_NOCLDSTOP;
1753584Ssos}
1763584Ssos
17711397Sswallacestatic void
17811397Sswallacebsd_to_ibcs2_sigaction(bsa, isa)
17911397Sswallace	struct sigaction *bsa;
18011397Sswallace	struct ibcs2_sigaction *isa;
18111397Sswallace{
1823584Ssos
18348620Scracauer	isa->isa_handler = bsa->sa_handler;
18448620Scracauer	bsd_to_ibcs2_sigset(&bsa->sa_mask, &isa->isa_mask);
18548620Scracauer	isa->isa_flags = 0;
18611397Sswallace	if ((bsa->sa_flags & SA_NOCLDSTOP) != 0)
18748620Scracauer		isa->isa_flags |= IBCS2_SA_NOCLDSTOP;
1883584Ssos}
1893584Ssos
19011397Sswallaceint
19183366Sjulianibcs2_sigaction(td, uap)
19283366Sjulian	register struct thread *td;
19311397Sswallace	struct ibcs2_sigaction_args *uap;
19411397Sswallace{
19511397Sswallace	struct ibcs2_sigaction *nisa, *oisa, tmpisa;
19611397Sswallace	struct sigaction *nbsa, *obsa, tmpbsa;
19711397Sswallace	struct sigaction_args sa;
19811397Sswallace	caddr_t sg;
19911397Sswallace	int error;
2003584Ssos
20111397Sswallace	sg = stackgap_init();
20211397Sswallace	nisa = SCARG(uap, act);
20311397Sswallace	oisa = SCARG(uap, oact);
2043584Ssos
20511397Sswallace	if (oisa != NULL)
20611397Sswallace		obsa = stackgap_alloc(&sg, sizeof(struct sigaction));
20711397Sswallace	else
20811397Sswallace		obsa = NULL;
2093584Ssos
21011397Sswallace	if (nisa != NULL) {
21111397Sswallace		nbsa = stackgap_alloc(&sg, sizeof(struct sigaction));
21211397Sswallace		if ((error = copyin(nisa, &tmpisa, sizeof(tmpisa))) != 0)
21311397Sswallace			return error;
21411397Sswallace		ibcs2_to_bsd_sigaction(&tmpisa, &tmpbsa);
21511397Sswallace		if ((error = copyout(&tmpbsa, nbsa, sizeof(tmpbsa))) != 0)
21611397Sswallace			return error;
21711397Sswallace	} else
21811397Sswallace		nbsa = NULL;
2193584Ssos
22051793Smarcel	SCARG(&sa, sig) = ibcs2_to_bsd_sig[_SIG_IDX(SCARG(uap, sig))];
22151793Smarcel	SCARG(&sa, act) = nbsa;
22251793Smarcel	SCARG(&sa, oact) = obsa;
22311397Sswallace
22483366Sjulian	if ((error = sigaction(td, &sa)) != 0)
22511397Sswallace		return error;
22611397Sswallace
22711397Sswallace	if (oisa != NULL) {
22811397Sswallace		if ((error = copyin(obsa, &tmpbsa, sizeof(tmpbsa))) != 0)
22911397Sswallace			return error;
23011397Sswallace		bsd_to_ibcs2_sigaction(&tmpbsa, &tmpisa);
23111397Sswallace		if ((error = copyout(&tmpisa, oisa, sizeof(tmpisa))) != 0)
23211397Sswallace			return error;
2333584Ssos	}
23411397Sswallace
23511397Sswallace	return 0;
2368876Srgrimes}
2373584Ssos
23811397Sswallaceint
23983366Sjulianibcs2_sigsys(td, uap)
24083366Sjulian	register struct thread *td;
24111397Sswallace	struct ibcs2_sigsys_args *uap;
2423584Ssos{
24383366Sjulian	struct proc *p = td->td_proc;
24411605Sswallace	struct sigaction sa;
24551793Smarcel	int signum = ibcs2_to_bsd_sig[_SIG_IDX(IBCS2_SIGNO(SCARG(uap, sig)))];
24611397Sswallace	int error;
24711397Sswallace	caddr_t sg = stackgap_init();
2483584Ssos
24911397Sswallace	if (signum <= 0 || signum >= IBCS2_NSIG) {
25011397Sswallace		if (IBCS2_SIGCALL(SCARG(uap, sig)) == IBCS2_SIGNAL_MASK ||
25111397Sswallace		    IBCS2_SIGCALL(SCARG(uap, sig)) == IBCS2_SIGSET_MASK)
25283366Sjulian			td->td_retval[0] = (int)IBCS2_SIG_ERR;
25311397Sswallace		return EINVAL;
25411397Sswallace	}
25511397Sswallace
25611397Sswallace	switch (IBCS2_SIGCALL(SCARG(uap, sig))) {
25711397Sswallace	case IBCS2_SIGSET_MASK:
25811397Sswallace		/*
25911605Sswallace		 * Check for SIG_HOLD action.
26011605Sswallace		 * Otherwise, perform signal() except with different sa_flags.
26111397Sswallace		 */
26211605Sswallace		if (SCARG(uap, fp) != IBCS2_SIG_HOLD) {
26311605Sswallace			/* add sig to mask before exececuting signal handler */
26411605Sswallace			sa.sa_flags = 0;
26511605Sswallace			goto ibcs2_sigset;
26611605Sswallace		}
26711605Sswallace		/* else fallthrough to sighold */
26811605Sswallace
26911605Sswallace	case IBCS2_SIGHOLD_MASK:
27011605Sswallace		{
27152084Smarcel			sigset_t mask;
27252084Smarcel			struct sigprocmask_args sa;
2733584Ssos
27452084Smarcel			SIGEMPTYSET(mask);
27552084Smarcel			SIGADDSET(mask, signum);
27611397Sswallace			SCARG(&sa, how) = SIG_BLOCK;
27752084Smarcel			SCARG(&sa, set) = &mask;
27852084Smarcel			SCARG(&sa, oset) = NULL;
27983366Sjulian			return sigprocmask(td, &sa);
28011397Sswallace		}
28111605Sswallace
28211397Sswallace	case IBCS2_SIGNAL_MASK:
28311397Sswallace		{
28411397Sswallace			struct sigaction_args sa_args;
28511605Sswallace			struct sigaction *nbsa, *obsa;
2863584Ssos
28711605Sswallace			/* do not automatically block signal */
28811605Sswallace			sa.sa_flags = SA_NODEFER;
28911605Sswallace#ifdef SA_RESETHAND
29011605Sswallace			if((signum != IBCS2_SIGILL) &&
29111605Sswallace			   (signum != IBCS2_SIGTRAP) &&
29211605Sswallace			   (signum != IBCS2_SIGPWR))
29311605Sswallace				/* set to SIG_DFL before executing handler */
29411605Sswallace				sa.sa_flags |= SA_RESETHAND;
29511605Sswallace#endif
29611605Sswallace		ibcs2_sigset:
29711397Sswallace			nbsa = stackgap_alloc(&sg, sizeof(struct sigaction));
29811397Sswallace			obsa = stackgap_alloc(&sg, sizeof(struct sigaction));
29951793Smarcel			SCARG(&sa_args, sig) = signum;
30051793Smarcel			SCARG(&sa_args, act) = nbsa;
30151793Smarcel			SCARG(&sa_args, oact) = obsa;
3023584Ssos
30311397Sswallace			sa.sa_handler = SCARG(uap, fp);
30411397Sswallace			sigemptyset(&sa.sa_mask);
30511397Sswallace#if 0
30611397Sswallace			if (signum != SIGALRM)
30711574Sswallace				sa.sa_flags |= SA_RESTART;
30811397Sswallace#endif
30983366Sjulian			td->td_retval[0] = (int)IBCS2_SIG_ERR; /* init error return */
31020203Sswallace
31120203Sswallace			/* perform native sigaction() */
31211397Sswallace			if ((error = copyout(&sa, nbsa, sizeof(sa))) != 0)
31311397Sswallace				return error;
31483366Sjulian			if ((error = sigaction(td, &sa_args)) != 0) {
31511397Sswallace				DPRINTF(("signal: sigaction failed: %d\n",
31611397Sswallace					 error));
31711397Sswallace				return error;
31811397Sswallace			}
31911397Sswallace			if ((error = copyin(obsa, &sa, sizeof(sa))) != 0)
32011397Sswallace				return error;
32183366Sjulian			td->td_retval[0] = (int)sa.sa_handler;
32220203Sswallace
32320203Sswallace			/* special sigset() check */
32471489Sjhb                        if(IBCS2_SIGCALL(SCARG(uap, sig)) == IBCS2_SIGSET_MASK) {
32571489Sjhb				PROC_LOCK(p);
32620203Sswallace			        /* check to make sure signal is not blocked */
32720203Sswallace                                if(sigismember(&p->p_sigmask, signum)) {
32820203Sswallace				        /* return SIG_HOLD and unblock signal*/
32983366Sjulian                                        td->td_retval[0] = (int)IBCS2_SIG_HOLD;
33051793Smarcel					SIGDELSET(p->p_sigmask, signum);
33120203Sswallace				}
33271489Sjhb				PROC_UNLOCK(p);
33371489Sjhb			}
33420203Sswallace
33511397Sswallace			return 0;
33611397Sswallace		}
33711397Sswallace
33811397Sswallace	case IBCS2_SIGRELSE_MASK:
33911397Sswallace		{
34052084Smarcel			sigset_t mask;
34152084Smarcel			struct sigprocmask_args sa;
3423584Ssos
34352084Smarcel			SIGEMPTYSET(mask);
34452084Smarcel			SIGADDSET(mask, signum);
34511397Sswallace			SCARG(&sa, how) = SIG_UNBLOCK;
34652084Smarcel			SCARG(&sa, set) = &mask;
34752084Smarcel			SCARG(&sa, oset) = NULL;
34883366Sjulian			return sigprocmask(td, &sa);
34911397Sswallace		}
35011397Sswallace
35111397Sswallace	case IBCS2_SIGIGNORE_MASK:
35211397Sswallace		{
35311397Sswallace			struct sigaction_args sa_args;
35411605Sswallace			struct sigaction *bsa;
3553584Ssos
35611397Sswallace			bsa = stackgap_alloc(&sg, sizeof(struct sigaction));
35751793Smarcel			SCARG(&sa_args, sig) = signum;
35851793Smarcel			SCARG(&sa_args, act) = bsa;
35951793Smarcel			SCARG(&sa_args, oact) = NULL;
3603584Ssos
36111397Sswallace			sa.sa_handler = SIG_IGN;
36211397Sswallace			sigemptyset(&sa.sa_mask);
36311397Sswallace			sa.sa_flags = 0;
36411397Sswallace			if ((error = copyout(&sa, bsa, sizeof(sa))) != 0)
36511397Sswallace				return error;
36683366Sjulian			if ((error = sigaction(td, &sa_args)) != 0) {
36711397Sswallace				DPRINTF(("sigignore: sigaction failed\n"));
36811397Sswallace				return error;
36911397Sswallace			}
37011397Sswallace			return 0;
37111397Sswallace		}
37211397Sswallace
37311397Sswallace	case IBCS2_SIGPAUSE_MASK:
37411397Sswallace		{
37552084Smarcel			sigset_t mask;
37652084Smarcel			struct sigsuspend_args sa;
3773584Ssos
37871489Sjhb			PROC_LOCK(p);
37952084Smarcel			mask = p->p_sigmask;
38071489Sjhb			PROC_UNLOCK(p);
38152084Smarcel			SIGDELSET(mask, signum);
38252084Smarcel			SCARG(&sa, sigmask) = &mask;
38383366Sjulian			return sigsuspend(td, &sa);
38411397Sswallace		}
38511397Sswallace
3863584Ssos	default:
38711397Sswallace		return ENOSYS;
3883584Ssos	}
3893584Ssos}
3903584Ssos
3913584Ssosint
39283366Sjulianibcs2_sigprocmask(td, uap)
39383366Sjulian	register struct thread *td;
39411397Sswallace	struct ibcs2_sigprocmask_args *uap;
3953584Ssos{
39683366Sjulian	struct proc *p = td->td_proc;
39711397Sswallace	ibcs2_sigset_t iss;
39811397Sswallace	sigset_t bss;
39911397Sswallace	int error = 0;
4003584Ssos
40111397Sswallace	if (SCARG(uap, oset) != NULL) {
40211397Sswallace		/* Fix the return value first if needed */
40371489Sjhb		PROC_LOCK(p);
40411397Sswallace		bsd_to_ibcs2_sigset(&p->p_sigmask, &iss);
40571489Sjhb		PROC_UNLOCK(p);
40611397Sswallace		if ((error = copyout(&iss, SCARG(uap, oset), sizeof(iss))) != 0)
4073584Ssos			return error;
4083584Ssos	}
40911397Sswallace
41011397Sswallace	if (SCARG(uap, set) == NULL)
41111397Sswallace		/* Just examine */
41211397Sswallace		return 0;
4133584Ssos
41411397Sswallace	if ((error = copyin(SCARG(uap, set), &iss, sizeof(iss))) != 0)
41511397Sswallace		return error;
4163584Ssos
41711397Sswallace	ibcs2_to_bsd_sigset(&iss, &bss);
4183584Ssos
41971489Sjhb	PROC_LOCK(p);
42011397Sswallace
42111397Sswallace	switch (SCARG(uap, how)) {
42211397Sswallace	case IBCS2_SIG_BLOCK:
42351793Smarcel		SIGSETOR(p->p_sigmask, bss);
42451793Smarcel		SIG_CANTMASK(p->p_sigmask);
4253584Ssos		break;
4268876Srgrimes
42711397Sswallace	case IBCS2_SIG_UNBLOCK:
42851793Smarcel		SIGSETNAND(p->p_sigmask, bss);
4293584Ssos		break;
4303584Ssos
43111397Sswallace	case IBCS2_SIG_SETMASK:
43251793Smarcel		p->p_sigmask = bss;
43351793Smarcel		SIG_CANTMASK(p->p_sigmask);
4343584Ssos		break;
4353584Ssos
4363584Ssos	default:
4373584Ssos		error = EINVAL;
4383584Ssos		break;
4393584Ssos	}
44011397Sswallace
44171489Sjhb	PROC_UNLOCK(p);
44211397Sswallace
44311397Sswallace	return error;
4443584Ssos}
4453584Ssos
44611397Sswallaceint
44783366Sjulianibcs2_sigpending(td, uap)
44883366Sjulian	register struct thread *td;
44911397Sswallace	struct ibcs2_sigpending_args *uap;
45011397Sswallace{
45183366Sjulian	struct proc *p = td->td_proc;
45211397Sswallace	sigset_t bss;
45311397Sswallace	ibcs2_sigset_t iss;
4543584Ssos
45571489Sjhb	PROC_LOCK(p);
45651793Smarcel	bss = p->p_siglist;
45751793Smarcel	SIGSETAND(bss, p->p_sigmask);
45871489Sjhb	PROC_UNLOCK(p);
45911397Sswallace	bsd_to_ibcs2_sigset(&bss, &iss);
46011397Sswallace
46111397Sswallace	return copyout(&iss, SCARG(uap, mask), sizeof(iss));
46211397Sswallace}
46311397Sswallace
4643584Ssosint
46583366Sjulianibcs2_sigsuspend(td, uap)
46683366Sjulian	register struct thread *td;
46711397Sswallace	struct ibcs2_sigsuspend_args *uap;
4683584Ssos{
46911397Sswallace	ibcs2_sigset_t sss;
47011397Sswallace	sigset_t bss;
47152084Smarcel	struct sigsuspend_args sa;
47211397Sswallace	int error;
4738876Srgrimes
47411397Sswallace	if ((error = copyin(SCARG(uap, mask), &sss, sizeof(sss))) != 0)
47511397Sswallace		return error;
47611397Sswallace
47711397Sswallace	ibcs2_to_bsd_sigset(&sss, &bss);
47852084Smarcel	SCARG(&sa, sigmask) = &bss;
47983366Sjulian	return sigsuspend(td, &sa);
4803584Ssos}
4813584Ssos
4823584Ssosint
48383366Sjulianibcs2_pause(td, uap)
48483366Sjulian	register struct thread *td;
48511397Sswallace	struct ibcs2_pause_args *uap;
4863584Ssos{
48783366Sjulian	struct proc *p = td->td_proc;
48852084Smarcel	sigset_t mask;
48952084Smarcel	struct sigsuspend_args sa;
4903584Ssos
49171489Sjhb	PROC_LOCK(p);
49283366Sjulian	mask = td->td_proc->p_sigmask;
49371489Sjhb	PROC_UNLOCK(p);
49452084Smarcel	SCARG(&sa, sigmask) = &mask;
49583366Sjulian	return sigsuspend(td, &sa);
4963584Ssos}
4973584Ssos
4983584Ssosint
49983366Sjulianibcs2_kill(td, uap)
50083366Sjulian	register struct thread *td;
50111397Sswallace	struct ibcs2_kill_args *uap;
5023584Ssos{
50311397Sswallace	struct kill_args ka;
5043584Ssos
50511397Sswallace	SCARG(&ka, pid) = SCARG(uap, pid);
50651793Smarcel	SCARG(&ka, signum) = ibcs2_to_bsd_sig[_SIG_IDX(SCARG(uap, signo))];
50783366Sjulian	return kill(td, &ka);
5083584Ssos}
509