aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-02-23 21:50:11 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-02-23 21:50:11 -0500
commit9e2d59ad580d590134285f361a0e80f0e98c0207 (patch)
treef3232be75781484193413f32ec82c21f6d8eb76e /arch/sparc/kernel
parent5ce1a70e2f00f0bce0cab57f798ca354b9496169 (diff)
parent235b80226b986dabcbba844968f7807866bd0bfe (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
Pull signal handling cleanups from Al Viro: "This is the first pile; another one will come a bit later and will contain SYSCALL_DEFINE-related patches. - a bunch of signal-related syscalls (both native and compat) unified. - a bunch of compat syscalls switched to COMPAT_SYSCALL_DEFINE (fixing several potential problems with missing argument validation, while we are at it) - a lot of now-pointless wrappers killed - a couple of architectures (cris and hexagon) forgot to save altstack settings into sigframe, even though they used the (uninitialized) values in sigreturn; fixed. - microblaze fixes for delivery of multiple signals arriving at once - saner set of helpers for signal delivery introduced, several architectures switched to using those." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal: (143 commits) x86: convert to ksignal sparc: convert to ksignal arm: switch to struct ksignal * passing alpha: pass k_sigaction and siginfo_t using ksignal pointer burying unused conditionals make do_sigaltstack() static arm64: switch to generic old sigaction() (compat-only) arm64: switch to generic compat rt_sigaction() arm64: switch compat to generic old sigsuspend arm64: switch to generic compat rt_sigqueueinfo() arm64: switch to generic compat rt_sigpending() arm64: switch to generic compat rt_sigprocmask() arm64: switch to generic sigaltstack sparc: switch to generic old sigsuspend sparc: COMPAT_SYSCALL_DEFINE does all sign-extension as well as SYSCALL_DEFINE sparc: kill sign-extending wrappers for native syscalls kill sparc32_open() sparc: switch to use of generic old sigaction sparc: switch sys_compat_rt_sigaction() to COMPAT_SYSCALL_DEFINE mips: switch to generic sys_fork() and sys_clone() ...
Diffstat (limited to 'arch/sparc/kernel')
-rw-r--r--arch/sparc/kernel/entry.S8
-rw-r--r--arch/sparc/kernel/signal32.c202
-rw-r--r--arch/sparc/kernel/signal_32.c175
-rw-r--r--arch/sparc/kernel/signal_64.c142
-rw-r--r--arch/sparc/kernel/sys32.S86
-rw-r--r--arch/sparc/kernel/sys_sparc32.c185
-rw-r--r--arch/sparc/kernel/sys_sparc_32.c48
-rw-r--r--arch/sparc/kernel/syscalls.S6
-rw-r--r--arch/sparc/kernel/systbls.h4
-rw-r--r--arch/sparc/kernel/systbls_32.S2
-rw-r--r--arch/sparc/kernel/systbls_64.S84
11 files changed, 237 insertions, 705 deletions
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S
index 21fd1a8f47d2..e2a030045089 100644
--- a/arch/sparc/kernel/entry.S
+++ b/arch/sparc/kernel/entry.S
@@ -820,14 +820,6 @@ sys_sparc_pipe:
820 mov %l5, %o7 820 mov %l5, %o7
821 821
822 .align 4 822 .align 4
823 .globl sys_sigaltstack
824sys_sigaltstack:
825 mov %o7, %l5
826 mov %fp, %o2
827 call do_sigaltstack
828 mov %l5, %o7
829
830 .align 4
831 .globl sys_sigstack 823 .globl sys_sigstack
832sys_sigstack: 824sys_sigstack:
833 mov %o7, %l5 825 mov %o7, %l5
diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c
index 53e48f721ce3..cd5dc4d411d1 100644
--- a/arch/sparc/kernel/signal32.c
+++ b/arch/sparc/kernel/signal32.c
@@ -61,7 +61,7 @@ struct rt_signal_frame32 {
61 compat_sigset_t mask; 61 compat_sigset_t mask;
62 /* __siginfo_fpu_t * */ u32 fpu_save; 62 /* __siginfo_fpu_t * */ u32 fpu_save;
63 unsigned int insns[2]; 63 unsigned int insns[2];
64 stack_t32 stack; 64 compat_stack_t stack;
65 unsigned int extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */ 65 unsigned int extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
66 /* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */ 66 /* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
67 siginfo_extra_v8plus_t v8plus; 67 siginfo_extra_v8plus_t v8plus;
@@ -230,13 +230,11 @@ segv:
230asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) 230asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
231{ 231{
232 struct rt_signal_frame32 __user *sf; 232 struct rt_signal_frame32 __user *sf;
233 unsigned int psr, pc, npc, u_ss_sp; 233 unsigned int psr, pc, npc;
234 compat_uptr_t fpu_save; 234 compat_uptr_t fpu_save;
235 compat_uptr_t rwin_save; 235 compat_uptr_t rwin_save;
236 mm_segment_t old_fs;
237 sigset_t set; 236 sigset_t set;
238 compat_sigset_t seta; 237 compat_sigset_t seta;
239 stack_t st;
240 int err, i; 238 int err, i;
241 239
242 /* Always make any pending restarted system calls return -EINTR */ 240 /* Always make any pending restarted system calls return -EINTR */
@@ -295,20 +293,10 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
295 if (!err && fpu_save) 293 if (!err && fpu_save)
296 err |= restore_fpu_state(regs, compat_ptr(fpu_save)); 294 err |= restore_fpu_state(regs, compat_ptr(fpu_save));
297 err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t)); 295 err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t));
298 err |= __get_user(u_ss_sp, &sf->stack.ss_sp); 296 err |= compat_restore_altstack(&sf->stack);
299 st.ss_sp = compat_ptr(u_ss_sp);
300 err |= __get_user(st.ss_flags, &sf->stack.ss_flags);
301 err |= __get_user(st.ss_size, &sf->stack.ss_size);
302 if (err) 297 if (err)
303 goto segv; 298 goto segv;
304 299
305 /* It is more difficult to avoid calling this function than to
306 call it and ignore errors. */
307 old_fs = get_fs();
308 set_fs(KERNEL_DS);
309 do_sigaltstack((stack_t __user *) &st, NULL, (unsigned long)sf);
310 set_fs(old_fs);
311
312 err |= __get_user(rwin_save, &sf->rwin_save); 300 err |= __get_user(rwin_save, &sf->rwin_save);
313 if (!err && rwin_save) { 301 if (!err && rwin_save) {
314 if (restore_rwin_state(compat_ptr(rwin_save))) 302 if (restore_rwin_state(compat_ptr(rwin_save)))
@@ -335,7 +323,7 @@ static int invalid_frame_pointer(void __user *fp, int fplen)
335 return 0; 323 return 0;
336} 324}
337 325
338static 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)
339{ 327{
340 unsigned long sp; 328 unsigned long sp;
341 329
@@ -350,12 +338,7 @@ static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, uns
350 return (void __user *) -1L; 338 return (void __user *) -1L;
351 339
352 /* This is the X/Open sanctioned signal stack switching. */ 340 /* This is the X/Open sanctioned signal stack switching. */
353 if (sa->sa_flags & SA_ONSTACK) { 341 sp = sigsp(sp, ksig) - framesize;
354 if (sas_ss_flags(sp) == 0)
355 sp = current->sas_ss_sp + current->sas_ss_size;
356 }
357
358 sp -= framesize;
359 342
360 /* Always align the stack frame. This handles two cases. First, 343 /* Always align the stack frame. This handles two cases. First,
361 * sigaltstack need not be mindful of platform specific stack 344 * sigaltstack need not be mindful of platform specific stack
@@ -426,8 +409,8 @@ out_irqs_on:
426 409
427} 410}
428 411
429static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, 412static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs,
430 int signo, sigset_t *oldset) 413 sigset_t *oldset)
431{ 414{
432 struct signal_frame32 __user *sf; 415 struct signal_frame32 __user *sf;
433 int i, err, wsaved; 416 int i, err, wsaved;
@@ -449,10 +432,12 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
449 sigframe_size += sizeof(__siginfo_rwin_t); 432 sigframe_size += sizeof(__siginfo_rwin_t);
450 433
451 sf = (struct signal_frame32 __user *) 434 sf = (struct signal_frame32 __user *)
452 get_sigframe(&ka->sa, regs, sigframe_size); 435 get_sigframe(ksig, regs, sigframe_size);
453 436
454 if (invalid_frame_pointer(sf, sigframe_size)) 437 if (invalid_frame_pointer(sf, sigframe_size)) {
455 goto sigill; 438 do_exit(SIGILL);
439 return -EINVAL;
440 }
456 441
457 tail = (sf + 1); 442 tail = (sf + 1);
458 443
@@ -526,16 +511,16 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
526 err |= __put_user(rp->ins[7], &sf->ss.callers_pc); 511 err |= __put_user(rp->ins[7], &sf->ss.callers_pc);
527 } 512 }
528 if (err) 513 if (err)
529 goto sigsegv; 514 return err;
530 515
531 /* 3. signal handler back-trampoline and parameters */ 516 /* 3. signal handler back-trampoline and parameters */
532 regs->u_regs[UREG_FP] = (unsigned long) sf; 517 regs->u_regs[UREG_FP] = (unsigned long) sf;
533 regs->u_regs[UREG_I0] = signo; 518 regs->u_regs[UREG_I0] = ksig->sig;
534 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; 519 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
535 regs->u_regs[UREG_I2] = (unsigned long) &sf->info; 520 regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
536 521
537 /* 4. signal handler */ 522 /* 4. signal handler */
538 regs->tpc = (unsigned long) ka->sa.sa_handler; 523 regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;
539 regs->tnpc = (regs->tpc + 4); 524 regs->tnpc = (regs->tpc + 4);
540 if (test_thread_flag(TIF_32BIT)) { 525 if (test_thread_flag(TIF_32BIT)) {
541 regs->tpc &= 0xffffffff; 526 regs->tpc &= 0xffffffff;
@@ -543,8 +528,8 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
543 } 528 }
544 529
545 /* 5. return to kernel instructions */ 530 /* 5. return to kernel instructions */
546 if (ka->ka_restorer) { 531 if (ksig->ka.ka_restorer) {
547 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; 532 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
548 } else { 533 } else {
549 unsigned long address = ((unsigned long)&(sf->insns[0])); 534 unsigned long address = ((unsigned long)&(sf->insns[0]));
550 535
@@ -553,23 +538,14 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
553 err = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/ 538 err = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/
554 err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/ 539 err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/
555 if (err) 540 if (err)
556 goto sigsegv; 541 return err;
557 flush_signal_insns(address); 542 flush_signal_insns(address);
558 } 543 }
559 return 0; 544 return 0;
560
561sigill:
562 do_exit(SIGILL);
563 return -EINVAL;
564
565sigsegv:
566 force_sigsegv(signo, current);
567 return -EFAULT;
568} 545}
569 546
570static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, 547static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs,
571 unsigned long signr, sigset_t *oldset, 548 sigset_t *oldset)
572 siginfo_t *info)
573{ 549{
574 struct rt_signal_frame32 __user *sf; 550 struct rt_signal_frame32 __user *sf;
575 int i, err, wsaved; 551 int i, err, wsaved;
@@ -591,10 +567,12 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
591 sigframe_size += sizeof(__siginfo_rwin_t); 567 sigframe_size += sizeof(__siginfo_rwin_t);
592 568
593 sf = (struct rt_signal_frame32 __user *) 569 sf = (struct rt_signal_frame32 __user *)
594 get_sigframe(&ka->sa, regs, sigframe_size); 570 get_sigframe(ksig, regs, sigframe_size);
595 571
596 if (invalid_frame_pointer(sf, sigframe_size)) 572 if (invalid_frame_pointer(sf, sigframe_size)) {
597 goto sigill; 573 do_exit(SIGILL);
574 return -EINVAL;
575 }
598 576
599 tail = (sf + 1); 577 tail = (sf + 1);
600 578
@@ -639,12 +617,10 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
639 } 617 }
640 618
641 /* Update the siginfo structure. */ 619 /* Update the siginfo structure. */
642 err |= copy_siginfo_to_user32(&sf->info, info); 620 err |= copy_siginfo_to_user32(&sf->info, &ksig->info);
643 621
644 /* Setup sigaltstack */ 622 /* Setup sigaltstack */
645 err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp); 623 err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]);
646 err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
647 err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
648 624
649 switch (_NSIG_WORDS) { 625 switch (_NSIG_WORDS) {
650 case 4: seta.sig[7] = (oldset->sig[3] >> 32); 626 case 4: seta.sig[7] = (oldset->sig[3] >> 32);
@@ -674,16 +650,16 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
674 err |= __put_user(rp->ins[7], &sf->ss.callers_pc); 650 err |= __put_user(rp->ins[7], &sf->ss.callers_pc);
675 } 651 }
676 if (err) 652 if (err)
677 goto sigsegv; 653 return err;
678 654
679 /* 3. signal handler back-trampoline and parameters */ 655 /* 3. signal handler back-trampoline and parameters */
680 regs->u_regs[UREG_FP] = (unsigned long) sf; 656 regs->u_regs[UREG_FP] = (unsigned long) sf;
681 regs->u_regs[UREG_I0] = signr; 657 regs->u_regs[UREG_I0] = ksig->sig;
682 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; 658 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
683 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; 659 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
684 660
685 /* 4. signal handler */ 661 /* 4. signal handler */
686 regs->tpc = (unsigned long) ka->sa.sa_handler; 662 regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;
687 regs->tnpc = (regs->tpc + 4); 663 regs->tnpc = (regs->tpc + 4);
688 if (test_thread_flag(TIF_32BIT)) { 664 if (test_thread_flag(TIF_32BIT)) {
689 regs->tpc &= 0xffffffff; 665 regs->tpc &= 0xffffffff;
@@ -691,8 +667,8 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
691 } 667 }
692 668
693 /* 5. return to kernel instructions */ 669 /* 5. return to kernel instructions */
694 if (ka->ka_restorer) 670 if (ksig->ka.ka_restorer)
695 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; 671 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
696 else { 672 else {
697 unsigned long address = ((unsigned long)&(sf->insns[0])); 673 unsigned long address = ((unsigned long)&(sf->insns[0]));
698 674
@@ -704,36 +680,25 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
704 /* t 0x10 */ 680 /* t 0x10 */
705 err |= __put_user(0x91d02010, &sf->insns[1]); 681 err |= __put_user(0x91d02010, &sf->insns[1]);
706 if (err) 682 if (err)
707 goto sigsegv; 683 return err;
708 684
709 flush_signal_insns(address); 685 flush_signal_insns(address);
710 } 686 }
711 return 0; 687 return 0;
712
713sigill:
714 do_exit(SIGILL);
715 return -EINVAL;
716
717sigsegv:
718 force_sigsegv(signr, current);
719 return -EFAULT;
720} 688}
721 689
722static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka, 690static inline void handle_signal32(struct ksignal *ksig,
723 siginfo_t *info, 691 struct pt_regs *regs)
724 sigset_t *oldset, struct pt_regs *regs)
725{ 692{
693 sigset_t *oldset = sigmask_to_save();
726 int err; 694 int err;
727 695
728 if (ka->sa.sa_flags & SA_SIGINFO) 696 if (ksig->ka.sa.sa_flags & SA_SIGINFO)
729 err = setup_rt_frame32(ka, regs, signr, oldset, info); 697 err = setup_rt_frame32(ksig, regs, oldset);
730 else 698 else
731 err = setup_frame32(ka, regs, signr, oldset); 699 err = setup_frame32(ksig, regs, oldset);
732
733 if (err)
734 return;
735 700
736 signal_delivered(signr, info, ka, regs, 0); 701 signal_setup_done(err, ksig, 0);
737} 702}
738 703
739static 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,
@@ -763,50 +728,41 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs
763 */ 728 */
764void do_signal32(sigset_t *oldset, struct pt_regs * regs) 729void do_signal32(sigset_t *oldset, struct pt_regs * regs)
765{ 730{
766 struct k_sigaction ka; 731 struct ksignal ksig;
767 unsigned long orig_i0; 732 unsigned long orig_i0 = 0;
768 int restart_syscall; 733 int restart_syscall = 0;
769 siginfo_t info; 734 bool has_handler = get_signal(&ksig);
770 int signr;
771
772 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
773 735
774 restart_syscall = 0;
775 orig_i0 = 0;
776 if (pt_regs_is_syscall(regs) && 736 if (pt_regs_is_syscall(regs) &&
777 (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) { 737 (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) {
778 restart_syscall = 1; 738 restart_syscall = 1;
779 orig_i0 = regs->u_regs[UREG_G6]; 739 orig_i0 = regs->u_regs[UREG_G6];
780 } 740 }
781 741
782 if (signr > 0) { 742 if (has_handler) {
783 if (restart_syscall) 743 if (restart_syscall)
784 syscall_restart32(orig_i0, regs, &ka.sa); 744 syscall_restart32(orig_i0, regs, &ksig.ka.sa);
785 handle_signal32(signr, &ka, &info, oldset, regs); 745 handle_signal32(&ksig, regs);
786 return; 746 } else {
787 } 747 if (restart_syscall) {
788 if (restart_syscall && 748 switch (regs->u_regs[UREG_I0]) {
789 (regs->u_regs[UREG_I0] == ERESTARTNOHAND || 749 case ERESTARTNOHAND:
790 regs->u_regs[UREG_I0] == ERESTARTSYS || 750 case ERESTARTSYS:
791 regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { 751 case ERESTARTNOINTR:
792 /* replay the system call when we are done */ 752 /* replay the system call when we are done */
793 regs->u_regs[UREG_I0] = orig_i0; 753 regs->u_regs[UREG_I0] = orig_i0;
794 regs->tpc -= 4; 754 regs->tpc -= 4;
795 regs->tnpc -= 4; 755 regs->tnpc -= 4;
796 pt_regs_clear_syscall(regs); 756 pt_regs_clear_syscall(regs);
797 } 757 case ERESTART_RESTARTBLOCK:
798 if (restart_syscall && 758 regs->u_regs[UREG_G1] = __NR_restart_syscall;
799 regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { 759 regs->tpc -= 4;
800 regs->u_regs[UREG_G1] = __NR_restart_syscall; 760 regs->tnpc -= 4;
801 regs->tpc -= 4; 761 pt_regs_clear_syscall(regs);
802 regs->tnpc -= 4; 762 }
803 pt_regs_clear_syscall(regs); 763 }
764 restore_saved_sigmask();
804 } 765 }
805
806 /* If there's no signal to deliver, we just put the saved sigmask
807 * back
808 */
809 restore_saved_sigmask();
810} 766}
811 767
812struct sigstack32 { 768struct sigstack32 {
@@ -856,29 +812,3 @@ asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
856out: 812out:
857 return ret; 813 return ret;
858} 814}
859
860asmlinkage long do_sys32_sigaltstack(u32 ussa, u32 uossa, unsigned long sp)
861{
862 stack_t uss, uoss;
863 u32 u_ss_sp = 0;
864 int ret;
865 mm_segment_t old_fs;
866 stack_t32 __user *uss32 = compat_ptr(ussa);
867 stack_t32 __user *uoss32 = compat_ptr(uossa);
868
869 if (ussa && (get_user(u_ss_sp, &uss32->ss_sp) ||
870 __get_user(uss.ss_flags, &uss32->ss_flags) ||
871 __get_user(uss.ss_size, &uss32->ss_size)))
872 return -EFAULT;
873 uss.ss_sp = compat_ptr(u_ss_sp);
874 old_fs = get_fs();
875 set_fs(KERNEL_DS);
876 ret = do_sigaltstack(ussa ? (stack_t __user *) &uss : NULL,
877 uossa ? (stack_t __user *) &uoss : NULL, sp);
878 set_fs(old_fs);
879 if (!ret && uossa && (put_user(ptr_to_compat(uoss.ss_sp), &uoss32->ss_sp) ||
880 __put_user(uoss.ss_flags, &uoss32->ss_flags) ||
881 __put_user(uoss.ss_size, &uoss32->ss_size)))
882 return -EFAULT;
883 return ret;
884}
diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c
index 68f9c8650af4..7d5d8e1f8415 100644
--- a/arch/sparc/kernel/signal_32.c
+++ b/arch/sparc/kernel/signal_32.c
@@ -59,18 +59,6 @@ struct rt_signal_frame {
59#define SF_ALIGNEDSZ (((sizeof(struct signal_frame) + 7) & (~7))) 59#define SF_ALIGNEDSZ (((sizeof(struct signal_frame) + 7) & (~7)))
60#define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7))) 60#define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7)))
61 61
62static int _sigpause_common(old_sigset_t set)
63{
64 sigset_t blocked;
65 siginitset(&blocked, set);
66 return sigsuspend(&blocked);
67}
68
69asmlinkage int sys_sigsuspend(old_sigset_t set)
70{
71 return _sigpause_common(set);
72}
73
74asmlinkage void do_sigreturn(struct pt_regs *regs) 62asmlinkage void do_sigreturn(struct pt_regs *regs)
75{ 63{
76 struct signal_frame __user *sf; 64 struct signal_frame __user *sf;
@@ -141,9 +129,7 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
141 unsigned int psr, pc, npc; 129 unsigned int psr, pc, npc;
142 __siginfo_fpu_t __user *fpu_save; 130 __siginfo_fpu_t __user *fpu_save;
143 __siginfo_rwin_t __user *rwin_save; 131 __siginfo_rwin_t __user *rwin_save;
144 mm_segment_t old_fs;
145 sigset_t set; 132 sigset_t set;
146 stack_t st;
147 int err; 133 int err;
148 134
149 synchronize_user_stack(); 135 synchronize_user_stack();
@@ -171,8 +157,7 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
171 if (!err && fpu_save) 157 if (!err && fpu_save)
172 err |= restore_fpu_state(regs, fpu_save); 158 err |= restore_fpu_state(regs, fpu_save);
173 err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); 159 err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
174 160 err |= restore_altstack(&sf->stack);
175 err |= __copy_from_user(&st, &sf->stack, sizeof(stack_t));
176 161
177 if (err) 162 if (err)
178 goto segv; 163 goto segv;
@@ -180,14 +165,6 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
180 regs->pc = pc; 165 regs->pc = pc;
181 regs->npc = npc; 166 regs->npc = npc;
182 167
183 /* It is more difficult to avoid calling this function than to
184 * call it and ignore errors.
185 */
186 old_fs = get_fs();
187 set_fs(KERNEL_DS);
188 do_sigaltstack((const stack_t __user *) &st, NULL, (unsigned long)sf);
189 set_fs(old_fs);
190
191 err |= __get_user(rwin_save, &sf->rwin_save); 168 err |= __get_user(rwin_save, &sf->rwin_save);
192 if (!err && rwin_save) { 169 if (!err && rwin_save) {
193 if (restore_rwin_state(rwin_save)) 170 if (restore_rwin_state(rwin_save))
@@ -209,7 +186,7 @@ static inline int invalid_frame_pointer(void __user *fp, int fplen)
209 return 0; 186 return 0;
210} 187}
211 188
212static 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)
213{ 190{
214 unsigned long sp = regs->u_regs[UREG_FP]; 191 unsigned long sp = regs->u_regs[UREG_FP];
215 192
@@ -221,12 +198,7 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re
221 return (void __user *) -1L; 198 return (void __user *) -1L;
222 199
223 /* This is the X/Open sanctioned signal stack switching. */ 200 /* This is the X/Open sanctioned signal stack switching. */
224 if (sa->sa_flags & SA_ONSTACK) { 201 sp = sigsp(sp, ksig) - framesize;
225 if (sas_ss_flags(sp) == 0)
226 sp = current->sas_ss_sp + current->sas_ss_size;
227 }
228
229 sp -= framesize;
230 202
231 /* Always align the stack frame. This handles two cases. First, 203 /* Always align the stack frame. This handles two cases. First,
232 * sigaltstack need not be mindful of platform specific stack 204 * sigaltstack need not be mindful of platform specific stack
@@ -239,8 +211,8 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re
239 return (void __user *) sp; 211 return (void __user *) sp;
240} 212}
241 213
242static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, 214static int setup_frame(struct ksignal *ksig, struct pt_regs *regs,
243 int signo, sigset_t *oldset) 215 sigset_t *oldset)
244{ 216{
245 struct signal_frame __user *sf; 217 struct signal_frame __user *sf;
246 int sigframe_size, err, wsaved; 218 int sigframe_size, err, wsaved;
@@ -258,10 +230,12 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
258 sigframe_size += sizeof(__siginfo_rwin_t); 230 sigframe_size += sizeof(__siginfo_rwin_t);
259 231
260 sf = (struct signal_frame __user *) 232 sf = (struct signal_frame __user *)
261 get_sigframe(&ka->sa, regs, sigframe_size); 233 get_sigframe(ksig, regs, sigframe_size);
262 234
263 if (invalid_frame_pointer(sf, sigframe_size)) 235 if (invalid_frame_pointer(sf, sigframe_size)) {
264 goto sigill_and_return; 236 do_exit(SIGILL);
237 return -EINVAL;
238 }
265 239
266 tail = sf + 1; 240 tail = sf + 1;
267 241
@@ -300,21 +274,21 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
300 err |= __copy_to_user(sf, rp, sizeof(struct reg_window32)); 274 err |= __copy_to_user(sf, rp, sizeof(struct reg_window32));
301 } 275 }
302 if (err) 276 if (err)
303 goto sigsegv; 277 return err;
304 278
305 /* 3. signal handler back-trampoline and parameters */ 279 /* 3. signal handler back-trampoline and parameters */
306 regs->u_regs[UREG_FP] = (unsigned long) sf; 280 regs->u_regs[UREG_FP] = (unsigned long) sf;
307 regs->u_regs[UREG_I0] = signo; 281 regs->u_regs[UREG_I0] = ksig->sig;
308 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; 282 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
309 regs->u_regs[UREG_I2] = (unsigned long) &sf->info; 283 regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
310 284
311 /* 4. signal handler */ 285 /* 4. signal handler */
312 regs->pc = (unsigned long) ka->sa.sa_handler; 286 regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
313 regs->npc = (regs->pc + 4); 287 regs->npc = (regs->pc + 4);
314 288
315 /* 5. return to kernel instructions */ 289 /* 5. return to kernel instructions */
316 if (ka->ka_restorer) 290 if (ksig->ka.ka_restorer)
317 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; 291 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
318 else { 292 else {
319 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); 293 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
320 294
@@ -324,24 +298,16 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
324 /* t 0x10 */ 298 /* t 0x10 */
325 err |= __put_user(0x91d02010, &sf->insns[1]); 299 err |= __put_user(0x91d02010, &sf->insns[1]);
326 if (err) 300 if (err)
327 goto sigsegv; 301 return err;
328 302
329 /* Flush instruction space. */ 303 /* Flush instruction space. */
330 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); 304 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
331 } 305 }
332 return 0; 306 return 0;
333
334sigill_and_return:
335 do_exit(SIGILL);
336 return -EINVAL;
337
338sigsegv:
339 force_sigsegv(signo, current);
340 return -EFAULT;
341} 307}
342 308
343static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, 309static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs,
344 int signo, sigset_t *oldset, siginfo_t *info) 310 sigset_t *oldset)
345{ 311{
346 struct rt_signal_frame __user *sf; 312 struct rt_signal_frame __user *sf;
347 int sigframe_size, wsaved; 313 int sigframe_size, wsaved;
@@ -357,9 +323,11 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
357 if (wsaved) 323 if (wsaved)
358 sigframe_size += sizeof(__siginfo_rwin_t); 324 sigframe_size += sizeof(__siginfo_rwin_t);
359 sf = (struct rt_signal_frame __user *) 325 sf = (struct rt_signal_frame __user *)
360 get_sigframe(&ka->sa, regs, sigframe_size); 326 get_sigframe(ksig, regs, sigframe_size);
361 if (invalid_frame_pointer(sf, sigframe_size)) 327 if (invalid_frame_pointer(sf, sigframe_size)) {
362 goto sigill; 328 do_exit(SIGILL);
329 return -EINVAL;
330 }
363 331
364 tail = sf + 1; 332 tail = sf + 1;
365 err = __put_user(regs->pc, &sf->regs.pc); 333 err = __put_user(regs->pc, &sf->regs.pc);
@@ -391,9 +359,7 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
391 err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t)); 359 err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t));
392 360
393 /* Setup sigaltstack */ 361 /* Setup sigaltstack */
394 err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp); 362 err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]);
395 err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
396 err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
397 363
398 if (!wsaved) { 364 if (!wsaved) {
399 err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP], 365 err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],
@@ -405,21 +371,21 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
405 err |= __copy_to_user(sf, rp, sizeof(struct reg_window32)); 371 err |= __copy_to_user(sf, rp, sizeof(struct reg_window32));
406 } 372 }
407 373
408 err |= copy_siginfo_to_user(&sf->info, info); 374 err |= copy_siginfo_to_user(&sf->info, &ksig->info);
409 375
410 if (err) 376 if (err)
411 goto sigsegv; 377 return err;
412 378
413 regs->u_regs[UREG_FP] = (unsigned long) sf; 379 regs->u_regs[UREG_FP] = (unsigned long) sf;
414 regs->u_regs[UREG_I0] = signo; 380 regs->u_regs[UREG_I0] = ksig->sig;
415 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; 381 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
416 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; 382 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
417 383
418 regs->pc = (unsigned long) ka->sa.sa_handler; 384 regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
419 regs->npc = (regs->pc + 4); 385 regs->npc = (regs->pc + 4);
420 386
421 if (ka->ka_restorer) 387 if (ksig->ka.ka_restorer)
422 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; 388 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
423 else { 389 else {
424 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); 390 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
425 391
@@ -429,38 +395,25 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
429 /* t 0x10 */ 395 /* t 0x10 */
430 err |= __put_user(0x91d02010, &sf->insns[1]); 396 err |= __put_user(0x91d02010, &sf->insns[1]);
431 if (err) 397 if (err)
432 goto sigsegv; 398 return err;
433 399
434 /* Flush instruction space. */ 400 /* Flush instruction space. */
435 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); 401 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
436 } 402 }
437 return 0; 403 return 0;
438
439sigill:
440 do_exit(SIGILL);
441 return -EINVAL;
442
443sigsegv:
444 force_sigsegv(signo, current);
445 return -EFAULT;
446} 404}
447 405
448static inline void 406static inline void
449handle_signal(unsigned long signr, struct k_sigaction *ka, 407handle_signal(struct ksignal *ksig, struct pt_regs *regs)
450 siginfo_t *info, struct pt_regs *regs)
451{ 408{
452 sigset_t *oldset = sigmask_to_save(); 409 sigset_t *oldset = sigmask_to_save();
453 int err; 410 int err;
454 411
455 if (ka->sa.sa_flags & SA_SIGINFO) 412 if (ksig->ka.sa.sa_flags & SA_SIGINFO)
456 err = setup_rt_frame(ka, regs, signr, oldset, info); 413 err = setup_rt_frame(ksig, regs, oldset);
457 else 414 else
458 err = setup_frame(ka, regs, signr, oldset); 415 err = setup_frame(ksig, regs, oldset);
459 416 signal_setup_done(err, ksig, 0);
460 if (err)
461 return;
462
463 signal_delivered(signr, info, ka, regs, 0);
464} 417}
465 418
466static 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,
@@ -490,10 +443,9 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
490 */ 443 */
491static void do_signal(struct pt_regs *regs, unsigned long orig_i0) 444static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
492{ 445{
493 struct k_sigaction ka; 446 struct ksignal ksig;
494 int restart_syscall; 447 int restart_syscall;
495 siginfo_t info; 448 bool has_handler;
496 int signr;
497 449
498 /* 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
499 * register for GDB to save and restore in order to get 451 * register for GDB to save and restore in order to get
@@ -516,7 +468,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
516 if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) 468 if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C))
517 regs->u_regs[UREG_G6] = orig_i0; 469 regs->u_regs[UREG_G6] = orig_i0;
518 470
519 signr = get_signal_to_deliver(&info, &ka, regs, NULL); 471 has_handler = get_signal(&ksig);
520 472
521 /* If the debugger messes with the program counter, it clears 473 /* If the debugger messes with the program counter, it clears
522 * the software "in syscall" bit, directing us to not perform 474 * the software "in syscall" bit, directing us to not perform
@@ -528,35 +480,30 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
528 orig_i0 = regs->u_regs[UREG_G6]; 480 orig_i0 = regs->u_regs[UREG_G6];
529 } 481 }
530 482
531 483 if (has_handler) {
532 if (signr > 0) {
533 if (restart_syscall) 484 if (restart_syscall)
534 syscall_restart(orig_i0, regs, &ka.sa); 485 syscall_restart(orig_i0, regs, &ksig.ka.sa);
535 handle_signal(signr, &ka, &info, regs); 486 handle_signal(&ksig, regs);
536 return; 487 } else {
537 } 488 if (restart_syscall) {
538 if (restart_syscall && 489 switch (regs->u_regs[UREG_I0]) {
539 (regs->u_regs[UREG_I0] == ERESTARTNOHAND || 490 case ERESTARTNOHAND:
540 regs->u_regs[UREG_I0] == ERESTARTSYS || 491 case ERESTARTSYS:
541 regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { 492 case ERESTARTNOINTR:
542 /* replay the system call when we are done */ 493 /* replay the system call when we are done */
543 regs->u_regs[UREG_I0] = orig_i0; 494 regs->u_regs[UREG_I0] = orig_i0;
544 regs->pc -= 4; 495 regs->pc -= 4;
545 regs->npc -= 4; 496 regs->npc -= 4;
546 pt_regs_clear_syscall(regs); 497 pt_regs_clear_syscall(regs);
547 } 498 case ERESTART_RESTARTBLOCK:
548 if (restart_syscall && 499 regs->u_regs[UREG_G1] = __NR_restart_syscall;
549 regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { 500 regs->pc -= 4;
550 regs->u_regs[UREG_G1] = __NR_restart_syscall; 501 regs->npc -= 4;
551 regs->pc -= 4; 502 pt_regs_clear_syscall(regs);
552 regs->npc -= 4; 503 }
553 pt_regs_clear_syscall(regs); 504 }
505 restore_saved_sigmask();
554 } 506 }
555
556 /* if there's no signal to deliver, we just put the saved sigmask
557 * back
558 */
559 restore_saved_sigmask();
560} 507}
561 508
562void 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 689e1ba62809..35923e8abd82 100644
--- a/arch/sparc/kernel/signal_64.c
+++ b/arch/sparc/kernel/signal_64.c
@@ -236,23 +236,6 @@ struct rt_signal_frame {
236 __siginfo_rwin_t *rwin_save; 236 __siginfo_rwin_t *rwin_save;
237}; 237};
238 238
239static long _sigpause_common(old_sigset_t set)
240{
241 sigset_t blocked;
242 siginitset(&blocked, set);
243 return sigsuspend(&blocked);
244}
245
246asmlinkage long sys_sigpause(unsigned int set)
247{
248 return _sigpause_common(set);
249}
250
251asmlinkage long sys_sigsuspend(old_sigset_t set)
252{
253 return _sigpause_common(set);
254}
255
256void do_rt_sigreturn(struct pt_regs *regs) 239void do_rt_sigreturn(struct pt_regs *regs)
257{ 240{
258 struct rt_signal_frame __user *sf; 241 struct rt_signal_frame __user *sf;
@@ -295,7 +278,8 @@ void do_rt_sigreturn(struct pt_regs *regs)
295 err |= restore_fpu_state(regs, fpu_save); 278 err |= restore_fpu_state(regs, fpu_save);
296 279
297 err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); 280 err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
298 if (err || do_sigaltstack(&sf->stack, NULL, (unsigned long)sf) == -EFAULT) 281 err |= restore_altstack(&sf->stack);
282 if (err)
299 goto segv; 283 goto segv;
300 284
301 err |= __get_user(rwin_save, &sf->rwin_save); 285 err |= __get_user(rwin_save, &sf->rwin_save);
@@ -324,7 +308,7 @@ static int invalid_frame_pointer(void __user *fp)
324 return 0; 308 return 0;
325} 309}
326 310
327static 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)
328{ 312{
329 unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS; 313 unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS;
330 314
@@ -336,12 +320,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *
336 return (void __user *) -1L; 320 return (void __user *) -1L;
337 321
338 /* This is the X/Open sanctioned signal stack switching. */ 322 /* This is the X/Open sanctioned signal stack switching. */
339 if (ka->sa.sa_flags & SA_ONSTACK) { 323 sp = sigsp(sp, ksig) - framesize;
340 if (sas_ss_flags(sp) == 0)
341 sp = current->sas_ss_sp + current->sas_ss_size;
342 }
343
344 sp -= framesize;
345 324
346 /* Always align the stack frame. This handles two cases. First, 325 /* Always align the stack frame. This handles two cases. First,
347 * sigaltstack need not be mindful of platform specific stack 326 * sigaltstack need not be mindful of platform specific stack
@@ -355,8 +334,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *
355} 334}
356 335
357static inline int 336static inline int
358setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, 337setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
359 int signo, sigset_t *oldset, siginfo_t *info)
360{ 338{
361 struct rt_signal_frame __user *sf; 339 struct rt_signal_frame __user *sf;
362 int wsaved, err, sf_size; 340 int wsaved, err, sf_size;
@@ -374,10 +352,12 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
374 if (wsaved) 352 if (wsaved)
375 sf_size += sizeof(__siginfo_rwin_t); 353 sf_size += sizeof(__siginfo_rwin_t);
376 sf = (struct rt_signal_frame __user *) 354 sf = (struct rt_signal_frame __user *)
377 get_sigframe(ka, regs, sf_size); 355 get_sigframe(ksig, regs, sf_size);
378 356
379 if (invalid_frame_pointer (sf)) 357 if (invalid_frame_pointer (sf)) {
380 goto sigill; 358 do_exit(SIGILL); /* won't return, actually */
359 return -EINVAL;
360 }
381 361
382 tail = (sf + 1); 362 tail = (sf + 1);
383 363
@@ -403,11 +383,9 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
403 } 383 }
404 384
405 /* Setup sigaltstack */ 385 /* Setup sigaltstack */
406 err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp); 386 err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]);
407 err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
408 err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
409 387
410 err |= copy_to_user(&sf->mask, oldset, sizeof(sigset_t)); 388 err |= copy_to_user(&sf->mask, sigmask_to_save(), sizeof(sigset_t));
411 389
412 if (!wsaved) { 390 if (!wsaved) {
413 err |= copy_in_user((u64 __user *)sf, 391 err |= copy_in_user((u64 __user *)sf,
@@ -420,18 +398,18 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
420 rp = &current_thread_info()->reg_window[wsaved - 1]; 398 rp = &current_thread_info()->reg_window[wsaved - 1];
421 err |= copy_to_user(sf, rp, sizeof(struct reg_window)); 399 err |= copy_to_user(sf, rp, sizeof(struct reg_window));
422 } 400 }
423 if (info) 401 if (ksig->ka.sa.sa_flags & SA_SIGINFO)
424 err |= copy_siginfo_to_user(&sf->info, info); 402 err |= copy_siginfo_to_user(&sf->info, &ksig->info);
425 else { 403 else {
426 err |= __put_user(signo, &sf->info.si_signo); 404 err |= __put_user(ksig->sig, &sf->info.si_signo);
427 err |= __put_user(SI_NOINFO, &sf->info.si_code); 405 err |= __put_user(SI_NOINFO, &sf->info.si_code);
428 } 406 }
429 if (err) 407 if (err)
430 goto sigsegv; 408 return err;
431 409
432 /* 3. signal handler back-trampoline and parameters */ 410 /* 3. signal handler back-trampoline and parameters */
433 regs->u_regs[UREG_FP] = ((unsigned long) sf) - STACK_BIAS; 411 regs->u_regs[UREG_FP] = ((unsigned long) sf) - STACK_BIAS;
434 regs->u_regs[UREG_I0] = signo; 412 regs->u_regs[UREG_I0] = ksig->sig;
435 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; 413 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
436 414
437 /* The sigcontext is passed in this way because of how it 415 /* The sigcontext is passed in this way because of how it
@@ -441,37 +419,15 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
441 regs->u_regs[UREG_I2] = (unsigned long) &sf->info; 419 regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
442 420
443 /* 5. signal handler */ 421 /* 5. signal handler */
444 regs->tpc = (unsigned long) ka->sa.sa_handler; 422 regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;
445 regs->tnpc = (regs->tpc + 4); 423 regs->tnpc = (regs->tpc + 4);
446 if (test_thread_flag(TIF_32BIT)) { 424 if (test_thread_flag(TIF_32BIT)) {
447 regs->tpc &= 0xffffffff; 425 regs->tpc &= 0xffffffff;
448 regs->tnpc &= 0xffffffff; 426 regs->tnpc &= 0xffffffff;
449 } 427 }
450 /* 4. return to kernel instructions */ 428 /* 4. return to kernel instructions */
451 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; 429 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
452 return 0; 430 return 0;
453
454sigill:
455 do_exit(SIGILL);
456 return -EINVAL;
457
458sigsegv:
459 force_sigsegv(signo, current);
460 return -EFAULT;
461}
462
463static inline void handle_signal(unsigned long signr, struct k_sigaction *ka,
464 siginfo_t *info,
465 sigset_t *oldset, struct pt_regs *regs)
466{
467 int err;
468
469 err = setup_rt_frame(ka, regs, signr, oldset,
470 (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL);
471 if (err)
472 return;
473
474 signal_delivered(signr, info, ka, regs, 0);
475} 431}
476 432
477static 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,
@@ -501,11 +457,9 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
501 */ 457 */
502static void do_signal(struct pt_regs *regs, unsigned long orig_i0) 458static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
503{ 459{
504 struct k_sigaction ka; 460 struct ksignal ksig;
505 int restart_syscall; 461 int restart_syscall;
506 sigset_t *oldset = sigmask_to_save(); 462 bool has_handler;
507 siginfo_t info;
508 int signr;
509 463
510 /* 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
511 * register for GDB to save and restore in order to get 465 * register for GDB to save and restore in order to get
@@ -531,13 +485,13 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
531 485
532#ifdef CONFIG_COMPAT 486#ifdef CONFIG_COMPAT
533 if (test_thread_flag(TIF_32BIT)) { 487 if (test_thread_flag(TIF_32BIT)) {
534 extern void do_signal32(sigset_t *, struct pt_regs *); 488 extern void do_signal32(struct pt_regs *);
535 do_signal32(oldset, regs); 489 do_signal32(regs);
536 return; 490 return;
537 } 491 }
538#endif 492#endif
539 493
540 signr = get_signal_to_deliver(&info, &ka, regs, NULL); 494 has_handler = get_signal(&ksig);
541 495
542 restart_syscall = 0; 496 restart_syscall = 0;
543 if (pt_regs_is_syscall(regs) && 497 if (pt_regs_is_syscall(regs) &&
@@ -546,34 +500,30 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
546 orig_i0 = regs->u_regs[UREG_G6]; 500 orig_i0 = regs->u_regs[UREG_G6];
547 } 501 }
548 502
549 if (signr > 0) { 503 if (has_handler) {
550 if (restart_syscall) 504 if (restart_syscall)
551 syscall_restart(orig_i0, regs, &ka.sa); 505 syscall_restart(orig_i0, regs, &ksig.ka.sa);
552 handle_signal(signr, &ka, &info, oldset, regs); 506 signal_setup_done(setup_rt_frame(&ksig, regs), &ksig, 0);
553 return; 507 } else {
554 } 508 if (restart_syscall) {
555 if (restart_syscall && 509 switch (regs->u_regs[UREG_I0]) {
556 (regs->u_regs[UREG_I0] == ERESTARTNOHAND || 510 case ERESTARTNOHAND:
557 regs->u_regs[UREG_I0] == ERESTARTSYS || 511 case ERESTARTSYS:
558 regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { 512 case ERESTARTNOINTR:
559 /* replay the system call when we are done */ 513 /* replay the system call when we are done */
560 regs->u_regs[UREG_I0] = orig_i0; 514 regs->u_regs[UREG_I0] = orig_i0;
561 regs->tpc -= 4; 515 regs->tpc -= 4;
562 regs->tnpc -= 4; 516 regs->tnpc -= 4;
563 pt_regs_clear_syscall(regs); 517 pt_regs_clear_syscall(regs);
564 } 518 case ERESTART_RESTARTBLOCK:
565 if (restart_syscall && 519 regs->u_regs[UREG_G1] = __NR_restart_syscall;
566 regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { 520 regs->tpc -= 4;
567 regs->u_regs[UREG_G1] = __NR_restart_syscall; 521 regs->tnpc -= 4;
568 regs->tpc -= 4; 522 pt_regs_clear_syscall(regs);
569 regs->tnpc -= 4; 523 }
570 pt_regs_clear_syscall(regs); 524 }
525 restore_saved_sigmask();
571 } 526 }
572
573 /* If there's no signal to deliver, we just put the saved sigmask
574 * back
575 */
576 restore_saved_sigmask();
577} 527}
578 528
579void 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)
diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S
index 8475a474273a..240a3cecc11e 100644
--- a/arch/sparc/kernel/sys32.S
+++ b/arch/sparc/kernel/sys32.S
@@ -36,108 +36,22 @@ STUB: sra REG1, 0, REG1; \
36 jmpl %g1 + %lo(SYSCALL), %g0; \ 36 jmpl %g1 + %lo(SYSCALL), %g0; \
37 sra REG3, 0, REG3 37 sra REG3, 0, REG3
38 38
39#define SIGN4(STUB,SYSCALL,REG1,REG2,REG3,REG4) \
40 .align 32; \
41 .globl STUB; \
42STUB: sra REG1, 0, REG1; \
43 sethi %hi(SYSCALL), %g1; \
44 sra REG2, 0, REG2; \
45 sra REG3, 0, REG3; \
46 jmpl %g1 + %lo(SYSCALL), %g0; \
47 sra REG4, 0, REG4
48
49SIGN1(sys32_exit, sparc_exit, %o0)
50SIGN1(sys32_exit_group, sparc_exit_group, %o0)
51SIGN1(sys32_wait4, compat_sys_wait4, %o2)
52SIGN1(sys32_creat, sys_creat, %o1)
53SIGN1(sys32_mknod, sys_mknod, %o1)
54SIGN1(sys32_umount, sys_umount, %o1)
55SIGN1(sys32_signal, sys_signal, %o0)
56SIGN1(sys32_access, sys_access, %o1)
57SIGN1(sys32_msync, sys_msync, %o2)
58SIGN2(sys32_reboot, sys_reboot, %o0, %o1)
59SIGN1(sys32_setitimer, compat_sys_setitimer, %o0)
60SIGN1(sys32_getitimer, compat_sys_getitimer, %o0)
61SIGN1(sys32_sethostname, sys_sethostname, %o1)
62SIGN1(sys32_swapon, sys_swapon, %o1)
63SIGN1(sys32_sigaction, compat_sys_sigaction, %o0)
64SIGN1(sys32_rt_sigaction, compat_sys_rt_sigaction, %o0)
65SIGN1(sys32_sigprocmask, compat_sys_sigprocmask, %o0)
66SIGN1(sys32_rt_sigprocmask, compat_sys_rt_sigprocmask, %o0)
67SIGN2(sys32_rt_sigqueueinfo, compat_sys_rt_sigqueueinfo, %o0, %o1)
68SIGN1(sys32_getrusage, compat_sys_getrusage, %o0) 39SIGN1(sys32_getrusage, compat_sys_getrusage, %o0)
69SIGN1(sys32_setxattr, sys_setxattr, %o4)
70SIGN1(sys32_lsetxattr, sys_lsetxattr, %o4)
71SIGN1(sys32_fsetxattr, sys_fsetxattr, %o4)
72SIGN1(sys32_fgetxattr, sys_fgetxattr, %o0)
73SIGN1(sys32_flistxattr, sys_flistxattr, %o0)
74SIGN1(sys32_fremovexattr, sys_fremovexattr, %o0)
75SIGN2(sys32_tkill, sys_tkill, %o0, %o1)
76SIGN1(sys32_epoll_create, sys_epoll_create, %o0)
77SIGN3(sys32_epoll_ctl, sys_epoll_ctl, %o0, %o1, %o2)
78SIGN3(sys32_epoll_wait, sys_epoll_wait, %o0, %o2, %o3)
79SIGN1(sys32_readahead, compat_sys_readahead, %o0) 40SIGN1(sys32_readahead, compat_sys_readahead, %o0)
80SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4) 41SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4)
81SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5) 42SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5)
82SIGN2(sys32_bdflush, sys_bdflush, %o0, %o1)
83SIGN1(sys32_mlockall, sys_mlockall, %o0)
84SIGN1(sys32_clock_nanosleep, compat_sys_clock_nanosleep, %o1) 43SIGN1(sys32_clock_nanosleep, compat_sys_clock_nanosleep, %o1)
85SIGN1(sys32_timer_settime, compat_sys_timer_settime, %o1) 44SIGN1(sys32_timer_settime, compat_sys_timer_settime, %o1)
86SIGN1(sys32_io_submit, compat_sys_io_submit, %o1) 45SIGN1(sys32_io_submit, compat_sys_io_submit, %o1)
87SIGN1(sys32_mq_open, compat_sys_mq_open, %o1) 46SIGN1(sys32_mq_open, compat_sys_mq_open, %o1)
88SIGN1(sys32_select, compat_sys_select, %o0) 47SIGN1(sys32_select, compat_sys_select, %o0)
89SIGN1(sys32_mkdir, sys_mkdir, %o1)
90SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5) 48SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5)
91SIGN1(sys32_sysfs, compat_sys_sysfs, %o0)
92SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1) 49SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1)
93SIGN2(sys32_sendfile64, sys_sendfile, %o0, %o1)
94SIGN1(sys32_prctl, sys_prctl, %o0)
95SIGN1(sys32_sched_rr_get_interval, compat_sys_sched_rr_get_interval, %o0)
96SIGN2(sys32_waitpid, sys_waitpid, %o0, %o2)
97SIGN1(sys32_getgroups, sys_getgroups, %o0)
98SIGN1(sys32_getpgid, sys_getpgid, %o0)
99SIGN2(sys32_getpriority, sys_getpriority, %o0, %o1)
100SIGN1(sys32_getsid, sys_getsid, %o0)
101SIGN2(sys32_kill, sys_kill, %o0, %o1)
102SIGN1(sys32_nice, sys_nice, %o0)
103SIGN1(sys32_lseek, sys_lseek, %o1)
104SIGN2(sys32_open, sparc32_open, %o1, %o2)
105SIGN1(sys32_readlink, sys_readlink, %o2)
106SIGN1(sys32_sched_get_priority_max, sys_sched_get_priority_max, %o0)
107SIGN1(sys32_sched_get_priority_min, sys_sched_get_priority_min, %o0)
108SIGN1(sys32_sched_getparam, sys_sched_getparam, %o0)
109SIGN1(sys32_sched_getscheduler, sys_sched_getscheduler, %o0)
110SIGN1(sys32_sched_setparam, sys_sched_setparam, %o0)
111SIGN2(sys32_sched_setscheduler, sys_sched_setscheduler, %o0, %o1)
112SIGN1(sys32_getdomainname, sys_getdomainname, %o1)
113SIGN1(sys32_setdomainname, sys_setdomainname, %o1)
114SIGN1(sys32_setgroups, sys_setgroups, %o0)
115SIGN2(sys32_setpgid, sys_setpgid, %o0, %o1)
116SIGN3(sys32_setpriority, sys_setpriority, %o0, %o1, %o2)
117SIGN1(sys32_ssetmask, sys_ssetmask, %o0)
118SIGN2(sys32_syslog, sys_syslog, %o0, %o2)
119SIGN1(sys32_umask, sys_umask, %o0)
120SIGN3(sys32_tgkill, sys_tgkill, %o0, %o1, %o2)
121SIGN1(sys32_sendto, sys_sendto, %o0)
122SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0) 50SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0)
123SIGN3(sys32_socket, sys_socket, %o0, %o1, %o2)
124SIGN2(sys32_connect, sys_connect, %o0, %o2)
125SIGN2(sys32_bind, sys_bind, %o0, %o2)
126SIGN2(sys32_listen, sys_listen, %o0, %o1)
127SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0) 51SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)
128SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) 52SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0)
129SIGN2(sys32_shutdown, sys_shutdown, %o0, %o1)
130SIGN3(sys32_socketpair, sys_socketpair, %o0, %o1, %o2)
131SIGN1(sys32_getpeername, sys_getpeername, %o0)
132SIGN1(sys32_getsockname, sys_getsockname, %o0)
133SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1)
134SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2)
135SIGN2(sys32_splice, sys_splice, %o0, %o2)
136SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) 53SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5)
137SIGN2(sys32_tee, sys_tee, %o0, %o1)
138SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0) 54SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0)
139SIGN1(sys32_truncate, sys_truncate, %o1)
140SIGN1(sys32_ftruncate, sys_ftruncate, %o1)
141 55
142 .globl sys32_mmap2 56 .globl sys32_mmap2
143sys32_mmap2: 57sys32_mmap2:
diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c
index 4a4cdc633f6b..f38f2280fade 100644
--- a/arch/sparc/kernel/sys_sparc32.c
+++ b/arch/sparc/kernel/sys_sparc32.c
@@ -206,133 +206,19 @@ asmlinkage long compat_sys_fstatat64(unsigned int dfd,
206 return cp_compat_stat64(&stat, statbuf); 206 return cp_compat_stat64(&stat, statbuf);
207} 207}
208 208
209asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2) 209COMPAT_SYSCALL_DEFINE3(sparc_sigaction, int, sig,
210 struct compat_old_sigaction __user *,act,
211 struct compat_old_sigaction __user *,oact)
210{ 212{
211 return sys_sysfs(option, arg1, arg2);
212}
213
214asmlinkage long compat_sys_rt_sigprocmask(int how,
215 compat_sigset_t __user *set,
216 compat_sigset_t __user *oset,
217 compat_size_t sigsetsize)
218{
219 sigset_t s;
220 compat_sigset_t s32;
221 int ret;
222 mm_segment_t old_fs = get_fs();
223
224 if (set) {
225 if (copy_from_user (&s32, set, sizeof(compat_sigset_t)))
226 return -EFAULT;
227 switch (_NSIG_WORDS) {
228 case 4: s.sig[3] = s32.sig[6] | (((long)s32.sig[7]) << 32);
229 case 3: s.sig[2] = s32.sig[4] | (((long)s32.sig[5]) << 32);
230 case 2: s.sig[1] = s32.sig[2] | (((long)s32.sig[3]) << 32);
231 case 1: s.sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32);
232 }
233 }
234 set_fs (KERNEL_DS);
235 ret = sys_rt_sigprocmask(how,
236 set ? (sigset_t __user *) &s : NULL,
237 oset ? (sigset_t __user *) &s : NULL,
238 sigsetsize);
239 set_fs (old_fs);
240 if (ret) return ret;
241 if (oset) {
242 switch (_NSIG_WORDS) {
243 case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
244 case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
245 case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
246 case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
247 }
248 if (copy_to_user (oset, &s32, sizeof(compat_sigset_t)))
249 return -EFAULT;
250 }
251 return 0;
252}
253
254asmlinkage long sys32_rt_sigpending(compat_sigset_t __user *set,
255 compat_size_t sigsetsize)
256{
257 sigset_t s;
258 compat_sigset_t s32;
259 int ret;
260 mm_segment_t old_fs = get_fs();
261
262 set_fs (KERNEL_DS);
263 ret = sys_rt_sigpending((sigset_t __user *) &s, sigsetsize);
264 set_fs (old_fs);
265 if (!ret) {
266 switch (_NSIG_WORDS) {
267 case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
268 case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
269 case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
270 case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
271 }
272 if (copy_to_user (set, &s32, sizeof(compat_sigset_t)))
273 return -EFAULT;
274 }
275 return ret;
276}
277
278asmlinkage long compat_sys_rt_sigqueueinfo(int pid, int sig,
279 struct compat_siginfo __user *uinfo)
280{
281 siginfo_t info;
282 int ret;
283 mm_segment_t old_fs = get_fs();
284
285 if (copy_siginfo_from_user32(&info, uinfo))
286 return -EFAULT;
287
288 set_fs (KERNEL_DS);
289 ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *) &info);
290 set_fs (old_fs);
291 return ret;
292}
293
294asmlinkage long compat_sys_sigaction(int sig, struct old_sigaction32 __user *act,
295 struct old_sigaction32 __user *oact)
296{
297 struct k_sigaction new_ka, old_ka;
298 int ret;
299
300 WARN_ON_ONCE(sig >= 0); 213 WARN_ON_ONCE(sig >= 0);
301 sig = -sig; 214 return compat_sys_sigaction(-sig, act, oact);
302
303 if (act) {
304 compat_old_sigset_t mask;
305 u32 u_handler, u_restorer;
306
307 ret = get_user(u_handler, &act->sa_handler);
308 new_ka.sa.sa_handler = compat_ptr(u_handler);
309 ret |= __get_user(u_restorer, &act->sa_restorer);
310 new_ka.sa.sa_restorer = compat_ptr(u_restorer);
311 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
312 ret |= __get_user(mask, &act->sa_mask);
313 if (ret)
314 return ret;
315 new_ka.ka_restorer = NULL;
316 siginitset(&new_ka.sa.sa_mask, mask);
317 }
318
319 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
320
321 if (!ret && oact) {
322 ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler);
323 ret |= __put_user(ptr_to_compat(old_ka.sa.sa_restorer), &oact->sa_restorer);
324 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
325 ret |= __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
326 }
327
328 return ret;
329} 215}
330 216
331asmlinkage long compat_sys_rt_sigaction(int sig, 217COMPAT_SYSCALL_DEFINE5(rt_sigaction, int, sig,
332 struct sigaction32 __user *act, 218 struct compat_sigaction __user *,act,
333 struct sigaction32 __user *oact, 219 struct compat_sigaction __user *,oact,
334 void __user *restorer, 220 void __user *,restorer,
335 compat_size_t sigsetsize) 221 compat_size_t,sigsetsize)
336{ 222{
337 struct k_sigaction new_ka, old_ka; 223 struct k_sigaction new_ka, old_ka;
338 int ret; 224 int ret;
@@ -349,12 +235,7 @@ asmlinkage long compat_sys_rt_sigaction(int sig,
349 ret = get_user(u_handler, &act->sa_handler); 235 ret = get_user(u_handler, &act->sa_handler);
350 new_ka.sa.sa_handler = compat_ptr(u_handler); 236 new_ka.sa.sa_handler = compat_ptr(u_handler);
351 ret |= __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t)); 237 ret |= __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t));
352 switch (_NSIG_WORDS) { 238 sigset_from_compat(&new_ka.sa.sa_mask, &set32);
353 case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6] | (((long)set32.sig[7]) << 32);
354 case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4] | (((long)set32.sig[5]) << 32);
355 case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2] | (((long)set32.sig[3]) << 32);
356 case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0] | (((long)set32.sig[1]) << 32);
357 }
358 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); 239 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
359 ret |= __get_user(u_restorer, &act->sa_restorer); 240 ret |= __get_user(u_restorer, &act->sa_restorer);
360 new_ka.sa.sa_restorer = compat_ptr(u_restorer); 241 new_ka.sa.sa_restorer = compat_ptr(u_restorer);
@@ -365,12 +246,7 @@ asmlinkage long compat_sys_rt_sigaction(int sig,
365 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); 246 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
366 247
367 if (!ret && oact) { 248 if (!ret && oact) {
368 switch (_NSIG_WORDS) { 249 sigset_to_compat(&set32, &old_ka.sa.sa_mask);
369 case 4: set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32); set32.sig[6] = old_ka.sa.sa_mask.sig[3];
370 case 3: set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32); set32.sig[4] = old_ka.sa.sa_mask.sig[2];
371 case 2: set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32); set32.sig[2] = old_ka.sa.sa_mask.sig[1];
372 case 1: set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32); set32.sig[0] = old_ka.sa.sa_mask.sig[0];
373 }
374 ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler); 250 ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler);
375 ret |= __copy_to_user(&oact->sa_mask, &set32, sizeof(compat_sigset_t)); 251 ret |= __copy_to_user(&oact->sa_mask, &set32, sizeof(compat_sigset_t));
376 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); 252 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
@@ -382,35 +258,6 @@ asmlinkage long compat_sys_rt_sigaction(int sig,
382 return ret; 258 return ret;
383} 259}
384 260
385#ifdef CONFIG_MODULES
386
387asmlinkage long sys32_init_module(void __user *umod, u32 len,
388 const char __user *uargs)
389{
390 return sys_init_module(umod, len, uargs);
391}
392
393asmlinkage long sys32_delete_module(const char __user *name_user,
394 unsigned int flags)
395{
396 return sys_delete_module(name_user, flags);
397}
398
399#else /* CONFIG_MODULES */
400
401asmlinkage long sys32_init_module(const char __user *name_user,
402 struct module __user *mod_user)
403{
404 return -ENOSYS;
405}
406
407asmlinkage long sys32_delete_module(const char __user *name_user)
408{
409 return -ENOSYS;
410}
411
412#endif /* CONFIG_MODULES */
413
414asmlinkage compat_ssize_t sys32_pread64(unsigned int fd, 261asmlinkage compat_ssize_t sys32_pread64(unsigned int fd,
415 char __user *ubuf, 262 char __user *ubuf,
416 compat_size_t count, 263 compat_size_t count,
@@ -456,16 +303,6 @@ long compat_sys_fadvise64_64(int fd,
456 advice); 303 advice);
457} 304}
458 305
459/* This is just a version for 32-bit applications which does
460 * not force O_LARGEFILE on.
461 */
462
463asmlinkage long sparc32_open(const char __user *filename,
464 int flags, int mode)
465{
466 return do_sys_open(AT_FDCWD, filename, flags, mode);
467}
468
469long sys32_lookup_dcookie(unsigned long cookie_high, 306long sys32_lookup_dcookie(unsigned long cookie_high,
470 unsigned long cookie_low, 307 unsigned long cookie_low,
471 char __user *buf, size_t len) 308 char __user *buf, size_t len)
diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c
index 2da0bdcae52f..3a8d1844402e 100644
--- a/arch/sparc/kernel/sys_sparc_32.c
+++ b/arch/sparc/kernel/sys_sparc_32.c
@@ -160,49 +160,19 @@ sparc_breakpoint (struct pt_regs *regs)
160#endif 160#endif
161} 161}
162 162
163asmlinkage int 163SYSCALL_DEFINE3(sparc_sigaction, int, sig,
164sparc_sigaction (int sig, const struct old_sigaction __user *act, 164 struct old_sigaction __user *,act,
165 struct old_sigaction __user *oact) 165 struct old_sigaction __user *,oact)
166{ 166{
167 struct k_sigaction new_ka, old_ka;
168 int ret;
169
170 WARN_ON_ONCE(sig >= 0); 167 WARN_ON_ONCE(sig >= 0);
171 sig = -sig; 168 return sys_sigaction(-sig, act, oact);
172
173 if (act) {
174 unsigned long mask;
175
176 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
177 __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
178 __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) ||
179 __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
180 __get_user(mask, &act->sa_mask))
181 return -EFAULT;
182 siginitset(&new_ka.sa.sa_mask, mask);
183 new_ka.ka_restorer = NULL;
184 }
185
186 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
187
188 if (!ret && oact) {
189 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
190 __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
191 __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) ||
192 __put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
193 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
194 return -EFAULT;
195 }
196
197 return ret;
198} 169}
199 170
200asmlinkage long 171SYSCALL_DEFINE5(rt_sigaction, int, sig,
201sys_rt_sigaction(int sig, 172 const struct sigaction __user *, act,
202 const struct sigaction __user *act, 173 struct sigaction __user *, oact,
203 struct sigaction __user *oact, 174 void __user *, restorer,
204 void __user *restorer, 175 size_t, sigsetsize)
205 size_t sigsetsize)
206{ 176{
207 struct k_sigaction new_ka, old_ka; 177 struct k_sigaction new_ka, old_ka;
208 int ret; 178 int ret;
diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S
index e0fed7711a94..22a1098961f5 100644
--- a/arch/sparc/kernel/syscalls.S
+++ b/arch/sparc/kernel/syscalls.S
@@ -25,16 +25,10 @@ sys_nis_syscall:
25sys_memory_ordering: 25sys_memory_ordering:
26 ba,pt %xcc, sparc_memory_ordering 26 ba,pt %xcc, sparc_memory_ordering
27 add %sp, PTREGS_OFF, %o1 27 add %sp, PTREGS_OFF, %o1
28sys_sigaltstack:
29 ba,pt %xcc, do_sigaltstack
30 add %i6, STACK_BIAS, %o2
31#ifdef CONFIG_COMPAT 28#ifdef CONFIG_COMPAT
32sys32_sigstack: 29sys32_sigstack:
33 ba,pt %xcc, do_sys32_sigstack 30 ba,pt %xcc, do_sys32_sigstack
34 mov %i6, %o2 31 mov %i6, %o2
35sys32_sigaltstack:
36 ba,pt %xcc, do_sys32_sigaltstack
37 mov %i6, %o2
38#endif 32#endif
39 .align 32 33 .align 32
40#ifdef CONFIG_COMPAT 34#ifdef CONFIG_COMPAT
diff --git a/arch/sparc/kernel/systbls.h b/arch/sparc/kernel/systbls.h
index 118759cd7342..26e6dd72e92a 100644
--- a/arch/sparc/kernel/systbls.h
+++ b/arch/sparc/kernel/systbls.h
@@ -3,8 +3,8 @@
3 3
4#include <linux/kernel.h> 4#include <linux/kernel.h>
5#include <linux/types.h> 5#include <linux/types.h>
6#include <linux/signal.h>
6#include <asm/utrap.h> 7#include <asm/utrap.h>
7#include <asm/signal.h>
8 8
9extern asmlinkage unsigned long sys_getpagesize(void); 9extern asmlinkage unsigned long sys_getpagesize(void);
10extern asmlinkage long sparc_pipe(struct pt_regs *regs); 10extern asmlinkage long sparc_pipe(struct pt_regs *regs);
@@ -36,8 +36,6 @@ extern asmlinkage long sys_rt_sigaction(int sig,
36 36
37extern asmlinkage void sparc64_set_context(struct pt_regs *regs); 37extern asmlinkage void sparc64_set_context(struct pt_regs *regs);
38extern asmlinkage void sparc64_get_context(struct pt_regs *regs); 38extern asmlinkage void sparc64_get_context(struct pt_regs *regs);
39extern asmlinkage long sys_sigpause(unsigned int set);
40extern asmlinkage long sys_sigsuspend(old_sigset_t set);
41extern void do_rt_sigreturn(struct pt_regs *regs); 39extern void do_rt_sigreturn(struct pt_regs *regs);
42 40
43#endif /* _SYSTBLS_H */ 41#endif /* _SYSTBLS_H */
diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S
index 6ac43c36bbbf..7b87171ecf1e 100644
--- a/arch/sparc/kernel/systbls_32.S
+++ b/arch/sparc/kernel/systbls_32.S
@@ -55,7 +55,7 @@ sys_call_table:
55/*180*/ .long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_ni_syscall 55/*180*/ .long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_ni_syscall
56/*185*/ .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname 56/*185*/ .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname
57/*190*/ .long sys_init_module, sys_personality, sparc_remap_file_pages, sys_epoll_create, sys_epoll_ctl 57/*190*/ .long sys_init_module, sys_personality, sparc_remap_file_pages, sys_epoll_create, sys_epoll_ctl
58/*195*/ .long sys_epoll_wait, sys_ioprio_set, sys_getppid, sparc_sigaction, sys_sgetmask 58/*195*/ .long sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_sparc_sigaction, sys_sgetmask
59/*200*/ .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, sys_old_readdir 59/*200*/ .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, sys_old_readdir
60/*205*/ .long sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64 60/*205*/ .long sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64
61/*210*/ .long sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo 61/*210*/ .long sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S
index 1009ecb92678..260ddcd412bf 100644
--- a/arch/sparc/kernel/systbls_64.S
+++ b/arch/sparc/kernel/systbls_64.S
@@ -18,63 +18,63 @@
18 18
19 .globl sys_call_table32 19 .globl sys_call_table32
20sys_call_table32: 20sys_call_table32:
21/*0*/ .word sys_restart_syscall, sys32_exit, sys_fork, sys_read, sys_write 21/*0*/ .word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write
22/*5*/ .word sys32_open, sys_close, sys32_wait4, sys32_creat, sys_link 22/*5*/ .word compat_sys_open, sys_close, compat_sys_wait4, sys_creat, sys_link
23/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys32_mknod 23/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys_mknod
24/*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, sys32_lseek 24/*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, sys_lseek
25/*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16 25/*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16
26/*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, sys32_sigaltstack, sys_pause 26/*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, compat_sys_sigaltstack, sys_pause
27/*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys32_access, sys32_nice 27/*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice
28 .word sys_chown, sys_sync, sys32_kill, compat_sys_newstat, sys32_sendfile 28 .word sys_chown, sys_sync, sys_kill, compat_sys_newstat, sys32_sendfile
29/*40*/ .word compat_sys_newlstat, sys_dup, sys_sparc_pipe, compat_sys_times, sys_getuid 29/*40*/ .word compat_sys_newlstat, sys_dup, sys_sparc_pipe, compat_sys_times, sys_getuid
30 .word sys32_umount, sys_setgid16, sys_getgid16, sys32_signal, sys_geteuid16 30 .word sys_umount, sys_setgid16, sys_getgid16, sys_signal, sys_geteuid16
31/*50*/ .word sys_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl 31/*50*/ .word sys_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl
32 .word sys32_reboot, sys32_mmap2, sys_symlink, sys32_readlink, sys32_execve 32 .word sys_reboot, sys32_mmap2, sys_symlink, sys_readlink, sys32_execve
33/*60*/ .word sys32_umask, sys_chroot, compat_sys_newfstat, compat_sys_fstat64, sys_getpagesize 33/*60*/ .word sys_umask, sys_chroot, compat_sys_newfstat, compat_sys_fstat64, sys_getpagesize
34 .word sys32_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid 34 .word sys_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid
35/*70*/ .word sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect 35/*70*/ .word sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect
36 .word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys_getgroups16 36 .word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys_getgroups16
37/*80*/ .word sys_setgroups16, sys_getpgrp, sys32_setgroups, sys32_setitimer, sys32_ftruncate64 37/*80*/ .word sys_setgroups16, sys_getpgrp, sys_setgroups, compat_sys_setitimer, sys32_ftruncate64
38 .word sys32_swapon, sys32_getitimer, sys_setuid, sys32_sethostname, sys_setgid 38 .word sys_swapon, compat_sys_getitimer, sys_setuid, sys_sethostname, sys_setgid
39/*90*/ .word sys_dup2, sys_setfsuid, compat_sys_fcntl, sys32_select, sys_setfsgid 39/*90*/ .word sys_dup2, sys_setfsuid, compat_sys_fcntl, sys32_select, sys_setfsgid
40 .word sys_fsync, sys32_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall 40 .word sys_fsync, sys_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
41/*100*/ .word sys32_getpriority, sys32_rt_sigreturn, sys32_rt_sigaction, sys32_rt_sigprocmask, sys32_rt_sigpending 41/*100*/ .word sys_getpriority, sys32_rt_sigreturn, compat_sys_rt_sigaction, compat_sys_rt_sigprocmask, compat_sys_rt_sigpending
42 .word compat_sys_rt_sigtimedwait, sys32_rt_sigqueueinfo, compat_sys_rt_sigsuspend, sys_setresuid, sys_getresuid 42 .word compat_sys_rt_sigtimedwait, compat_sys_rt_sigqueueinfo, compat_sys_rt_sigsuspend, sys_setresuid, sys_getresuid
43/*110*/ .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall 43/*110*/ .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall
44 .word sys32_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd 44 .word sys_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd
45/*120*/ .word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod 45/*120*/ .word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod
46 .word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys32_truncate 46 .word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys_truncate
47/*130*/ .word sys32_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall 47/*130*/ .word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall
48 .word sys_nis_syscall, sys32_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 48 .word sys_nis_syscall, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64
49/*140*/ .word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit 49/*140*/ .word sys_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit
50 .word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write 50 .word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write
51/*150*/ .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64 51/*150*/ .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64
52 .word compat_sys_fcntl64, sys_inotify_rm_watch, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount 52 .word compat_sys_fcntl64, sys_inotify_rm_watch, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount
53/*160*/ .word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys32_getdomainname, sys32_setdomainname, sys_nis_syscall 53/*160*/ .word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys_getdomainname, sys_setdomainname, sys_nis_syscall
54 .word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys32_setxattr 54 .word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys_setxattr
55/*170*/ .word sys32_lsetxattr, sys32_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents 55/*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents
56 .word sys_setsid, sys_fchdir, sys32_fgetxattr, sys_listxattr, sys_llistxattr 56 .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr
57/*180*/ .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall 57/*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall
58 .word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sys_newuname 58 .word sys_setpgid, sys_fremovexattr, sys_tkill, sparc_exit_group, sys_newuname
59/*190*/ .word sys32_init_module, sys_sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl 59/*190*/ .word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl
60 .word sys32_epoll_wait, sys32_ioprio_set, sys_getppid, sys32_sigaction, sys_sgetmask 60 .word sys_epoll_wait, sys_ioprio_set, sys_getppid, compat_sys_sparc_sigaction, sys_sgetmask
61/*200*/ .word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir 61/*200*/ .word sys_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir
62 .word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64 62 .word sys32_readahead, sys32_socketcall, sys_syslog, sys32_lookup_dcookie, sys32_fadvise64
63/*210*/ .word sys32_fadvise64_64, sys32_tgkill, sys32_waitpid, sys_swapoff, compat_sys_sysinfo 63/*210*/ .word sys32_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, compat_sys_sysinfo
64 .word compat_sys_ipc, sys32_sigreturn, sys_clone, sys32_ioprio_get, compat_sys_adjtimex 64 .word compat_sys_ipc, sys32_sigreturn, sys_clone, sys_ioprio_get, compat_sys_adjtimex
65/*220*/ .word sys32_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys32_getpgid 65/*220*/ .word compat_sys_sigprocmask, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid
66 .word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16 66 .word sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16
67/*230*/ .word sys32_select, compat_sys_time, sys32_splice, compat_sys_stime, compat_sys_statfs64 67/*230*/ .word sys32_select, compat_sys_time, sys_splice, compat_sys_stime, compat_sys_statfs64
68 .word compat_sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys32_mlockall 68 .word compat_sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall
69/*240*/ .word sys_munlockall, sys32_sched_setparam, sys32_sched_getparam, sys32_sched_setscheduler, sys32_sched_getscheduler 69/*240*/ .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler
70 .word sys_sched_yield, sys32_sched_get_priority_max, sys32_sched_get_priority_min, sys32_sched_rr_get_interval, compat_sys_nanosleep 70 .word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, compat_sys_sched_rr_get_interval, compat_sys_nanosleep
71/*250*/ .word sys_mremap, compat_sys_sysctl, sys32_getsid, sys_fdatasync, sys_nis_syscall 71/*250*/ .word sys_mremap, compat_sys_sysctl, sys_getsid, sys_fdatasync, sys_nis_syscall
72 .word sys32_sync_file_range, compat_sys_clock_settime, compat_sys_clock_gettime, compat_sys_clock_getres, sys32_clock_nanosleep 72 .word sys32_sync_file_range, compat_sys_clock_settime, compat_sys_clock_gettime, compat_sys_clock_getres, sys32_clock_nanosleep
73/*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun 73/*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun
74 .word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy 74 .word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy
75/*270*/ .word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink 75/*270*/ .word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink
76 .word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid 76 .word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid
77/*280*/ .word sys32_tee, sys_add_key, sys_request_key, compat_sys_keyctl, compat_sys_openat 77/*280*/ .word sys_tee, sys_add_key, sys_request_key, compat_sys_keyctl, compat_sys_openat
78 .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64 78 .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64
79/*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat 79/*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
80 .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare 80 .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare