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