1*b07ec3fcSad /* $NetBSD: kern_sig_13.c,v 1.14 2007/02/09 21:55:16 ad Exp $ */ 2a255f23eSkleink 3a255f23eSkleink /*- 4fb526e05Smycroft * Copyright (c) 1998 The NetBSD Foundation, Inc. 5a255f23eSkleink * All rights reserved. 6a255f23eSkleink * 7a255f23eSkleink * This code is derived from software contributed to The NetBSD Foundation 8fb526e05Smycroft * by Charles M. Hannum. 9a255f23eSkleink * 10a255f23eSkleink * Redistribution and use in source and binary forms, with or without 11a255f23eSkleink * modification, are permitted provided that the following conditions 12a255f23eSkleink * are met: 13a255f23eSkleink * 1. Redistributions of source code must retain the above copyright 14a255f23eSkleink * notice, this list of conditions and the following disclaimer. 15a255f23eSkleink * 2. Redistributions in binary form must reproduce the above copyright 16a255f23eSkleink * notice, this list of conditions and the following disclaimer in the 17a255f23eSkleink * documentation and/or other materials provided with the distribution. 18a255f23eSkleink * 3. All advertising materials mentioning features or use of this software 19a255f23eSkleink * must display the following acknowledgement: 20a255f23eSkleink * This product includes software developed by the NetBSD 21a255f23eSkleink * Foundation, Inc. and its contributors. 22a255f23eSkleink * 4. Neither the name of The NetBSD Foundation nor the names of its 23a255f23eSkleink * contributors may be used to endorse or promote products derived 24a255f23eSkleink * from this software without specific prior written permission. 25a255f23eSkleink * 26a255f23eSkleink * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27a255f23eSkleink * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28a255f23eSkleink * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29a255f23eSkleink * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30a255f23eSkleink * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31a255f23eSkleink * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32a255f23eSkleink * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33a255f23eSkleink * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34a255f23eSkleink * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35a255f23eSkleink * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36a255f23eSkleink * POSSIBILITY OF SUCH DAMAGE. 37a255f23eSkleink */ 38a255f23eSkleink 39dab6ef8bSlukem #include <sys/cdefs.h> 40*b07ec3fcSad __KERNEL_RCSID(0, "$NetBSD: kern_sig_13.c,v 1.14 2007/02/09 21:55:16 ad Exp $"); 41dab6ef8bSlukem 42a255f23eSkleink #include <sys/param.h> 43a255f23eSkleink #include <sys/proc.h> 44a255f23eSkleink #include <sys/signal.h> 45fb526e05Smycroft #include <sys/signalvar.h> 46a255f23eSkleink #include <sys/systm.h> 47a255f23eSkleink 48a255f23eSkleink #include <sys/mount.h> 49a255f23eSkleink #include <sys/syscallargs.h> 50a255f23eSkleink 515d7a8f4aSkleink #include <machine/limits.h> 525d7a8f4aSkleink 53063b880cSchristos #include <compat/sys/signal.h> 54063b880cSchristos #include <compat/sys/signalvar.h> 55a255f23eSkleink #include <compat/common/compat_util.h> 56a255f23eSkleink 57fb526e05Smycroft void 58fb526e05Smycroft native_sigset13_to_sigset(oss, ss) 59fb526e05Smycroft const sigset13_t *oss; 60fb526e05Smycroft sigset_t *ss; 61fb526e05Smycroft { 62fb526e05Smycroft 63fb526e05Smycroft ss->__bits[0] = *oss; 64fb526e05Smycroft ss->__bits[1] = 0; 65fb526e05Smycroft ss->__bits[2] = 0; 66fb526e05Smycroft ss->__bits[3] = 0; 67fb526e05Smycroft } 68fb526e05Smycroft 69fb526e05Smycroft void 70fb526e05Smycroft native_sigset_to_sigset13(ss, oss) 71fb526e05Smycroft const sigset_t *ss; 72fb526e05Smycroft sigset13_t *oss; 73fb526e05Smycroft { 74fb526e05Smycroft 75fb526e05Smycroft *oss = ss->__bits[0]; 76fb526e05Smycroft } 77fb526e05Smycroft 78fb526e05Smycroft void 79fb526e05Smycroft native_sigaction13_to_sigaction(osa, sa) 80fb526e05Smycroft const struct sigaction13 *osa; 81fb526e05Smycroft struct sigaction *sa; 82fb526e05Smycroft { 83fb526e05Smycroft 84116bcb05Schristos sa->sa_handler = osa->osa_handler; 85116bcb05Schristos native_sigset13_to_sigset(&osa->osa_mask, &sa->sa_mask); 86116bcb05Schristos sa->sa_flags = osa->osa_flags; 87fb526e05Smycroft } 88fb526e05Smycroft 89fb526e05Smycroft void 90fb526e05Smycroft native_sigaction_to_sigaction13(sa, osa) 91fb526e05Smycroft const struct sigaction *sa; 92fb526e05Smycroft struct sigaction13 *osa; 93fb526e05Smycroft { 94fb526e05Smycroft 95116bcb05Schristos osa->osa_handler = sa->sa_handler; 96116bcb05Schristos native_sigset_to_sigset13(&sa->sa_mask, &osa->osa_mask); 97116bcb05Schristos osa->osa_flags = sa->sa_flags; 98fb526e05Smycroft } 99fb526e05Smycroft 100fb526e05Smycroft void 101fb526e05Smycroft native_sigaltstack13_to_sigaltstack(osa, sa) 102fb526e05Smycroft const struct sigaltstack13 *osa; 103fb526e05Smycroft struct sigaltstack *sa; 104fb526e05Smycroft { 105fb526e05Smycroft 106fb526e05Smycroft sa->ss_sp = osa->ss_sp; 107fb526e05Smycroft sa->ss_size = osa->ss_size; 108fb526e05Smycroft sa->ss_flags = osa->ss_flags; 109fb526e05Smycroft } 110fb526e05Smycroft 111fb526e05Smycroft void 112fb526e05Smycroft native_sigaltstack_to_sigaltstack13(sa, osa) 113fb526e05Smycroft const struct sigaltstack *sa; 114fb526e05Smycroft struct sigaltstack13 *osa; 115fb526e05Smycroft { 116fb526e05Smycroft 117fb526e05Smycroft osa->ss_sp = sa->ss_sp; 118fb526e05Smycroft osa->ss_size = sa->ss_size; 119fb526e05Smycroft osa->ss_flags = sa->ss_flags; 120fb526e05Smycroft } 121a255f23eSkleink 122a255f23eSkleink int 123168cd830Schristos compat_13_sys_sigaltstack(struct lwp *l, void *v, register_t *retval) 124a255f23eSkleink { 125a255f23eSkleink struct compat_13_sys_sigaltstack_args /* { 126a255f23eSkleink syscallarg(const struct sigaltstack13 *) nss; 127a255f23eSkleink syscallarg(struct sigaltstack13 *) oss; 128a255f23eSkleink } */ *uap = v; 129fb526e05Smycroft struct sigaltstack13 ness, oess; 130fb526e05Smycroft struct sigaltstack nbss, obss; 131a255f23eSkleink int error; 132a255f23eSkleink 133fb526e05Smycroft if (SCARG(uap, nss)) { 134fb526e05Smycroft error = copyin(SCARG(uap, nss), &ness, sizeof(ness)); 135fb526e05Smycroft if (error) 136a255f23eSkleink return (error); 137fb526e05Smycroft native_sigaltstack13_to_sigaltstack(&ness, &nbss); 138fb526e05Smycroft } 139*b07ec3fcSad error = sigaltstack1(l, 140fb526e05Smycroft SCARG(uap, nss) ? &nbss : 0, SCARG(uap, oss) ? &obss : 0); 141fb526e05Smycroft if (error) 142a255f23eSkleink return (error); 143fb526e05Smycroft if (SCARG(uap, oss)) { 144fb526e05Smycroft native_sigaltstack_to_sigaltstack13(&obss, &oess); 145fb526e05Smycroft error = copyout(&oess, SCARG(uap, oss), sizeof(oess)); 146fb526e05Smycroft if (error) 147a255f23eSkleink return (error); 148a255f23eSkleink } 149a255f23eSkleink return (0); 150a255f23eSkleink } 151fb526e05Smycroft 152fb526e05Smycroft int 153168cd830Schristos compat_13_sys_sigaction(struct lwp *l, void *v, register_t *retval) 154fb526e05Smycroft { 155fb526e05Smycroft struct compat_13_sys_sigaction_args /* { 156fb526e05Smycroft syscallarg(int) signum; 157fb526e05Smycroft syscallarg(const struct sigaction13 *) nsa; 158fb526e05Smycroft syscallarg(struct sigaction13 *) osa; 159fb526e05Smycroft } */ *uap = v; 160fb526e05Smycroft struct sigaction13 nesa, oesa; 161fb526e05Smycroft struct sigaction nbsa, obsa; 162fb526e05Smycroft int error; 163fb526e05Smycroft 164fb526e05Smycroft if (SCARG(uap, nsa)) { 165fb526e05Smycroft error = copyin(SCARG(uap, nsa), &nesa, sizeof(nesa)); 166fb526e05Smycroft if (error) 167fb526e05Smycroft return (error); 168fb526e05Smycroft native_sigaction13_to_sigaction(&nesa, &nbsa); 169fb526e05Smycroft } 170*b07ec3fcSad error = sigaction1(l, SCARG(uap, signum), 171011d4d5fSthorpej SCARG(uap, nsa) ? &nbsa : 0, SCARG(uap, osa) ? &obsa : 0, 172011d4d5fSthorpej NULL, 0); 173fb526e05Smycroft if (error) 174fb526e05Smycroft return (error); 175fb526e05Smycroft if (SCARG(uap, osa)) { 176fb526e05Smycroft native_sigaction_to_sigaction13(&obsa, &oesa); 177fb526e05Smycroft error = copyout(&oesa, SCARG(uap, osa), sizeof(oesa)); 178fb526e05Smycroft if (error) 179fb526e05Smycroft return (error); 180fb526e05Smycroft } 181fb526e05Smycroft return (0); 182fb526e05Smycroft } 183fb526e05Smycroft 184fb526e05Smycroft int 1856762b37eSthorpej compat_13_sys_sigprocmask(struct lwp *l, void *v, register_t *retval) 186fb526e05Smycroft { 187fb526e05Smycroft struct compat_13_sys_sigprocmask_args /* { 188fb526e05Smycroft syscallarg(int) how; 189fb526e05Smycroft syscallarg(int) mask; 190fb526e05Smycroft } */ *uap = v; 1916762b37eSthorpej struct proc *p = l->l_proc; 192fb526e05Smycroft sigset13_t ness, oess; 193fb526e05Smycroft sigset_t nbss, obss; 194fb526e05Smycroft int error; 195fb526e05Smycroft 196fb526e05Smycroft ness = SCARG(uap, mask); 197fb526e05Smycroft native_sigset13_to_sigset(&ness, &nbss); 198*b07ec3fcSad mutex_enter(&p->p_smutex); 199*b07ec3fcSad error = sigprocmask1(l, SCARG(uap, how), &nbss, &obss); 200*b07ec3fcSad mutex_exit(&p->p_smutex); 201fb526e05Smycroft if (error) 202fb526e05Smycroft return (error); 203fb526e05Smycroft native_sigset_to_sigset13(&obss, &oess); 204fb526e05Smycroft *retval = oess; 205fb526e05Smycroft return (0); 206fb526e05Smycroft } 207fb526e05Smycroft 208fb526e05Smycroft int 209168cd830Schristos compat_13_sys_sigpending(struct lwp *l, void *v, register_t *retval) 210fb526e05Smycroft { 211fb526e05Smycroft sigset13_t ess; 212fb526e05Smycroft sigset_t bss; 213fb526e05Smycroft 214*b07ec3fcSad sigpending1(l, &bss); 215fb526e05Smycroft native_sigset_to_sigset13(&bss, &ess); 216fb526e05Smycroft *retval = ess; 217fb526e05Smycroft return (0); 218fb526e05Smycroft } 219fb526e05Smycroft 220fb526e05Smycroft int 221168cd830Schristos compat_13_sys_sigsuspend(struct lwp *l, void *v, register_t *retval) 222fb526e05Smycroft { 223fb526e05Smycroft struct compat_13_sys_sigsuspend_args /* { 224fb526e05Smycroft syscallarg(sigset13_t) mask; 225fb526e05Smycroft } */ *uap = v; 226fb526e05Smycroft sigset13_t ess; 227fb526e05Smycroft sigset_t bss; 228fb526e05Smycroft 229fb526e05Smycroft ess = SCARG(uap, mask); 230fb526e05Smycroft native_sigset13_to_sigset(&ess, &bss); 231*b07ec3fcSad return (sigsuspend1(l, &bss)); 232fb526e05Smycroft } 233