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