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