diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-09 12:58:12 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-09 12:58:12 -0400 |
commit | 63b12bdb0d21aca527996fb2c547387bfd3e14b8 (patch) | |
tree | 6ab83b2a1c289f30fea18b88f04138ee69c37c6f /arch/m68k/kernel/signal.c | |
parent | ad1f5caf34390bb20fdbb4eaf71b0494e89936f0 (diff) | |
parent | 059ade650ae57cfd371af690fdba887af04aded8 (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.c | 75 |
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 | ||
837 | static inline void __user * | 837 | static inline void __user * |
838 | get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) | 838 | get_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 | ||
853 | static int setup_frame (int sig, struct k_sigaction *ka, | 845 | static 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 | |||
938 | give_sigsegv: | ||
939 | force_sigsegv(sig, current); | ||
940 | return err; | ||
941 | } | 929 | } |
942 | 930 | ||
943 | static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info, | 931 | static 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 | |||
1035 | give_sigsegv: | ||
1036 | force_sigsegv(sig, current); | ||
1037 | return err; | ||
1038 | } | 1022 | } |
1039 | 1023 | ||
1040 | static inline void | 1024 | static 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 | */ |
1076 | static void | 1060 | static void |
1077 | handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, | 1061 | handle_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 | */ |
1109 | static void do_signal(struct pt_regs *regs) | 1089 | static 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 | ||