svn commit: r346829 - in stable/11/sys: amd64/linux amd64/linux32 compat/linux i386/linux
Dmitry Chagin
dchagin at FreeBSD.org
Sun Apr 28 13:42:36 UTC 2019
Author: dchagin
Date: Sun Apr 28 13:42:34 2019
New Revision: 346829
URL: https://svnweb.freebsd.org/changeset/base/346829
Log:
MFC r332333 (by emaste@):
linuxulator: deduplicate linux_exec_imgact_try
Previously linuxulator had three identical copies of
linux_exec_imgact_try. Deduplicate before adding another arch to
linuxulator.
Modified:
stable/11/sys/amd64/linux/linux_sysvec.c
stable/11/sys/amd64/linux32/linux32_sysvec.c
stable/11/sys/compat/linux/linux_emul.c
stable/11/sys/compat/linux/linux_emul.h
stable/11/sys/i386/linux/linux_sysvec.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/amd64/linux/linux_sysvec.c
==============================================================================
--- stable/11/sys/amd64/linux/linux_sysvec.c Sun Apr 28 13:41:23 2019 (r346828)
+++ stable/11/sys/amd64/linux/linux_sysvec.c Sun Apr 28 13:42:34 2019 (r346829)
@@ -87,12 +87,6 @@ __FBSDID("$FreeBSD$");
MODULE_VERSION(linux64, 1);
-#if BYTE_ORDER == LITTLE_ENDIAN
-#define SHELLMAGIC 0x2123 /* #! */
-#else
-#define SHELLMAGIC 0x2321
-#endif
-
#if defined(DEBUG)
SYSCTL_PROC(_compat_linux, OID_AUTO, debug,
CTLTYPE_STRING | CTLFLAG_RW,
@@ -126,7 +120,6 @@ static void linux_vdso_install(void *param);
static void linux_vdso_deinstall(void *param);
static void linux_set_syscall_retval(struct thread *td, int error);
static int linux_fetch_syscall_args(struct thread *td);
-static int linux_exec_imgact_try(struct image_params *iparams);
static void linux_exec_setregs(struct thread *td, struct image_params *imgp,
u_long stack);
static int linux_vsyscall(struct thread *td);
@@ -661,42 +654,6 @@ linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigse
set_pcb_flags(td->td_pcb, PCB_FULL_IRET);
PROC_LOCK(p);
mtx_lock(&psp->ps_mtx);
-}
-
-/*
- * If a Linux binary is exec'ing something, try this image activator
- * first. We override standard shell script execution in order to
- * be able to modify the interpreter path. We only do this if a Linux
- * binary is doing the exec, so we do not create an EXEC module for it.
- */
-static int
-linux_exec_imgact_try(struct image_params *imgp)
-{
- const char *head = (const char *)imgp->image_header;
- char *rpath;
- int error = -1;
-
- /*
- * The interpreter for shell scripts run from a Linux binary needs
- * to be located in /compat/linux if possible in order to recursively
- * maintain Linux path emulation.
- */
- if (((const short *)head)[0] == SHELLMAGIC) {
- /*
- * Run our normal shell image activator. If it succeeds then
- * attempt to use the alternate path for the interpreter. If
- * an alternate path is found, use our stringspace to store it.
- */
- if ((error = exec_shell_imgact(imgp)) == 0) {
- linux_emul_convpath(FIRST_THREAD_IN_PROC(imgp->proc),
- imgp->interpreter_name, UIO_SYSSPACE, &rpath, 0,
- AT_FDCWD);
- if (rpath != NULL)
- imgp->args->fname_buf =
- imgp->interpreter_name = rpath;
- }
- }
- return (error);
}
#define LINUX_VSYSCALL_START (-10UL << 20)
Modified: stable/11/sys/amd64/linux32/linux32_sysvec.c
==============================================================================
--- stable/11/sys/amd64/linux32/linux32_sysvec.c Sun Apr 28 13:41:23 2019 (r346828)
+++ stable/11/sys/amd64/linux32/linux32_sysvec.c Sun Apr 28 13:42:34 2019 (r346829)
@@ -95,12 +95,6 @@ MODULE_VERSION(linux, 1);
suword32(pos++, val); \
} while (0)
-#if BYTE_ORDER == LITTLE_ENDIAN
-#define SHELLMAGIC 0x2123 /* #! */
-#else
-#define SHELLMAGIC 0x2321
-#endif
-
/*
* Allow the sendsig functions to use the ldebug() facility even though they
* are not syscalls themselves. Map them to syscall 0. This is slightly less
@@ -124,7 +118,6 @@ static int linux_fixup_elf(register_t **stack_base,
struct image_params *iparams);
static register_t *linux_copyout_strings(struct image_params *imgp);
static void linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask);
-static int linux_exec_imgact_try(struct image_params *iparams);
static void linux_exec_setregs(struct thread *td,
struct image_params *imgp, u_long stack);
static void linux32_fixlimit(struct rlimit *rl, int which);
@@ -715,42 +708,6 @@ linux32_fetch_syscall_args(struct thread *td)
td->td_retval[1] = frame->tf_rdx;
return (0);
-}
-
-/*
- * If a Linux binary is exec'ing something, try this image activator
- * first. We override standard shell script execution in order to
- * be able to modify the interpreter path. We only do this if a Linux
- * binary is doing the exec, so we do not create an EXEC module for it.
- */
-static int
-linux_exec_imgact_try(struct image_params *imgp)
-{
- const char *head = (const char *)imgp->image_header;
- char *rpath;
- int error = -1;
-
- /*
- * The interpreter for shell scripts run from a Linux binary needs
- * to be located in /compat/linux if possible in order to recursively
- * maintain Linux path emulation.
- */
- if (((const short *)head)[0] == SHELLMAGIC) {
- /*
- * Run our normal shell image activator. If it succeeds then
- * attempt to use the alternate path for the interpreter. If
- * an alternate path is found, use our stringspace to store it.
- */
- if ((error = exec_shell_imgact(imgp)) == 0) {
- linux_emul_convpath(FIRST_THREAD_IN_PROC(imgp->proc),
- imgp->interpreter_name, UIO_SYSSPACE, &rpath, 0,
- AT_FDCWD);
- if (rpath != NULL)
- imgp->args->fname_buf =
- imgp->interpreter_name = rpath;
- }
- }
- return (error);
}
/*
Modified: stable/11/sys/compat/linux/linux_emul.c
==============================================================================
--- stable/11/sys/compat/linux/linux_emul.c Sun Apr 28 13:41:23 2019 (r346828)
+++ stable/11/sys/compat/linux/linux_emul.c Sun Apr 28 13:42:34 2019 (r346829)
@@ -1,6 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
+ * Copyright (c) 1994-1996 Søren Schmidt
* Copyright (c) 2006 Roman Divacky
* Copyright (c) 2013 Dmitry Chagin
* All rights reserved.
@@ -32,6 +33,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/fcntl.h>
#include <sys/imgact.h>
#include <sys/kernel.h>
#include <sys/ktr.h>
@@ -48,6 +50,11 @@ __FBSDID("$FreeBSD$");
#include <compat/linux/linux_persona.h>
#include <compat/linux/linux_util.h>
+#if BYTE_ORDER == LITTLE_ENDIAN
+#define SHELLMAGIC 0x2123 /* #! */
+#else
+#define SHELLMAGIC 0x2321
+#endif
/*
* This returns reference to the thread emuldata entry (if found)
@@ -166,6 +173,42 @@ linux_proc_exit(void *arg __unused, struct proc *p)
sx_destroy(&pem->pem_sx);
free(pem, M_LINUX);
+}
+
+/*
+ * If a Linux binary is exec'ing something, try this image activator
+ * first. We override standard shell script execution in order to
+ * be able to modify the interpreter path. We only do this if a Linux
+ * binary is doing the exec, so we do not create an EXEC module for it.
+ */
+int
+linux_exec_imgact_try(struct image_params *imgp)
+{
+ const char *head = (const char *)imgp->image_header;
+ char *rpath;
+ int error = -1;
+
+ /*
+ * The interpreter for shell scripts run from a Linux binary needs
+ * to be located in /compat/linux if possible in order to recursively
+ * maintain Linux path emulation.
+ */
+ if (((const short *)head)[0] == SHELLMAGIC) {
+ /*
+ * Run our normal shell image activator. If it succeeds attempt
+ * to use the alternate path for the interpreter. If an
+ * alternate path is found, use our stringspace to store it.
+ */
+ if ((error = exec_shell_imgact(imgp)) == 0) {
+ linux_emul_convpath(FIRST_THREAD_IN_PROC(imgp->proc),
+ imgp->interpreter_name, UIO_SYSSPACE, &rpath, 0,
+ AT_FDCWD);
+ if (rpath != NULL)
+ imgp->args->fname_buf =
+ imgp->interpreter_name = rpath;
+ }
+ }
+ return (error);
}
int
Modified: stable/11/sys/compat/linux/linux_emul.h
==============================================================================
--- stable/11/sys/compat/linux/linux_emul.h Sun Apr 28 13:41:23 2019 (r346828)
+++ stable/11/sys/compat/linux/linux_emul.h Sun Apr 28 13:42:34 2019 (r346829)
@@ -49,6 +49,7 @@ struct linux_emuldata {
struct linux_emuldata *em_find(struct thread *);
+int linux_exec_imgact_try(struct image_params *);
void linux_proc_init(struct thread *, struct thread *, int);
void linux_proc_exit(void *, struct proc *);
void linux_schedtail(struct thread *);
Modified: stable/11/sys/i386/linux/linux_sysvec.c
==============================================================================
--- stable/11/sys/i386/linux/linux_sysvec.c Sun Apr 28 13:41:23 2019 (r346828)
+++ stable/11/sys/i386/linux/linux_sysvec.c Sun Apr 28 13:42:34 2019 (r346829)
@@ -76,12 +76,6 @@ __FBSDID("$FreeBSD$");
MODULE_VERSION(linux, 1);
-#if BYTE_ORDER == LITTLE_ENDIAN
-#define SHELLMAGIC 0x2123 /* #! */
-#else
-#define SHELLMAGIC 0x2321
-#endif
-
#if defined(DEBUG)
SYSCTL_PROC(_compat_linux, OID_AUTO, debug, CTLTYPE_STRING | CTLFLAG_RW, 0, 0,
linux_sysctl_debug, "A", "Linux debugging control");
@@ -112,7 +106,6 @@ static int linux_fixup(register_t **stack_base,
static int linux_fixup_elf(register_t **stack_base,
struct image_params *iparams);
static void linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask);
-static int linux_exec_imgact_try(struct image_params *iparams);
static void linux_exec_setregs(struct thread *td,
struct image_params *imgp, u_long stack);
static register_t *linux_copyout_strings(struct image_params *imgp);
@@ -804,42 +797,6 @@ linux_fetch_syscall_args(struct thread *td)
td->td_retval[1] = frame->tf_edx;
return (0);
-}
-
-/*
- * If a Linux binary is exec'ing something, try this image activator
- * first. We override standard shell script execution in order to
- * be able to modify the interpreter path. We only do this if a Linux
- * binary is doing the exec, so we do not create an EXEC module for it.
- */
-static int
-linux_exec_imgact_try(struct image_params *imgp)
-{
- const char *head = (const char *)imgp->image_header;
- char *rpath;
- int error = -1;
-
- /*
- * The interpreter for shell scripts run from a Linux binary needs
- * to be located in /compat/linux if possible in order to recursively
- * maintain Linux path emulation.
- */
- if (((const short *)head)[0] == SHELLMAGIC) {
- /*
- * Run our normal shell image activator. If it succeeds then
- * attempt to use the alternate path for the interpreter. If
- * an alternate path is found, use our stringspace to store it.
- */
- if ((error = exec_shell_imgact(imgp)) == 0) {
- linux_emul_convpath(FIRST_THREAD_IN_PROC(imgp->proc),
- imgp->interpreter_name, UIO_SYSSPACE, &rpath, 0,
- AT_FDCWD);
- if (rpath != NULL)
- imgp->args->fname_buf =
- imgp->interpreter_name = rpath;
- }
- }
- return (error);
}
/*
More information about the svn-src-stable-11
mailing list