aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arc
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/arc
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/arc')
-rw-r--r--arch/arc/kernel/signal.c47
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 */
144static inline void __user *get_sigframe(struct k_sigaction *ka, 144static 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
181static int 177static int
182setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info, 178setup_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 */
300static void 295static void
301handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, 296handle_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
316void do_signal(struct pt_regs *regs) 307void 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