diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/mips/kernel/signal32.c | 50 |
1 files changed, 4 insertions, 46 deletions
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c index e0a855331826..5934f33224f8 100644 --- a/arch/mips/kernel/signal32.c +++ b/arch/mips/kernel/signal32.c | |||
@@ -33,6 +33,8 @@ | |||
33 | #include <asm/fpu.h> | 33 | #include <asm/fpu.h> |
34 | #include <asm/war.h> | 34 | #include <asm/war.h> |
35 | 35 | ||
36 | #include "signal-common.h" | ||
37 | |||
36 | #define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3) | 38 | #define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3) |
37 | 39 | ||
38 | typedef struct compat_siginfo { | 40 | typedef struct compat_siginfo { |
@@ -604,32 +606,6 @@ out: | |||
604 | return err; | 606 | return err; |
605 | } | 607 | } |
606 | 608 | ||
607 | /* | ||
608 | * Determine which stack to use.. | ||
609 | */ | ||
610 | static inline void __user *get_sigframe(struct k_sigaction *ka, | ||
611 | struct pt_regs *regs, | ||
612 | size_t frame_size) | ||
613 | { | ||
614 | unsigned long sp; | ||
615 | |||
616 | /* Default to using normal stack */ | ||
617 | sp = regs->regs[29]; | ||
618 | |||
619 | /* | ||
620 | * FPU emulator may have it's own trampoline active just | ||
621 | * above the user stack, 16-bytes before the next lowest | ||
622 | * 16 byte boundary. Try to avoid trashing it. | ||
623 | */ | ||
624 | sp -= 32; | ||
625 | |||
626 | /* This is the X/Open sanctioned signal stack switching. */ | ||
627 | if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0)) | ||
628 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
629 | |||
630 | return (void __user *)((sp - frame_size) & ALMASK); | ||
631 | } | ||
632 | |||
633 | int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, | 609 | int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, |
634 | int signr, sigset_t *set) | 610 | int signr, sigset_t *set) |
635 | { | 611 | { |
@@ -640,15 +616,7 @@ int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, | |||
640 | if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) | 616 | if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) |
641 | goto give_sigsegv; | 617 | goto give_sigsegv; |
642 | 618 | ||
643 | /* | 619 | err |= install_sigtramp(frame->sf_code, __NR_O32_sigreturn); |
644 | * Set up the return code ... | ||
645 | * | ||
646 | * li v0, __NR_O32_sigreturn | ||
647 | * syscall | ||
648 | */ | ||
649 | err |= __put_user(0x24020000 + __NR_O32_sigreturn, frame->sf_code + 0); | ||
650 | err |= __put_user(0x0000000c , frame->sf_code + 1); | ||
651 | flush_cache_sigtramp((unsigned long) frame->sf_code); | ||
652 | 620 | ||
653 | err |= setup_sigcontext32(regs, &frame->sf_sc); | 621 | err |= setup_sigcontext32(regs, &frame->sf_sc); |
654 | err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set)); | 622 | err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set)); |
@@ -695,17 +663,7 @@ int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs, | |||
695 | if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) | 663 | if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) |
696 | goto give_sigsegv; | 664 | goto give_sigsegv; |
697 | 665 | ||
698 | /* Set up to return from userspace. If provided, use a stub already | 666 | err |= install_sigtramp(frame->rs_code, __NR_O32_rt_sigreturn); |
699 | in userspace. */ | ||
700 | /* | ||
701 | * Set up the return code ... | ||
702 | * | ||
703 | * li v0, __NR_O32_rt_sigreturn | ||
704 | * syscall | ||
705 | */ | ||
706 | err |= __put_user(0x24020000 + __NR_O32_rt_sigreturn, frame->rs_code + 0); | ||
707 | err |= __put_user(0x0000000c , frame->rs_code + 1); | ||
708 | flush_cache_sigtramp((unsigned long) frame->rs_code); | ||
709 | 667 | ||
710 | /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */ | 668 | /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */ |
711 | err |= copy_siginfo_to_user32(&frame->rs_info, info); | 669 | err |= copy_siginfo_to_user32(&frame->rs_info, info); |