aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/signal.c
diff options
context:
space:
mode:
authorRichard Weinberger <richard@nod.at>2014-03-02 08:46:11 -0500
committerRichard Weinberger <richard@sigma-star.at>2014-08-06 07:03:09 -0400
commit129b69df9c9074750245fca8aa92df5cc1a86ef4 (patch)
tree10c9f8b350d6946a1a38dfade27f42930e1af358 /arch/powerpc/kernel/signal.c
parente4dc894b61776733629b24507031dd46f5ba5efc (diff)
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>
Diffstat (limited to 'arch/powerpc/kernel/signal.c')
-rw-r--r--arch/powerpc/kernel/signal.c31
1 files changed, 11 insertions, 20 deletions
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c
index 1c794cef2883..aa9b048c4766 100644
--- a/arch/powerpc/kernel/signal.c
+++ b/arch/powerpc/kernel/signal.c
@@ -105,25 +105,23 @@ static void check_syscall_restart(struct pt_regs *regs, struct k_sigaction *ka,
105 } 105 }
106} 106}
107 107
108static int do_signal(struct pt_regs *regs) 108static void do_signal(struct pt_regs *regs)
109{ 109{
110 sigset_t *oldset = sigmask_to_save(); 110 sigset_t *oldset = sigmask_to_save();
111 siginfo_t info; 111 struct ksignal ksig;
112 int signr;
113 struct k_sigaction ka;
114 int ret; 112 int ret;
115 int is32 = is_32bit_task(); 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 /* Is there any syscall restart business here ? */ 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 /* No signal to deliver -- put the saved sigmask back */ 121 /* No signal to deliver -- put the saved sigmask back */
124 restore_saved_sigmask(); 122 restore_saved_sigmask();
125 regs->trap = 0; 123 regs->trap = 0;
126 return 0; /* no signals delivered */ 124 return; /* no signals delivered */
127 } 125 }
128 126
129#ifndef CONFIG_PPC_ADV_DEBUG_REGS 127#ifndef CONFIG_PPC_ADV_DEBUG_REGS
@@ -140,23 +138,16 @@ static int do_signal(struct pt_regs *regs)
140 thread_change_pc(current, regs); 138 thread_change_pc(current, regs);
141 139
142 if (is32) { 140 if (is32) {
143 if (ka.sa.sa_flags & SA_SIGINFO) 141 if (ksig.ka.sa.sa_flags & SA_SIGINFO)
144 ret = handle_rt_signal32(signr, &ka, &info, oldset, 142 ret = handle_rt_signal32(&ksig, oldset, regs);
145 regs);
146 else 143 else
147 ret = handle_signal32(signr, &ka, &info, oldset, 144 ret = handle_signal32(&ksig, oldset, regs);
148 regs);
149 } else { 145 } else {
150 ret = handle_rt_signal64(signr, &ka, &info, oldset, regs); 146 ret = handle_rt_signal64(&ksig, oldset, regs);
151 } 147 }
152 148
153 regs->trap = 0; 149 regs->trap = 0;
154 if (ret) { 150 signal_setup_done(ret, &ksig, test_thread_flag(TIF_SINGLESTEP));
155 signal_delivered(signr, &info, &ka, regs,
156 test_thread_flag(TIF_SINGLESTEP));
157 }
158
159 return ret;
160} 151}
161 152
162void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags) 153void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)