diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-09 12:58:12 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-09 12:58:12 -0400 |
commit | 63b12bdb0d21aca527996fb2c547387bfd3e14b8 (patch) | |
tree | 6ab83b2a1c289f30fea18b88f04138ee69c37c6f /arch/m32r | |
parent | ad1f5caf34390bb20fdbb4eaf71b0494e89936f0 (diff) | |
parent | 059ade650ae57cfd371af690fdba887af04aded8 (diff) |
Merge branch 'signal-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/misc
Pull arch signal handling cleanup from Richard Weinberger:
"This patch series moves all remaining archs to the get_signal(),
signal_setup_done() and sigsp() functions.
Currently these archs use open coded variants of the said functions.
Further, unused parameters get removed from get_signal_to_deliver(),
tracehook_signal_handler() and signal_delivered().
At the end of the day we save around 500 lines of code."
* 'signal-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/misc: (43 commits)
powerpc: Use sigsp()
openrisc: Use sigsp()
mn10300: Use sigsp()
mips: Use sigsp()
microblaze: Use sigsp()
metag: Use sigsp()
m68k: Use sigsp()
m32r: Use sigsp()
hexagon: Use sigsp()
frv: Use sigsp()
cris: Use sigsp()
c6x: Use sigsp()
blackfin: Use sigsp()
avr32: Use sigsp()
arm64: Use sigsp()
arc: Use sigsp()
sas_ss_flags: Remove nested ternary if
Rip out get_signal_to_deliver()
Clean up signal_delivered()
tracehook_signal_handler: Remove sig, info, ka and regs
...
Diffstat (limited to 'arch/m32r')
-rw-r--r-- | arch/m32r/kernel/signal.c | 57 |
1 files changed, 22 insertions, 35 deletions
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c index d503568cb753..95408b8f130a 100644 --- a/arch/m32r/kernel/signal.c +++ b/arch/m32r/kernel/signal.c | |||
@@ -162,28 +162,22 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | |||
162 | * Determine which stack to use.. | 162 | * Determine which stack to use.. |
163 | */ | 163 | */ |
164 | static inline void __user * | 164 | static inline void __user * |
165 | get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size) | 165 | get_sigframe(struct ksignal *ksig, unsigned long sp, size_t frame_size) |
166 | { | 166 | { |
167 | /* This is the X/Open sanctioned signal stack switching. */ | 167 | return (void __user *)((sigsp(sp, ksig) - frame_size) & -8ul); |
168 | if (ka->sa.sa_flags & SA_ONSTACK) { | ||
169 | if (sas_ss_flags(sp) == 0) | ||
170 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
171 | } | ||
172 | |||
173 | return (void __user *)((sp - frame_size) & -8ul); | ||
174 | } | 168 | } |
175 | 169 | ||
176 | static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 170 | static int setup_rt_frame(struct ksignal *ksig, sigset_t *set, |
177 | sigset_t *set, struct pt_regs *regs) | 171 | struct pt_regs *regs) |
178 | { | 172 | { |
179 | struct rt_sigframe __user *frame; | 173 | struct rt_sigframe __user *frame; |
180 | int err = 0; | 174 | int err = 0; |
181 | int signal; | 175 | int signal, sig = ksig->sig; |
182 | 176 | ||
183 | frame = get_sigframe(ka, regs->spu, sizeof(*frame)); | 177 | frame = get_sigframe(ksig, regs->spu, sizeof(*frame)); |
184 | 178 | ||
185 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 179 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
186 | goto give_sigsegv; | 180 | return -EFAULT; |
187 | 181 | ||
188 | signal = current_thread_info()->exec_domain | 182 | signal = current_thread_info()->exec_domain |
189 | && current_thread_info()->exec_domain->signal_invmap | 183 | && current_thread_info()->exec_domain->signal_invmap |
@@ -193,13 +187,13 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
193 | 187 | ||
194 | err |= __put_user(signal, &frame->sig); | 188 | err |= __put_user(signal, &frame->sig); |
195 | if (err) | 189 | if (err) |
196 | goto give_sigsegv; | 190 | return -EFAULT; |
197 | 191 | ||
198 | err |= __put_user(&frame->info, &frame->pinfo); | 192 | err |= __put_user(&frame->info, &frame->pinfo); |
199 | err |= __put_user(&frame->uc, &frame->puc); | 193 | err |= __put_user(&frame->uc, &frame->puc); |
200 | err |= copy_siginfo_to_user(&frame->info, info); | 194 | err |= copy_siginfo_to_user(&frame->info, &ksig->info); |
201 | if (err) | 195 | if (err) |
202 | goto give_sigsegv; | 196 | return -EFAULT; |
203 | 197 | ||
204 | /* Create the ucontext. */ | 198 | /* Create the ucontext. */ |
205 | err |= __put_user(0, &frame->uc.uc_flags); | 199 | err |= __put_user(0, &frame->uc.uc_flags); |
@@ -208,17 +202,17 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
208 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); | 202 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); |
209 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 203 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
210 | if (err) | 204 | if (err) |
211 | goto give_sigsegv; | 205 | return -EFAULT; |
212 | 206 | ||
213 | /* Set up to return from userspace. */ | 207 | /* Set up to return from userspace. */ |
214 | regs->lr = (unsigned long)ka->sa.sa_restorer; | 208 | regs->lr = (unsigned long)ksig->ka.sa.sa_restorer; |
215 | 209 | ||
216 | /* Set up registers for signal handler */ | 210 | /* Set up registers for signal handler */ |
217 | regs->spu = (unsigned long)frame; | 211 | regs->spu = (unsigned long)frame; |
218 | regs->r0 = signal; /* Arg for signal handler */ | 212 | regs->r0 = signal; /* Arg for signal handler */ |
219 | regs->r1 = (unsigned long)&frame->info; | 213 | regs->r1 = (unsigned long)&frame->info; |
220 | regs->r2 = (unsigned long)&frame->uc; | 214 | regs->r2 = (unsigned long)&frame->uc; |
221 | regs->bpc = (unsigned long)ka->sa.sa_handler; | 215 | regs->bpc = (unsigned long)ksig->ka.sa.sa_handler; |
222 | 216 | ||
223 | set_fs(USER_DS); | 217 | set_fs(USER_DS); |
224 | 218 | ||
@@ -228,10 +222,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
228 | #endif | 222 | #endif |
229 | 223 | ||
230 | return 0; | 224 | return 0; |
231 | |||
232 | give_sigsegv: | ||
233 | force_sigsegv(sig, current); | ||
234 | return -EFAULT; | ||
235 | } | 225 | } |
236 | 226 | ||
237 | static int prev_insn(struct pt_regs *regs) | 227 | static int prev_insn(struct pt_regs *regs) |
@@ -252,9 +242,10 @@ static int prev_insn(struct pt_regs *regs) | |||
252 | */ | 242 | */ |
253 | 243 | ||
254 | static void | 244 | static void |
255 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | 245 | handle_signal(struct ksignal *ksig, struct pt_regs *regs) |
256 | struct pt_regs *regs) | ||
257 | { | 246 | { |
247 | int ret; | ||
248 | |||
258 | /* Are we from a system call? */ | 249 | /* Are we from a system call? */ |
259 | if (regs->syscall_nr >= 0) { | 250 | if (regs->syscall_nr >= 0) { |
260 | /* If so, check system call restarting.. */ | 251 | /* If so, check system call restarting.. */ |
@@ -265,7 +256,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
265 | break; | 256 | break; |
266 | 257 | ||
267 | case -ERESTARTSYS: | 258 | case -ERESTARTSYS: |
268 | if (!(ka->sa.sa_flags & SA_RESTART)) { | 259 | if (!(ksig->ka.sa.sa_flags & SA_RESTART)) { |
269 | regs->r0 = -EINTR; | 260 | regs->r0 = -EINTR; |
270 | break; | 261 | break; |
271 | } | 262 | } |
@@ -278,10 +269,9 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
278 | } | 269 | } |
279 | 270 | ||
280 | /* Set up the stack frame */ | 271 | /* Set up the stack frame */ |
281 | if (setup_rt_frame(sig, ka, info, sigmask_to_save(), regs)) | 272 | ret = setup_rt_frame(ksig, sigmask_to_save(), regs); |
282 | return; | ||
283 | 273 | ||
284 | signal_delivered(sig, info, ka, regs, 0); | 274 | signal_setup_done(ret, ksig, 0); |
285 | } | 275 | } |
286 | 276 | ||
287 | /* | 277 | /* |
@@ -291,9 +281,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
291 | */ | 281 | */ |
292 | static void do_signal(struct pt_regs *regs) | 282 | static void do_signal(struct pt_regs *regs) |
293 | { | 283 | { |
294 | siginfo_t info; | 284 | struct ksignal ksig; |
295 | int signr; | ||
296 | struct k_sigaction ka; | ||
297 | 285 | ||
298 | /* | 286 | /* |
299 | * We want the common case to go fast, which | 287 | * We want the common case to go fast, which |
@@ -304,8 +292,7 @@ static void do_signal(struct pt_regs *regs) | |||
304 | if (!user_mode(regs)) | 292 | if (!user_mode(regs)) |
305 | return; | 293 | return; |
306 | 294 | ||
307 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 295 | if (get_signal(&ksig)) { |
308 | if (signr > 0) { | ||
309 | /* Re-enable any watchpoints before delivering the | 296 | /* Re-enable any watchpoints before delivering the |
310 | * signal to user space. The processor register will | 297 | * signal to user space. The processor register will |
311 | * have been cleared if the watchpoint triggered | 298 | * have been cleared if the watchpoint triggered |
@@ -313,7 +300,7 @@ static void do_signal(struct pt_regs *regs) | |||
313 | */ | 300 | */ |
314 | 301 | ||
315 | /* Whee! Actually deliver the signal. */ | 302 | /* Whee! Actually deliver the signal. */ |
316 | handle_signal(signr, &ka, &info, regs); | 303 | handle_signal(&ksig, regs); |
317 | 304 | ||
318 | return; | 305 | return; |
319 | } | 306 | } |