linuxulator: deduplicate linux_exec_imgact_try
Previously linuxulator had three identical copies of linux_exec_imgact_try. Deduplicate before adding another arch to linuxulator. Sponsored by: Turing Robotic Industries Inc Differential Revision: https://reviews.freebsd.org/D14856
This commit is contained in:
parent
66e8725e8d
commit
c5db8e6d0d
@ -86,12 +86,6 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
MODULE_VERSION(linux64, 1);
|
MODULE_VERSION(linux64, 1);
|
||||||
|
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
|
||||||
#define SHELLMAGIC 0x2123 /* #! */
|
|
||||||
#else
|
|
||||||
#define SHELLMAGIC 0x2321
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
SYSCTL_PROC(_compat_linux, OID_AUTO, debug,
|
SYSCTL_PROC(_compat_linux, OID_AUTO, debug,
|
||||||
CTLTYPE_STRING | CTLFLAG_RW,
|
CTLTYPE_STRING | CTLFLAG_RW,
|
||||||
@ -125,7 +119,6 @@ static void linux_vdso_install(void *param);
|
|||||||
static void linux_vdso_deinstall(void *param);
|
static void linux_vdso_deinstall(void *param);
|
||||||
static void linux_set_syscall_retval(struct thread *td, int error);
|
static void linux_set_syscall_retval(struct thread *td, int error);
|
||||||
static int linux_fetch_syscall_args(struct thread *td);
|
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,
|
static void linux_exec_setregs(struct thread *td, struct image_params *imgp,
|
||||||
u_long stack);
|
u_long stack);
|
||||||
static int linux_vsyscall(struct thread *td);
|
static int linux_vsyscall(struct thread *td);
|
||||||
@ -663,42 +656,6 @@ linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
|||||||
mtx_lock(&psp->ps_mtx);
|
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)
|
#define LINUX_VSYSCALL_START (-10UL << 20)
|
||||||
#define LINUX_VSYSCALL_SZ 1024
|
#define LINUX_VSYSCALL_SZ 1024
|
||||||
|
|
||||||
|
@ -95,12 +95,6 @@ MODULE_VERSION(linux, 1);
|
|||||||
suword32(pos++, val); \
|
suword32(pos++, val); \
|
||||||
} while (0)
|
} 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
|
* 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
|
* 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);
|
struct image_params *iparams);
|
||||||
static register_t *linux_copyout_strings(struct image_params *imgp);
|
static register_t *linux_copyout_strings(struct image_params *imgp);
|
||||||
static void linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask);
|
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,
|
static void linux_exec_setregs(struct thread *td,
|
||||||
struct image_params *imgp, u_long stack);
|
struct image_params *imgp, u_long stack);
|
||||||
static void linux32_fixlimit(struct rlimit *rl, int which);
|
static void linux32_fixlimit(struct rlimit *rl, int which);
|
||||||
@ -717,42 +710,6 @@ linux32_fetch_syscall_args(struct thread *td)
|
|||||||
return (0);
|
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Clear registers on exec
|
* Clear registers on exec
|
||||||
* XXX copied from ia32_signal.c.
|
* XXX copied from ia32_signal.c.
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*-
|
/*-
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||||
*
|
*
|
||||||
|
* Copyright (c) 1994-1996 Søren Schmidt
|
||||||
* Copyright (c) 2006 Roman Divacky
|
* Copyright (c) 2006 Roman Divacky
|
||||||
* Copyright (c) 2013 Dmitry Chagin
|
* Copyright (c) 2013 Dmitry Chagin
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
@ -32,6 +33,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
#include <sys/fcntl.h>
|
||||||
#include <sys/imgact.h>
|
#include <sys/imgact.h>
|
||||||
#include <sys/kernel.h>
|
#include <sys/kernel.h>
|
||||||
#include <sys/ktr.h>
|
#include <sys/ktr.h>
|
||||||
@ -48,6 +50,11 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <compat/linux/linux_persona.h>
|
#include <compat/linux/linux_persona.h>
|
||||||
#include <compat/linux/linux_util.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)
|
* This returns reference to the thread emuldata entry (if found)
|
||||||
@ -168,6 +175,42 @@ linux_proc_exit(void *arg __unused, struct proc *p)
|
|||||||
free(pem, M_LINUX);
|
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
|
int
|
||||||
linux_common_execve(struct thread *td, struct image_args *eargs)
|
linux_common_execve(struct thread *td, struct image_args *eargs)
|
||||||
{
|
{
|
||||||
|
@ -49,6 +49,7 @@ struct linux_emuldata {
|
|||||||
|
|
||||||
struct linux_emuldata *em_find(struct thread *);
|
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_init(struct thread *, struct thread *, int);
|
||||||
void linux_proc_exit(void *, struct proc *);
|
void linux_proc_exit(void *, struct proc *);
|
||||||
void linux_schedtail(struct thread *);
|
void linux_schedtail(struct thread *);
|
||||||
|
@ -77,12 +77,6 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
MODULE_VERSION(linux, 1);
|
MODULE_VERSION(linux, 1);
|
||||||
|
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
|
||||||
#define SHELLMAGIC 0x2123 /* #! */
|
|
||||||
#else
|
|
||||||
#define SHELLMAGIC 0x2321
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
SYSCTL_PROC(_compat_linux, OID_AUTO, debug, CTLTYPE_STRING | CTLFLAG_RW, 0, 0,
|
SYSCTL_PROC(_compat_linux, OID_AUTO, debug, CTLTYPE_STRING | CTLFLAG_RW, 0, 0,
|
||||||
linux_sysctl_debug, "A", "Linux debugging control");
|
linux_sysctl_debug, "A", "Linux debugging control");
|
||||||
@ -113,7 +107,6 @@ static int linux_fixup(register_t **stack_base,
|
|||||||
static int linux_fixup_elf(register_t **stack_base,
|
static int linux_fixup_elf(register_t **stack_base,
|
||||||
struct image_params *iparams);
|
struct image_params *iparams);
|
||||||
static void linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask);
|
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,
|
static void linux_exec_setregs(struct thread *td,
|
||||||
struct image_params *imgp, u_long stack);
|
struct image_params *imgp, u_long stack);
|
||||||
static register_t *linux_copyout_strings(struct image_params *imgp);
|
static register_t *linux_copyout_strings(struct image_params *imgp);
|
||||||
@ -815,42 +808,6 @@ linux_fetch_syscall_args(struct thread *td)
|
|||||||
return (0);
|
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* exec_setregs may initialize some registers differently than Linux
|
* exec_setregs may initialize some registers differently than Linux
|
||||||
* does, thus potentially confusing Linux binaries. If necessary, we
|
* does, thus potentially confusing Linux binaries. If necessary, we
|
||||||
|
Loading…
x
Reference in New Issue
Block a user