mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-26 11:28:28 +00:00
Merge branch 'execve' into upstream
* execve: arm64: get rid of fork/vfork/clone wrappers
This commit is contained in:
commit
7a6cf9328c
@ -23,15 +23,16 @@
|
|||||||
/*
|
/*
|
||||||
* System call wrappers implemented in kernel/entry.S.
|
* System call wrappers implemented in kernel/entry.S.
|
||||||
*/
|
*/
|
||||||
asmlinkage long sys_clone_wrapper(unsigned long clone_flags,
|
|
||||||
unsigned long newsp,
|
|
||||||
void __user *parent_tid,
|
|
||||||
unsigned long tls_val,
|
|
||||||
void __user *child_tid);
|
|
||||||
asmlinkage long sys_rt_sigreturn_wrapper(void);
|
asmlinkage long sys_rt_sigreturn_wrapper(void);
|
||||||
asmlinkage long sys_sigaltstack_wrapper(const stack_t __user *uss,
|
asmlinkage long sys_sigaltstack_wrapper(const stack_t __user *uss,
|
||||||
stack_t __user *uoss);
|
stack_t __user *uoss);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AArch64 sys_clone implementation has a different prototype than the generic
|
||||||
|
* one (additional TLS value argument).
|
||||||
|
*/
|
||||||
|
#define sys_clone sys_clone
|
||||||
|
|
||||||
#include <asm-generic/syscalls.h>
|
#include <asm-generic/syscalls.h>
|
||||||
|
|
||||||
#endif /* __ASM_SYSCALLS_H */
|
#endif /* __ASM_SYSCALLS_H */
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
__SYSCALL(0, sys_restart_syscall)
|
__SYSCALL(0, sys_restart_syscall)
|
||||||
__SYSCALL(1, sys_exit)
|
__SYSCALL(1, sys_exit)
|
||||||
__SYSCALL(2, compat_sys_fork_wrapper)
|
__SYSCALL(2, compat_sys_fork)
|
||||||
__SYSCALL(3, sys_read)
|
__SYSCALL(3, sys_read)
|
||||||
__SYSCALL(4, sys_write)
|
__SYSCALL(4, sys_write)
|
||||||
__SYSCALL(5, compat_sys_open)
|
__SYSCALL(5, compat_sys_open)
|
||||||
@ -141,7 +141,7 @@ __SYSCALL(116, compat_sys_sysinfo)
|
|||||||
__SYSCALL(117, sys_ni_syscall) /* 117 was sys_ipc */
|
__SYSCALL(117, sys_ni_syscall) /* 117 was sys_ipc */
|
||||||
__SYSCALL(118, sys_fsync)
|
__SYSCALL(118, sys_fsync)
|
||||||
__SYSCALL(119, compat_sys_sigreturn_wrapper)
|
__SYSCALL(119, compat_sys_sigreturn_wrapper)
|
||||||
__SYSCALL(120, compat_sys_clone_wrapper)
|
__SYSCALL(120, sys_clone)
|
||||||
__SYSCALL(121, sys_setdomainname)
|
__SYSCALL(121, sys_setdomainname)
|
||||||
__SYSCALL(122, sys_newuname)
|
__SYSCALL(122, sys_newuname)
|
||||||
__SYSCALL(123, sys_ni_syscall) /* 123 was sys_modify_ldt */
|
__SYSCALL(123, sys_ni_syscall) /* 123 was sys_modify_ldt */
|
||||||
@ -211,7 +211,7 @@ __SYSCALL(186, compat_sys_sigaltstack_wrapper)
|
|||||||
__SYSCALL(187, compat_sys_sendfile)
|
__SYSCALL(187, compat_sys_sendfile)
|
||||||
__SYSCALL(188, sys_ni_syscall) /* 188 reserved */
|
__SYSCALL(188, sys_ni_syscall) /* 188 reserved */
|
||||||
__SYSCALL(189, sys_ni_syscall) /* 189 reserved */
|
__SYSCALL(189, sys_ni_syscall) /* 189 reserved */
|
||||||
__SYSCALL(190, compat_sys_vfork_wrapper)
|
__SYSCALL(190, compat_sys_vfork)
|
||||||
__SYSCALL(191, compat_sys_getrlimit) /* SuS compliant getrlimit */
|
__SYSCALL(191, compat_sys_getrlimit) /* SuS compliant getrlimit */
|
||||||
__SYSCALL(192, sys_mmap_pgoff)
|
__SYSCALL(192, sys_mmap_pgoff)
|
||||||
__SYSCALL(193, compat_sys_truncate64_wrapper)
|
__SYSCALL(193, compat_sys_truncate64_wrapper)
|
||||||
|
@ -676,11 +676,6 @@ __sys_trace_return:
|
|||||||
/*
|
/*
|
||||||
* Special system call wrappers.
|
* Special system call wrappers.
|
||||||
*/
|
*/
|
||||||
ENTRY(sys_clone_wrapper)
|
|
||||||
mov x5, sp
|
|
||||||
b sys_clone
|
|
||||||
ENDPROC(sys_clone_wrapper)
|
|
||||||
|
|
||||||
ENTRY(sys_rt_sigreturn_wrapper)
|
ENTRY(sys_rt_sigreturn_wrapper)
|
||||||
mov x0, sp
|
mov x0, sp
|
||||||
b sys_rt_sigreturn
|
b sys_rt_sigreturn
|
||||||
|
@ -246,14 +246,20 @@ int copy_thread(unsigned long clone_flags, unsigned long stack_start,
|
|||||||
*childregs = *regs;
|
*childregs = *regs;
|
||||||
childregs->regs[0] = 0;
|
childregs->regs[0] = 0;
|
||||||
if (is_compat_thread(task_thread_info(p))) {
|
if (is_compat_thread(task_thread_info(p))) {
|
||||||
childregs->compat_sp = stack_start;
|
if (stack_start)
|
||||||
|
childregs->compat_sp = stack_start;
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Read the current TLS pointer from tpidr_el0 as it may be
|
* Read the current TLS pointer from tpidr_el0 as it may be
|
||||||
* out-of-sync with the saved value.
|
* out-of-sync with the saved value.
|
||||||
*/
|
*/
|
||||||
asm("mrs %0, tpidr_el0" : "=r" (tls));
|
asm("mrs %0, tpidr_el0" : "=r" (tls));
|
||||||
childregs->sp = stack_start;
|
if (stack_start) {
|
||||||
|
/* 16-byte aligned stack mandatory on AArch64 */
|
||||||
|
if (stack_start & 15)
|
||||||
|
return -EINVAL;
|
||||||
|
childregs->sp = stack_start;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* If a TLS pointer was passed to clone (4th argument), use it
|
* If a TLS pointer was passed to clone (4th argument), use it
|
||||||
|
@ -31,14 +31,10 @@
|
|||||||
*/
|
*/
|
||||||
asmlinkage long sys_clone(unsigned long clone_flags, unsigned long newsp,
|
asmlinkage long sys_clone(unsigned long clone_flags, unsigned long newsp,
|
||||||
int __user *parent_tidptr, unsigned long tls_val,
|
int __user *parent_tidptr, unsigned long tls_val,
|
||||||
int __user *child_tidptr, struct pt_regs *regs)
|
int __user *child_tidptr)
|
||||||
{
|
{
|
||||||
if (!newsp)
|
return do_fork(clone_flags, newsp, current_pt_regs(), 0,
|
||||||
newsp = regs->sp;
|
parent_tidptr, child_tidptr);
|
||||||
/* 16-byte aligned stack mandatory on AArch64 */
|
|
||||||
if (newsp & 15)
|
|
||||||
return -EINVAL;
|
|
||||||
return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
|
asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
|
||||||
@ -54,7 +50,6 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
|
|||||||
/*
|
/*
|
||||||
* Wrappers to pass the pt_regs argument.
|
* Wrappers to pass the pt_regs argument.
|
||||||
*/
|
*/
|
||||||
#define sys_clone sys_clone_wrapper
|
|
||||||
#define sys_rt_sigreturn sys_rt_sigreturn_wrapper
|
#define sys_rt_sigreturn sys_rt_sigreturn_wrapper
|
||||||
#define sys_sigaltstack sys_sigaltstack_wrapper
|
#define sys_sigaltstack sys_sigaltstack_wrapper
|
||||||
|
|
||||||
|
@ -26,20 +26,6 @@
|
|||||||
/*
|
/*
|
||||||
* System call wrappers for the AArch32 compatibility layer.
|
* System call wrappers for the AArch32 compatibility layer.
|
||||||
*/
|
*/
|
||||||
compat_sys_fork_wrapper:
|
|
||||||
mov x0, sp
|
|
||||||
b compat_sys_fork
|
|
||||||
ENDPROC(compat_sys_fork_wrapper)
|
|
||||||
|
|
||||||
compat_sys_vfork_wrapper:
|
|
||||||
mov x0, sp
|
|
||||||
b compat_sys_vfork
|
|
||||||
ENDPROC(compat_sys_vfork_wrapper)
|
|
||||||
|
|
||||||
compat_sys_clone_wrapper:
|
|
||||||
mov x5, sp
|
|
||||||
b compat_sys_clone
|
|
||||||
ENDPROC(compat_sys_clone_wrapper)
|
|
||||||
|
|
||||||
compat_sys_sigreturn_wrapper:
|
compat_sys_sigreturn_wrapper:
|
||||||
mov x0, sp
|
mov x0, sp
|
||||||
|
@ -28,25 +28,15 @@
|
|||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/unistd32.h>
|
#include <asm/unistd32.h>
|
||||||
|
|
||||||
asmlinkage int compat_sys_fork(struct pt_regs *regs)
|
asmlinkage int compat_sys_fork(void)
|
||||||
{
|
{
|
||||||
return do_fork(SIGCHLD, regs->compat_sp, regs, 0, NULL, NULL);
|
return do_fork(SIGCHLD, 0, current_pt_regs(), 0, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage int compat_sys_clone(unsigned long clone_flags, unsigned long newsp,
|
asmlinkage int compat_sys_vfork(void)
|
||||||
int __user *parent_tidptr, int tls_val,
|
|
||||||
int __user *child_tidptr, struct pt_regs *regs)
|
|
||||||
{
|
{
|
||||||
if (!newsp)
|
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0,
|
||||||
newsp = regs->compat_sp;
|
current_pt_regs(), 0, NULL, NULL);
|
||||||
|
|
||||||
return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage int compat_sys_vfork(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->compat_sp,
|
|
||||||
regs, 0, NULL, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage int compat_sys_sched_rr_get_interval(compat_pid_t pid,
|
asmlinkage int compat_sys_sched_rr_get_interval(compat_pid_t pid,
|
||||||
|
Loading…
Reference in New Issue
Block a user