aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-08-09 12:58:12 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-08-09 12:58:12 -0400
commit63b12bdb0d21aca527996fb2c547387bfd3e14b8 (patch)
tree6ab83b2a1c289f30fea18b88f04138ee69c37c6f /arch/ia64/kernel
parentad1f5caf34390bb20fdbb4eaf71b0494e89936f0 (diff)
parent059ade650ae57cfd371af690fdba887af04aded8 (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/ia64/kernel')
-rw-r--r--arch/ia64/kernel/signal.c46
1 files changed, 21 insertions, 25 deletions
diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c
index 33cab9a8adff..6d92170be457 100644
--- a/arch/ia64/kernel/signal.c
+++ b/arch/ia64/kernel/signal.c
@@ -309,12 +309,11 @@ force_sigsegv_info (int sig, void __user *addr)
309 si.si_uid = from_kuid_munged(current_user_ns(), current_uid()); 309 si.si_uid = from_kuid_munged(current_user_ns(), current_uid());
310 si.si_addr = addr; 310 si.si_addr = addr;
311 force_sig_info(SIGSEGV, &si, current); 311 force_sig_info(SIGSEGV, &si, current);
312 return 0; 312 return 1;
313} 313}
314 314
315static long 315static long
316setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, 316setup_frame(struct ksignal *ksig, sigset_t *set, struct sigscratch *scr)
317 struct sigscratch *scr)
318{ 317{
319 extern char __kernel_sigtramp[]; 318 extern char __kernel_sigtramp[];
320 unsigned long tramp_addr, new_rbs = 0, new_sp; 319 unsigned long tramp_addr, new_rbs = 0, new_sp;
@@ -323,7 +322,7 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,
323 322
324 new_sp = scr->pt.r12; 323 new_sp = scr->pt.r12;
325 tramp_addr = (unsigned long) __kernel_sigtramp; 324 tramp_addr = (unsigned long) __kernel_sigtramp;
326 if (ka->sa.sa_flags & SA_ONSTACK) { 325 if (ksig->ka.sa.sa_flags & SA_ONSTACK) {
327 int onstack = sas_ss_flags(new_sp); 326 int onstack = sas_ss_flags(new_sp);
328 327
329 if (onstack == 0) { 328 if (onstack == 0) {
@@ -347,29 +346,29 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,
347 */ 346 */
348 check_sp = (new_sp - sizeof(*frame)) & -STACK_ALIGN; 347 check_sp = (new_sp - sizeof(*frame)) & -STACK_ALIGN;
349 if (!likely(on_sig_stack(check_sp))) 348 if (!likely(on_sig_stack(check_sp)))
350 return force_sigsegv_info(sig, (void __user *) 349 return force_sigsegv_info(ksig->sig, (void __user *)
351 check_sp); 350 check_sp);
352 } 351 }
353 } 352 }
354 frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN); 353 frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN);
355 354
356 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) 355 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
357 return force_sigsegv_info(sig, frame); 356 return force_sigsegv_info(ksig->sig, frame);
358 357
359 err = __put_user(sig, &frame->arg0); 358 err = __put_user(ksig->sig, &frame->arg0);
360 err |= __put_user(&frame->info, &frame->arg1); 359 err |= __put_user(&frame->info, &frame->arg1);
361 err |= __put_user(&frame->sc, &frame->arg2); 360 err |= __put_user(&frame->sc, &frame->arg2);
362 err |= __put_user(new_rbs, &frame->sc.sc_rbs_base); 361 err |= __put_user(new_rbs, &frame->sc.sc_rbs_base);
363 err |= __put_user(0, &frame->sc.sc_loadrs); /* initialize to zero */ 362 err |= __put_user(0, &frame->sc.sc_loadrs); /* initialize to zero */
364 err |= __put_user(ka->sa.sa_handler, &frame->handler); 363 err |= __put_user(ksig->ka.sa.sa_handler, &frame->handler);
365 364
366 err |= copy_siginfo_to_user(&frame->info, info); 365 err |= copy_siginfo_to_user(&frame->info, &ksig->info);
367 366
368 err |= __save_altstack(&frame->sc.sc_stack, scr->pt.r12); 367 err |= __save_altstack(&frame->sc.sc_stack, scr->pt.r12);
369 err |= setup_sigcontext(&frame->sc, set, scr); 368 err |= setup_sigcontext(&frame->sc, set, scr);
370 369
371 if (unlikely(err)) 370 if (unlikely(err))
372 return force_sigsegv_info(sig, frame); 371 return force_sigsegv_info(ksig->sig, frame);
373 372
374 scr->pt.r12 = (unsigned long) frame - 16; /* new stack pointer */ 373 scr->pt.r12 = (unsigned long) frame - 16; /* new stack pointer */
375 scr->pt.ar_fpsr = FPSR_DEFAULT; /* reset fpsr for signal handler */ 374 scr->pt.ar_fpsr = FPSR_DEFAULT; /* reset fpsr for signal handler */
@@ -394,22 +393,20 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,
394 393
395#if DEBUG_SIG 394#if DEBUG_SIG
396 printk("SIG deliver (%s:%d): sig=%d sp=%lx ip=%lx handler=%p\n", 395 printk("SIG deliver (%s:%d): sig=%d sp=%lx ip=%lx handler=%p\n",
397 current->comm, current->pid, sig, scr->pt.r12, frame->sc.sc_ip, frame->handler); 396 current->comm, current->pid, ksig->sig, scr->pt.r12, frame->sc.sc_ip, frame->handler);
398#endif 397#endif
399 return 1; 398 return 0;
400} 399}
401 400
402static long 401static long
403handle_signal (unsigned long sig, struct k_sigaction *ka, siginfo_t *info, 402handle_signal (struct ksignal *ksig, struct sigscratch *scr)
404 struct sigscratch *scr)
405{ 403{
406 if (!setup_frame(sig, ka, info, sigmask_to_save(), scr)) 404 int ret = setup_frame(ksig, sigmask_to_save(), scr);
407 return 0;
408 405
409 signal_delivered(sig, info, ka, &scr->pt, 406 if (!ret)
410 test_thread_flag(TIF_SINGLESTEP)); 407 signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
411 408
412 return 1; 409 return ret;
413} 410}
414 411
415/* 412/*
@@ -419,17 +416,16 @@ handle_signal (unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
419void 416void
420ia64_do_signal (struct sigscratch *scr, long in_syscall) 417ia64_do_signal (struct sigscratch *scr, long in_syscall)
421{ 418{
422 struct k_sigaction ka;
423 siginfo_t info;
424 long restart = in_syscall; 419 long restart = in_syscall;
425 long errno = scr->pt.r8; 420 long errno = scr->pt.r8;
421 struct ksignal ksig;
426 422
427 /* 423 /*
428 * This only loops in the rare cases of handle_signal() failing, in which case we 424 * This only loops in the rare cases of handle_signal() failing, in which case we
429 * need to push through a forced SIGSEGV. 425 * need to push through a forced SIGSEGV.
430 */ 426 */
431 while (1) { 427 while (1) {
432 int signr = get_signal_to_deliver(&info, &ka, &scr->pt, NULL); 428 get_signal(&ksig);
433 429
434 /* 430 /*
435 * get_signal_to_deliver() may have run a debugger (via notify_parent()) 431 * get_signal_to_deliver() may have run a debugger (via notify_parent())
@@ -446,7 +442,7 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall)
446 */ 442 */
447 restart = 0; 443 restart = 0;
448 444
449 if (signr <= 0) 445 if (ksig.sig <= 0)
450 break; 446 break;
451 447
452 if (unlikely(restart)) { 448 if (unlikely(restart)) {
@@ -458,7 +454,7 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall)
458 break; 454 break;
459 455
460 case ERESTARTSYS: 456 case ERESTARTSYS:
461 if ((ka.sa.sa_flags & SA_RESTART) == 0) { 457 if ((ksig.ka.sa.sa_flags & SA_RESTART) == 0) {
462 scr->pt.r8 = EINTR; 458 scr->pt.r8 = EINTR;
463 /* note: scr->pt.r10 is already -1 */ 459 /* note: scr->pt.r10 is already -1 */
464 break; 460 break;
@@ -473,7 +469,7 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall)
473 * Whee! Actually deliver the signal. If the delivery failed, we need to 469 * Whee! Actually deliver the signal. If the delivery failed, we need to
474 * continue to iterate in this loop so we can deliver the SIGSEGV... 470 * continue to iterate in this loop so we can deliver the SIGSEGV...
475 */ 471 */
476 if (handle_signal(signr, &ka, &info, scr)) 472 if (handle_signal(&ksig, scr))
477 return; 473 return;
478 } 474 }
479 475