diff options
Diffstat (limited to 'arch/um/sys-i386/syscalls.c')
| -rw-r--r-- | arch/um/sys-i386/syscalls.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/um/sys-i386/syscalls.c b/arch/um/sys-i386/syscalls.c index 1845123ed124..749dd1bfe60f 100644 --- a/arch/um/sys-i386/syscalls.c +++ b/arch/um/sys-i386/syscalls.c | |||
| @@ -61,21 +61,27 @@ long old_select(struct sel_arg_struct __user *arg) | |||
| 61 | return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp); | 61 | return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp); |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | /* The i386 version skips reading from %esi, the fourth argument. So we must do | 64 | /* |
| 65 | * this, too. | 65 | * The prototype on i386 is: |
| 66 | * | ||
| 67 | * int clone(int flags, void * child_stack, int * parent_tidptr, struct user_desc * newtls, int * child_tidptr) | ||
| 68 | * | ||
| 69 | * and the "newtls" arg. on i386 is read by copy_thread directly from the | ||
| 70 | * register saved on the stack. | ||
| 66 | */ | 71 | */ |
| 67 | long sys_clone(unsigned long clone_flags, unsigned long newsp, | 72 | long sys_clone(unsigned long clone_flags, unsigned long newsp, |
| 68 | int __user *parent_tid, int unused, int __user *child_tid) | 73 | int __user *parent_tid, void *newtls, int __user *child_tid) |
| 69 | { | 74 | { |
| 70 | long ret; | 75 | long ret; |
| 71 | 76 | ||
| 72 | if (!newsp) | 77 | if (!newsp) |
| 73 | newsp = UPT_SP(¤t->thread.regs.regs); | 78 | newsp = UPT_SP(¤t->thread.regs.regs); |
| 79 | |||
| 74 | current->thread.forking = 1; | 80 | current->thread.forking = 1; |
| 75 | ret = do_fork(clone_flags, newsp, ¤t->thread.regs, 0, parent_tid, | 81 | ret = do_fork(clone_flags, newsp, ¤t->thread.regs, 0, parent_tid, |
| 76 | child_tid); | 82 | child_tid); |
| 77 | current->thread.forking = 0; | 83 | current->thread.forking = 0; |
| 78 | return(ret); | 84 | return ret; |
| 79 | } | 85 | } |
| 80 | 86 | ||
| 81 | /* | 87 | /* |
