aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-11-07 23:48:13 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2013-02-14 09:21:16 -0500
commit08f739570de697dc06b949ba3be33acdda21498c (patch)
treed320ae4cbe2c174f3ce34685311b4ccbb15751bc
parent7e243643dffbe216dbcb10933c4cafde0f95f537 (diff)
sparc: convert to ksignal
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--arch/sparc/kernel/signal32.c154
-rw-r--r--arch/sparc/kernel/signal_32.c146
-rw-r--r--arch/sparc/kernel/signal_64.c118
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
326static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) 326static 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
417static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, 412static 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
549sigill:
550 do_exit(SIGILL);
551 return -EINVAL;
552
553sigsegv:
554 force_sigsegv(signo, current);
555 return -EFAULT;
556} 545}
557 546
558static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, 547static 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
699sigill:
700 do_exit(SIGILL);
701 return -EINVAL;
702
703sigsegv:
704 force_sigsegv(signr, current);
705 return -EFAULT;
706} 688}
707 689
708static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka, 690static 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
725static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs, 704static 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 */
750void do_signal32(sigset_t *oldset, struct pt_regs * regs) 729void 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
798struct sigstack32 { 768struct 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
189static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) 189static 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
219static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, 214static 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
311sigill_and_return:
312 do_exit(SIGILL);
313 return -EINVAL;
314
315sigsegv:
316 force_sigsegv(signo, current);
317 return -EFAULT;
318} 307}
319 308
320static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, 309static 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
414sigill:
415 do_exit(SIGILL);
416 return -EINVAL;
417
418sigsegv:
419 force_sigsegv(signo, current);
420 return -EFAULT;
421} 404}
422 405
423static inline void 406static inline void
424handle_signal(unsigned long signr, struct k_sigaction *ka, 407handle_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
441static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, 419static 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 */
466static void do_signal(struct pt_regs *regs, unsigned long orig_i0) 444static 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
537void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, 509void 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
311static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize) 311static 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
341static inline int 336static inline int
342setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, 337setup_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 = &current_thread_info()->reg_window[wsaved - 1]; 398 rp = &current_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
436sigill:
437 do_exit(SIGILL);
438 return -EINVAL;
439
440sigsegv:
441 force_sigsegv(signo, current);
442 return -EFAULT;
443}
444
445static 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
459static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, 433static 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 */
484static void do_signal(struct pt_regs *regs, unsigned long orig_i0) 458static 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
561void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) 529void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags)