Module Name: src Committed By: mlelstv Date: Wed May 1 11:32:29 UTC 2024
Modified Files: src/sys/compat/netbsd32: netbsd32_compat_16.c Log Message: Enable compat sigreturn system call. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/compat/netbsd32/netbsd32_compat_16.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/netbsd32/netbsd32_compat_16.c diff -u src/sys/compat/netbsd32/netbsd32_compat_16.c:1.4 src/sys/compat/netbsd32/netbsd32_compat_16.c:1.5 --- src/sys/compat/netbsd32/netbsd32_compat_16.c:1.4 Fri Nov 26 08:06:11 2021 +++ src/sys/compat/netbsd32/netbsd32_compat_16.c Wed May 1 11:32:29 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32_compat_16.c,v 1.4 2021/11/26 08:06:11 ryo Exp $ */ +/* $NetBSD: netbsd32_compat_16.c,v 1.5 2024/05/01 11:32:29 mlelstv Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -29,13 +29,14 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_16.c,v 1.4 2021/11/26 08:06:11 ryo Exp $"); +__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_16.c,v 1.5 2024/05/01 11:32:29 mlelstv Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/module.h> #include <sys/dirent.h> #include <sys/exec.h> +#include <sys/proc.h> #include <sys/lwp.h> #include <sys/syscallargs.h> #include <sys/syscallvar.h> @@ -47,40 +48,87 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_com struct uvm_object *emul_netbsd32_object; -MODULE(MODULE_CLASS_EXEC, compat_netbsd32_16, "compat_netbsd32_20,compat_16"); +static const struct syscall_package netbsd32_kern_sig_16_syscalls[] = { + /* compat_16_netbs32___sigreturn14 is in MD code! */ + { NETBSD32_SYS_compat_16_netbsd32___sigreturn14, 0, + (sy_call_t *)compat_16_netbsd32___sigreturn14 }, + { 0, 0, NULL } +}; static int -compat_netbsd32_16_modcmd(modcmd_t cmd, void *arg) +compat_netbsd32_16_init(void) +{ + int error; + + error = syscall_establish(&emul_netbsd32, netbsd32_kern_sig_16_syscalls); + if (error) + return error; + + rw_enter(&exec_lock, RW_WRITER); + emul_netbsd32.e_sigcode = netbsd32_sigcode; + emul_netbsd32.e_esigcode = netbsd32_esigcode; + emul_netbsd32.e_sigobject = &emul_netbsd32_object; + error = exec_sigcode_alloc(&emul_netbsd); + if (error) { + emul_netbsd32.e_sigcode = NULL; + emul_netbsd32.e_esigcode = NULL; + emul_netbsd32.e_sigobject = NULL; + } + rw_exit(&exec_lock); + if (error) + return error; + netbsd32_machdep_md_16_init(); + return 0; +} + +static int +compat_netbsd32_16_fini(void) { + proc_t *p; int error; + error = syscall_disestablish(&emul_netbsd32, netbsd32_kern_sig_16_syscalls); + if (error) + return error; + /* + * Ensure sendsig_sigcontext() is not being used. + * module_lock prevents the flag being set on any + * further processes while we are here. See + * sigaction1() for the opposing half. + */ + mutex_enter(&proc_lock); + PROCLIST_FOREACH(p, &allproc) { + if ((p->p_lflag & PL_SIGCOMPAT) != 0) { + break; + } + } + mutex_exit(&proc_lock); + if (p != NULL) { + syscall_establish(&emul_netbsd32, netbsd32_kern_sig_16_syscalls); + return EBUSY; + } + + rw_enter(&exec_lock, RW_WRITER); + exec_sigcode_free(&emul_netbsd); + emul_netbsd32.e_sigcode = NULL; + emul_netbsd32.e_esigcode = NULL; + emul_netbsd32.e_sigobject = NULL; + rw_exit(&exec_lock); + netbsd32_machdep_md_16_fini(); + return 0; +} + +MODULE(MODULE_CLASS_EXEC, compat_netbsd32_16, "compat_netbsd32_20,compat_16"); + +static int +compat_netbsd32_16_modcmd(modcmd_t cmd, void *arg) +{ switch (cmd) { case MODULE_CMD_INIT: - rw_enter(&exec_lock, RW_WRITER); - emul_netbsd32.e_sigcode = netbsd32_sigcode; - emul_netbsd32.e_esigcode = netbsd32_esigcode; - emul_netbsd32.e_sigobject = &emul_netbsd32_object; - error = exec_sigcode_alloc(&emul_netbsd); - if (error) { - emul_netbsd32.e_sigcode = NULL; - emul_netbsd32.e_esigcode = NULL; - emul_netbsd32.e_sigobject = NULL; - } - rw_exit(&exec_lock); - if (error) - return error; - netbsd32_machdep_md_16_init(); - return 0; + return compat_netbsd32_16_init(); case MODULE_CMD_FINI: - rw_enter(&exec_lock, RW_WRITER); - exec_sigcode_free(&emul_netbsd); - emul_netbsd32.e_sigcode = NULL; - emul_netbsd32.e_esigcode = NULL; - emul_netbsd32.e_sigobject = NULL; - rw_exit(&exec_lock); - netbsd32_machdep_md_16_fini(); - return 0; + return compat_netbsd32_16_fini(); default: return ENOTTY;