aboutsummaryrefslogtreecommitdiffstats
path: root/arch/m68k/kernel/signal.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-08-09 12:58:12 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-08-09 12:58:12 -0400
commit63b12bdb0d21aca527996fb2c547387bfd3e14b8 (patch)
tree6ab83b2a1c289f30fea18b88f04138ee69c37c6f /arch/m68k/kernel/signal.c
parentad1f5caf34390bb20fdbb4eaf71b0494e89936f0 (diff)
parent059ade650ae57cfd371af690fdba887af04aded8 (diff)
Merge branch 'signal-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/misc
Pull arch signal handling cleanup from Richard Weinberger: "This patch series moves all remaining archs to the get_signal(), signal_setup_done() and sigsp() functions. Currently these archs use open coded variants of the said functions. Further, unused parameters get removed from get_signal_to_deliver(), tracehook_signal_handler() and signal_delivered(). At the end of the day we save around 500 lines of code." * 'signal-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/misc: (43 commits) powerpc: Use sigsp() openrisc: Use sigsp() mn10300: Use sigsp() mips: Use sigsp() microblaze: Use sigsp() metag: Use sigsp() m68k: Use sigsp() m32r: Use sigsp() hexagon: Use sigsp() frv: Use sigsp() cris: Use sigsp() c6x: Use sigsp() blackfin: Use sigsp() avr32: Use sigsp() arm64: Use sigsp() arc: Use sigsp() sas_ss_flags: Remove nested ternary if Rip out get_signal_to_deliver() Clean up signal_delivered() tracehook_signal_handler: Remove sig, info, ka and regs ...
Diffstat (limited to 'arch/m68k/kernel/signal.c')
-rw-r--r--arch/m68k/kernel/signal.c75
1 files changed, 26 insertions, 49 deletions
diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c
index 57fd286e4b0b..967a8b7e1527 100644
--- a/arch/m68k/kernel/signal.c
+++ b/arch/m68k/kernel/signal.c
@@ -835,38 +835,30 @@ static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *
835} 835}
836 836
837static inline void __user * 837static inline void __user *
838get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) 838get_sigframe(struct ksignal *ksig, size_t frame_size)
839{ 839{
840 unsigned long usp; 840 unsigned long usp = sigsp(rdusp(), ksig);
841
842 /* Default to using normal stack. */
843 usp = rdusp();
844 841
845 /* This is the X/Open sanctioned signal stack switching. */
846 if (ka->sa.sa_flags & SA_ONSTACK) {
847 if (!sas_ss_flags(usp))
848 usp = current->sas_ss_sp + current->sas_ss_size;
849 }
850 return (void __user *)((usp - frame_size) & -8UL); 842 return (void __user *)((usp - frame_size) & -8UL);
851} 843}
852 844
853static int setup_frame (int sig, struct k_sigaction *ka, 845static int setup_frame(struct ksignal *ksig, sigset_t *set,
854 sigset_t *set, struct pt_regs *regs) 846 struct pt_regs *regs)
855{ 847{
856 struct sigframe __user *frame; 848 struct sigframe __user *frame;
857 int fsize = frame_extra_sizes(regs->format); 849 int fsize = frame_extra_sizes(regs->format);
858 struct sigcontext context; 850 struct sigcontext context;
859 int err = 0; 851 int err = 0, sig = ksig->sig;
860 852
861 if (fsize < 0) { 853 if (fsize < 0) {
862#ifdef DEBUG 854#ifdef DEBUG
863 printk ("setup_frame: Unknown frame format %#x\n", 855 printk ("setup_frame: Unknown frame format %#x\n",
864 regs->format); 856 regs->format);
865#endif 857#endif
866 goto give_sigsegv; 858 return -EFAULT;
867 } 859 }
868 860
869 frame = get_sigframe(ka, regs, sizeof(*frame) + fsize); 861 frame = get_sigframe(ksig, sizeof(*frame) + fsize);
870 862
871 if (fsize) 863 if (fsize)
872 err |= copy_to_user (frame + 1, regs + 1, fsize); 864 err |= copy_to_user (frame + 1, regs + 1, fsize);
@@ -899,7 +891,7 @@ static int setup_frame (int sig, struct k_sigaction *ka,
899#endif 891#endif
900 892
901 if (err) 893 if (err)
902 goto give_sigsegv; 894 return -EFAULT;
903 895
904 push_cache ((unsigned long) &frame->retcode); 896 push_cache ((unsigned long) &frame->retcode);
905 897
@@ -908,7 +900,7 @@ static int setup_frame (int sig, struct k_sigaction *ka,
908 * to destroy is successfully copied to sigframe. 900 * to destroy is successfully copied to sigframe.
909 */ 901 */
910 wrusp ((unsigned long) frame); 902 wrusp ((unsigned long) frame);
911 regs->pc = (unsigned long) ka->sa.sa_handler; 903 regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
912 adjustformat(regs); 904 adjustformat(regs);
913 905
914 /* 906 /*
@@ -934,28 +926,24 @@ static int setup_frame (int sig, struct k_sigaction *ka,
934 tregs->sr = regs->sr; 926 tregs->sr = regs->sr;
935 } 927 }
936 return 0; 928 return 0;
937
938give_sigsegv:
939 force_sigsegv(sig, current);
940 return err;
941} 929}
942 930
943static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info, 931static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
944 sigset_t *set, struct pt_regs *regs) 932 struct pt_regs *regs)
945{ 933{
946 struct rt_sigframe __user *frame; 934 struct rt_sigframe __user *frame;
947 int fsize = frame_extra_sizes(regs->format); 935 int fsize = frame_extra_sizes(regs->format);
948 int err = 0; 936 int err = 0, sig = ksig->sig;
949 937
950 if (fsize < 0) { 938 if (fsize < 0) {
951#ifdef DEBUG 939#ifdef DEBUG
952 printk ("setup_frame: Unknown frame format %#x\n", 940 printk ("setup_frame: Unknown frame format %#x\n",
953 regs->format); 941 regs->format);
954#endif 942#endif
955 goto give_sigsegv; 943 return -EFAULT;
956 } 944 }
957 945
958 frame = get_sigframe(ka, regs, sizeof(*frame)); 946 frame = get_sigframe(ksig, sizeof(*frame));
959 947
960 if (fsize) 948 if (fsize)
961 err |= copy_to_user (&frame->uc.uc_extra, regs + 1, fsize); 949 err |= copy_to_user (&frame->uc.uc_extra, regs + 1, fsize);
@@ -968,7 +956,7 @@ static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
968 &frame->sig); 956 &frame->sig);
969 err |= __put_user(&frame->info, &frame->pinfo); 957 err |= __put_user(&frame->info, &frame->pinfo);
970 err |= __put_user(&frame->uc, &frame->puc); 958 err |= __put_user(&frame->uc, &frame->puc);
971 err |= copy_siginfo_to_user(&frame->info, info); 959 err |= copy_siginfo_to_user(&frame->info, &ksig->info);
972 960
973 /* Create the ucontext. */ 961 /* Create the ucontext. */
974 err |= __put_user(0, &frame->uc.uc_flags); 962 err |= __put_user(0, &frame->uc.uc_flags);
@@ -996,7 +984,7 @@ static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
996#endif /* CONFIG_MMU */ 984#endif /* CONFIG_MMU */
997 985
998 if (err) 986 if (err)
999 goto give_sigsegv; 987 return -EFAULT;
1000 988
1001 push_cache ((unsigned long) &frame->retcode); 989 push_cache ((unsigned long) &frame->retcode);
1002 990
@@ -1005,7 +993,7 @@ static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
1005 * to destroy is successfully copied to sigframe. 993 * to destroy is successfully copied to sigframe.
1006 */ 994 */
1007 wrusp ((unsigned long) frame); 995 wrusp ((unsigned long) frame);
1008 regs->pc = (unsigned long) ka->sa.sa_handler; 996 regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
1009 adjustformat(regs); 997 adjustformat(regs);
1010 998
1011 /* 999 /*
@@ -1031,10 +1019,6 @@ static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
1031 tregs->sr = regs->sr; 1019 tregs->sr = regs->sr;
1032 } 1020 }
1033 return 0; 1021 return 0;
1034
1035give_sigsegv:
1036 force_sigsegv(sig, current);
1037 return err;
1038} 1022}
1039 1023
1040static inline void 1024static inline void
@@ -1074,26 +1058,22 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
1074 * OK, we're invoking a handler 1058 * OK, we're invoking a handler
1075 */ 1059 */
1076static void 1060static void
1077handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, 1061handle_signal(struct ksignal *ksig, struct pt_regs *regs)
1078 struct pt_regs *regs)
1079{ 1062{
1080 sigset_t *oldset = sigmask_to_save(); 1063 sigset_t *oldset = sigmask_to_save();
1081 int err; 1064 int err;
1082 /* are we from a system call? */ 1065 /* are we from a system call? */
1083 if (regs->orig_d0 >= 0) 1066 if (regs->orig_d0 >= 0)
1084 /* If so, check system call restarting.. */ 1067 /* If so, check system call restarting.. */
1085 handle_restart(regs, ka, 1); 1068 handle_restart(regs, &ksig->ka, 1);
1086 1069
1087 /* set up the stack frame */ 1070 /* set up the stack frame */
1088 if (ka->sa.sa_flags & SA_SIGINFO) 1071 if (ksig->ka.sa.sa_flags & SA_SIGINFO)
1089 err = setup_rt_frame(sig, ka, info, oldset, regs); 1072 err = setup_rt_frame(ksig, oldset, regs);
1090 else 1073 else
1091 err = setup_frame(sig, ka, oldset, regs); 1074 err = setup_frame(ksig, oldset, regs);
1092
1093 if (err)
1094 return;
1095 1075
1096 signal_delivered(sig, info, ka, regs, 0); 1076 signal_setup_done(err, ksig, 0);
1097 1077
1098 if (test_thread_flag(TIF_DELAYED_TRACE)) { 1078 if (test_thread_flag(TIF_DELAYED_TRACE)) {
1099 regs->sr &= ~0x8000; 1079 regs->sr &= ~0x8000;
@@ -1108,16 +1088,13 @@ handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
1108 */ 1088 */
1109static void do_signal(struct pt_regs *regs) 1089static void do_signal(struct pt_regs *regs)
1110{ 1090{
1111 siginfo_t info; 1091 struct ksignal ksig;
1112 struct k_sigaction ka;
1113 int signr;
1114 1092
1115 current->thread.esp0 = (unsigned long) regs; 1093 current->thread.esp0 = (unsigned long) regs;
1116 1094
1117 signr = get_signal_to_deliver(&info, &ka, regs, NULL); 1095 if (get_signal(&ksig)) {
1118 if (signr > 0) {
1119 /* Whee! Actually deliver the signal. */ 1096 /* Whee! Actually deliver the signal. */
1120 handle_signal(signr, &ka, &info, regs); 1097 handle_signal(&ksig, regs);
1121 return; 1098 return;
1122 } 1099 }
1123 1100