diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-23 21:50:11 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-23 21:50:11 -0500 |
commit | 9e2d59ad580d590134285f361a0e80f0e98c0207 (patch) | |
tree | f3232be75781484193413f32ec82c21f6d8eb76e /arch/sparc/kernel | |
parent | 5ce1a70e2f00f0bce0cab57f798ca354b9496169 (diff) | |
parent | 235b80226b986dabcbba844968f7807866bd0bfe (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.S | 8 | ||||
-rw-r--r-- | arch/sparc/kernel/signal32.c | 202 | ||||
-rw-r--r-- | arch/sparc/kernel/signal_32.c | 175 | ||||
-rw-r--r-- | arch/sparc/kernel/signal_64.c | 142 | ||||
-rw-r--r-- | arch/sparc/kernel/sys32.S | 86 | ||||
-rw-r--r-- | arch/sparc/kernel/sys_sparc32.c | 185 | ||||
-rw-r--r-- | arch/sparc/kernel/sys_sparc_32.c | 48 | ||||
-rw-r--r-- | arch/sparc/kernel/syscalls.S | 6 | ||||
-rw-r--r-- | arch/sparc/kernel/systbls.h | 4 | ||||
-rw-r--r-- | arch/sparc/kernel/systbls_32.S | 2 | ||||
-rw-r--r-- | arch/sparc/kernel/systbls_64.S | 84 |
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 | ||
824 | sys_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 |
832 | sys_sigstack: | 824 | sys_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: | |||
230 | asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) | 230 | asmlinkage 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 | ||
338 | static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) | 326 | static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize) |
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 | ||
429 | static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | 412 | static 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 | |||
561 | sigill: | ||
562 | do_exit(SIGILL); | ||
563 | return -EINVAL; | ||
564 | |||
565 | sigsegv: | ||
566 | force_sigsegv(signo, current); | ||
567 | return -EFAULT; | ||
568 | } | 545 | } |
569 | 546 | ||
570 | static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | 547 | static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs, |
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 | |||
713 | sigill: | ||
714 | do_exit(SIGILL); | ||
715 | return -EINVAL; | ||
716 | |||
717 | sigsegv: | ||
718 | force_sigsegv(signr, current); | ||
719 | return -EFAULT; | ||
720 | } | 688 | } |
721 | 689 | ||
722 | static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka, | 690 | static 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 | ||
739 | static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs, | 704 | static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs, |
@@ -763,50 +728,41 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs | |||
763 | */ | 728 | */ |
764 | void do_signal32(sigset_t *oldset, struct pt_regs * regs) | 729 | void 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 | ||
812 | struct sigstack32 { | 768 | struct sigstack32 { |
@@ -856,29 +812,3 @@ asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp) | |||
856 | out: | 812 | out: |
857 | return ret; | 813 | return ret; |
858 | } | 814 | } |
859 | |||
860 | asmlinkage 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 | ||
62 | static int _sigpause_common(old_sigset_t set) | ||
63 | { | ||
64 | sigset_t blocked; | ||
65 | siginitset(&blocked, set); | ||
66 | return sigsuspend(&blocked); | ||
67 | } | ||
68 | |||
69 | asmlinkage int sys_sigsuspend(old_sigset_t set) | ||
70 | { | ||
71 | return _sigpause_common(set); | ||
72 | } | ||
73 | |||
74 | asmlinkage void do_sigreturn(struct pt_regs *regs) | 62 | asmlinkage 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 | ||
212 | static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) | 189 | static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize) |
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 | ||
242 | static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, | 214 | static 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 | |||
334 | sigill_and_return: | ||
335 | do_exit(SIGILL); | ||
336 | return -EINVAL; | ||
337 | |||
338 | sigsegv: | ||
339 | force_sigsegv(signo, current); | ||
340 | return -EFAULT; | ||
341 | } | 307 | } |
342 | 308 | ||
343 | static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | 309 | static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs, |
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 | |||
439 | sigill: | ||
440 | do_exit(SIGILL); | ||
441 | return -EINVAL; | ||
442 | |||
443 | sigsegv: | ||
444 | force_sigsegv(signo, current); | ||
445 | return -EFAULT; | ||
446 | } | 404 | } |
447 | 405 | ||
448 | static inline void | 406 | static inline void |
449 | handle_signal(unsigned long signr, struct k_sigaction *ka, | 407 | handle_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 | ||
466 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | 419 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, |
@@ -490,10 +443,9 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | |||
490 | */ | 443 | */ |
491 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | 444 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) |
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 | ||
562 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, | 509 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, |
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 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 | ||
239 | static long _sigpause_common(old_sigset_t set) | ||
240 | { | ||
241 | sigset_t blocked; | ||
242 | siginitset(&blocked, set); | ||
243 | return sigsuspend(&blocked); | ||
244 | } | ||
245 | |||
246 | asmlinkage long sys_sigpause(unsigned int set) | ||
247 | { | ||
248 | return _sigpause_common(set); | ||
249 | } | ||
250 | |||
251 | asmlinkage long sys_sigsuspend(old_sigset_t set) | ||
252 | { | ||
253 | return _sigpause_common(set); | ||
254 | } | ||
255 | |||
256 | void do_rt_sigreturn(struct pt_regs *regs) | 239 | void 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 | ||
327 | static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize) | 311 | static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize) |
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 | ||
357 | static inline int | 336 | static inline int |
358 | setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | 337 | setup_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 = ¤t_thread_info()->reg_window[wsaved - 1]; | 398 | rp = ¤t_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 | |||
454 | sigill: | ||
455 | do_exit(SIGILL); | ||
456 | return -EINVAL; | ||
457 | |||
458 | sigsegv: | ||
459 | force_sigsegv(signo, current); | ||
460 | return -EFAULT; | ||
461 | } | ||
462 | |||
463 | static 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 | ||
477 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | 433 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, |
@@ -501,11 +457,9 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | |||
501 | */ | 457 | */ |
502 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | 458 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) |
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 | ||
579 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) | 529 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) |
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; \ | ||
42 | STUB: 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 | |||
49 | SIGN1(sys32_exit, sparc_exit, %o0) | ||
50 | SIGN1(sys32_exit_group, sparc_exit_group, %o0) | ||
51 | SIGN1(sys32_wait4, compat_sys_wait4, %o2) | ||
52 | SIGN1(sys32_creat, sys_creat, %o1) | ||
53 | SIGN1(sys32_mknod, sys_mknod, %o1) | ||
54 | SIGN1(sys32_umount, sys_umount, %o1) | ||
55 | SIGN1(sys32_signal, sys_signal, %o0) | ||
56 | SIGN1(sys32_access, sys_access, %o1) | ||
57 | SIGN1(sys32_msync, sys_msync, %o2) | ||
58 | SIGN2(sys32_reboot, sys_reboot, %o0, %o1) | ||
59 | SIGN1(sys32_setitimer, compat_sys_setitimer, %o0) | ||
60 | SIGN1(sys32_getitimer, compat_sys_getitimer, %o0) | ||
61 | SIGN1(sys32_sethostname, sys_sethostname, %o1) | ||
62 | SIGN1(sys32_swapon, sys_swapon, %o1) | ||
63 | SIGN1(sys32_sigaction, compat_sys_sigaction, %o0) | ||
64 | SIGN1(sys32_rt_sigaction, compat_sys_rt_sigaction, %o0) | ||
65 | SIGN1(sys32_sigprocmask, compat_sys_sigprocmask, %o0) | ||
66 | SIGN1(sys32_rt_sigprocmask, compat_sys_rt_sigprocmask, %o0) | ||
67 | SIGN2(sys32_rt_sigqueueinfo, compat_sys_rt_sigqueueinfo, %o0, %o1) | ||
68 | SIGN1(sys32_getrusage, compat_sys_getrusage, %o0) | 39 | SIGN1(sys32_getrusage, compat_sys_getrusage, %o0) |
69 | SIGN1(sys32_setxattr, sys_setxattr, %o4) | ||
70 | SIGN1(sys32_lsetxattr, sys_lsetxattr, %o4) | ||
71 | SIGN1(sys32_fsetxattr, sys_fsetxattr, %o4) | ||
72 | SIGN1(sys32_fgetxattr, sys_fgetxattr, %o0) | ||
73 | SIGN1(sys32_flistxattr, sys_flistxattr, %o0) | ||
74 | SIGN1(sys32_fremovexattr, sys_fremovexattr, %o0) | ||
75 | SIGN2(sys32_tkill, sys_tkill, %o0, %o1) | ||
76 | SIGN1(sys32_epoll_create, sys_epoll_create, %o0) | ||
77 | SIGN3(sys32_epoll_ctl, sys_epoll_ctl, %o0, %o1, %o2) | ||
78 | SIGN3(sys32_epoll_wait, sys_epoll_wait, %o0, %o2, %o3) | ||
79 | SIGN1(sys32_readahead, compat_sys_readahead, %o0) | 40 | SIGN1(sys32_readahead, compat_sys_readahead, %o0) |
80 | SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4) | 41 | SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4) |
81 | SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5) | 42 | SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5) |
82 | SIGN2(sys32_bdflush, sys_bdflush, %o0, %o1) | ||
83 | SIGN1(sys32_mlockall, sys_mlockall, %o0) | ||
84 | SIGN1(sys32_clock_nanosleep, compat_sys_clock_nanosleep, %o1) | 43 | SIGN1(sys32_clock_nanosleep, compat_sys_clock_nanosleep, %o1) |
85 | SIGN1(sys32_timer_settime, compat_sys_timer_settime, %o1) | 44 | SIGN1(sys32_timer_settime, compat_sys_timer_settime, %o1) |
86 | SIGN1(sys32_io_submit, compat_sys_io_submit, %o1) | 45 | SIGN1(sys32_io_submit, compat_sys_io_submit, %o1) |
87 | SIGN1(sys32_mq_open, compat_sys_mq_open, %o1) | 46 | SIGN1(sys32_mq_open, compat_sys_mq_open, %o1) |
88 | SIGN1(sys32_select, compat_sys_select, %o0) | 47 | SIGN1(sys32_select, compat_sys_select, %o0) |
89 | SIGN1(sys32_mkdir, sys_mkdir, %o1) | ||
90 | SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5) | 48 | SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5) |
91 | SIGN1(sys32_sysfs, compat_sys_sysfs, %o0) | ||
92 | SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1) | 49 | SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1) |
93 | SIGN2(sys32_sendfile64, sys_sendfile, %o0, %o1) | ||
94 | SIGN1(sys32_prctl, sys_prctl, %o0) | ||
95 | SIGN1(sys32_sched_rr_get_interval, compat_sys_sched_rr_get_interval, %o0) | ||
96 | SIGN2(sys32_waitpid, sys_waitpid, %o0, %o2) | ||
97 | SIGN1(sys32_getgroups, sys_getgroups, %o0) | ||
98 | SIGN1(sys32_getpgid, sys_getpgid, %o0) | ||
99 | SIGN2(sys32_getpriority, sys_getpriority, %o0, %o1) | ||
100 | SIGN1(sys32_getsid, sys_getsid, %o0) | ||
101 | SIGN2(sys32_kill, sys_kill, %o0, %o1) | ||
102 | SIGN1(sys32_nice, sys_nice, %o0) | ||
103 | SIGN1(sys32_lseek, sys_lseek, %o1) | ||
104 | SIGN2(sys32_open, sparc32_open, %o1, %o2) | ||
105 | SIGN1(sys32_readlink, sys_readlink, %o2) | ||
106 | SIGN1(sys32_sched_get_priority_max, sys_sched_get_priority_max, %o0) | ||
107 | SIGN1(sys32_sched_get_priority_min, sys_sched_get_priority_min, %o0) | ||
108 | SIGN1(sys32_sched_getparam, sys_sched_getparam, %o0) | ||
109 | SIGN1(sys32_sched_getscheduler, sys_sched_getscheduler, %o0) | ||
110 | SIGN1(sys32_sched_setparam, sys_sched_setparam, %o0) | ||
111 | SIGN2(sys32_sched_setscheduler, sys_sched_setscheduler, %o0, %o1) | ||
112 | SIGN1(sys32_getdomainname, sys_getdomainname, %o1) | ||
113 | SIGN1(sys32_setdomainname, sys_setdomainname, %o1) | ||
114 | SIGN1(sys32_setgroups, sys_setgroups, %o0) | ||
115 | SIGN2(sys32_setpgid, sys_setpgid, %o0, %o1) | ||
116 | SIGN3(sys32_setpriority, sys_setpriority, %o0, %o1, %o2) | ||
117 | SIGN1(sys32_ssetmask, sys_ssetmask, %o0) | ||
118 | SIGN2(sys32_syslog, sys_syslog, %o0, %o2) | ||
119 | SIGN1(sys32_umask, sys_umask, %o0) | ||
120 | SIGN3(sys32_tgkill, sys_tgkill, %o0, %o1, %o2) | ||
121 | SIGN1(sys32_sendto, sys_sendto, %o0) | ||
122 | SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0) | 50 | SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0) |
123 | SIGN3(sys32_socket, sys_socket, %o0, %o1, %o2) | ||
124 | SIGN2(sys32_connect, sys_connect, %o0, %o2) | ||
125 | SIGN2(sys32_bind, sys_bind, %o0, %o2) | ||
126 | SIGN2(sys32_listen, sys_listen, %o0, %o1) | ||
127 | SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0) | 51 | SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0) |
128 | SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) | 52 | SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) |
129 | SIGN2(sys32_shutdown, sys_shutdown, %o0, %o1) | ||
130 | SIGN3(sys32_socketpair, sys_socketpair, %o0, %o1, %o2) | ||
131 | SIGN1(sys32_getpeername, sys_getpeername, %o0) | ||
132 | SIGN1(sys32_getsockname, sys_getsockname, %o0) | ||
133 | SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1) | ||
134 | SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2) | ||
135 | SIGN2(sys32_splice, sys_splice, %o0, %o2) | ||
136 | SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) | 53 | SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) |
137 | SIGN2(sys32_tee, sys_tee, %o0, %o1) | ||
138 | SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0) | 54 | SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0) |
139 | SIGN1(sys32_truncate, sys_truncate, %o1) | ||
140 | SIGN1(sys32_ftruncate, sys_ftruncate, %o1) | ||
141 | 55 | ||
142 | .globl sys32_mmap2 | 56 | .globl sys32_mmap2 |
143 | sys32_mmap2: | 57 | sys32_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 | ||
209 | asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2) | 209 | COMPAT_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 | |||
214 | asmlinkage 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 | |||
254 | asmlinkage 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 | |||
278 | asmlinkage 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 | |||
294 | asmlinkage 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 | ||
331 | asmlinkage long compat_sys_rt_sigaction(int sig, | 217 | COMPAT_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 | |||
387 | asmlinkage 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 | |||
393 | asmlinkage 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 | |||
401 | asmlinkage long sys32_init_module(const char __user *name_user, | ||
402 | struct module __user *mod_user) | ||
403 | { | ||
404 | return -ENOSYS; | ||
405 | } | ||
406 | |||
407 | asmlinkage long sys32_delete_module(const char __user *name_user) | ||
408 | { | ||
409 | return -ENOSYS; | ||
410 | } | ||
411 | |||
412 | #endif /* CONFIG_MODULES */ | ||
413 | |||
414 | asmlinkage compat_ssize_t sys32_pread64(unsigned int fd, | 261 | asmlinkage 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 | |||
463 | asmlinkage 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 | |||
469 | long sys32_lookup_dcookie(unsigned long cookie_high, | 306 | long 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 | ||
163 | asmlinkage int | 163 | SYSCALL_DEFINE3(sparc_sigaction, int, sig, |
164 | sparc_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 | ||
200 | asmlinkage long | 171 | SYSCALL_DEFINE5(rt_sigaction, int, sig, |
201 | sys_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: | |||
25 | sys_memory_ordering: | 25 | sys_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 |
28 | sys_sigaltstack: | ||
29 | ba,pt %xcc, do_sigaltstack | ||
30 | add %i6, STACK_BIAS, %o2 | ||
31 | #ifdef CONFIG_COMPAT | 28 | #ifdef CONFIG_COMPAT |
32 | sys32_sigstack: | 29 | sys32_sigstack: |
33 | ba,pt %xcc, do_sys32_sigstack | 30 | ba,pt %xcc, do_sys32_sigstack |
34 | mov %i6, %o2 | 31 | mov %i6, %o2 |
35 | sys32_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 | ||
9 | extern asmlinkage unsigned long sys_getpagesize(void); | 9 | extern asmlinkage unsigned long sys_getpagesize(void); |
10 | extern asmlinkage long sparc_pipe(struct pt_regs *regs); | 10 | extern asmlinkage long sparc_pipe(struct pt_regs *regs); |
@@ -36,8 +36,6 @@ extern asmlinkage long sys_rt_sigaction(int sig, | |||
36 | 36 | ||
37 | extern asmlinkage void sparc64_set_context(struct pt_regs *regs); | 37 | extern asmlinkage void sparc64_set_context(struct pt_regs *regs); |
38 | extern asmlinkage void sparc64_get_context(struct pt_regs *regs); | 38 | extern asmlinkage void sparc64_get_context(struct pt_regs *regs); |
39 | extern asmlinkage long sys_sigpause(unsigned int set); | ||
40 | extern asmlinkage long sys_sigsuspend(old_sigset_t set); | ||
41 | extern void do_rt_sigreturn(struct pt_regs *regs); | 39 | extern 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 |
20 | sys_call_table32: | 20 | sys_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 |