Module Name:    src
Committed By:   maxv
Date:           Tue Jul 22 08:18:33 UTC 2014

Modified Files:
        src/sys/compat/linux32/common: linux32_mod.c
        src/sys/compat/netbsd32: netbsd32_mod.c
        src/sys/kern: exec_elf32.c exec_elf64.c

Log Message:
1) On 64bit systems, don't add the 32bit execsw[] to the global exec array.
   exec_elf32 works on 32bit systems only, and will crash 32bit binaries on
   64bit systems.
2) Now that exec_elf32 is dormant, we can give the native ELF loaders the
   highest priority.

Binaries will load faster now (system boot, compilation, etc.).

With the help of njloy@. Discussed a bit on tech-kern@, no disagreement.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/compat/linux32/common/linux32_mod.c
cvs rdiff -u -r1.4 -r1.5 src/sys/compat/netbsd32/netbsd32_mod.c
cvs rdiff -u -r1.140 -r1.141 src/sys/kern/exec_elf32.c
cvs rdiff -u -r1.5 -r1.6 src/sys/kern/exec_elf64.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.5 src/sys/compat/linux32/common/linux32_mod.c:1.6
--- src/sys/compat/linux32/common/linux32_mod.c:1.5	Fri Mar  7 01:33:43 2014
+++ src/sys/compat/linux32/common/linux32_mod.c	Tue Jul 22 08:18:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux32_mod.c,v 1.5 2014/03/07 01:33:43 christos Exp $	*/
+/*	$NetBSD: linux32_mod.c,v 1.6 2014/07/22 08:18:33 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.5 2014/03/07 01:33:43 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_mod.c,v 1.6 2014/07/22 08:18:33 maxv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_execfmt.h"
@@ -67,7 +67,7 @@ static struct execsw linux32_execsw[] = 
 			.elf_probe_func = linux32_elf32_probe, 
 		},
 		.es_emul = &emul_linux32,
-		.es_prio = EXECSW_PRIO_FIRST, 
+		.es_prio = EXECSW_PRIO_ANY, 
 		.es_arglen = LINUX32_ELF_AUX_ARGSIZ,
 		.es_copyargs = linux32_elf32_copyargs,
 		.es_setregs = NULL,

Index: src/sys/compat/netbsd32/netbsd32_mod.c
diff -u src/sys/compat/netbsd32/netbsd32_mod.c:1.4 src/sys/compat/netbsd32/netbsd32_mod.c:1.5
--- src/sys/compat/netbsd32/netbsd32_mod.c:1.4	Fri Jul 11 16:22:49 2014
+++ src/sys/compat/netbsd32/netbsd32_mod.c	Tue Jul 22 08:18:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_mod.c,v 1.4 2014/07/11 16:22:49 maxv Exp $	*/
+/*	$NetBSD: netbsd32_mod.c,v 1.5 2014/07/22 08:18:33 maxv Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_mod.c,v 1.4 2014/07/11 16:22:49 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_mod.c,v 1.5 2014/07/22 08:18:33 maxv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_execfmt.h"
@@ -87,7 +87,7 @@ static struct execsw netbsd32_execsw[] =
 			.elf_probe_func = netbsd32_elf32_probe,
 		},
 		.es_emul = &emul_netbsd32,
-		.es_prio = EXECSW_PRIO_FIRST,
+		.es_prio = EXECSW_PRIO_ANY,
 		.es_arglen = ELF32_AUXSIZE,
 		.es_copyargs = netbsd32_elf32_copyargs,
 		.es_setregs = NULL,

Index: src/sys/kern/exec_elf32.c
diff -u src/sys/kern/exec_elf32.c:1.140 src/sys/kern/exec_elf32.c:1.141
--- src/sys/kern/exec_elf32.c:1.140	Mon Apr  7 17:02:15 2014
+++ src/sys/kern/exec_elf32.c	Tue Jul 22 08:18:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: exec_elf32.c,v 1.140 2014/04/07 17:02:15 rjs Exp $	*/
+/*	$NetBSD: exec_elf32.c,v 1.141 2014/07/22 08:18:33 maxv Exp $	*/
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exec_elf32.c,v 1.140 2014/04/07 17:02:15 rjs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exec_elf32.c,v 1.141 2014/07/22 08:18:33 maxv Exp $");
 
 #define	ELFSIZE	32
 
@@ -59,7 +59,7 @@ static struct execsw exec_elf32_execsw[]
 			.elf_probe_func = netbsd_elf32_probe,
 		},
 		.es_emul = &emul_netbsd,
-		.es_prio = EXECSW_PRIO_ANY,
+		.es_prio = EXECSW_PRIO_FIRST,
 		.es_arglen = ELF32_AUXSIZE,
 		.es_copyargs = elf32_copyargs,
 		.es_setregs = NULL,
@@ -87,7 +87,28 @@ static struct execsw exec_elf32_execsw[]
 static int
 exec_elf32_modcmd(modcmd_t cmd, void *arg)
 {
+#if ARCH_ELFSIZE == 64
+	/*
+	 * If we are on a 64bit system, we don't want the 32bit execsw[] to be
+	 * added in the global array, because the exec_elf32 module only works
+	 * on 32bit systems.
+	 *
+	 * However, we need the exec_elf32 module, because it will make the 32bit
+	 * functions available for netbsd32 and linux32.
+	 *
+	 * Therefore, allow this module on 64bit systems, but make it dormant.
+	 */
 
+	(void)exec_elf32_execsw; /* unused */
+
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+	case MODULE_CMD_FINI:
+		return 0;
+	default:
+		return ENOTTY;
+	}
+#else /* ARCH_ELFSIZE == 64 */
 	switch (cmd) {
 	case MODULE_CMD_INIT:
 		return exec_add(exec_elf32_execsw,
@@ -100,4 +121,5 @@ exec_elf32_modcmd(modcmd_t cmd, void *ar
 	default:
 		return ENOTTY;
         }
+#endif /* ARCH_ELFSIZE == 64 */
 }

Index: src/sys/kern/exec_elf64.c
diff -u src/sys/kern/exec_elf64.c:1.5 src/sys/kern/exec_elf64.c:1.6
--- src/sys/kern/exec_elf64.c:1.5	Fri Mar  7 01:34:29 2014
+++ src/sys/kern/exec_elf64.c	Tue Jul 22 08:18:33 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: exec_elf64.c,v 1.5 2014/03/07 01:34:29 christos Exp $	*/
+/*	$NetBSD: exec_elf64.c,v 1.6 2014/07/22 08:18:33 maxv Exp $	*/
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exec_elf64.c,v 1.5 2014/03/07 01:34:29 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exec_elf64.c,v 1.6 2014/07/22 08:18:33 maxv Exp $");
 
 #define	ELFSIZE	64
 
@@ -60,7 +60,7 @@ static struct execsw exec_elf64_execsw[]
 			.elf_probe_func = netbsd_elf64_probe,
 		},
 		.es_emul = &emul_netbsd,
-		.es_prio = EXECSW_PRIO_ANY,
+		.es_prio = EXECSW_PRIO_FIRST,
 		.es_arglen = ELF64_AUXSIZE,
 		.es_copyargs = elf64_copyargs,
 		.es_setregs = NULL,

Reply via email to