dect
/
linux-2.6
Archived
13
0
Fork 0

arm64: get rid of fork/vfork/clone wrappers

[fixes from Catalin Marinas folded]

Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Tested-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2012-10-18 00:55:54 -04:00
parent 6a872777ff
commit e0fd18ce11
7 changed files with 25 additions and 52 deletions

View File

@ -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 */

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,