aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-12-12 15:22:13 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-12-12 15:22:13 -0500
commit9977d9b379cb77e0f67bd6f4563618106e58e11d (patch)
tree0191accfddf578edb52c69c933d64521e3dce297 /arch/um
parentcf4af01221579a4e895f43dbfc47598fbfc5a731 (diff)
parent541880d9a2c7871f6370071d55aa6662d329c51e (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
Pull big execve/kernel_thread/fork unification series from Al Viro: "All architectures are converted to new model. Quite a bit of that stuff is actually shared with architecture trees; in such cases it's literally shared branch pulled by both, not a cherry-pick. A lot of ugliness and black magic is gone (-3KLoC total in this one): - kernel_thread()/kernel_execve()/sys_execve() redesign. We don't do syscalls from kernel anymore for either kernel_thread() or kernel_execve(): kernel_thread() is essentially clone(2) with callback run before we return to userland, the callbacks either never return or do successful do_execve() before returning. kernel_execve() is a wrapper for do_execve() - it doesn't need to do transition to user mode anymore. As a result kernel_thread() and kernel_execve() are arch-independent now - they live in kernel/fork.c and fs/exec.c resp. sys_execve() is also in fs/exec.c and it's completely architecture-independent. - daemonize() is gone, along with its parts in fs/*.c - struct pt_regs * is no longer passed to do_fork/copy_process/ copy_thread/do_execve/search_binary_handler/->load_binary/do_coredump. - sys_fork()/sys_vfork()/sys_clone() unified; some architectures still need wrappers (ones with callee-saved registers not saved in pt_regs on syscall entry), but the main part of those suckers is in kernel/fork.c now." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal: (113 commits) do_coredump(): get rid of pt_regs argument print_fatal_signal(): get rid of pt_regs argument ptrace_signal(): get rid of unused arguments get rid of ptrace_signal_deliver() arguments new helper: signal_pt_regs() unify default ptrace_signal_deliver flagday: kill pt_regs argument of do_fork() death to idle_regs() don't pass regs to copy_process() flagday: don't pass regs to copy_thread() bfin: switch to generic vfork, get rid of pointless wrappers xtensa: switch to generic clone() openrisc: switch to use of generic fork and clone unicore32: switch to generic clone(2) score: switch to generic fork/vfork/clone c6x: sanitize copy_thread(), get rid of clone(2) wrapper, switch to generic clone() take sys_fork/sys_vfork/sys_clone prototypes to linux/syscalls.h mn10300: switch to generic fork/vfork/clone h8300: switch to generic fork/vfork/clone tile: switch to generic clone() ... Conflicts: arch/microblaze/include/asm/Kbuild
Diffstat (limited to 'arch/um')
-rw-r--r--arch/um/kernel/process.c5
-rw-r--r--arch/um/kernel/syscall.c23
2 files changed, 2 insertions, 26 deletions
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c
index b6d699cdd557..b462b13c5bae 100644
--- a/arch/um/kernel/process.c
+++ b/arch/um/kernel/process.c
@@ -161,8 +161,7 @@ void fork_handler(void)
161} 161}
162 162
163int copy_thread(unsigned long clone_flags, unsigned long sp, 163int copy_thread(unsigned long clone_flags, unsigned long sp,
164 unsigned long arg, struct task_struct * p, 164 unsigned long arg, struct task_struct * p)
165 struct pt_regs *regs)
166{ 165{
167 void (*handler)(void); 166 void (*handler)(void);
168 int kthread = current->flags & PF_KTHREAD; 167 int kthread = current->flags & PF_KTHREAD;
@@ -171,7 +170,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
171 p->thread = (struct thread_struct) INIT_THREAD; 170 p->thread = (struct thread_struct) INIT_THREAD;
172 171
173 if (!kthread) { 172 if (!kthread) {
174 memcpy(&p->thread.regs.regs, &regs->regs, 173 memcpy(&p->thread.regs.regs, current_pt_regs(),
175 sizeof(p->thread.regs.regs)); 174 sizeof(p->thread.regs.regs));
176 PT_REGS_SET_SYSCALL_RETURN(&p->thread.regs, 0); 175 PT_REGS_SET_SYSCALL_RETURN(&p->thread.regs, 0);
177 if (sp != 0) 176 if (sp != 0)
diff --git a/arch/um/kernel/syscall.c b/arch/um/kernel/syscall.c
index a81f3705e90f..c1d0ae069b53 100644
--- a/arch/um/kernel/syscall.c
+++ b/arch/um/kernel/syscall.c
@@ -14,29 +14,6 @@
14#include <asm/uaccess.h> 14#include <asm/uaccess.h>
15#include <asm/unistd.h> 15#include <asm/unistd.h>
16 16
17long sys_fork(void)
18{
19 return do_fork(SIGCHLD, UPT_SP(&current->thread.regs.regs),
20 &current->thread.regs, 0, NULL, NULL);
21}
22
23long sys_vfork(void)
24{
25 return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,
26 UPT_SP(&current->thread.regs.regs),
27 &current->thread.regs, 0, NULL, NULL);
28}
29
30long sys_clone(unsigned long clone_flags, unsigned long newsp,
31 void __user *parent_tid, void __user *child_tid)
32{
33 if (!newsp)
34 newsp = UPT_SP(&current->thread.regs.regs);
35
36 return do_fork(clone_flags, newsp, &current->thread.regs, 0, parent_tid,
37 child_tid);
38}
39
40long old_mmap(unsigned long addr, unsigned long len, 17long old_mmap(unsigned long addr, unsigned long len,
41 unsigned long prot, unsigned long flags, 18 unsigned long prot, unsigned long flags,
42 unsigned long fd, unsigned long offset) 19 unsigned long fd, unsigned long offset)