ibcs2_signal.c revision 51793
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 51793 1999-09-29 15:12:18Z marcel $
293584Ssos */
303584Ssos
313584Ssos#include <sys/param.h>
323584Ssos#include <sys/systm.h>
333584Ssos#include <sys/signalvar.h>
3411397Sswallace#include <sys/sysproto.h>
353584Ssos
3611397Sswallace#include <i386/ibcs2/ibcs2_types.h>
3711397Sswallace#include <i386/ibcs2/ibcs2_signal.h>
3811397Sswallace#include <i386/ibcs2/ibcs2_proto.h>
3911397Sswallace#include <i386/ibcs2/ibcs2_xenix.h>
4011397Sswallace#include <i386/ibcs2/ibcs2_util.h>
413584Ssos
4251793Smarcel#define sigemptyset(s)		SIGEMPTYSET(*(s))
4351793Smarcel#define sigismember(s, n)	SIGISMEMBER(*(s), n)
4451793Smarcel#define sigaddset(s, n)		SIGADDSET(*(s), n)
453584Ssos
4611397Sswallace#define	ibcs2_sigmask(n)	(1 << ((n) - 1))
4711397Sswallace#define ibcs2_sigemptyset(s)	bzero((s), sizeof(*(s)))
4811397Sswallace#define ibcs2_sigismember(s, n)	(*(s) & ibcs2_sigmask(n))
4911397Sswallace#define ibcs2_sigaddset(s, n)	(*(s) |= ibcs2_sigmask(n))
503584Ssos
5111397Sswallacestatic void ibcs2_to_bsd_sigset    __P((const ibcs2_sigset_t *, sigset_t *));
5211397Sswallacestatic void bsd_to_ibcs2_sigset    __P((const sigset_t *, ibcs2_sigset_t *));
5311397Sswallacestatic void ibcs2_to_bsd_sigaction __P((struct ibcs2_sigaction *,
5411397Sswallace					struct sigaction *));
5511397Sswallacestatic void bsd_to_ibcs2_sigaction __P((struct sigaction *,
5611397Sswallace					struct ibcs2_sigaction *));
5711397Sswallace
5851793Smarcelint bsd_to_ibcs2_sig[IBCS2_SIGTBLSZ] = {
5911397Sswallace	IBCS2_SIGHUP,		/* 1 */
6011397Sswallace	IBCS2_SIGINT,		/* 2 */
6111397Sswallace	IBCS2_SIGQUIT,		/* 3 */
6211397Sswallace	IBCS2_SIGILL,		/* 4 */
6311397Sswallace	IBCS2_SIGTRAP,		/* 5 */
6411397Sswallace	IBCS2_SIGABRT,		/* 6 */
6511397Sswallace	IBCS2_SIGEMT,		/* 7 */
6611397Sswallace	IBCS2_SIGFPE,		/* 8 */
6711397Sswallace	IBCS2_SIGKILL,		/* 9 */
6811397Sswallace	IBCS2_SIGBUS,		/* 10 */
6911397Sswallace	IBCS2_SIGSEGV,		/* 11 */
7011397Sswallace	IBCS2_SIGSYS,		/* 12 */
7111397Sswallace	IBCS2_SIGPIPE,		/* 13 */
7211397Sswallace	IBCS2_SIGALRM,		/* 14 */
7311397Sswallace	IBCS2_SIGTERM,		/* 15 */
7411397Sswallace	0,			/* 16 - SIGURG */
7511397Sswallace	IBCS2_SIGSTOP,		/* 17 */
7611397Sswallace	IBCS2_SIGTSTP,		/* 18 */
7711397Sswallace	IBCS2_SIGCONT,		/* 19 */
7811397Sswallace	IBCS2_SIGCLD,		/* 20 */
7911397Sswallace	IBCS2_SIGTTIN,		/* 21 */
8011397Sswallace	IBCS2_SIGTTOU,		/* 22 */
8111397Sswallace	IBCS2_SIGPOLL,		/* 23 */
8211397Sswallace	0,			/* 24 - SIGXCPU */
8311397Sswallace	0,			/* 25 - SIGXFSZ */
8411397Sswallace	IBCS2_SIGVTALRM,	/* 26 */
8511397Sswallace	IBCS2_SIGPROF,		/* 27 */
8611397Sswallace	IBCS2_SIGWINCH,		/* 28 */
8711397Sswallace	0,			/* 29 */
8811397Sswallace	IBCS2_SIGUSR1,		/* 30 */
8911397Sswallace	IBCS2_SIGUSR2,		/* 31 */
9051793Smarcel	0			/* 32 */
913584Ssos};
923584Ssos
9351793Smarcelstatic int ibcs2_to_bsd_sig[IBCS2_SIGTBLSZ] = {
9411397Sswallace	SIGHUP,			/* 1 */
9511397Sswallace	SIGINT,			/* 2 */
9611397Sswallace	SIGQUIT,		/* 3 */
9711397Sswallace	SIGILL,			/* 4 */
9811397Sswallace	SIGTRAP,		/* 5 */
9911397Sswallace	SIGABRT,		/* 6 */
10011397Sswallace	SIGEMT,			/* 7 */
10111397Sswallace	SIGFPE,			/* 8 */
10211397Sswallace	SIGKILL,		/* 9 */
10311397Sswallace	SIGBUS,			/* 10 */
10411397Sswallace	SIGSEGV,		/* 11 */
10511397Sswallace	SIGSYS,			/* 12 */
10611397Sswallace	SIGPIPE,		/* 13 */
10711397Sswallace	SIGALRM,		/* 14 */
10811397Sswallace	SIGTERM,		/* 15 */
10911397Sswallace	SIGUSR1,		/* 16 */
11011397Sswallace	SIGUSR2,		/* 17 */
11111397Sswallace	SIGCHLD,		/* 18 */
11211397Sswallace	0,			/* 19 - SIGPWR */
11311397Sswallace	SIGWINCH,		/* 20 */
11411397Sswallace	0,			/* 21 */
11511397Sswallace	SIGIO,			/* 22 */
11611397Sswallace	SIGSTOP,		/* 23 */
11711397Sswallace	SIGTSTP,		/* 24 */
11811397Sswallace	SIGCONT,		/* 25 */
11911397Sswallace	SIGTTIN,		/* 26 */
12011397Sswallace	SIGTTOU,		/* 27 */
12111397Sswallace	SIGVTALRM,		/* 28 */
12211397Sswallace	SIGPROF,		/* 29 */
12311397Sswallace	0,			/* 30 */
12411397Sswallace	0,			/* 31 */
12551793Smarcel	0			/* 32 */
1263584Ssos};
1273584Ssos
12811397Sswallacevoid
12911397Sswallaceibcs2_to_bsd_sigset(iss, bss)
13011397Sswallace	const ibcs2_sigset_t *iss;
13111397Sswallace	sigset_t *bss;
1323584Ssos{
13311397Sswallace	int i, newsig;
13411397Sswallace
13511397Sswallace	sigemptyset(bss);
13651793Smarcel	for (i = 1; i <= IBCS2_SIGTBLSZ; i++) {
13711397Sswallace		if (ibcs2_sigismember(iss, i)) {
13851793Smarcel			newsig = ibcs2_to_bsd_sig[_SIG_IDX(i)];
13911397Sswallace			if (newsig)
14011397Sswallace				sigaddset(bss, newsig);
14111397Sswallace		}
1423584Ssos	}
1433584Ssos}
1443584Ssos
14511397Sswallacestatic void
14611397Sswallacebsd_to_ibcs2_sigset(bss, iss)
14711397Sswallace	const sigset_t *bss;
14811397Sswallace	ibcs2_sigset_t *iss;
1493584Ssos{
15011397Sswallace	int i, newsig;
1513584Ssos
15211397Sswallace	ibcs2_sigemptyset(iss);
15351793Smarcel	for (i = 1; i <= IBCS2_SIGTBLSZ; i++) {
15411397Sswallace		if (sigismember(bss, i)) {
15551793Smarcel			newsig = bsd_to_ibcs2_sig[_SIG_IDX(i)];
15611397Sswallace			if (newsig)
15711397Sswallace				ibcs2_sigaddset(iss, newsig);
15811397Sswallace		}
1593584Ssos	}
1603584Ssos}
1613584Ssos
16211397Sswallacestatic void
16311397Sswallaceibcs2_to_bsd_sigaction(isa, bsa)
16411397Sswallace	struct ibcs2_sigaction *isa;
16511397Sswallace	struct sigaction *bsa;
16611397Sswallace{
16711397Sswallace
16848620Scracauer	bsa->sa_handler = isa->isa_handler;
16948620Scracauer	ibcs2_to_bsd_sigset(&isa->isa_mask, &bsa->sa_mask);
17011574Sswallace	bsa->sa_flags = 0;	/* ??? SA_NODEFER */
17148620Scracauer	if ((isa->isa_flags & IBCS2_SA_NOCLDSTOP) != 0)
17211397Sswallace		bsa->sa_flags |= SA_NOCLDSTOP;
1733584Ssos}
1743584Ssos
17511397Sswallacestatic void
17611397Sswallacebsd_to_ibcs2_sigaction(bsa, isa)
17711397Sswallace	struct sigaction *bsa;
17811397Sswallace	struct ibcs2_sigaction *isa;
17911397Sswallace{
1803584Ssos
18148620Scracauer	isa->isa_handler = bsa->sa_handler;
18248620Scracauer	bsd_to_ibcs2_sigset(&bsa->sa_mask, &isa->isa_mask);
18348620Scracauer	isa->isa_flags = 0;
18411397Sswallace	if ((bsa->sa_flags & SA_NOCLDSTOP) != 0)
18548620Scracauer		isa->isa_flags |= IBCS2_SA_NOCLDSTOP;
1863584Ssos}
1873584Ssos
18811397Sswallaceint
18930994Sphkibcs2_sigaction(p, uap)
19011397Sswallace	register struct proc *p;
19111397Sswallace	struct ibcs2_sigaction_args *uap;
19211397Sswallace{
19311397Sswallace	struct ibcs2_sigaction *nisa, *oisa, tmpisa;
19411397Sswallace	struct sigaction *nbsa, *obsa, tmpbsa;
19511397Sswallace	struct sigaction_args sa;
19611397Sswallace	caddr_t sg;
19711397Sswallace	int error;
1983584Ssos
19911397Sswallace	sg = stackgap_init();
20011397Sswallace	nisa = SCARG(uap, act);
20111397Sswallace	oisa = SCARG(uap, oact);
2023584Ssos
20311397Sswallace	if (oisa != NULL)
20411397Sswallace		obsa = stackgap_alloc(&sg, sizeof(struct sigaction));
20511397Sswallace	else
20611397Sswallace		obsa = NULL;
2073584Ssos
20811397Sswallace	if (nisa != NULL) {
20911397Sswallace		nbsa = stackgap_alloc(&sg, sizeof(struct sigaction));
21011397Sswallace		if ((error = copyin(nisa, &tmpisa, sizeof(tmpisa))) != 0)
21111397Sswallace			return error;
21211397Sswallace		ibcs2_to_bsd_sigaction(&tmpisa, &tmpbsa);
21311397Sswallace		if ((error = copyout(&tmpbsa, nbsa, sizeof(tmpbsa))) != 0)
21411397Sswallace			return error;
21511397Sswallace	} else
21611397Sswallace		nbsa = NULL;
2173584Ssos
21851793Smarcel	SCARG(&sa, sig) = ibcs2_to_bsd_sig[_SIG_IDX(SCARG(uap, sig))];
21951793Smarcel	SCARG(&sa, act) = nbsa;
22051793Smarcel	SCARG(&sa, oact) = obsa;
22111397Sswallace
22230994Sphk	if ((error = sigaction(p, &sa)) != 0)
22311397Sswallace		return error;
22411397Sswallace
22511397Sswallace	if (oisa != NULL) {
22611397Sswallace		if ((error = copyin(obsa, &tmpbsa, sizeof(tmpbsa))) != 0)
22711397Sswallace			return error;
22811397Sswallace		bsd_to_ibcs2_sigaction(&tmpbsa, &tmpisa);
22911397Sswallace		if ((error = copyout(&tmpisa, oisa, sizeof(tmpisa))) != 0)
23011397Sswallace			return error;
2313584Ssos	}
23211397Sswallace
23311397Sswallace	return 0;
2348876Srgrimes}
2353584Ssos
23611397Sswallaceint
23730994Sphkibcs2_sigsys(p, uap)
23811397Sswallace	register struct proc *p;
23911397Sswallace	struct ibcs2_sigsys_args *uap;
2403584Ssos{
24111605Sswallace	struct sigaction sa;
24251793Smarcel	int signum = ibcs2_to_bsd_sig[_SIG_IDX(IBCS2_SIGNO(SCARG(uap, sig)))];
24311397Sswallace	int error;
24411397Sswallace	caddr_t sg = stackgap_init();
2453584Ssos
24611397Sswallace	if (signum <= 0 || signum >= IBCS2_NSIG) {
24711397Sswallace		if (IBCS2_SIGCALL(SCARG(uap, sig)) == IBCS2_SIGNAL_MASK ||
24811397Sswallace		    IBCS2_SIGCALL(SCARG(uap, sig)) == IBCS2_SIGSET_MASK)
24930994Sphk			p->p_retval[0] = (int)IBCS2_SIG_ERR;
25011397Sswallace		return EINVAL;
25111397Sswallace	}
25211397Sswallace
25311397Sswallace	switch (IBCS2_SIGCALL(SCARG(uap, sig))) {
25411397Sswallace	case IBCS2_SIGSET_MASK:
25511397Sswallace		/*
25611605Sswallace		 * Check for SIG_HOLD action.
25711605Sswallace		 * Otherwise, perform signal() except with different sa_flags.
25811397Sswallace		 */
25911605Sswallace		if (SCARG(uap, fp) != IBCS2_SIG_HOLD) {
26011605Sswallace			/* add sig to mask before exececuting signal handler */
26111605Sswallace			sa.sa_flags = 0;
26211605Sswallace			goto ibcs2_sigset;
26311605Sswallace		}
26411605Sswallace		/* else fallthrough to sighold */
26511605Sswallace
26611605Sswallace	case IBCS2_SIGHOLD_MASK:
26711605Sswallace		{
26851793Smarcel			struct osigprocmask_args sa;
2693584Ssos
27011397Sswallace			SCARG(&sa, how) = SIG_BLOCK;
27111397Sswallace			SCARG(&sa, mask) = sigmask(signum);
27251793Smarcel			return osigprocmask(p, &sa);
27311397Sswallace		}
27411605Sswallace
27511397Sswallace	case IBCS2_SIGNAL_MASK:
27611397Sswallace		{
27711397Sswallace			struct sigaction_args sa_args;
27811605Sswallace			struct sigaction *nbsa, *obsa;
2793584Ssos
28011605Sswallace			/* do not automatically block signal */
28111605Sswallace			sa.sa_flags = SA_NODEFER;
28211605Sswallace#ifdef SA_RESETHAND
28311605Sswallace			if((signum != IBCS2_SIGILL) &&
28411605Sswallace			   (signum != IBCS2_SIGTRAP) &&
28511605Sswallace			   (signum != IBCS2_SIGPWR))
28611605Sswallace				/* set to SIG_DFL before executing handler */
28711605Sswallace				sa.sa_flags |= SA_RESETHAND;
28811605Sswallace#endif
28911605Sswallace		ibcs2_sigset:
29011397Sswallace			nbsa = stackgap_alloc(&sg, sizeof(struct sigaction));
29111397Sswallace			obsa = stackgap_alloc(&sg, sizeof(struct sigaction));
29251793Smarcel			SCARG(&sa_args, sig) = signum;
29351793Smarcel			SCARG(&sa_args, act) = nbsa;
29451793Smarcel			SCARG(&sa_args, oact) = obsa;
2953584Ssos
29611397Sswallace			sa.sa_handler = SCARG(uap, fp);
29711397Sswallace			sigemptyset(&sa.sa_mask);
29811397Sswallace#if 0
29911397Sswallace			if (signum != SIGALRM)
30011574Sswallace				sa.sa_flags |= SA_RESTART;
30111397Sswallace#endif
30230994Sphk			p->p_retval[0] = (int)IBCS2_SIG_ERR; /* init error return */
30320203Sswallace
30420203Sswallace			/* perform native sigaction() */
30511397Sswallace			if ((error = copyout(&sa, nbsa, sizeof(sa))) != 0)
30611397Sswallace				return error;
30730994Sphk			if ((error = sigaction(p, &sa_args)) != 0) {
30811397Sswallace				DPRINTF(("signal: sigaction failed: %d\n",
30911397Sswallace					 error));
31011397Sswallace				return error;
31111397Sswallace			}
31211397Sswallace			if ((error = copyin(obsa, &sa, sizeof(sa))) != 0)
31311397Sswallace				return error;
31430994Sphk			p->p_retval[0] = (int)sa.sa_handler;
31520203Sswallace
31620203Sswallace			/* special sigset() check */
31720203Sswallace                        if(IBCS2_SIGCALL(SCARG(uap, sig)) == IBCS2_SIGSET_MASK)
31820203Sswallace			        /* check to make sure signal is not blocked */
31920203Sswallace                                if(sigismember(&p->p_sigmask, signum)) {
32020203Sswallace				        /* return SIG_HOLD and unblock signal*/
32130994Sphk                                        p->p_retval[0] = (int)IBCS2_SIG_HOLD;
32251793Smarcel					SIGDELSET(p->p_sigmask, signum);
32320203Sswallace				}
32420203Sswallace
32511397Sswallace			return 0;
32611397Sswallace		}
32711397Sswallace
32811397Sswallace	case IBCS2_SIGRELSE_MASK:
32911397Sswallace		{
33051793Smarcel			struct osigprocmask_args sa;
3313584Ssos
33211397Sswallace			SCARG(&sa, how) = SIG_UNBLOCK;
33311397Sswallace			SCARG(&sa, mask) = sigmask(signum);
33451793Smarcel			return osigprocmask(p, &sa);
33511397Sswallace		}
33611397Sswallace
33711397Sswallace	case IBCS2_SIGIGNORE_MASK:
33811397Sswallace		{
33911397Sswallace			struct sigaction_args sa_args;
34011605Sswallace			struct sigaction *bsa;
3413584Ssos
34211397Sswallace			bsa = stackgap_alloc(&sg, sizeof(struct sigaction));
34351793Smarcel			SCARG(&sa_args, sig) = signum;
34451793Smarcel			SCARG(&sa_args, act) = bsa;
34551793Smarcel			SCARG(&sa_args, oact) = NULL;
3463584Ssos
34711397Sswallace			sa.sa_handler = SIG_IGN;
34811397Sswallace			sigemptyset(&sa.sa_mask);
34911397Sswallace			sa.sa_flags = 0;
35011397Sswallace			if ((error = copyout(&sa, bsa, sizeof(sa))) != 0)
35111397Sswallace				return error;
35230994Sphk			if ((error = sigaction(p, &sa_args)) != 0) {
35311397Sswallace				DPRINTF(("sigignore: sigaction failed\n"));
35411397Sswallace				return error;
35511397Sswallace			}
35611397Sswallace			return 0;
35711397Sswallace		}
35811397Sswallace
35911397Sswallace	case IBCS2_SIGPAUSE_MASK:
36011397Sswallace		{
36151793Smarcel			osigset_t mask;
36251793Smarcel			struct osigsuspend_args sa;
3633584Ssos
36451793Smarcel			SIG2OSIG(p->p_sigmask, mask);
36551793Smarcel			SCARG(&sa, mask) = mask &~ sigmask(signum);
36651793Smarcel			return osigsuspend(p, &sa);
36711397Sswallace		}
36811397Sswallace
3693584Ssos	default:
37011397Sswallace		return ENOSYS;
3713584Ssos	}
3723584Ssos}
3733584Ssos
3743584Ssosint
37530994Sphkibcs2_sigprocmask(p, uap)
37611397Sswallace	register struct proc *p;
37711397Sswallace	struct ibcs2_sigprocmask_args *uap;
3783584Ssos{
37911397Sswallace	ibcs2_sigset_t iss;
38011397Sswallace	sigset_t bss;
38111397Sswallace	int error = 0;
3823584Ssos
38311397Sswallace	if (SCARG(uap, oset) != NULL) {
38411397Sswallace		/* Fix the return value first if needed */
38511397Sswallace		bsd_to_ibcs2_sigset(&p->p_sigmask, &iss);
38611397Sswallace		if ((error = copyout(&iss, SCARG(uap, oset), sizeof(iss))) != 0)
3873584Ssos			return error;
3883584Ssos	}
38911397Sswallace
39011397Sswallace	if (SCARG(uap, set) == NULL)
39111397Sswallace		/* Just examine */
39211397Sswallace		return 0;
3933584Ssos
39411397Sswallace	if ((error = copyin(SCARG(uap, set), &iss, sizeof(iss))) != 0)
39511397Sswallace		return error;
3963584Ssos
39711397Sswallace	ibcs2_to_bsd_sigset(&iss, &bss);
3983584Ssos
3993584Ssos	(void) splhigh();
40011397Sswallace
40111397Sswallace	switch (SCARG(uap, how)) {
40211397Sswallace	case IBCS2_SIG_BLOCK:
40351793Smarcel		SIGSETOR(p->p_sigmask, bss);
40451793Smarcel		SIG_CANTMASK(p->p_sigmask);
4053584Ssos		break;
4068876Srgrimes
40711397Sswallace	case IBCS2_SIG_UNBLOCK:
40851793Smarcel		SIGSETNAND(p->p_sigmask, bss);
4093584Ssos		break;
4103584Ssos
41111397Sswallace	case IBCS2_SIG_SETMASK:
41251793Smarcel		p->p_sigmask = bss;
41351793Smarcel		SIG_CANTMASK(p->p_sigmask);
4143584Ssos		break;
4153584Ssos
4163584Ssos	default:
4173584Ssos		error = EINVAL;
4183584Ssos		break;
4193584Ssos	}
42011397Sswallace
4213584Ssos	(void) spl0();
42211397Sswallace
42311397Sswallace	return error;
4243584Ssos}
4253584Ssos
42611397Sswallaceint
42730994Sphkibcs2_sigpending(p, uap)
42811397Sswallace	register struct proc *p;
42911397Sswallace	struct ibcs2_sigpending_args *uap;
43011397Sswallace{
43111397Sswallace	sigset_t bss;
43211397Sswallace	ibcs2_sigset_t iss;
4333584Ssos
43451793Smarcel	bss = p->p_siglist;
43551793Smarcel	SIGSETAND(bss, p->p_sigmask);
43611397Sswallace	bsd_to_ibcs2_sigset(&bss, &iss);
43711397Sswallace
43811397Sswallace	return copyout(&iss, SCARG(uap, mask), sizeof(iss));
43911397Sswallace}
44011397Sswallace
4413584Ssosint
44230994Sphkibcs2_sigsuspend(p, uap)
44311397Sswallace	register struct proc *p;
44411397Sswallace	struct ibcs2_sigsuspend_args *uap;
4453584Ssos{
44611397Sswallace	ibcs2_sigset_t sss;
44711397Sswallace	sigset_t bss;
44851793Smarcel	osigset_t mask;
44951793Smarcel	struct osigsuspend_args sa;
45011397Sswallace	int error;
4518876Srgrimes
45211397Sswallace	if ((error = copyin(SCARG(uap, mask), &sss, sizeof(sss))) != 0)
45311397Sswallace		return error;
45411397Sswallace
45511397Sswallace	ibcs2_to_bsd_sigset(&sss, &bss);
45651793Smarcel	SIG2OSIG(bss, mask);
45751793Smarcel	SCARG(&sa, mask) = mask;
45851793Smarcel	return osigsuspend(p, &sa);
4593584Ssos}
4603584Ssos
4613584Ssosint
46230994Sphkibcs2_pause(p, uap)
46311397Sswallace	register struct proc *p;
46411397Sswallace	struct ibcs2_pause_args *uap;
4653584Ssos{
46651793Smarcel	struct osigsuspend_args bsa;
46751793Smarcel	osigset_t mask;
4683584Ssos
46951793Smarcel	SIG2OSIG(p->p_sigmask, mask);
47051793Smarcel	SCARG(&bsa, mask) = mask;
47151793Smarcel	return osigsuspend(p, &bsa);
4723584Ssos}
4733584Ssos
4743584Ssosint
47530994Sphkibcs2_kill(p, uap)
47611397Sswallace	register struct proc *p;
47711397Sswallace	struct ibcs2_kill_args *uap;
4783584Ssos{
47911397Sswallace	struct kill_args ka;
4803584Ssos
48111397Sswallace	SCARG(&ka, pid) = SCARG(uap, pid);
48251793Smarcel	SCARG(&ka, signum) = ibcs2_to_bsd_sig[_SIG_IDX(SCARG(uap, signo))];
48330994Sphk	return kill(p, &ka);
4843584Ssos}
485