Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc: Use get_signal() signal_setup_done()

Use the more generic functions get_signal() signal_setup_done()
for signal delivery.
This inverts also the return codes of setup_*frame() to follow the
kernel convention.

Signed-off-by: Richard Weinberger <richard@nod.at>

authored by

Richard Weinberger and committed by
Richard Weinberger
129b69df e4dc894b

+45 -64
+11 -20
arch/powerpc/kernel/signal.c
··· 105 105 } 106 106 } 107 107 108 - static int do_signal(struct pt_regs *regs) 108 + static void do_signal(struct pt_regs *regs) 109 109 { 110 110 sigset_t *oldset = sigmask_to_save(); 111 - siginfo_t info; 112 - int signr; 113 - struct k_sigaction ka; 111 + struct ksignal ksig; 114 112 int ret; 115 113 int is32 = is_32bit_task(); 116 114 117 - signr = get_signal_to_deliver(&info, &ka, regs, NULL); 115 + get_signal(&ksig); 118 116 119 117 /* Is there any syscall restart business here ? */ 120 - check_syscall_restart(regs, &ka, signr > 0); 118 + check_syscall_restart(regs, &ksig.ka, ksig.sig > 0); 121 119 122 - if (signr <= 0) { 120 + if (ksig.sig <= 0) { 123 121 /* No signal to deliver -- put the saved sigmask back */ 124 122 restore_saved_sigmask(); 125 123 regs->trap = 0; 126 - return 0; /* no signals delivered */ 124 + return; /* no signals delivered */ 127 125 } 128 126 129 127 #ifndef CONFIG_PPC_ADV_DEBUG_REGS ··· 138 140 thread_change_pc(current, regs); 139 141 140 142 if (is32) { 141 - if (ka.sa.sa_flags & SA_SIGINFO) 142 - ret = handle_rt_signal32(signr, &ka, &info, oldset, 143 - regs); 143 + if (ksig.ka.sa.sa_flags & SA_SIGINFO) 144 + ret = handle_rt_signal32(&ksig, oldset, regs); 144 145 else 145 - ret = handle_signal32(signr, &ka, &info, oldset, 146 - regs); 146 + ret = handle_signal32(&ksig, oldset, regs); 147 147 } else { 148 - ret = handle_rt_signal64(signr, &ka, &info, oldset, regs); 148 + ret = handle_rt_signal64(&ksig, oldset, regs); 149 149 } 150 150 151 151 regs->trap = 0; 152 - if (ret) { 153 - signal_delivered(signr, &info, &ka, regs, 154 - test_thread_flag(TIF_SINGLESTEP)); 155 - } 156 - 157 - return ret; 152 + signal_setup_done(ret, &ksig, test_thread_flag(TIF_SINGLESTEP)); 158 153 } 159 154 160 155 void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
+5 -9
arch/powerpc/kernel/signal.h
··· 12 12 13 13 extern void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags); 14 14 15 - extern void __user * get_sigframe(struct k_sigaction *ka, unsigned long sp, 15 + extern void __user *get_sigframe(struct ksignal *ksig, unsigned long sp, 16 16 size_t frame_size, int is_32); 17 17 18 - extern int handle_signal32(unsigned long sig, struct k_sigaction *ka, 19 - siginfo_t *info, sigset_t *oldset, 18 + extern int handle_signal32(struct ksignal *ksig, sigset_t *oldset, 20 19 struct pt_regs *regs); 21 20 22 - extern int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, 23 - siginfo_t *info, sigset_t *oldset, 21 + extern int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, 24 22 struct pt_regs *regs); 25 23 26 24 extern unsigned long copy_fpr_to_user(void __user *to, ··· 42 44 43 45 #ifdef CONFIG_PPC64 44 46 45 - extern int handle_rt_signal64(int signr, struct k_sigaction *ka, 46 - siginfo_t *info, sigset_t *set, 47 + extern int handle_rt_signal64(struct ksignal *ksig, sigset_t *set, 47 48 struct pt_regs *regs); 48 49 49 50 #else /* CONFIG_PPC64 */ 50 51 51 - static inline int handle_rt_signal64(int signr, struct k_sigaction *ka, 52 - siginfo_t *info, sigset_t *set, 52 + static inline int handle_rt_signal64(struct ksignal *ksig, sigset_t *set, 53 53 struct pt_regs *regs) 54 54 { 55 55 return -EFAULT;
+16 -20
arch/powerpc/kernel/signal_32.c
··· 981 981 * Set up a signal frame for a "real-time" signal handler 982 982 * (one which gets siginfo). 983 983 */ 984 - int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, 985 - siginfo_t *info, sigset_t *oldset, 986 - struct pt_regs *regs) 984 + int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, 985 + struct pt_regs *regs) 987 986 { 988 987 struct rt_sigframe __user *rt_sf; 989 988 struct mcontext __user *frame; ··· 994 995 995 996 /* Set up Signal Frame */ 996 997 /* Put a Real Time Context onto stack */ 997 - rt_sf = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*rt_sf), 1); 998 + rt_sf = get_sigframe(&ksig->ka, get_tm_stackpointer(regs), sizeof(*rt_sf), 1); 998 999 addr = rt_sf; 999 1000 if (unlikely(rt_sf == NULL)) 1000 1001 goto badframe; 1001 1002 1002 1003 /* Put the siginfo & fill in most of the ucontext */ 1003 - if (copy_siginfo_to_user(&rt_sf->info, info) 1004 + if (copy_siginfo_to_user(&rt_sf->info, &ksig->info) 1004 1005 || __put_user(0, &rt_sf->uc.uc_flags) 1005 1006 || __save_altstack(&rt_sf->uc.uc_stack, regs->gpr[1]) 1006 1007 || __put_user(to_user_ptr(&rt_sf->uc.uc_mcontext), ··· 1050 1051 1051 1052 /* Fill registers for signal handler */ 1052 1053 regs->gpr[1] = newsp; 1053 - regs->gpr[3] = sig; 1054 + regs->gpr[3] = ksig->sig; 1054 1055 regs->gpr[4] = (unsigned long) &rt_sf->info; 1055 1056 regs->gpr[5] = (unsigned long) &rt_sf->uc; 1056 1057 regs->gpr[6] = (unsigned long) rt_sf; 1057 - regs->nip = (unsigned long) ka->sa.sa_handler; 1058 + regs->nip = (unsigned long) ksig->ka.sa.sa_handler; 1058 1059 /* enter the signal handler in native-endian mode */ 1059 1060 regs->msr &= ~MSR_LE; 1060 1061 regs->msr |= (MSR_KERNEL & MSR_LE); 1061 - return 1; 1062 + return 0; 1062 1063 1063 1064 badframe: 1064 1065 if (show_unhandled_signals) ··· 1068 1069 current->comm, current->pid, 1069 1070 addr, regs->nip, regs->link); 1070 1071 1071 - force_sigsegv(sig, current); 1072 - return 0; 1072 + return 1; 1073 1073 } 1074 1074 1075 1075 static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int sig) ··· 1407 1409 /* 1408 1410 * OK, we're invoking a handler 1409 1411 */ 1410 - int handle_signal32(unsigned long sig, struct k_sigaction *ka, 1411 - siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) 1412 + int handle_signal32(struct ksignal *ksig, sigset_t *oldset, struct pt_regs *regs) 1412 1413 { 1413 1414 struct sigcontext __user *sc; 1414 1415 struct sigframe __user *frame; ··· 1417 1420 unsigned long tramp; 1418 1421 1419 1422 /* Set up Signal Frame */ 1420 - frame = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*frame), 1); 1423 + frame = get_sigframe(&ksig->ka, get_tm_stackpointer(regs), sizeof(*frame), 1); 1421 1424 if (unlikely(frame == NULL)) 1422 1425 goto badframe; 1423 1426 sc = (struct sigcontext __user *) &frame->sctx; ··· 1425 1428 #if _NSIG != 64 1426 1429 #error "Please adjust handle_signal()" 1427 1430 #endif 1428 - if (__put_user(to_user_ptr(ka->sa.sa_handler), &sc->handler) 1431 + if (__put_user(to_user_ptr(ksig->ka.sa.sa_handler), &sc->handler) 1429 1432 || __put_user(oldset->sig[0], &sc->oldmask) 1430 1433 #ifdef CONFIG_PPC64 1431 1434 || __put_user((oldset->sig[0] >> 32), &sc->_unused[3]) ··· 1433 1436 || __put_user(oldset->sig[1], &sc->_unused[3]) 1434 1437 #endif 1435 1438 || __put_user(to_user_ptr(&frame->mctx), &sc->regs) 1436 - || __put_user(sig, &sc->signal)) 1439 + || __put_user(ksig->sig, &sc->signal)) 1437 1440 goto badframe; 1438 1441 1439 1442 if (vdso32_sigtramp && current->mm->context.vdso_base) { ··· 1468 1471 goto badframe; 1469 1472 1470 1473 regs->gpr[1] = newsp; 1471 - regs->gpr[3] = sig; 1474 + regs->gpr[3] = ksig->sig; 1472 1475 regs->gpr[4] = (unsigned long) sc; 1473 - regs->nip = (unsigned long) ka->sa.sa_handler; 1476 + regs->nip = (unsigned long) (unsigned long)ksig->ka.sa.sa_handler; 1474 1477 /* enter the signal handler in big-endian mode */ 1475 1478 regs->msr &= ~MSR_LE; 1476 - return 1; 1479 + return 0; 1477 1480 1478 1481 badframe: 1479 1482 if (show_unhandled_signals) ··· 1483 1486 current->comm, current->pid, 1484 1487 frame, regs->nip, regs->link); 1485 1488 1486 - force_sigsegv(sig, current); 1487 - return 0; 1489 + return 1; 1488 1490 } 1489 1491 1490 1492 /*
+13 -15
arch/powerpc/kernel/signal_64.c
··· 708 708 return 0; 709 709 } 710 710 711 - int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, 712 - sigset_t *set, struct pt_regs *regs) 711 + int handle_rt_signal64(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) 713 712 { 714 713 struct rt_sigframe __user *frame; 715 714 unsigned long newsp = 0; 716 715 long err = 0; 717 716 718 - frame = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*frame), 0); 717 + frame = get_sigframe(&ksig->ka, get_tm_stackpointer(regs), sizeof(*frame), 0); 719 718 if (unlikely(frame == NULL)) 720 719 goto badframe; 721 720 722 721 err |= __put_user(&frame->info, &frame->pinfo); 723 722 err |= __put_user(&frame->uc, &frame->puc); 724 - err |= copy_siginfo_to_user(&frame->info, info); 723 + err |= copy_siginfo_to_user(&frame->info, &ksig->info); 725 724 if (err) 726 725 goto badframe; 727 726 ··· 735 736 err |= __put_user(&frame->uc_transact, &frame->uc.uc_link); 736 737 err |= setup_tm_sigcontexts(&frame->uc.uc_mcontext, 737 738 &frame->uc_transact.uc_mcontext, 738 - regs, signr, 739 + regs, ksig->sig, 739 740 NULL, 740 - (unsigned long)ka->sa.sa_handler); 741 + (unsigned long)ksig->ka.sa.sa_handler); 741 742 } else 742 743 #endif 743 744 { 744 745 err |= __put_user(0, &frame->uc.uc_link); 745 - err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, signr, 746 - NULL, (unsigned long)ka->sa.sa_handler, 746 + err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, ksig->sig, 747 + NULL, (unsigned long)ksig->ka.sa.sa_handler, 747 748 1); 748 749 } 749 750 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); ··· 769 770 770 771 /* Set up "regs" so we "return" to the signal handler. */ 771 772 if (is_elf2_task()) { 772 - regs->nip = (unsigned long) ka->sa.sa_handler; 773 + regs->nip = (unsigned long) ksig->ka.sa.sa_handler; 773 774 regs->gpr[12] = regs->nip; 774 775 } else { 775 776 /* Handler is *really* a pointer to the function descriptor for ··· 778 779 * entry is the TOC value we need to use. 779 780 */ 780 781 func_descr_t __user *funct_desc_ptr = 781 - (func_descr_t __user *) ka->sa.sa_handler; 782 + (func_descr_t __user *) ksig->ka.sa.sa_handler; 782 783 783 784 err |= get_user(regs->nip, &funct_desc_ptr->entry); 784 785 err |= get_user(regs->gpr[2], &funct_desc_ptr->toc); ··· 788 789 regs->msr &= ~MSR_LE; 789 790 regs->msr |= (MSR_KERNEL & MSR_LE); 790 791 regs->gpr[1] = newsp; 791 - regs->gpr[3] = signr; 792 + regs->gpr[3] = ksig->sig; 792 793 regs->result = 0; 793 - if (ka->sa.sa_flags & SA_SIGINFO) { 794 + if (ksig->ka.sa.sa_flags & SA_SIGINFO) { 794 795 err |= get_user(regs->gpr[4], (unsigned long __user *)&frame->pinfo); 795 796 err |= get_user(regs->gpr[5], (unsigned long __user *)&frame->puc); 796 797 regs->gpr[6] = (unsigned long) frame; ··· 800 801 if (err) 801 802 goto badframe; 802 803 803 - return 1; 804 + return 0; 804 805 805 806 badframe: 806 807 if (show_unhandled_signals) ··· 808 809 current->comm, current->pid, "setup_rt_frame", 809 810 (long)frame, regs->nip, regs->link); 810 811 811 - force_sigsegv(signr, current); 812 - return 0; 812 + return 1; 813 813 }