diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-11-07 23:48:13 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-02-14 09:21:16 -0500 |
commit | 08f739570de697dc06b949ba3be33acdda21498c (patch) | |
tree | d320ae4cbe2c174f3ce34685311b4ccbb15751bc | |
parent | 7e243643dffbe216dbcb10933c4cafde0f95f537 (diff) |
sparc: convert to ksignal
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | arch/sparc/kernel/signal32.c | 154 | ||||
-rw-r--r-- | arch/sparc/kernel/signal_32.c | 146 | ||||
-rw-r--r-- | arch/sparc/kernel/signal_64.c | 118 |
3 files changed, 164 insertions, 254 deletions
diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c index 9d9eb91d0de1..cd5dc4d411d1 100644 --- a/arch/sparc/kernel/signal32.c +++ b/arch/sparc/kernel/signal32.c | |||
@@ -323,7 +323,7 @@ static int invalid_frame_pointer(void __user *fp, int fplen) | |||
323 | return 0; | 323 | return 0; |
324 | } | 324 | } |
325 | 325 | ||
326 | static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) | 326 | static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize) |
327 | { | 327 | { |
328 | unsigned long sp; | 328 | unsigned long sp; |
329 | 329 | ||
@@ -338,12 +338,7 @@ static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, uns | |||
338 | return (void __user *) -1L; | 338 | return (void __user *) -1L; |
339 | 339 | ||
340 | /* This is the X/Open sanctioned signal stack switching. */ | 340 | /* This is the X/Open sanctioned signal stack switching. */ |
341 | if (sa->sa_flags & SA_ONSTACK) { | 341 | sp = sigsp(sp, ksig) - framesize; |
342 | if (sas_ss_flags(sp) == 0) | ||
343 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
344 | } | ||
345 | |||
346 | sp -= framesize; | ||
347 | 342 | ||
348 | /* Always align the stack frame. This handles two cases. First, | 343 | /* Always align the stack frame. This handles two cases. First, |
349 | * sigaltstack need not be mindful of platform specific stack | 344 | * sigaltstack need not be mindful of platform specific stack |
@@ -414,8 +409,8 @@ out_irqs_on: | |||
414 | 409 | ||
415 | } | 410 | } |
416 | 411 | ||
417 | static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | 412 | static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs, |
418 | int signo, sigset_t *oldset) | 413 | sigset_t *oldset) |
419 | { | 414 | { |
420 | struct signal_frame32 __user *sf; | 415 | struct signal_frame32 __user *sf; |
421 | int i, err, wsaved; | 416 | int i, err, wsaved; |
@@ -437,10 +432,12 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
437 | sigframe_size += sizeof(__siginfo_rwin_t); | 432 | sigframe_size += sizeof(__siginfo_rwin_t); |
438 | 433 | ||
439 | sf = (struct signal_frame32 __user *) | 434 | sf = (struct signal_frame32 __user *) |
440 | get_sigframe(&ka->sa, regs, sigframe_size); | 435 | get_sigframe(ksig, regs, sigframe_size); |
441 | 436 | ||
442 | if (invalid_frame_pointer(sf, sigframe_size)) | 437 | if (invalid_frame_pointer(sf, sigframe_size)) { |
443 | goto sigill; | 438 | do_exit(SIGILL); |
439 | return -EINVAL; | ||
440 | } | ||
444 | 441 | ||
445 | tail = (sf + 1); | 442 | tail = (sf + 1); |
446 | 443 | ||
@@ -514,16 +511,16 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
514 | err |= __put_user(rp->ins[7], &sf->ss.callers_pc); | 511 | err |= __put_user(rp->ins[7], &sf->ss.callers_pc); |
515 | } | 512 | } |
516 | if (err) | 513 | if (err) |
517 | goto sigsegv; | 514 | return err; |
518 | 515 | ||
519 | /* 3. signal handler back-trampoline and parameters */ | 516 | /* 3. signal handler back-trampoline and parameters */ |
520 | regs->u_regs[UREG_FP] = (unsigned long) sf; | 517 | regs->u_regs[UREG_FP] = (unsigned long) sf; |
521 | regs->u_regs[UREG_I0] = signo; | 518 | regs->u_regs[UREG_I0] = ksig->sig; |
522 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; | 519 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; |
523 | regs->u_regs[UREG_I2] = (unsigned long) &sf->info; | 520 | regs->u_regs[UREG_I2] = (unsigned long) &sf->info; |
524 | 521 | ||
525 | /* 4. signal handler */ | 522 | /* 4. signal handler */ |
526 | regs->tpc = (unsigned long) ka->sa.sa_handler; | 523 | regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; |
527 | regs->tnpc = (regs->tpc + 4); | 524 | regs->tnpc = (regs->tpc + 4); |
528 | if (test_thread_flag(TIF_32BIT)) { | 525 | if (test_thread_flag(TIF_32BIT)) { |
529 | regs->tpc &= 0xffffffff; | 526 | regs->tpc &= 0xffffffff; |
@@ -531,8 +528,8 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
531 | } | 528 | } |
532 | 529 | ||
533 | /* 5. return to kernel instructions */ | 530 | /* 5. return to kernel instructions */ |
534 | if (ka->ka_restorer) { | 531 | if (ksig->ka.ka_restorer) { |
535 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 532 | regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; |
536 | } else { | 533 | } else { |
537 | unsigned long address = ((unsigned long)&(sf->insns[0])); | 534 | unsigned long address = ((unsigned long)&(sf->insns[0])); |
538 | 535 | ||
@@ -541,23 +538,14 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
541 | err = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/ | 538 | err = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/ |
542 | err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/ | 539 | err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/ |
543 | if (err) | 540 | if (err) |
544 | goto sigsegv; | 541 | return err; |
545 | flush_signal_insns(address); | 542 | flush_signal_insns(address); |
546 | } | 543 | } |
547 | return 0; | 544 | return 0; |
548 | |||
549 | sigill: | ||
550 | do_exit(SIGILL); | ||
551 | return -EINVAL; | ||
552 | |||
553 | sigsegv: | ||
554 | force_sigsegv(signo, current); | ||
555 | return -EFAULT; | ||
556 | } | 545 | } |
557 | 546 | ||
558 | static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | 547 | static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs, |
559 | unsigned long signr, sigset_t *oldset, | 548 | sigset_t *oldset) |
560 | siginfo_t *info) | ||
561 | { | 549 | { |
562 | struct rt_signal_frame32 __user *sf; | 550 | struct rt_signal_frame32 __user *sf; |
563 | int i, err, wsaved; | 551 | int i, err, wsaved; |
@@ -579,10 +567,12 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
579 | sigframe_size += sizeof(__siginfo_rwin_t); | 567 | sigframe_size += sizeof(__siginfo_rwin_t); |
580 | 568 | ||
581 | sf = (struct rt_signal_frame32 __user *) | 569 | sf = (struct rt_signal_frame32 __user *) |
582 | get_sigframe(&ka->sa, regs, sigframe_size); | 570 | get_sigframe(ksig, regs, sigframe_size); |
583 | 571 | ||
584 | if (invalid_frame_pointer(sf, sigframe_size)) | 572 | if (invalid_frame_pointer(sf, sigframe_size)) { |
585 | goto sigill; | 573 | do_exit(SIGILL); |
574 | return -EINVAL; | ||
575 | } | ||
586 | 576 | ||
587 | tail = (sf + 1); | 577 | tail = (sf + 1); |
588 | 578 | ||
@@ -627,7 +617,7 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
627 | } | 617 | } |
628 | 618 | ||
629 | /* Update the siginfo structure. */ | 619 | /* Update the siginfo structure. */ |
630 | err |= copy_siginfo_to_user32(&sf->info, info); | 620 | err |= copy_siginfo_to_user32(&sf->info, &ksig->info); |
631 | 621 | ||
632 | /* Setup sigaltstack */ | 622 | /* Setup sigaltstack */ |
633 | err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]); | 623 | err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]); |
@@ -660,16 +650,16 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
660 | err |= __put_user(rp->ins[7], &sf->ss.callers_pc); | 650 | err |= __put_user(rp->ins[7], &sf->ss.callers_pc); |
661 | } | 651 | } |
662 | if (err) | 652 | if (err) |
663 | goto sigsegv; | 653 | return err; |
664 | 654 | ||
665 | /* 3. signal handler back-trampoline and parameters */ | 655 | /* 3. signal handler back-trampoline and parameters */ |
666 | regs->u_regs[UREG_FP] = (unsigned long) sf; | 656 | regs->u_regs[UREG_FP] = (unsigned long) sf; |
667 | regs->u_regs[UREG_I0] = signr; | 657 | regs->u_regs[UREG_I0] = ksig->sig; |
668 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; | 658 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; |
669 | regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; | 659 | regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; |
670 | 660 | ||
671 | /* 4. signal handler */ | 661 | /* 4. signal handler */ |
672 | regs->tpc = (unsigned long) ka->sa.sa_handler; | 662 | regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; |
673 | regs->tnpc = (regs->tpc + 4); | 663 | regs->tnpc = (regs->tpc + 4); |
674 | if (test_thread_flag(TIF_32BIT)) { | 664 | if (test_thread_flag(TIF_32BIT)) { |
675 | regs->tpc &= 0xffffffff; | 665 | regs->tpc &= 0xffffffff; |
@@ -677,8 +667,8 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
677 | } | 667 | } |
678 | 668 | ||
679 | /* 5. return to kernel instructions */ | 669 | /* 5. return to kernel instructions */ |
680 | if (ka->ka_restorer) | 670 | if (ksig->ka.ka_restorer) |
681 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 671 | regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; |
682 | else { | 672 | else { |
683 | unsigned long address = ((unsigned long)&(sf->insns[0])); | 673 | unsigned long address = ((unsigned long)&(sf->insns[0])); |
684 | 674 | ||
@@ -690,36 +680,25 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
690 | /* t 0x10 */ | 680 | /* t 0x10 */ |
691 | err |= __put_user(0x91d02010, &sf->insns[1]); | 681 | err |= __put_user(0x91d02010, &sf->insns[1]); |
692 | if (err) | 682 | if (err) |
693 | goto sigsegv; | 683 | return err; |
694 | 684 | ||
695 | flush_signal_insns(address); | 685 | flush_signal_insns(address); |
696 | } | 686 | } |
697 | return 0; | 687 | return 0; |
698 | |||
699 | sigill: | ||
700 | do_exit(SIGILL); | ||
701 | return -EINVAL; | ||
702 | |||
703 | sigsegv: | ||
704 | force_sigsegv(signr, current); | ||
705 | return -EFAULT; | ||
706 | } | 688 | } |
707 | 689 | ||
708 | static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka, | 690 | static inline void handle_signal32(struct ksignal *ksig, |
709 | siginfo_t *info, | 691 | struct pt_regs *regs) |
710 | sigset_t *oldset, struct pt_regs *regs) | ||
711 | { | 692 | { |
693 | sigset_t *oldset = sigmask_to_save(); | ||
712 | int err; | 694 | int err; |
713 | 695 | ||
714 | if (ka->sa.sa_flags & SA_SIGINFO) | 696 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) |
715 | err = setup_rt_frame32(ka, regs, signr, oldset, info); | 697 | err = setup_rt_frame32(ksig, regs, oldset); |
716 | else | 698 | else |
717 | err = setup_frame32(ka, regs, signr, oldset); | 699 | err = setup_frame32(ksig, regs, oldset); |
718 | 700 | ||
719 | if (err) | 701 | signal_setup_done(err, ksig, 0); |
720 | return; | ||
721 | |||
722 | signal_delivered(signr, info, ka, regs, 0); | ||
723 | } | 702 | } |
724 | 703 | ||
725 | static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs, | 704 | static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs, |
@@ -749,50 +728,41 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs | |||
749 | */ | 728 | */ |
750 | void do_signal32(sigset_t *oldset, struct pt_regs * regs) | 729 | void do_signal32(sigset_t *oldset, struct pt_regs * regs) |
751 | { | 730 | { |
752 | struct k_sigaction ka; | 731 | struct ksignal ksig; |
753 | unsigned long orig_i0; | 732 | unsigned long orig_i0 = 0; |
754 | int restart_syscall; | 733 | int restart_syscall = 0; |
755 | siginfo_t info; | 734 | bool has_handler = get_signal(&ksig); |
756 | int signr; | ||
757 | |||
758 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | ||
759 | 735 | ||
760 | restart_syscall = 0; | ||
761 | orig_i0 = 0; | ||
762 | if (pt_regs_is_syscall(regs) && | 736 | if (pt_regs_is_syscall(regs) && |
763 | (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) { | 737 | (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) { |
764 | restart_syscall = 1; | 738 | restart_syscall = 1; |
765 | orig_i0 = regs->u_regs[UREG_G6]; | 739 | orig_i0 = regs->u_regs[UREG_G6]; |
766 | } | 740 | } |
767 | 741 | ||
768 | if (signr > 0) { | 742 | if (has_handler) { |
769 | if (restart_syscall) | 743 | if (restart_syscall) |
770 | syscall_restart32(orig_i0, regs, &ka.sa); | 744 | syscall_restart32(orig_i0, regs, &ksig.ka.sa); |
771 | handle_signal32(signr, &ka, &info, oldset, regs); | 745 | handle_signal32(&ksig, regs); |
772 | return; | 746 | } else { |
773 | } | 747 | if (restart_syscall) { |
774 | if (restart_syscall && | 748 | switch (regs->u_regs[UREG_I0]) { |
775 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || | 749 | case ERESTARTNOHAND: |
776 | regs->u_regs[UREG_I0] == ERESTARTSYS || | 750 | case ERESTARTSYS: |
777 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { | 751 | case ERESTARTNOINTR: |
778 | /* replay the system call when we are done */ | 752 | /* replay the system call when we are done */ |
779 | regs->u_regs[UREG_I0] = orig_i0; | 753 | regs->u_regs[UREG_I0] = orig_i0; |
780 | regs->tpc -= 4; | 754 | regs->tpc -= 4; |
781 | regs->tnpc -= 4; | 755 | regs->tnpc -= 4; |
782 | pt_regs_clear_syscall(regs); | 756 | pt_regs_clear_syscall(regs); |
783 | } | 757 | case ERESTART_RESTARTBLOCK: |
784 | if (restart_syscall && | 758 | regs->u_regs[UREG_G1] = __NR_restart_syscall; |
785 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | 759 | regs->tpc -= 4; |
786 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | 760 | regs->tnpc -= 4; |
787 | regs->tpc -= 4; | 761 | pt_regs_clear_syscall(regs); |
788 | regs->tnpc -= 4; | 762 | } |
789 | pt_regs_clear_syscall(regs); | 763 | } |
764 | restore_saved_sigmask(); | ||
790 | } | 765 | } |
791 | |||
792 | /* If there's no signal to deliver, we just put the saved sigmask | ||
793 | * back | ||
794 | */ | ||
795 | restore_saved_sigmask(); | ||
796 | } | 766 | } |
797 | 767 | ||
798 | struct sigstack32 { | 768 | struct sigstack32 { |
diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c index cd1823487759..7d5d8e1f8415 100644 --- a/arch/sparc/kernel/signal_32.c +++ b/arch/sparc/kernel/signal_32.c | |||
@@ -186,7 +186,7 @@ static inline int invalid_frame_pointer(void __user *fp, int fplen) | |||
186 | return 0; | 186 | return 0; |
187 | } | 187 | } |
188 | 188 | ||
189 | static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) | 189 | static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize) |
190 | { | 190 | { |
191 | unsigned long sp = regs->u_regs[UREG_FP]; | 191 | unsigned long sp = regs->u_regs[UREG_FP]; |
192 | 192 | ||
@@ -198,12 +198,7 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re | |||
198 | return (void __user *) -1L; | 198 | return (void __user *) -1L; |
199 | 199 | ||
200 | /* This is the X/Open sanctioned signal stack switching. */ | 200 | /* This is the X/Open sanctioned signal stack switching. */ |
201 | if (sa->sa_flags & SA_ONSTACK) { | 201 | sp = sigsp(sp, ksig) - framesize; |
202 | if (sas_ss_flags(sp) == 0) | ||
203 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
204 | } | ||
205 | |||
206 | sp -= framesize; | ||
207 | 202 | ||
208 | /* Always align the stack frame. This handles two cases. First, | 203 | /* Always align the stack frame. This handles two cases. First, |
209 | * sigaltstack need not be mindful of platform specific stack | 204 | * sigaltstack need not be mindful of platform specific stack |
@@ -216,8 +211,8 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re | |||
216 | return (void __user *) sp; | 211 | return (void __user *) sp; |
217 | } | 212 | } |
218 | 213 | ||
219 | static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, | 214 | static int setup_frame(struct ksignal *ksig, struct pt_regs *regs, |
220 | int signo, sigset_t *oldset) | 215 | sigset_t *oldset) |
221 | { | 216 | { |
222 | struct signal_frame __user *sf; | 217 | struct signal_frame __user *sf; |
223 | int sigframe_size, err, wsaved; | 218 | int sigframe_size, err, wsaved; |
@@ -235,10 +230,12 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
235 | sigframe_size += sizeof(__siginfo_rwin_t); | 230 | sigframe_size += sizeof(__siginfo_rwin_t); |
236 | 231 | ||
237 | sf = (struct signal_frame __user *) | 232 | sf = (struct signal_frame __user *) |
238 | get_sigframe(&ka->sa, regs, sigframe_size); | 233 | get_sigframe(ksig, regs, sigframe_size); |
239 | 234 | ||
240 | if (invalid_frame_pointer(sf, sigframe_size)) | 235 | if (invalid_frame_pointer(sf, sigframe_size)) { |
241 | goto sigill_and_return; | 236 | do_exit(SIGILL); |
237 | return -EINVAL; | ||
238 | } | ||
242 | 239 | ||
243 | tail = sf + 1; | 240 | tail = sf + 1; |
244 | 241 | ||
@@ -277,21 +274,21 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
277 | err |= __copy_to_user(sf, rp, sizeof(struct reg_window32)); | 274 | err |= __copy_to_user(sf, rp, sizeof(struct reg_window32)); |
278 | } | 275 | } |
279 | if (err) | 276 | if (err) |
280 | goto sigsegv; | 277 | return err; |
281 | 278 | ||
282 | /* 3. signal handler back-trampoline and parameters */ | 279 | /* 3. signal handler back-trampoline and parameters */ |
283 | regs->u_regs[UREG_FP] = (unsigned long) sf; | 280 | regs->u_regs[UREG_FP] = (unsigned long) sf; |
284 | regs->u_regs[UREG_I0] = signo; | 281 | regs->u_regs[UREG_I0] = ksig->sig; |
285 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; | 282 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; |
286 | regs->u_regs[UREG_I2] = (unsigned long) &sf->info; | 283 | regs->u_regs[UREG_I2] = (unsigned long) &sf->info; |
287 | 284 | ||
288 | /* 4. signal handler */ | 285 | /* 4. signal handler */ |
289 | regs->pc = (unsigned long) ka->sa.sa_handler; | 286 | regs->pc = (unsigned long) ksig->ka.sa.sa_handler; |
290 | regs->npc = (regs->pc + 4); | 287 | regs->npc = (regs->pc + 4); |
291 | 288 | ||
292 | /* 5. return to kernel instructions */ | 289 | /* 5. return to kernel instructions */ |
293 | if (ka->ka_restorer) | 290 | if (ksig->ka.ka_restorer) |
294 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 291 | regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; |
295 | else { | 292 | else { |
296 | regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); | 293 | regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); |
297 | 294 | ||
@@ -301,24 +298,16 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
301 | /* t 0x10 */ | 298 | /* t 0x10 */ |
302 | err |= __put_user(0x91d02010, &sf->insns[1]); | 299 | err |= __put_user(0x91d02010, &sf->insns[1]); |
303 | if (err) | 300 | if (err) |
304 | goto sigsegv; | 301 | return err; |
305 | 302 | ||
306 | /* Flush instruction space. */ | 303 | /* Flush instruction space. */ |
307 | flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); | 304 | flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); |
308 | } | 305 | } |
309 | return 0; | 306 | return 0; |
310 | |||
311 | sigill_and_return: | ||
312 | do_exit(SIGILL); | ||
313 | return -EINVAL; | ||
314 | |||
315 | sigsegv: | ||
316 | force_sigsegv(signo, current); | ||
317 | return -EFAULT; | ||
318 | } | 307 | } |
319 | 308 | ||
320 | static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | 309 | static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs, |
321 | int signo, sigset_t *oldset, siginfo_t *info) | 310 | sigset_t *oldset) |
322 | { | 311 | { |
323 | struct rt_signal_frame __user *sf; | 312 | struct rt_signal_frame __user *sf; |
324 | int sigframe_size, wsaved; | 313 | int sigframe_size, wsaved; |
@@ -334,9 +323,11 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
334 | if (wsaved) | 323 | if (wsaved) |
335 | sigframe_size += sizeof(__siginfo_rwin_t); | 324 | sigframe_size += sizeof(__siginfo_rwin_t); |
336 | sf = (struct rt_signal_frame __user *) | 325 | sf = (struct rt_signal_frame __user *) |
337 | get_sigframe(&ka->sa, regs, sigframe_size); | 326 | get_sigframe(ksig, regs, sigframe_size); |
338 | if (invalid_frame_pointer(sf, sigframe_size)) | 327 | if (invalid_frame_pointer(sf, sigframe_size)) { |
339 | goto sigill; | 328 | do_exit(SIGILL); |
329 | return -EINVAL; | ||
330 | } | ||
340 | 331 | ||
341 | tail = sf + 1; | 332 | tail = sf + 1; |
342 | err = __put_user(regs->pc, &sf->regs.pc); | 333 | err = __put_user(regs->pc, &sf->regs.pc); |
@@ -380,21 +371,21 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
380 | err |= __copy_to_user(sf, rp, sizeof(struct reg_window32)); | 371 | err |= __copy_to_user(sf, rp, sizeof(struct reg_window32)); |
381 | } | 372 | } |
382 | 373 | ||
383 | err |= copy_siginfo_to_user(&sf->info, info); | 374 | err |= copy_siginfo_to_user(&sf->info, &ksig->info); |
384 | 375 | ||
385 | if (err) | 376 | if (err) |
386 | goto sigsegv; | 377 | return err; |
387 | 378 | ||
388 | regs->u_regs[UREG_FP] = (unsigned long) sf; | 379 | regs->u_regs[UREG_FP] = (unsigned long) sf; |
389 | regs->u_regs[UREG_I0] = signo; | 380 | regs->u_regs[UREG_I0] = ksig->sig; |
390 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; | 381 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; |
391 | regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; | 382 | regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; |
392 | 383 | ||
393 | regs->pc = (unsigned long) ka->sa.sa_handler; | 384 | regs->pc = (unsigned long) ksig->ka.sa.sa_handler; |
394 | regs->npc = (regs->pc + 4); | 385 | regs->npc = (regs->pc + 4); |
395 | 386 | ||
396 | if (ka->ka_restorer) | 387 | if (ksig->ka.ka_restorer) |
397 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 388 | regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; |
398 | else { | 389 | else { |
399 | regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); | 390 | regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); |
400 | 391 | ||
@@ -404,38 +395,25 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
404 | /* t 0x10 */ | 395 | /* t 0x10 */ |
405 | err |= __put_user(0x91d02010, &sf->insns[1]); | 396 | err |= __put_user(0x91d02010, &sf->insns[1]); |
406 | if (err) | 397 | if (err) |
407 | goto sigsegv; | 398 | return err; |
408 | 399 | ||
409 | /* Flush instruction space. */ | 400 | /* Flush instruction space. */ |
410 | flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); | 401 | flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); |
411 | } | 402 | } |
412 | return 0; | 403 | return 0; |
413 | |||
414 | sigill: | ||
415 | do_exit(SIGILL); | ||
416 | return -EINVAL; | ||
417 | |||
418 | sigsegv: | ||
419 | force_sigsegv(signo, current); | ||
420 | return -EFAULT; | ||
421 | } | 404 | } |
422 | 405 | ||
423 | static inline void | 406 | static inline void |
424 | handle_signal(unsigned long signr, struct k_sigaction *ka, | 407 | handle_signal(struct ksignal *ksig, struct pt_regs *regs) |
425 | siginfo_t *info, struct pt_regs *regs) | ||
426 | { | 408 | { |
427 | sigset_t *oldset = sigmask_to_save(); | 409 | sigset_t *oldset = sigmask_to_save(); |
428 | int err; | 410 | int err; |
429 | 411 | ||
430 | if (ka->sa.sa_flags & SA_SIGINFO) | 412 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) |
431 | err = setup_rt_frame(ka, regs, signr, oldset, info); | 413 | err = setup_rt_frame(ksig, regs, oldset); |
432 | else | 414 | else |
433 | err = setup_frame(ka, regs, signr, oldset); | 415 | err = setup_frame(ksig, regs, oldset); |
434 | 416 | signal_setup_done(err, ksig, 0); | |
435 | if (err) | ||
436 | return; | ||
437 | |||
438 | signal_delivered(signr, info, ka, regs, 0); | ||
439 | } | 417 | } |
440 | 418 | ||
441 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | 419 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, |
@@ -465,10 +443,9 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | |||
465 | */ | 443 | */ |
466 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | 444 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) |
467 | { | 445 | { |
468 | struct k_sigaction ka; | 446 | struct ksignal ksig; |
469 | int restart_syscall; | 447 | int restart_syscall; |
470 | siginfo_t info; | 448 | bool has_handler; |
471 | int signr; | ||
472 | 449 | ||
473 | /* It's a lot of work and synchronization to add a new ptrace | 450 | /* It's a lot of work and synchronization to add a new ptrace |
474 | * register for GDB to save and restore in order to get | 451 | * register for GDB to save and restore in order to get |
@@ -491,7 +468,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
491 | if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) | 468 | if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) |
492 | regs->u_regs[UREG_G6] = orig_i0; | 469 | regs->u_regs[UREG_G6] = orig_i0; |
493 | 470 | ||
494 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 471 | has_handler = get_signal(&ksig); |
495 | 472 | ||
496 | /* If the debugger messes with the program counter, it clears | 473 | /* If the debugger messes with the program counter, it clears |
497 | * the software "in syscall" bit, directing us to not perform | 474 | * the software "in syscall" bit, directing us to not perform |
@@ -503,35 +480,30 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
503 | orig_i0 = regs->u_regs[UREG_G6]; | 480 | orig_i0 = regs->u_regs[UREG_G6]; |
504 | } | 481 | } |
505 | 482 | ||
506 | 483 | if (has_handler) { | |
507 | if (signr > 0) { | ||
508 | if (restart_syscall) | 484 | if (restart_syscall) |
509 | syscall_restart(orig_i0, regs, &ka.sa); | 485 | syscall_restart(orig_i0, regs, &ksig.ka.sa); |
510 | handle_signal(signr, &ka, &info, regs); | 486 | handle_signal(&ksig, regs); |
511 | return; | 487 | } else { |
512 | } | 488 | if (restart_syscall) { |
513 | if (restart_syscall && | 489 | switch (regs->u_regs[UREG_I0]) { |
514 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || | 490 | case ERESTARTNOHAND: |
515 | regs->u_regs[UREG_I0] == ERESTARTSYS || | 491 | case ERESTARTSYS: |
516 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { | 492 | case ERESTARTNOINTR: |
517 | /* replay the system call when we are done */ | 493 | /* replay the system call when we are done */ |
518 | regs->u_regs[UREG_I0] = orig_i0; | 494 | regs->u_regs[UREG_I0] = orig_i0; |
519 | regs->pc -= 4; | 495 | regs->pc -= 4; |
520 | regs->npc -= 4; | 496 | regs->npc -= 4; |
521 | pt_regs_clear_syscall(regs); | 497 | pt_regs_clear_syscall(regs); |
522 | } | 498 | case ERESTART_RESTARTBLOCK: |
523 | if (restart_syscall && | 499 | regs->u_regs[UREG_G1] = __NR_restart_syscall; |
524 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | 500 | regs->pc -= 4; |
525 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | 501 | regs->npc -= 4; |
526 | regs->pc -= 4; | 502 | pt_regs_clear_syscall(regs); |
527 | regs->npc -= 4; | 503 | } |
528 | pt_regs_clear_syscall(regs); | 504 | } |
505 | restore_saved_sigmask(); | ||
529 | } | 506 | } |
530 | |||
531 | /* if there's no signal to deliver, we just put the saved sigmask | ||
532 | * back | ||
533 | */ | ||
534 | restore_saved_sigmask(); | ||
535 | } | 507 | } |
536 | 508 | ||
537 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, | 509 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, |
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 165a897a4133..35923e8abd82 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c | |||
@@ -308,7 +308,7 @@ static int invalid_frame_pointer(void __user *fp) | |||
308 | return 0; | 308 | return 0; |
309 | } | 309 | } |
310 | 310 | ||
311 | static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize) | 311 | static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize) |
312 | { | 312 | { |
313 | unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS; | 313 | unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS; |
314 | 314 | ||
@@ -320,12 +320,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs * | |||
320 | return (void __user *) -1L; | 320 | return (void __user *) -1L; |
321 | 321 | ||
322 | /* This is the X/Open sanctioned signal stack switching. */ | 322 | /* This is the X/Open sanctioned signal stack switching. */ |
323 | if (ka->sa.sa_flags & SA_ONSTACK) { | 323 | sp = sigsp(sp, ksig) - framesize; |
324 | if (sas_ss_flags(sp) == 0) | ||
325 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
326 | } | ||
327 | |||
328 | sp -= framesize; | ||
329 | 324 | ||
330 | /* Always align the stack frame. This handles two cases. First, | 325 | /* Always align the stack frame. This handles two cases. First, |
331 | * sigaltstack need not be mindful of platform specific stack | 326 | * sigaltstack need not be mindful of platform specific stack |
@@ -339,8 +334,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs * | |||
339 | } | 334 | } |
340 | 335 | ||
341 | static inline int | 336 | static inline int |
342 | setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | 337 | setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs) |
343 | int signo, sigset_t *oldset, siginfo_t *info) | ||
344 | { | 338 | { |
345 | struct rt_signal_frame __user *sf; | 339 | struct rt_signal_frame __user *sf; |
346 | int wsaved, err, sf_size; | 340 | int wsaved, err, sf_size; |
@@ -358,10 +352,12 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
358 | if (wsaved) | 352 | if (wsaved) |
359 | sf_size += sizeof(__siginfo_rwin_t); | 353 | sf_size += sizeof(__siginfo_rwin_t); |
360 | sf = (struct rt_signal_frame __user *) | 354 | sf = (struct rt_signal_frame __user *) |
361 | get_sigframe(ka, regs, sf_size); | 355 | get_sigframe(ksig, regs, sf_size); |
362 | 356 | ||
363 | if (invalid_frame_pointer (sf)) | 357 | if (invalid_frame_pointer (sf)) { |
364 | goto sigill; | 358 | do_exit(SIGILL); /* won't return, actually */ |
359 | return -EINVAL; | ||
360 | } | ||
365 | 361 | ||
366 | tail = (sf + 1); | 362 | tail = (sf + 1); |
367 | 363 | ||
@@ -389,7 +385,7 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
389 | /* Setup sigaltstack */ | 385 | /* Setup sigaltstack */ |
390 | err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]); | 386 | err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]); |
391 | 387 | ||
392 | err |= copy_to_user(&sf->mask, oldset, sizeof(sigset_t)); | 388 | err |= copy_to_user(&sf->mask, sigmask_to_save(), sizeof(sigset_t)); |
393 | 389 | ||
394 | if (!wsaved) { | 390 | if (!wsaved) { |
395 | err |= copy_in_user((u64 __user *)sf, | 391 | err |= copy_in_user((u64 __user *)sf, |
@@ -402,18 +398,18 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
402 | rp = ¤t_thread_info()->reg_window[wsaved - 1]; | 398 | rp = ¤t_thread_info()->reg_window[wsaved - 1]; |
403 | err |= copy_to_user(sf, rp, sizeof(struct reg_window)); | 399 | err |= copy_to_user(sf, rp, sizeof(struct reg_window)); |
404 | } | 400 | } |
405 | if (info) | 401 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) |
406 | err |= copy_siginfo_to_user(&sf->info, info); | 402 | err |= copy_siginfo_to_user(&sf->info, &ksig->info); |
407 | else { | 403 | else { |
408 | err |= __put_user(signo, &sf->info.si_signo); | 404 | err |= __put_user(ksig->sig, &sf->info.si_signo); |
409 | err |= __put_user(SI_NOINFO, &sf->info.si_code); | 405 | err |= __put_user(SI_NOINFO, &sf->info.si_code); |
410 | } | 406 | } |
411 | if (err) | 407 | if (err) |
412 | goto sigsegv; | 408 | return err; |
413 | 409 | ||
414 | /* 3. signal handler back-trampoline and parameters */ | 410 | /* 3. signal handler back-trampoline and parameters */ |
415 | regs->u_regs[UREG_FP] = ((unsigned long) sf) - STACK_BIAS; | 411 | regs->u_regs[UREG_FP] = ((unsigned long) sf) - STACK_BIAS; |
416 | regs->u_regs[UREG_I0] = signo; | 412 | regs->u_regs[UREG_I0] = ksig->sig; |
417 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; | 413 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; |
418 | 414 | ||
419 | /* The sigcontext is passed in this way because of how it | 415 | /* The sigcontext is passed in this way because of how it |
@@ -423,37 +419,15 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
423 | regs->u_regs[UREG_I2] = (unsigned long) &sf->info; | 419 | regs->u_regs[UREG_I2] = (unsigned long) &sf->info; |
424 | 420 | ||
425 | /* 5. signal handler */ | 421 | /* 5. signal handler */ |
426 | regs->tpc = (unsigned long) ka->sa.sa_handler; | 422 | regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; |
427 | regs->tnpc = (regs->tpc + 4); | 423 | regs->tnpc = (regs->tpc + 4); |
428 | if (test_thread_flag(TIF_32BIT)) { | 424 | if (test_thread_flag(TIF_32BIT)) { |
429 | regs->tpc &= 0xffffffff; | 425 | regs->tpc &= 0xffffffff; |
430 | regs->tnpc &= 0xffffffff; | 426 | regs->tnpc &= 0xffffffff; |
431 | } | 427 | } |
432 | /* 4. return to kernel instructions */ | 428 | /* 4. return to kernel instructions */ |
433 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 429 | regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; |
434 | return 0; | 430 | return 0; |
435 | |||
436 | sigill: | ||
437 | do_exit(SIGILL); | ||
438 | return -EINVAL; | ||
439 | |||
440 | sigsegv: | ||
441 | force_sigsegv(signo, current); | ||
442 | return -EFAULT; | ||
443 | } | ||
444 | |||
445 | static inline void handle_signal(unsigned long signr, struct k_sigaction *ka, | ||
446 | siginfo_t *info, | ||
447 | sigset_t *oldset, struct pt_regs *regs) | ||
448 | { | ||
449 | int err; | ||
450 | |||
451 | err = setup_rt_frame(ka, regs, signr, oldset, | ||
452 | (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL); | ||
453 | if (err) | ||
454 | return; | ||
455 | |||
456 | signal_delivered(signr, info, ka, regs, 0); | ||
457 | } | 431 | } |
458 | 432 | ||
459 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | 433 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, |
@@ -483,11 +457,9 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | |||
483 | */ | 457 | */ |
484 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | 458 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) |
485 | { | 459 | { |
486 | struct k_sigaction ka; | 460 | struct ksignal ksig; |
487 | int restart_syscall; | 461 | int restart_syscall; |
488 | sigset_t *oldset = sigmask_to_save(); | 462 | bool has_handler; |
489 | siginfo_t info; | ||
490 | int signr; | ||
491 | 463 | ||
492 | /* It's a lot of work and synchronization to add a new ptrace | 464 | /* It's a lot of work and synchronization to add a new ptrace |
493 | * register for GDB to save and restore in order to get | 465 | * register for GDB to save and restore in order to get |
@@ -513,13 +485,13 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
513 | 485 | ||
514 | #ifdef CONFIG_COMPAT | 486 | #ifdef CONFIG_COMPAT |
515 | if (test_thread_flag(TIF_32BIT)) { | 487 | if (test_thread_flag(TIF_32BIT)) { |
516 | extern void do_signal32(sigset_t *, struct pt_regs *); | 488 | extern void do_signal32(struct pt_regs *); |
517 | do_signal32(oldset, regs); | 489 | do_signal32(regs); |
518 | return; | 490 | return; |
519 | } | 491 | } |
520 | #endif | 492 | #endif |
521 | 493 | ||
522 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 494 | has_handler = get_signal(&ksig); |
523 | 495 | ||
524 | restart_syscall = 0; | 496 | restart_syscall = 0; |
525 | if (pt_regs_is_syscall(regs) && | 497 | if (pt_regs_is_syscall(regs) && |
@@ -528,34 +500,30 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
528 | orig_i0 = regs->u_regs[UREG_G6]; | 500 | orig_i0 = regs->u_regs[UREG_G6]; |
529 | } | 501 | } |
530 | 502 | ||
531 | if (signr > 0) { | 503 | if (has_handler) { |
532 | if (restart_syscall) | 504 | if (restart_syscall) |
533 | syscall_restart(orig_i0, regs, &ka.sa); | 505 | syscall_restart(orig_i0, regs, &ksig.ka.sa); |
534 | handle_signal(signr, &ka, &info, oldset, regs); | 506 | signal_setup_done(setup_rt_frame(&ksig, regs), &ksig, 0); |
535 | return; | 507 | } else { |
536 | } | 508 | if (restart_syscall) { |
537 | if (restart_syscall && | 509 | switch (regs->u_regs[UREG_I0]) { |
538 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || | 510 | case ERESTARTNOHAND: |
539 | regs->u_regs[UREG_I0] == ERESTARTSYS || | 511 | case ERESTARTSYS: |
540 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { | 512 | case ERESTARTNOINTR: |
541 | /* replay the system call when we are done */ | 513 | /* replay the system call when we are done */ |
542 | regs->u_regs[UREG_I0] = orig_i0; | 514 | regs->u_regs[UREG_I0] = orig_i0; |
543 | regs->tpc -= 4; | 515 | regs->tpc -= 4; |
544 | regs->tnpc -= 4; | 516 | regs->tnpc -= 4; |
545 | pt_regs_clear_syscall(regs); | 517 | pt_regs_clear_syscall(regs); |
546 | } | 518 | case ERESTART_RESTARTBLOCK: |
547 | if (restart_syscall && | 519 | regs->u_regs[UREG_G1] = __NR_restart_syscall; |
548 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | 520 | regs->tpc -= 4; |
549 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | 521 | regs->tnpc -= 4; |
550 | regs->tpc -= 4; | 522 | pt_regs_clear_syscall(regs); |
551 | regs->tnpc -= 4; | 523 | } |
552 | pt_regs_clear_syscall(regs); | 524 | } |
525 | restore_saved_sigmask(); | ||
553 | } | 526 | } |
554 | |||
555 | /* If there's no signal to deliver, we just put the saved sigmask | ||
556 | * back | ||
557 | */ | ||
558 | restore_saved_sigmask(); | ||
559 | } | 527 | } |
560 | 528 | ||
561 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) | 529 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) |