2 * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com)
3 * Licensed under the GPL
6 #include "linux/sched.h"
9 #include "linux/syscalls.h"
11 #include "asm/uaccess.h"
12 #include "asm/unistd.h"
15 * The prototype on i386 is:
17 * int clone(int flags, void * child_stack, int * parent_tidptr, struct user_desc * newtls, int * child_tidptr)
19 * and the "newtls" arg. on i386 is read by copy_thread directly from the
20 * register saved on the stack.
22 long sys_clone(unsigned long clone_flags
, unsigned long newsp
,
23 int __user
*parent_tid
, void *newtls
, int __user
*child_tid
)
28 newsp
= UPT_SP(¤t
->thread
.regs
.regs
);
30 current
->thread
.forking
= 1;
31 ret
= do_fork(clone_flags
, newsp
, ¤t
->thread
.regs
, 0, parent_tid
,
33 current
->thread
.forking
= 0;
37 long sys_sigaction(int sig
, const struct old_sigaction __user
*act
,
38 struct old_sigaction __user
*oact
)
40 struct k_sigaction new_ka
, old_ka
;
45 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)) ||
46 __get_user(new_ka
.sa
.sa_handler
, &act
->sa_handler
) ||
47 __get_user(new_ka
.sa
.sa_restorer
, &act
->sa_restorer
))
49 __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
);
50 __get_user(mask
, &act
->sa_mask
);
51 siginitset(&new_ka
.sa
.sa_mask
, mask
);
54 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
57 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)) ||
58 __put_user(old_ka
.sa
.sa_handler
, &oact
->sa_handler
) ||
59 __put_user(old_ka
.sa
.sa_restorer
, &oact
->sa_restorer
))
61 __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
);
62 __put_user(old_ka
.sa
.sa_mask
.sig
[0], &oact
->sa_mask
);