aboutsummaryrefslogtreecommitdiffstats
path: root/arch/unicore32/kernel
diff options
context:
space:
mode:
authorRichard Weinberger <richard@nod.at>2013-10-07 09:05:57 -0400
committerRichard Weinberger <richard@sigma-star.at>2014-08-06 07:03:42 -0400
commit649671c90eaf3cbbd0cd03460b6a92c0b674a32e (patch)
tree6d7254350309744f9963132a4e7b52977535e5e6 /arch/unicore32/kernel
parent307627eebbb0bc41b21e74d78b932362a6c1b38d (diff)
unicore32: Use get_signal() signal_setup_done()
Use the more generic functions get_signal() signal_setup_done() for signal delivery. Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'arch/unicore32/kernel')
-rw-r--r--arch/unicore32/kernel/signal.c48
1 files changed, 20 insertions, 28 deletions
diff --git a/arch/unicore32/kernel/signal.c b/arch/unicore32/kernel/signal.c
index 6905f0ebdc77..780d77388dec 100644
--- a/arch/unicore32/kernel/signal.c
+++ b/arch/unicore32/kernel/signal.c
@@ -238,10 +238,10 @@ static int setup_return(struct pt_regs *regs, struct k_sigaction *ka,
238 return 0; 238 return 0;
239} 239}
240 240
241static int setup_frame(int usig, struct k_sigaction *ka, 241static int setup_frame(struct ksignal *ksig, sigset_t *set,
242 sigset_t *set, struct pt_regs *regs) 242 struct pt_regs *regs)
243{ 243{
244 struct sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame)); 244 struct sigframe __user *frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
245 int err = 0; 245 int err = 0;
246 246
247 if (!frame) 247 if (!frame)
@@ -254,29 +254,29 @@ static int setup_frame(int usig, struct k_sigaction *ka,
254 254
255 err |= setup_sigframe(frame, regs, set); 255 err |= setup_sigframe(frame, regs, set);
256 if (err == 0) 256 if (err == 0)
257 err |= setup_return(regs, ka, frame->retcode, frame, usig); 257 err |= setup_return(regs, &ksig->ka, frame->retcode, frame, usig);
258 258
259 return err; 259 return err;
260} 260}
261 261
262static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, 262static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
263 sigset_t *set, struct pt_regs *regs) 263 struct pt_regs *regs)
264{ 264{
265 struct rt_sigframe __user *frame = 265 struct rt_sigframe __user *frame =
266 get_sigframe(ka, regs, sizeof(*frame)); 266 get_sigframe(&ksig->ka, regs, sizeof(*frame));
267 int err = 0; 267 int err = 0;
268 268
269 if (!frame) 269 if (!frame)
270 return 1; 270 return 1;
271 271
272 err |= copy_siginfo_to_user(&frame->info, info); 272 err |= copy_siginfo_to_user(&frame->info, &ksig->info);
273 273
274 err |= __put_user(0, &frame->sig.uc.uc_flags); 274 err |= __put_user(0, &frame->sig.uc.uc_flags);
275 err |= __put_user(NULL, &frame->sig.uc.uc_link); 275 err |= __put_user(NULL, &frame->sig.uc.uc_link);
276 err |= __save_altstack(&frame->sig.uc.uc_stack, regs->UCreg_sp); 276 err |= __save_altstack(&frame->sig.uc.uc_stack, regs->UCreg_sp);
277 err |= setup_sigframe(&frame->sig, regs, set); 277 err |= setup_sigframe(&frame->sig, regs, set);
278 if (err == 0) 278 if (err == 0)
279 err |= setup_return(regs, ka, frame->sig.retcode, frame, usig); 279 err |= setup_return(regs, &ksig->ka, frame->sig.retcode, frame, usig);
280 280
281 if (err == 0) { 281 if (err == 0) {
282 /* 282 /*
@@ -299,13 +299,13 @@ static inline void setup_syscall_restart(struct pt_regs *regs)
299/* 299/*
300 * OK, we're invoking a handler 300 * OK, we're invoking a handler
301 */ 301 */
302static void handle_signal(unsigned long sig, struct k_sigaction *ka, 302static void handle_signal(struct ksignal *ksig, struct pt_regs *regs,
303 siginfo_t *info, struct pt_regs *regs, int syscall) 303 int syscall)
304{ 304{
305 struct thread_info *thread = current_thread_info(); 305 struct thread_info *thread = current_thread_info();
306 struct task_struct *tsk = current; 306 struct task_struct *tsk = current;
307 sigset_t *oldset = sigmask_to_save(); 307 sigset_t *oldset = sigmask_to_save();
308 int usig = sig; 308 int usig = ksig->sig;
309 int ret; 309 int ret;
310 310
311 /* 311 /*
@@ -318,7 +318,7 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka,
318 regs->UCreg_00 = -EINTR; 318 regs->UCreg_00 = -EINTR;
319 break; 319 break;
320 case -ERESTARTSYS: 320 case -ERESTARTSYS:
321 if (!(ka->sa.sa_flags & SA_RESTART)) { 321 if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
322 regs->UCreg_00 = -EINTR; 322 regs->UCreg_00 = -EINTR;
323 break; 323 break;
324 } 324 }
@@ -338,22 +338,17 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka,
338 /* 338 /*
339 * Set up the stack frame 339 * Set up the stack frame
340 */ 340 */
341 if (ka->sa.sa_flags & SA_SIGINFO) 341 if (ksig->ka.sa.sa_flags & SA_SIGINFO)
342 ret = setup_rt_frame(usig, ka, info, oldset, regs); 342 ret = setup_rt_frame(ksig, oldset, regs);
343 else 343 else
344 ret = setup_frame(usig, ka, oldset, regs); 344 ret = setup_frame(ksig, oldset, regs);
345 345
346 /* 346 /*
347 * Check that the resulting registers are actually sane. 347 * Check that the resulting registers are actually sane.
348 */ 348 */
349 ret |= !valid_user_regs(regs); 349 ret |= !valid_user_regs(regs);
350 350
351 if (ret != 0) { 351 signal_setup_done(ret, ksig, 0);
352 force_sigsegv(sig, tsk);
353 return;
354 }
355
356 signal_delivered(sig, info, ka, regs, 0);
357} 352}
358 353
359/* 354/*
@@ -367,9 +362,7 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka,
367 */ 362 */
368static void do_signal(struct pt_regs *regs, int syscall) 363static void do_signal(struct pt_regs *regs, int syscall)
369{ 364{
370 struct k_sigaction ka; 365 struct ksignal ksig;
371 siginfo_t info;
372 int signr;
373 366
374 /* 367 /*
375 * We want the common case to go fast, which 368 * We want the common case to go fast, which
@@ -380,9 +373,8 @@ static void do_signal(struct pt_regs *regs, int syscall)
380 if (!user_mode(regs)) 373 if (!user_mode(regs))
381 return; 374 return;
382 375
383 signr = get_signal_to_deliver(&info, &ka, regs, NULL); 376 if (get_signsl(&ksig)) {
384 if (signr > 0) { 377 handle_signal(&ksig, regs, syscall);
385 handle_signal(signr, &ka, &info, regs, syscall);
386 return; 378 return;
387 } 379 }
388 380