diff options
Diffstat (limited to 'kernel')
-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; |