From: Jeff Dike This patch changes the calling convention of clone on i386 to match that of the host by leaving the fourth argument unused. Signed-off-by: Jeff Dike Signed-off-by: Andrew Morton --- 25-akpm/arch/um/kernel/syscall_kern.c | 11 ----------- 25-akpm/arch/um/sys-i386/syscalls.c | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+), 11 deletions(-) diff -puN arch/um/kernel/syscall_kern.c~uml-fix-call-to-sys_clone arch/um/kernel/syscall_kern.c --- 25/arch/um/kernel/syscall_kern.c~uml-fix-call-to-sys_clone Tue Sep 14 18:29:36 2004 +++ 25-akpm/arch/um/kernel/syscall_kern.c Tue Sep 14 18:29:36 2004 @@ -44,17 +44,6 @@ long sys_fork(void) return(ret); } -long sys_clone(unsigned long clone_flags, unsigned long newsp, - int *parent_tid, int *child_tid) -{ - long ret; - - current->thread.forking = 1; - ret = do_fork(clone_flags, newsp, NULL, 0, parent_tid, child_tid); - current->thread.forking = 0; - return(ret); -} - long sys_vfork(void) { long ret; diff -puN arch/um/sys-i386/syscalls.c~uml-fix-call-to-sys_clone arch/um/sys-i386/syscalls.c --- 25/arch/um/sys-i386/syscalls.c~uml-fix-call-to-sys_clone Tue Sep 14 18:29:36 2004 +++ 25-akpm/arch/um/sys-i386/syscalls.c Tue Sep 14 18:29:36 2004 @@ -3,6 +3,7 @@ * Licensed under the GPL */ +#include "linux/sched.h" #include "asm/mman.h" #include "asm/uaccess.h" #include "asm/unistd.h" @@ -56,6 +57,27 @@ int old_select(struct sel_arg_struct *ar return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp); } +/* The i386 version skips reading from %esi, the fourth argument. So we must do + * this, too. + */ +int sys_clone(unsigned long clone_flags, unsigned long newsp, int *parent_tid, + int unused, int *child_tid) +{ + long ret; + + /* XXX: normal arch do here this pass, and also pass the regs to + * do_fork, instead of NULL. Currently the arch-independent code + * ignores these values, while the UML code (actually it's + * copy_thread) does the right thing. But this should change, + probably. */ + /*if (!newsp) + newsp = UPT_SP(current->thread.regs);*/ + current->thread.forking = 1; + ret = do_fork(clone_flags, newsp, NULL, 0, parent_tid, child_tid); + current->thread.forking = 0; + return(ret); +} + /* * Overrides for Emacs so that we follow Linus's tabbing style. * Emacs will notice this stuff at the end of the file and automatically _