Module Name: src
Committed By: maxv
Date: Fri Sep 29 17:47:29 UTC 2017
Modified Files:
src/sys/compat/linux32/common: linux32_mod.c linux32_sysctl.c
linux32_sysctl.h
src/sys/kern: kern_exec.c
Log Message:
Remove compat_linux32 from the autoload list and add a enable/disable
sysctl, like compat_linux.
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/compat/linux32/common/linux32_mod.c
cvs rdiff -u -r1.16 -r1.17 src/sys/compat/linux32/common/linux32_sysctl.c
cvs rdiff -u -r1.2 -r1.3 src/sys/compat/linux32/common/linux32_sysctl.h
cvs rdiff -u -r1.445 -r1.446 src/sys/kern/kern_exec.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/linux32/common/linux32_mod.c
diff -u src/sys/compat/linux32/common/linux32_mod.c:1.7 src/sys/compat/linux32/common/linux32_mod.c:1.8
--- src/sys/compat/linux32/common/linux32_mod.c:1.7 Thu Dec 3 23:51:24 2015
+++ src/sys/compat/linux32/common/linux32_mod.c Fri Sep 29 17:47:29 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_mod.c,v 1.7 2015/12/03 23:51:24 pgoyette Exp $ */
+/* $NetBSD: linux32_mod.c,v 1.8 2017/09/29 17:47:29 maxv Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_mod.c,v 1.7 2015/12/03 23:51:24 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_mod.c,v 1.8 2017/09/29 17:47:29 maxv Exp $");
#ifdef _KERNEL_OPT
#include "opt_execfmt.h"
@@ -44,6 +44,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux32_mod.
#include <sys/module.h>
#include <sys/exec.h>
#include <sys/signalvar.h>
+#include <sys/sysctl.h>
#include <compat/linux/common/linux_exec.h>
@@ -77,6 +78,38 @@ static struct execsw linux32_execsw[] =
#endif
};
+int linux32_enabled = 0;
+
+int
+linux32_sysctl_enable(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node;
+ int error, val;
+
+ val = *(int *)rnode->sysctl_data;
+
+ node = *rnode;
+ node.sysctl_data = &val;
+
+ error = sysctl_lookup(SYSCTLFN_CALL(&node));
+ if (error != 0 || newp == NULL)
+ return error;
+
+ if (val == 1) {
+ error = exec_add(linux32_execsw, __arraycount(linux32_execsw));
+ } else if (val == 0) {
+ error = exec_remove(linux32_execsw, __arraycount(linux32_execsw));
+ } else {
+ error = EINVAL;
+ }
+ if (error)
+ return error;
+
+ *(int *)rnode->sysctl_data = val;
+
+ return 0;
+}
+
static int
compat_linux32_modcmd(modcmd_t cmd, void *arg)
{
@@ -84,19 +117,16 @@ compat_linux32_modcmd(modcmd_t cmd, void
switch (cmd) {
case MODULE_CMD_INIT:
+ linux32_enabled = 0;
linux32_sysctl_init();
- error = exec_add(linux32_execsw,
- __arraycount(linux32_execsw));
- if (error != 0)
- linux32_sysctl_fini();
- return error;
+ return 0;
case MODULE_CMD_FINI:
- error = exec_remove(linux32_execsw,
- __arraycount(linux32_execsw));
- if (error == 0)
- linux32_sysctl_fini();
- return error;
+ error = exec_remove(linux32_execsw, __arraycount(linux32_execsw));
+ if (error)
+ return error;
+ linux32_sysctl_fini();
+ return 0;
default:
return ENOTTY;
Index: src/sys/compat/linux32/common/linux32_sysctl.c
diff -u src/sys/compat/linux32/common/linux32_sysctl.c:1.16 src/sys/compat/linux32/common/linux32_sysctl.c:1.17
--- src/sys/compat/linux32/common/linux32_sysctl.c:1.16 Fri May 16 12:22:32 2014
+++ src/sys/compat/linux32/common/linux32_sysctl.c Fri Sep 29 17:47:29 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_sysctl.c,v 1.16 2014/05/16 12:22:32 martin Exp $ */
+/* $NetBSD: linux32_sysctl.c,v 1.17 2017/09/29 17:47:29 maxv Exp $ */
/*-
* Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -31,7 +31,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_sysctl.c,v 1.16 2014/05/16 12:22:32 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_sysctl.c,v 1.17 2017/09/29 17:47:29 maxv Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -70,6 +70,7 @@ struct sysctlnode linux32_sysctl_root =
static struct sysctllog *linux32_clog1;
static struct sysctllog *linux32_clog2;
+extern int linux32_enabled;
void
linux32_sysctl_fini(void)
@@ -119,6 +120,12 @@ linux32_sysctl_init(void)
NULL, 0, linux32_version, sizeof(linux32_version),
CTL_EMUL, EMUL_LINUX32, EMUL_LINUX32_KERN,
EMUL_LINUX32_KERN_VERSION, CTL_EOL);
+ sysctl_createv(&linux32_clog1, 0, NULL, NULL,
+ CTLFLAG_READWRITE,
+ CTLTYPE_INT, "enabled",
+ SYSCTL_DESCR("Linux 32 bit compat enabled."),
+ linux32_sysctl_enable, 0, &linux32_enabled, 0,
+ CTL_EMUL, EMUL_LINUX32, CTL_CREATE, CTL_EOL);
sysctl_createv(&linux32_clog2, 0, &node, &node,
CTLFLAG_PERMANENT,
Index: src/sys/compat/linux32/common/linux32_sysctl.h
diff -u src/sys/compat/linux32/common/linux32_sysctl.h:1.2 src/sys/compat/linux32/common/linux32_sysctl.h:1.3
--- src/sys/compat/linux32/common/linux32_sysctl.h:1.2 Wed Nov 19 18:36:04 2008
+++ src/sys/compat/linux32/common/linux32_sysctl.h Fri Sep 29 17:47:29 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_sysctl.h,v 1.2 2008/11/19 18:36:04 ad Exp $ */
+/* $NetBSD: linux32_sysctl.h,v 1.3 2017/09/29 17:47:29 maxv Exp $ */
/*-
* Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -61,4 +61,6 @@ extern char linux32_version[];
void linux32_sysctl_init(void);
void linux32_sysctl_fini(void);
+int linux32_sysctl_enable(SYSCTLFN_PROTO);
+
#endif /* !_LINUX32_SYSCTL_H */
Index: src/sys/kern/kern_exec.c
diff -u src/sys/kern/kern_exec.c:1.445 src/sys/kern/kern_exec.c:1.446
--- src/sys/kern/kern_exec.c:1.445 Fri Sep 29 17:08:00 2017
+++ src/sys/kern/kern_exec.c Fri Sep 29 17:47:29 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_exec.c,v 1.445 2017/09/29 17:08:00 maxv Exp $ */
+/* $NetBSD: kern_exec.c,v 1.446 2017/09/29 17:47:29 maxv Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -59,7 +59,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.445 2017/09/29 17:08:00 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.446 2017/09/29 17:47:29 maxv Exp $");
#include "opt_exec.h"
#include "opt_execfmt.h"
@@ -578,7 +578,6 @@ exec_autoload(void)
"exec_coff",
"exec_ecoff",
"compat_aoutm68k",
- "compat_linux32",
"compat_netbsd32",
"compat_sunos",
"compat_sunos32",