diff options
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r-- | arch/arm/kernel/signal.c | 62 |
1 files changed, 29 insertions, 33 deletions
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 1e2b54d32172..962851144099 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
@@ -325,41 +325,42 @@ badframe: | |||
325 | } | 325 | } |
326 | 326 | ||
327 | static int | 327 | static int |
328 | setup_sigcontext(struct sigcontext __user *sc, struct aux_sigframe __user *aux, | 328 | setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set) |
329 | struct pt_regs *regs, unsigned long mask) | ||
330 | { | 329 | { |
331 | int err = 0; | 330 | int err = 0; |
332 | 331 | ||
333 | __put_user_error(regs->ARM_r0, &sc->arm_r0, err); | 332 | __put_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err); |
334 | __put_user_error(regs->ARM_r1, &sc->arm_r1, err); | 333 | __put_user_error(regs->ARM_r1, &sf->uc.uc_mcontext.arm_r1, err); |
335 | __put_user_error(regs->ARM_r2, &sc->arm_r2, err); | 334 | __put_user_error(regs->ARM_r2, &sf->uc.uc_mcontext.arm_r2, err); |
336 | __put_user_error(regs->ARM_r3, &sc->arm_r3, err); | 335 | __put_user_error(regs->ARM_r3, &sf->uc.uc_mcontext.arm_r3, err); |
337 | __put_user_error(regs->ARM_r4, &sc->arm_r4, err); | 336 | __put_user_error(regs->ARM_r4, &sf->uc.uc_mcontext.arm_r4, err); |
338 | __put_user_error(regs->ARM_r5, &sc->arm_r5, err); | 337 | __put_user_error(regs->ARM_r5, &sf->uc.uc_mcontext.arm_r5, err); |
339 | __put_user_error(regs->ARM_r6, &sc->arm_r6, err); | 338 | __put_user_error(regs->ARM_r6, &sf->uc.uc_mcontext.arm_r6, err); |
340 | __put_user_error(regs->ARM_r7, &sc->arm_r7, err); | 339 | __put_user_error(regs->ARM_r7, &sf->uc.uc_mcontext.arm_r7, err); |
341 | __put_user_error(regs->ARM_r8, &sc->arm_r8, err); | 340 | __put_user_error(regs->ARM_r8, &sf->uc.uc_mcontext.arm_r8, err); |
342 | __put_user_error(regs->ARM_r9, &sc->arm_r9, err); | 341 | __put_user_error(regs->ARM_r9, &sf->uc.uc_mcontext.arm_r9, err); |
343 | __put_user_error(regs->ARM_r10, &sc->arm_r10, err); | 342 | __put_user_error(regs->ARM_r10, &sf->uc.uc_mcontext.arm_r10, err); |
344 | __put_user_error(regs->ARM_fp, &sc->arm_fp, err); | 343 | __put_user_error(regs->ARM_fp, &sf->uc.uc_mcontext.arm_fp, err); |
345 | __put_user_error(regs->ARM_ip, &sc->arm_ip, err); | 344 | __put_user_error(regs->ARM_ip, &sf->uc.uc_mcontext.arm_ip, err); |
346 | __put_user_error(regs->ARM_sp, &sc->arm_sp, err); | 345 | __put_user_error(regs->ARM_sp, &sf->uc.uc_mcontext.arm_sp, err); |
347 | __put_user_error(regs->ARM_lr, &sc->arm_lr, err); | 346 | __put_user_error(regs->ARM_lr, &sf->uc.uc_mcontext.arm_lr, err); |
348 | __put_user_error(regs->ARM_pc, &sc->arm_pc, err); | 347 | __put_user_error(regs->ARM_pc, &sf->uc.uc_mcontext.arm_pc, err); |
349 | __put_user_error(regs->ARM_cpsr, &sc->arm_cpsr, err); | 348 | __put_user_error(regs->ARM_cpsr, &sf->uc.uc_mcontext.arm_cpsr, err); |
350 | 349 | ||
351 | __put_user_error(current->thread.trap_no, &sc->trap_no, err); | 350 | __put_user_error(current->thread.trap_no, &sf->uc.uc_mcontext.trap_no, err); |
352 | __put_user_error(current->thread.error_code, &sc->error_code, err); | 351 | __put_user_error(current->thread.error_code, &sf->uc.uc_mcontext.error_code, err); |
353 | __put_user_error(current->thread.address, &sc->fault_address, err); | 352 | __put_user_error(current->thread.address, &sf->uc.uc_mcontext.fault_address, err); |
354 | __put_user_error(mask, &sc->oldmask, err); | 353 | __put_user_error(set->sig[0], &sf->uc.uc_mcontext.oldmask, err); |
354 | |||
355 | err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); | ||
355 | 356 | ||
356 | #ifdef CONFIG_IWMMXT | 357 | #ifdef CONFIG_IWMMXT |
357 | if (err == 0 && test_thread_flag(TIF_USING_IWMMXT)) | 358 | if (err == 0 && test_thread_flag(TIF_USING_IWMMXT)) |
358 | err |= preserve_iwmmxt_context(&aux->iwmmxt); | 359 | err |= preserve_iwmmxt_context(&sf->aux.iwmmxt); |
359 | #endif | 360 | #endif |
360 | #ifdef CONFIG_VFP | 361 | #ifdef CONFIG_VFP |
361 | // if (err == 0) | 362 | // if (err == 0) |
362 | // err |= vfp_save_state(&aux->vfp); | 363 | // err |= vfp_save_state(&sf->aux.vfp); |
363 | #endif | 364 | #endif |
364 | 365 | ||
365 | return err; | 366 | return err; |
@@ -469,9 +470,7 @@ setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *reg | |||
469 | if (!frame) | 470 | if (!frame) |
470 | return 1; | 471 | return 1; |
471 | 472 | ||
472 | err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->aux, regs, set->sig[0]); | 473 | err |= setup_sigframe(frame, regs, set); |
473 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | ||
474 | |||
475 | if (err == 0) | 474 | if (err == 0) |
476 | err = setup_return(regs, ka, frame->retcode, frame, usig); | 475 | err = setup_return(regs, ka, frame->retcode, frame, usig); |
477 | 476 | ||
@@ -500,10 +499,7 @@ setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, | |||
500 | stack.ss_size = current->sas_ss_size; | 499 | stack.ss_size = current->sas_ss_size; |
501 | err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack)); | 500 | err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack)); |
502 | 501 | ||
503 | err |= setup_sigcontext(&frame->sig.uc.uc_mcontext, &frame->sig.aux, | 502 | err |= setup_sigframe(&frame->sig, regs, set); |
504 | regs, set->sig[0]); | ||
505 | err |= __copy_to_user(&frame->sig.uc.uc_sigmask, set, sizeof(*set)); | ||
506 | |||
507 | if (err == 0) | 503 | if (err == 0) |
508 | err = setup_return(regs, ka, frame->sig.retcode, frame, usig); | 504 | err = setup_return(regs, ka, frame->sig.retcode, frame, usig); |
509 | 505 | ||