diff options
| -rw-r--r-- | kernel/signal.c | 65 |
1 files changed, 63 insertions, 2 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 3ab90e8b6ecf..dc17929ab78a 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
| @@ -2075,6 +2075,9 @@ EXPORT_SYMBOL(unblock_all_signals); | |||
| 2075 | * System call entry points. | 2075 | * System call entry points. |
| 2076 | */ | 2076 | */ |
| 2077 | 2077 | ||
| 2078 | /** | ||
| 2079 | * sys_restart_syscall - restart a system call | ||
| 2080 | */ | ||
| 2078 | SYSCALL_DEFINE0(restart_syscall) | 2081 | SYSCALL_DEFINE0(restart_syscall) |
| 2079 | { | 2082 | { |
| 2080 | struct restart_block *restart = ¤t_thread_info()->restart_block; | 2083 | struct restart_block *restart = ¤t_thread_info()->restart_block; |
| @@ -2128,6 +2131,13 @@ int sigprocmask(int how, sigset_t *set, sigset_t *oldset) | |||
| 2128 | return error; | 2131 | return error; |
| 2129 | } | 2132 | } |
| 2130 | 2133 | ||
| 2134 | /** | ||
| 2135 | * sys_rt_sigprocmask - change the list of currently blocked signals | ||
| 2136 | * @how: whether to add, remove, or set signals | ||
| 2137 | * @set: stores pending signals | ||
| 2138 | * @oset: previous value of signal mask if non-null | ||
| 2139 | * @sigsetsize: size of sigset_t type | ||
| 2140 | */ | ||
| 2131 | SYSCALL_DEFINE4(rt_sigprocmask, int, how, sigset_t __user *, set, | 2141 | SYSCALL_DEFINE4(rt_sigprocmask, int, how, sigset_t __user *, set, |
| 2132 | sigset_t __user *, oset, size_t, sigsetsize) | 2142 | sigset_t __user *, oset, size_t, sigsetsize) |
| 2133 | { | 2143 | { |
| @@ -2188,6 +2198,12 @@ out: | |||
| 2188 | return error; | 2198 | return error; |
| 2189 | } | 2199 | } |
| 2190 | 2200 | ||
| 2201 | /** | ||
| 2202 | * sys_rt_sigpending - examine a pending signal that has been raised | ||
| 2203 | * while blocked | ||
| 2204 | * @set: stores pending signals | ||
| 2205 | * @sigsetsize: size of sigset_t type or larger | ||
| 2206 | */ | ||
| 2191 | SYSCALL_DEFINE2(rt_sigpending, sigset_t __user *, set, size_t, sigsetsize) | 2207 | SYSCALL_DEFINE2(rt_sigpending, sigset_t __user *, set, size_t, sigsetsize) |
| 2192 | { | 2208 | { |
| 2193 | return do_sigpending(set, sigsetsize); | 2209 | return do_sigpending(set, sigsetsize); |
| @@ -2267,6 +2283,14 @@ int copy_siginfo_to_user(siginfo_t __user *to, siginfo_t *from) | |||
| 2267 | 2283 | ||
| 2268 | #endif | 2284 | #endif |
| 2269 | 2285 | ||
| 2286 | /** | ||
| 2287 | * sys_rt_sigtimedwait - synchronously wait for queued signals specified | ||
| 2288 | * in @uthese | ||
| 2289 | * @uthese: queued signals to wait for | ||
| 2290 | * @uinfo: if non-null, the signal's siginfo is returned here | ||
| 2291 | * @uts: upper bound on process time suspension | ||
| 2292 | * @sigsetsize: size of sigset_t type | ||
| 2293 | */ | ||
| 2270 | SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese, | 2294 | SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese, |
| 2271 | siginfo_t __user *, uinfo, const struct timespec __user *, uts, | 2295 | siginfo_t __user *, uinfo, const struct timespec __user *, uts, |
| 2272 | size_t, sigsetsize) | 2296 | size_t, sigsetsize) |
| @@ -2344,6 +2368,11 @@ SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese, | |||
| 2344 | return ret; | 2368 | return ret; |
| 2345 | } | 2369 | } |
| 2346 | 2370 | ||
| 2371 | /** | ||
| 2372 | * sys_kill - send a signal to a process | ||
| 2373 | * @pid: the PID of the process | ||
| 2374 | * @sig: signal to be sent | ||
| 2375 | */ | ||
| 2347 | SYSCALL_DEFINE2(kill, pid_t, pid, int, sig) | 2376 | SYSCALL_DEFINE2(kill, pid_t, pid, int, sig) |
| 2348 | { | 2377 | { |
| 2349 | struct siginfo info; | 2378 | struct siginfo info; |
| @@ -2419,7 +2448,11 @@ SYSCALL_DEFINE3(tgkill, pid_t, tgid, pid_t, pid, int, sig) | |||
| 2419 | return do_tkill(tgid, pid, sig); | 2448 | return do_tkill(tgid, pid, sig); |
| 2420 | } | 2449 | } |
| 2421 | 2450 | ||
| 2422 | /* | 2451 | /** |
| 2452 | * sys_tkill - send signal to one specific task | ||
| 2453 | * @pid: the PID of the task | ||
| 2454 | * @sig: signal to be sent | ||
| 2455 | * | ||
| 2423 | * Send a signal to only one task, even if it's a CLONE_THREAD task. | 2456 | * Send a signal to only one task, even if it's a CLONE_THREAD task. |
| 2424 | */ | 2457 | */ |
| 2425 | SYSCALL_DEFINE2(tkill, pid_t, pid, int, sig) | 2458 | SYSCALL_DEFINE2(tkill, pid_t, pid, int, sig) |
| @@ -2431,6 +2464,12 @@ SYSCALL_DEFINE2(tkill, pid_t, pid, int, sig) | |||
| 2431 | return do_tkill(0, pid, sig); | 2464 | return do_tkill(0, pid, sig); |
| 2432 | } | 2465 | } |
| 2433 | 2466 | ||
| 2467 | /** | ||
| 2468 | * sys_rt_sigqueueinfo - send signal information to a signal | ||
| 2469 | * @pid: the PID of the thread | ||
| 2470 | * @sig: signal to be sent | ||
| 2471 | * @uinfo: signal info to be sent | ||
| 2472 | */ | ||
| 2434 | SYSCALL_DEFINE3(rt_sigqueueinfo, pid_t, pid, int, sig, | 2473 | SYSCALL_DEFINE3(rt_sigqueueinfo, pid_t, pid, int, sig, |
| 2435 | siginfo_t __user *, uinfo) | 2474 | siginfo_t __user *, uinfo) |
| 2436 | { | 2475 | { |
| @@ -2596,6 +2635,10 @@ out: | |||
| 2596 | 2635 | ||
| 2597 | #ifdef __ARCH_WANT_SYS_SIGPENDING | 2636 | #ifdef __ARCH_WANT_SYS_SIGPENDING |
| 2598 | 2637 | ||
| 2638 | /** | ||
| 2639 | * sys_sigpending - examine pending signals | ||
| 2640 | * @set: where mask of pending signal is returned | ||
| 2641 | */ | ||
| 2599 | SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, set) | 2642 | SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, set) |
| 2600 | { | 2643 | { |
| 2601 | return do_sigpending(set, sizeof(*set)); | 2644 | return do_sigpending(set, sizeof(*set)); |
| @@ -2604,7 +2647,12 @@ SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, set) | |||
| 2604 | #endif | 2647 | #endif |
| 2605 | 2648 | ||
| 2606 | #ifdef __ARCH_WANT_SYS_SIGPROCMASK | 2649 | #ifdef __ARCH_WANT_SYS_SIGPROCMASK |
| 2607 | /* | 2650 | /** |
| 2651 | * sys_sigprocmask - examine and change blocked signals | ||
| 2652 | * @how: whether to add, remove, or set signals | ||
| 2653 | * @set: signals to add or remove (if non-null) | ||
| 2654 | * @oset: previous value of signal mask if non-null | ||
| 2655 | * | ||
| 2608 | * Some platforms have their own version with special arguments; | 2656 | * Some platforms have their own version with special arguments; |
| 2609 | * others support only sys_rt_sigprocmask. | 2657 | * others support only sys_rt_sigprocmask. |
| 2610 | */ | 2658 | */ |
| @@ -2660,6 +2708,13 @@ out: | |||
| 2660 | #endif /* __ARCH_WANT_SYS_SIGPROCMASK */ | 2708 | #endif /* __ARCH_WANT_SYS_SIGPROCMASK */ |
| 2661 | 2709 | ||
| 2662 | #ifdef __ARCH_WANT_SYS_RT_SIGACTION | 2710 | #ifdef __ARCH_WANT_SYS_RT_SIGACTION |
| 2711 | /** | ||
| 2712 | * sys_rt_sigaction - alter an action taken by a process | ||
| 2713 | * @sig: signal to be sent | ||
| 2714 | * @act: the thread group ID of the thread | ||
| 2715 | * @oact: the PID of the thread | ||
| 2716 | * @sigsetsize: size of sigset_t type | ||
| 2717 | */ | ||
| 2663 | SYSCALL_DEFINE4(rt_sigaction, int, sig, | 2718 | SYSCALL_DEFINE4(rt_sigaction, int, sig, |
| 2664 | const struct sigaction __user *, act, | 2719 | const struct sigaction __user *, act, |
| 2665 | struct sigaction __user *, oact, | 2720 | struct sigaction __user *, oact, |
| @@ -2746,6 +2801,12 @@ SYSCALL_DEFINE0(pause) | |||
| 2746 | #endif | 2801 | #endif |
| 2747 | 2802 | ||
| 2748 | #ifdef __ARCH_WANT_SYS_RT_SIGSUSPEND | 2803 | #ifdef __ARCH_WANT_SYS_RT_SIGSUSPEND |
| 2804 | /** | ||
| 2805 | * sys_rt_sigsuspend - replace the signal mask for a value with the | ||
| 2806 | * @unewset value until a signal is received | ||
| 2807 | * @unewset: new signal mask value | ||
| 2808 | * @sigsetsize: size of sigset_t type | ||
| 2809 | */ | ||
| 2749 | SYSCALL_DEFINE2(rt_sigsuspend, sigset_t __user *, unewset, size_t, sigsetsize) | 2810 | SYSCALL_DEFINE2(rt_sigsuspend, sigset_t __user *, unewset, size_t, sigsetsize) |
| 2750 | { | 2811 | { |
| 2751 | sigset_t newset; | 2812 | sigset_t newset; |
