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/arc | |
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/arc')
-rw-r--r-- | arch/arc/kernel/signal.c | 47 |
1 files changed, 17 insertions, 30 deletions
diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c index 7e95e1a86510..cb3142a2d40b 100644 --- a/arch/arc/kernel/signal.c +++ b/arch/arc/kernel/signal.c | |||
@@ -141,17 +141,13 @@ badframe: | |||
141 | /* | 141 | /* |
142 | * Determine which stack to use.. | 142 | * Determine which stack to use.. |
143 | */ | 143 | */ |
144 | static inline void __user *get_sigframe(struct k_sigaction *ka, | 144 | static inline void __user *get_sigframe(struct ksignal *ksig, |
145 | struct pt_regs *regs, | 145 | struct pt_regs *regs, |
146 | unsigned long framesize) | 146 | unsigned long framesize) |
147 | { | 147 | { |
148 | unsigned long sp = regs->sp; | 148 | unsigned long sp = sigsp(regs->sp, ksig); |
149 | void __user *frame; | 149 | void __user *frame; |
150 | 150 | ||
151 | /* This is the X/Open sanctioned signal stack switching */ | ||
152 | if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp)) | ||
153 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
154 | |||
155 | /* No matter what happens, 'sp' must be word | 151 | /* No matter what happens, 'sp' must be word |
156 | * aligned otherwise nasty things could happen | 152 | * aligned otherwise nasty things could happen |
157 | */ | 153 | */ |
@@ -179,14 +175,13 @@ static inline int map_sig(int sig) | |||
179 | } | 175 | } |
180 | 176 | ||
181 | static int | 177 | static int |
182 | setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info, | 178 | setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) |
183 | sigset_t *set, struct pt_regs *regs) | ||
184 | { | 179 | { |
185 | struct rt_sigframe __user *sf; | 180 | struct rt_sigframe __user *sf; |
186 | unsigned int magic = 0; | 181 | unsigned int magic = 0; |
187 | int err = 0; | 182 | int err = 0; |
188 | 183 | ||
189 | sf = get_sigframe(ka, regs, sizeof(struct rt_sigframe)); | 184 | sf = get_sigframe(ksig, regs, sizeof(struct rt_sigframe)); |
190 | if (!sf) | 185 | if (!sf) |
191 | return 1; | 186 | return 1; |
192 | 187 | ||
@@ -205,8 +200,8 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info, | |||
205 | * #2: struct siginfo | 200 | * #2: struct siginfo |
206 | * #3: struct ucontext (completely populated) | 201 | * #3: struct ucontext (completely populated) |
207 | */ | 202 | */ |
208 | if (unlikely(ka->sa.sa_flags & SA_SIGINFO)) { | 203 | if (unlikely(ksig->ka.sa.sa_flags & SA_SIGINFO)) { |
209 | err |= copy_siginfo_to_user(&sf->info, info); | 204 | err |= copy_siginfo_to_user(&sf->info, &ksig->info); |
210 | err |= __put_user(0, &sf->uc.uc_flags); | 205 | err |= __put_user(0, &sf->uc.uc_flags); |
211 | err |= __put_user(NULL, &sf->uc.uc_link); | 206 | err |= __put_user(NULL, &sf->uc.uc_link); |
212 | err |= __save_altstack(&sf->uc.uc_stack, regs->sp); | 207 | err |= __save_altstack(&sf->uc.uc_stack, regs->sp); |
@@ -227,16 +222,16 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info, | |||
227 | return err; | 222 | return err; |
228 | 223 | ||
229 | /* #1 arg to the user Signal handler */ | 224 | /* #1 arg to the user Signal handler */ |
230 | regs->r0 = map_sig(signo); | 225 | regs->r0 = map_sig(ksig->sig); |
231 | 226 | ||
232 | /* setup PC of user space signal handler */ | 227 | /* setup PC of user space signal handler */ |
233 | regs->ret = (unsigned long)ka->sa.sa_handler; | 228 | regs->ret = (unsigned long)ksig->ka.sa.sa_handler; |
234 | 229 | ||
235 | /* | 230 | /* |
236 | * handler returns using sigreturn stub provided already by userpsace | 231 | * handler returns using sigreturn stub provided already by userpsace |
237 | */ | 232 | */ |
238 | BUG_ON(!(ka->sa.sa_flags & SA_RESTORER)); | 233 | BUG_ON(!(ksig->ka.sa.sa_flags & SA_RESTORER)); |
239 | regs->blink = (unsigned long)ka->sa.sa_restorer; | 234 | regs->blink = (unsigned long)ksig->ka.sa.sa_restorer; |
240 | 235 | ||
241 | /* User Stack for signal handler will be above the frame just carved */ | 236 | /* User Stack for signal handler will be above the frame just carved */ |
242 | regs->sp = (unsigned long)sf; | 237 | regs->sp = (unsigned long)sf; |
@@ -298,38 +293,30 @@ static void arc_restart_syscall(struct k_sigaction *ka, struct pt_regs *regs) | |||
298 | * OK, we're invoking a handler | 293 | * OK, we're invoking a handler |
299 | */ | 294 | */ |
300 | static void | 295 | static void |
301 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | 296 | handle_signal(struct ksignal *ksig, struct pt_regs *regs) |
302 | struct pt_regs *regs) | ||
303 | { | 297 | { |
304 | sigset_t *oldset = sigmask_to_save(); | 298 | sigset_t *oldset = sigmask_to_save(); |
305 | int ret; | 299 | int ret; |
306 | 300 | ||
307 | /* Set up the stack frame */ | 301 | /* Set up the stack frame */ |
308 | ret = setup_rt_frame(sig, ka, info, oldset, regs); | 302 | ret = setup_rt_frame(ksig, oldset, regs); |
309 | 303 | ||
310 | if (ret) | 304 | signal_setup_done(ret, ksig, 0); |
311 | force_sigsegv(sig, current); | ||
312 | else | ||
313 | signal_delivered(sig, info, ka, regs, 0); | ||
314 | } | 305 | } |
315 | 306 | ||
316 | void do_signal(struct pt_regs *regs) | 307 | void do_signal(struct pt_regs *regs) |
317 | { | 308 | { |
318 | struct k_sigaction ka; | 309 | struct ksignal ksig; |
319 | siginfo_t info; | ||
320 | int signr; | ||
321 | int restart_scall; | 310 | int restart_scall; |
322 | 311 | ||
323 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | ||
324 | |||
325 | restart_scall = in_syscall(regs) && syscall_restartable(regs); | 312 | restart_scall = in_syscall(regs) && syscall_restartable(regs); |
326 | 313 | ||
327 | if (signr > 0) { | 314 | if (get_signal(&ksig)) { |
328 | if (restart_scall) { | 315 | if (restart_scall) { |
329 | arc_restart_syscall(&ka, regs); | 316 | arc_restart_syscall(&ksig.ka, regs); |
330 | syscall_wont_restart(regs); /* No more restarts */ | 317 | syscall_wont_restart(regs); /* No more restarts */ |
331 | } | 318 | } |
332 | handle_signal(signr, &ka, &info, regs); | 319 | handle_signal(&ksig, regs); |
333 | return; | 320 | return; |
334 | } | 321 | } |
335 | 322 | ||