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 | |
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')
-rw-r--r-- | arch/m68k/include/asm/thread_info.h | 1 | ||||
-rw-r--r-- | arch/m68k/kernel/entry_mm.S | 6 | ||||
-rw-r--r-- | arch/m68k/kernel/signal.c | 15 | ||||
-rw-r--r-- | arch/m68k/platform/68328/entry.S | 2 | ||||
-rw-r--r-- | arch/m68k/platform/68360/entry.S | 2 | ||||
-rw-r--r-- | arch/m68k/platform/coldfire/entry.S | 2 |
6 files changed, 21 insertions, 7 deletions
diff --git a/arch/m68k/include/asm/thread_info.h b/arch/m68k/include/asm/thread_info.h index e8665e6f9464..126131f94a2c 100644 --- a/arch/m68k/include/asm/thread_info.h +++ b/arch/m68k/include/asm/thread_info.h | |||
@@ -71,6 +71,7 @@ static inline struct thread_info *current_thread_info(void) | |||
71 | * bits 0-7 are tested at every exception exit | 71 | * bits 0-7 are tested at every exception exit |
72 | * bits 8-15 are also tested at syscall exit | 72 | * bits 8-15 are also tested at syscall exit |
73 | */ | 73 | */ |
74 | #define TIF_NOTIFY_RESUME 5 /* callback before returning to user */ | ||
74 | #define TIF_SIGPENDING 6 /* signal pending */ | 75 | #define TIF_SIGPENDING 6 /* signal pending */ |
75 | #define TIF_NEED_RESCHED 7 /* rescheduling necessary */ | 76 | #define TIF_NEED_RESCHED 7 /* rescheduling necessary */ |
76 | #define TIF_DELAYED_TRACE 14 /* single step a syscall */ | 77 | #define TIF_DELAYED_TRACE 14 /* single step a syscall */ |
diff --git a/arch/m68k/kernel/entry_mm.S b/arch/m68k/kernel/entry_mm.S index 675a854966a6..f29e73ca9dbb 100644 --- a/arch/m68k/kernel/entry_mm.S +++ b/arch/m68k/kernel/entry_mm.S | |||
@@ -148,7 +148,7 @@ syscall_exit_work: | |||
148 | jcs do_trace_exit | 148 | jcs do_trace_exit |
149 | jmi do_delayed_trace | 149 | jmi do_delayed_trace |
150 | lslw #8,%d0 | 150 | lslw #8,%d0 |
151 | jmi do_signal_return | 151 | jne do_signal_return |
152 | pea resume_userspace | 152 | pea resume_userspace |
153 | jra schedule | 153 | jra schedule |
154 | 154 | ||
@@ -172,7 +172,7 @@ exit_work: | |||
172 | | save top of frame | 172 | | save top of frame |
173 | movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0) | 173 | movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0) |
174 | lslb #1,%d0 | 174 | lslb #1,%d0 |
175 | jmi do_signal_return | 175 | jne do_signal_return |
176 | pea resume_userspace | 176 | pea resume_userspace |
177 | jra schedule | 177 | jra schedule |
178 | 178 | ||
@@ -182,7 +182,7 @@ do_signal_return: | |||
182 | subql #4,%sp | dummy return address | 182 | subql #4,%sp | dummy return address |
183 | SAVE_SWITCH_STACK | 183 | SAVE_SWITCH_STACK |
184 | pea %sp@(SWITCH_STACK_SIZE) | 184 | pea %sp@(SWITCH_STACK_SIZE) |
185 | bsrl do_signal | 185 | bsrl do_notify_resume |
186 | addql #4,%sp | 186 | addql #4,%sp |
187 | RESTORE_SWITCH_STACK | 187 | RESTORE_SWITCH_STACK |
188 | addql #4,%sp | 188 | addql #4,%sp |
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 | } | ||
diff --git a/arch/m68k/platform/68328/entry.S b/arch/m68k/platform/68328/entry.S index 5c39b80ed7de..7f91c2fde509 100644 --- a/arch/m68k/platform/68328/entry.S +++ b/arch/m68k/platform/68328/entry.S | |||
@@ -119,7 +119,7 @@ Lsignal_return: | |||
119 | subql #4,%sp /* dummy return address*/ | 119 | subql #4,%sp /* dummy return address*/ |
120 | SAVE_SWITCH_STACK | 120 | SAVE_SWITCH_STACK |
121 | pea %sp@(SWITCH_STACK_SIZE) | 121 | pea %sp@(SWITCH_STACK_SIZE) |
122 | bsrw do_signal | 122 | bsrw do_notify_resume |
123 | addql #4,%sp | 123 | addql #4,%sp |
124 | RESTORE_SWITCH_STACK | 124 | RESTORE_SWITCH_STACK |
125 | addql #4,%sp | 125 | addql #4,%sp |
diff --git a/arch/m68k/platform/68360/entry.S b/arch/m68k/platform/68360/entry.S index aa47d1d49929..904fd9a4af4e 100644 --- a/arch/m68k/platform/68360/entry.S +++ b/arch/m68k/platform/68360/entry.S | |||
@@ -115,7 +115,7 @@ Lsignal_return: | |||
115 | subql #4,%sp /* dummy return address*/ | 115 | subql #4,%sp /* dummy return address*/ |
116 | SAVE_SWITCH_STACK | 116 | SAVE_SWITCH_STACK |
117 | pea %sp@(SWITCH_STACK_SIZE) | 117 | pea %sp@(SWITCH_STACK_SIZE) |
118 | bsrw do_signal | 118 | bsrw do_notify_resume |
119 | addql #4,%sp | 119 | addql #4,%sp |
120 | RESTORE_SWITCH_STACK | 120 | RESTORE_SWITCH_STACK |
121 | addql #4,%sp | 121 | addql #4,%sp |
diff --git a/arch/m68k/platform/coldfire/entry.S b/arch/m68k/platform/coldfire/entry.S index 281e38c2b6c7..881ab8e379d4 100644 --- a/arch/m68k/platform/coldfire/entry.S +++ b/arch/m68k/platform/coldfire/entry.S | |||
@@ -152,7 +152,7 @@ Lsignal_return: | |||
152 | subql #4,%sp /* dummy return address */ | 152 | subql #4,%sp /* dummy return address */ |
153 | SAVE_SWITCH_STACK | 153 | SAVE_SWITCH_STACK |
154 | pea %sp@(SWITCH_STACK_SIZE) | 154 | pea %sp@(SWITCH_STACK_SIZE) |
155 | jsr do_signal | 155 | jsr do_notify_resume |
156 | addql #4,%sp | 156 | addql #4,%sp |
157 | RESTORE_SWITCH_STACK | 157 | RESTORE_SWITCH_STACK |
158 | addql #4,%sp | 158 | addql #4,%sp |