190792Sgshapiro/* $NetBSD: kern_sig_13.c,v 1.22 2021/09/07 11:43:02 riastradh Exp $ */ 2261363Sgshapiro 390792Sgshapiro/*- 490792Sgshapiro * Copyright (c) 1998 The NetBSD Foundation, Inc. 590792Sgshapiro * All rights reserved. 690792Sgshapiro * 790792Sgshapiro * This code is derived from software contributed to The NetBSD Foundation 890792Sgshapiro * by Charles M. Hannum. 990792Sgshapiro * 1090792Sgshapiro * Redistribution and use in source and binary forms, with or without 1190792Sgshapiro * modification, are permitted provided that the following conditions 12266692Sgshapiro * are met: 1390792Sgshapiro * 1. Redistributions of source code must retain the above copyright 1490792Sgshapiro * notice, this list of conditions and the following disclaimer. 1590792Sgshapiro * 2. Redistributions in binary form must reproduce the above copyright 1690792Sgshapiro * notice, this list of conditions and the following disclaimer in the 1790792Sgshapiro * documentation and/or other materials provided with the distribution. 1890792Sgshapiro * 1990792Sgshapiro * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 2090792Sgshapiro * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2190792Sgshapiro * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2290792Sgshapiro * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 2390792Sgshapiro * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2490792Sgshapiro * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2590792Sgshapiro * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2690792Sgshapiro * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2790792Sgshapiro * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2890792Sgshapiro * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2990792Sgshapiro * POSSIBILITY OF SUCH DAMAGE. 3090792Sgshapiro */ 3190792Sgshapiro 3290792Sgshapiro#include <sys/cdefs.h> 3390792Sgshapiro__KERNEL_RCSID(0, "$NetBSD: kern_sig_13.c,v 1.22 2021/09/07 11:43:02 riastradh Exp $"); 3490792Sgshapiro 3590792Sgshapiro#if defined(_KERNEL_OPT) 3690792Sgshapiro#include "opt_compat_netbsd.h" 3790792Sgshapiro#endif 3890792Sgshapiro 3990792Sgshapiro#include <sys/param.h> 40110560Sgshapiro#include <sys/proc.h> 41110560Sgshapiro#include <sys/signal.h> 42110560Sgshapiro#include <sys/signalvar.h> 4390792Sgshapiro#include <sys/systm.h> 4490792Sgshapiro 4590792Sgshapiro#include <sys/syscall.h> 4690792Sgshapiro#include <sys/syscallvar.h> 4790792Sgshapiro#include <sys/syscallargs.h> 4890792Sgshapiro 4990792Sgshapiro#include <machine/limits.h> 5090792Sgshapiro 5190792Sgshapiro#include <compat/sys/signal.h> 5290792Sgshapiro#include <compat/sys/signalvar.h> 5390792Sgshapiro#include <compat/common/compat_util.h> 5490792Sgshapiro#include <compat/common/compat_sigaltstack.h> 5598121Sgshapiro#include <compat/common/compat_mod.h> 5690792Sgshapiro 57110560Sgshapirostatic const struct syscall_package kern_sig_13_syscalls[] = { 58110560Sgshapiro { SYS_compat_13_sigaction13, 0, (sy_call_t *)compat_13_sys_sigaction }, 59110560Sgshapiro { SYS_compat_13_sigaltstack13, 0, 60110560Sgshapiro (sy_call_t *)compat_13_sys_sigaltstack }, 61110560Sgshapiro { SYS_compat_13_sigpending13, 0, 62110560Sgshapiro (sy_call_t *)compat_13_sys_sigpending }, 63110560Sgshapiro { SYS_compat_13_sigprocmask13, 0, 64110560Sgshapiro (sy_call_t *)compat_13_sys_sigprocmask }, 65110560Sgshapiro { SYS_compat_13_sigsuspend13, 0, 6690792Sgshapiro (sy_call_t *)compat_13_sys_sigsuspend }, 6790792Sgshapiro /* compat_13_sigreturn13 is in MD code! */ 6890792Sgshapiro { SYS_compat_13_sigreturn13, 0, (sy_call_t *)compat_13_sys_sigreturn }, 69110560Sgshapiro { 0, 0, NULL } 70110560Sgshapiro}; 71110560Sgshapiro 72110560Sgshapirovoid 73110560Sgshapironative_sigset13_to_sigset(const sigset13_t *oss, sigset_t *ss) 74110560Sgshapiro{ 7590792Sgshapiro 7690792Sgshapiro memset(ss, 0, sizeof(*ss)); 77 ss->__bits[0] = *oss; 78 ss->__bits[1] = 0; 79 ss->__bits[2] = 0; 80 ss->__bits[3] = 0; 81} 82 83void 84native_sigset_to_sigset13(const sigset_t *ss, sigset13_t *oss) 85{ 86 87 *oss = ss->__bits[0]; 88} 89 90void 91native_sigaction13_to_sigaction(const struct sigaction13 *osa, struct sigaction *sa) 92{ 93 94 memset(sa, 0, sizeof(*sa)); 95 sa->sa_handler = osa->osa_handler; 96 native_sigset13_to_sigset(&osa->osa_mask, &sa->sa_mask); 97 sa->sa_flags = osa->osa_flags; 98} 99 100void 101native_sigaction_to_sigaction13(const struct sigaction *sa, struct sigaction13 *osa) 102{ 103 104 memset(osa, 0, sizeof(*osa)); 105 osa->osa_handler = sa->sa_handler; 106 native_sigset_to_sigset13(&sa->sa_mask, &osa->osa_mask); 107 osa->osa_flags = sa->sa_flags; 108} 109 110int 111compat_13_sys_sigaltstack(struct lwp *l, const struct compat_13_sys_sigaltstack_args *uap, register_t *retval) 112{ 113 /* { 114 syscallarg(const struct sigaltstack13 *) nss; 115 syscallarg(struct sigaltstack13 *) oss; 116 } */ 117 compat_sigaltstack(uap, sigaltstack13, SS_ONSTACK, SS_DISABLE); 118} 119 120int 121compat_13_sys_sigaction(struct lwp *l, const struct compat_13_sys_sigaction_args *uap, register_t *retval) 122{ 123 /* { 124 syscallarg(int) signum; 125 syscallarg(const struct sigaction13 *) nsa; 126 syscallarg(struct sigaction13 *) osa; 127 } */ 128 struct sigaction13 nesa, oesa; 129 struct sigaction nbsa, obsa; 130 int error; 131 132 if (SCARG(uap, nsa)) { 133 error = copyin(SCARG(uap, nsa), &nesa, sizeof(nesa)); 134 if (error) 135 return (error); 136 native_sigaction13_to_sigaction(&nesa, &nbsa); 137 } 138 error = sigaction1(l, SCARG(uap, signum), 139 SCARG(uap, nsa) ? &nbsa : 0, SCARG(uap, osa) ? &obsa : 0, 140 NULL, 0); 141 if (error) 142 return (error); 143 if (SCARG(uap, osa)) { 144 native_sigaction_to_sigaction13(&obsa, &oesa); 145 error = copyout(&oesa, SCARG(uap, osa), sizeof(oesa)); 146 if (error) 147 return (error); 148 } 149 return (0); 150} 151 152int 153compat_13_sys_sigprocmask(struct lwp *l, const struct compat_13_sys_sigprocmask_args *uap, register_t *retval) 154{ 155 /* { 156 syscallarg(int) how; 157 syscallarg(int) mask; 158 } */ 159 struct proc *p = l->l_proc; 160 sigset13_t ness, oess; 161 sigset_t nbss, obss; 162 int error; 163 164 ness = SCARG(uap, mask); 165 native_sigset13_to_sigset(&ness, &nbss); 166 mutex_enter(p->p_lock); 167 error = sigprocmask1(l, SCARG(uap, how), &nbss, &obss); 168 mutex_exit(p->p_lock); 169 if (error) 170 return (error); 171 native_sigset_to_sigset13(&obss, &oess); 172 *retval = oess; 173 return (0); 174} 175 176int 177compat_13_sys_sigpending(struct lwp *l, const void *v, register_t *retval) 178{ 179 sigset13_t ess; 180 sigset_t bss; 181 182 sigpending1(l, &bss); 183 native_sigset_to_sigset13(&bss, &ess); 184 *retval = ess; 185 return (0); 186} 187 188int 189compat_13_sys_sigsuspend(struct lwp *l, const struct compat_13_sys_sigsuspend_args *uap, register_t *retval) 190{ 191 /* { 192 syscallarg(sigset13_t) mask; 193 } */ 194 sigset13_t ess; 195 sigset_t bss; 196 197 ess = SCARG(uap, mask); 198 native_sigset13_to_sigset(&ess, &bss); 199 return (sigsuspend1(l, &bss)); 200} 201 202int 203kern_sig_13_init(void) 204{ 205 206 return syscall_establish(NULL, kern_sig_13_syscalls); 207} 208 209int 210kern_sig_13_fini(void) 211{ 212 213 return syscall_disestablish(NULL, kern_sig_13_syscalls); 214} 215