diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-04-24 01:46:23 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-05-21 23:59:47 -0400 |
commit | a54f1655be4cb103a6729adcc9ca914c5fdf1ca0 (patch) | |
tree | a54cfff27d2fb3b9d04daa3490a7e601df586c18 /arch/m68k/kernel/signal.c | |
parent | 899dfaa7e7dd825f8366c2a6b38067db43644dc6 (diff) |
m68k: add TIF_NOTIFY_RESUME and handle it.
TIF_NOTIFY_RESUME added (as bit 5). That way nommu glue needs no changes at
all; mmu one needs just to replace jmi do_signal_return to jne do_signal_return
There we have flags shifted up, until bit 6 (SIGPENDING) is in MSBit; instead
of checking that MSBit is set (jmi) we check that MSBit or something below it
is set (jne); bits 0..4 are never set, so that's precisely "bit 6 or bit 5 is
set".
Usual handling of NOTIFY_RESUME/SIGPENDING is done in do_notify_resume(); glue
calls it instead of do_signal().
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/m68k/kernel/signal.c')
-rw-r--r-- | arch/m68k/kernel/signal.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c index d8f6960e8fd9..d9f3d1900eed 100644 --- a/arch/m68k/kernel/signal.c +++ b/arch/m68k/kernel/signal.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <linux/tty.h> | 43 | #include <linux/tty.h> |
44 | #include <linux/binfmts.h> | 44 | #include <linux/binfmts.h> |
45 | #include <linux/module.h> | 45 | #include <linux/module.h> |
46 | #include <linux/tracehook.h> | ||
46 | 47 | ||
47 | #include <asm/setup.h> | 48 | #include <asm/setup.h> |
48 | #include <asm/uaccess.h> | 49 | #include <asm/uaccess.h> |
@@ -1154,7 +1155,7 @@ handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
1154 | * want to handle. Thus you cannot kill init even with a SIGKILL even by | 1155 | * want to handle. Thus you cannot kill init even with a SIGKILL even by |
1155 | * mistake. | 1156 | * mistake. |
1156 | */ | 1157 | */ |
1157 | asmlinkage void do_signal(struct pt_regs *regs) | 1158 | static void do_signal(struct pt_regs *regs) |
1158 | { | 1159 | { |
1159 | siginfo_t info; | 1160 | siginfo_t info; |
1160 | struct k_sigaction ka; | 1161 | struct k_sigaction ka; |
@@ -1186,3 +1187,15 @@ asmlinkage void do_signal(struct pt_regs *regs) | |||
1186 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 1187 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); |
1187 | } | 1188 | } |
1188 | } | 1189 | } |
1190 | |||
1191 | void do_notify_resume(struct pt_regs *regs) | ||
1192 | { | ||
1193 | if (test_thread_flag(TIF_SIGPENDING)) | ||
1194 | do_signal(regs); | ||
1195 | |||
1196 | if (test_and_clear_thread_flag(TIF_NOTIFY_RESUME)) { | ||
1197 | tracehook_notify_resume(regs); | ||
1198 | if (current->replacement_session_keyring) | ||
1199 | key_replace_session_keyring(); | ||
1200 | } | ||
1201 | } | ||