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;