diff options
author | David Howells <dhowells@redhat.com> | 2006-01-18 20:44:00 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-18 22:20:29 -0500 |
commit | 283828f3c19ceb3a64a8544d42cc189003e8b0fe (patch) | |
tree | a3ba8f54e809bc1036bce6a404d88c93d578b0c2 /include | |
parent | a411aee96ea7fe6fe065df65bf29ea755bcdb554 (diff) |
[PATCH] Handle TIF_RESTORE_SIGMASK for i386
Handle TIF_RESTORE_SIGMASK as added by David Woodhouse's patch entitled:
[PATCH] 2/3 Add TIF_RESTORE_SIGMASK support for arch/powerpc
[PATCH] 3/3 Generic sys_rt_sigsuspend
It does the following:
(1) Declares TIF_RESTORE_SIGMASK for i386.
(2) Invokes it over to do_signal() when TIF_RESTORE_SIGMASK is set.
(3) Makes do_signal() support TIF_RESTORE_SIGMASK, using the signal mask saved
in current->saved_sigmask.
(4) Discards sys_rt_sigsuspend() from the arch, using the generic one instead.
(5) Makes sys_sigsuspend() save the signal mask and set TIF_RESTORE_SIGMASK
rather than attempting to fudge the return registers.
(6) Makes sys_sigsuspend() return -ERESTARTNOHAND rather than looping
intrinsically.
(7) Makes setup_frame(), setup_rt_frame() and handle_signal() return 0 or
-EFAULT rather than true/false to be consistent with the rest of the
kernel.
Due to the fact do_signal() is then only called from one place:
(8) Makes do_signal() no longer have a return value is it was just being
ignored; force_sig() takes care of this.
(9) Discards the old sigmask argument to do_signal() as it's no longer
necessary.
(10) Makes do_signal() static.
(11) Marks the second argument to do_notify_resume() as unused. The unused
argument should remain in the middle as the arguments are passed in as
registers, and the ordering is specific in entry.S
Given the way do_signal() is now no longer called from sys_{,rt_}sigsuspend(),
they no longer need access to the exception frame, and so can just take
arguments normally.
This patch depends on sys_rt_sigsuspend patch.
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-i386/signal.h | 1 | ||||
-rw-r--r-- | include/asm-i386/thread_info.h | 2 | ||||
-rw-r--r-- | include/asm-i386/unistd.h | 1 |
3 files changed, 3 insertions, 1 deletions
diff --git a/include/asm-i386/signal.h b/include/asm-i386/signal.h index 76524b4052ac..026fd231488d 100644 --- a/include/asm-i386/signal.h +++ b/include/asm-i386/signal.h | |||
@@ -218,7 +218,6 @@ static __inline__ int sigfindinword(unsigned long word) | |||
218 | } | 218 | } |
219 | 219 | ||
220 | struct pt_regs; | 220 | struct pt_regs; |
221 | extern int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset)); | ||
222 | 221 | ||
223 | #define ptrace_signal_deliver(regs, cookie) \ | 222 | #define ptrace_signal_deliver(regs, cookie) \ |
224 | do { \ | 223 | do { \ |
diff --git a/include/asm-i386/thread_info.h b/include/asm-i386/thread_info.h index 2493e77e8c30..e20e99551d71 100644 --- a/include/asm-i386/thread_info.h +++ b/include/asm-i386/thread_info.h | |||
@@ -140,6 +140,7 @@ register unsigned long current_stack_pointer asm("esp") __attribute_used__; | |||
140 | #define TIF_SYSCALL_EMU 6 /* syscall emulation active */ | 140 | #define TIF_SYSCALL_EMU 6 /* syscall emulation active */ |
141 | #define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ | 141 | #define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ |
142 | #define TIF_SECCOMP 8 /* secure computing */ | 142 | #define TIF_SECCOMP 8 /* secure computing */ |
143 | #define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */ | ||
143 | #define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ | 144 | #define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ |
144 | #define TIF_MEMDIE 17 | 145 | #define TIF_MEMDIE 17 |
145 | 146 | ||
@@ -152,6 +153,7 @@ register unsigned long current_stack_pointer asm("esp") __attribute_used__; | |||
152 | #define _TIF_SYSCALL_EMU (1<<TIF_SYSCALL_EMU) | 153 | #define _TIF_SYSCALL_EMU (1<<TIF_SYSCALL_EMU) |
153 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) | 154 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) |
154 | #define _TIF_SECCOMP (1<<TIF_SECCOMP) | 155 | #define _TIF_SECCOMP (1<<TIF_SECCOMP) |
156 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) | ||
155 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 157 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
156 | 158 | ||
157 | /* work to do on interrupt/exception return */ | 159 | /* work to do on interrupt/exception return */ |
diff --git a/include/asm-i386/unistd.h b/include/asm-i386/unistd.h index e3028aaf6d83..3400441b3f91 100644 --- a/include/asm-i386/unistd.h +++ b/include/asm-i386/unistd.h | |||
@@ -430,6 +430,7 @@ __syscall_return(type,__res); \ | |||
430 | #define __ARCH_WANT_SYS_SIGPENDING | 430 | #define __ARCH_WANT_SYS_SIGPENDING |
431 | #define __ARCH_WANT_SYS_SIGPROCMASK | 431 | #define __ARCH_WANT_SYS_SIGPROCMASK |
432 | #define __ARCH_WANT_SYS_RT_SIGACTION | 432 | #define __ARCH_WANT_SYS_RT_SIGACTION |
433 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
433 | #endif | 434 | #endif |
434 | 435 | ||
435 | #ifdef __KERNEL_SYSCALLS__ | 436 | #ifdef __KERNEL_SYSCALLS__ |