aboutsummaryrefslogtreecommitdiffstats
path: root/arch/m32r
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/m32r
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/m32r')
-rw-r--r--arch/m32r/kernel/signal.c57
1 files changed, 22 insertions, 35 deletions
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c
index d503568cb753..95408b8f130a 100644
--- a/arch/m32r/kernel/signal.c
+++ b/arch/m32r/kernel/signal.c
@@ -162,28 +162,22 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
162 * Determine which stack to use.. 162 * Determine which stack to use..
163 */ 163 */
164static inline void __user * 164static inline void __user *
165get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size) 165get_sigframe(struct ksignal *ksig, unsigned long sp, size_t frame_size)
166{ 166{
167 /* This is the X/Open sanctioned signal stack switching. */ 167 return (void __user *)((sigsp(sp, ksig) - frame_size) & -8ul);
168 if (ka->sa.sa_flags & SA_ONSTACK) {
169 if (sas_ss_flags(sp) == 0)
170 sp = current->sas_ss_sp + current->sas_ss_size;
171 }
172
173 return (void __user *)((sp - frame_size) & -8ul);
174} 168}
175 169
176static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, 170static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
177 sigset_t *set, struct pt_regs *regs) 171 struct pt_regs *regs)
178{ 172{
179 struct rt_sigframe __user *frame; 173 struct rt_sigframe __user *frame;
180 int err = 0; 174 int err = 0;
181 int signal; 175 int signal, sig = ksig->sig;
182 176
183 frame = get_sigframe(ka, regs->spu, sizeof(*frame)); 177 frame = get_sigframe(ksig, regs->spu, sizeof(*frame));
184 178
185 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) 179 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
186 goto give_sigsegv; 180 return -EFAULT;
187 181
188 signal = current_thread_info()->exec_domain 182 signal = current_thread_info()->exec_domain
189 && current_thread_info()->exec_domain->signal_invmap 183 && current_thread_info()->exec_domain->signal_invmap
@@ -193,13 +187,13 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
193 187
194 err |= __put_user(signal, &frame->sig); 188 err |= __put_user(signal, &frame->sig);
195 if (err) 189 if (err)
196 goto give_sigsegv; 190 return -EFAULT;
197 191
198 err |= __put_user(&frame->info, &frame->pinfo); 192 err |= __put_user(&frame->info, &frame->pinfo);
199 err |= __put_user(&frame->uc, &frame->puc); 193 err |= __put_user(&frame->uc, &frame->puc);
200 err |= copy_siginfo_to_user(&frame->info, info); 194 err |= copy_siginfo_to_user(&frame->info, &ksig->info);
201 if (err) 195 if (err)
202 goto give_sigsegv; 196 return -EFAULT;
203 197
204 /* Create the ucontext. */ 198 /* Create the ucontext. */
205 err |= __put_user(0, &frame->uc.uc_flags); 199 err |= __put_user(0, &frame->uc.uc_flags);
@@ -208,17 +202,17 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
208 err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); 202 err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
209 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); 203 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
210 if (err) 204 if (err)
211 goto give_sigsegv; 205 return -EFAULT;
212 206
213 /* Set up to return from userspace. */ 207 /* Set up to return from userspace. */
214 regs->lr = (unsigned long)ka->sa.sa_restorer; 208 regs->lr = (unsigned long)ksig->ka.sa.sa_restorer;
215 209
216 /* Set up registers for signal handler */ 210 /* Set up registers for signal handler */
217 regs->spu = (unsigned long)frame; 211 regs->spu = (unsigned long)frame;
218 regs->r0 = signal; /* Arg for signal handler */ 212 regs->r0 = signal; /* Arg for signal handler */
219 regs->r1 = (unsigned long)&frame->info; 213 regs->r1 = (unsigned long)&frame->info;
220 regs->r2 = (unsigned long)&frame->uc; 214 regs->r2 = (unsigned long)&frame->uc;
221 regs->bpc = (unsigned long)ka->sa.sa_handler; 215 regs->bpc = (unsigned long)ksig->ka.sa.sa_handler;
222 216
223 set_fs(USER_DS); 217 set_fs(USER_DS);
224 218
@@ -228,10 +222,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
228#endif 222#endif
229 223
230 return 0; 224 return 0;
231
232give_sigsegv:
233 force_sigsegv(sig, current);
234 return -EFAULT;
235} 225}
236 226
237static int prev_insn(struct pt_regs *regs) 227static int prev_insn(struct pt_regs *regs)
@@ -252,9 +242,10 @@ static int prev_insn(struct pt_regs *regs)
252 */ 242 */
253 243
254static void 244static void
255handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, 245handle_signal(struct ksignal *ksig, struct pt_regs *regs)
256 struct pt_regs *regs)
257{ 246{
247 int ret;
248
258 /* Are we from a system call? */ 249 /* Are we from a system call? */
259 if (regs->syscall_nr >= 0) { 250 if (regs->syscall_nr >= 0) {
260 /* If so, check system call restarting.. */ 251 /* If so, check system call restarting.. */
@@ -265,7 +256,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
265 break; 256 break;
266 257
267 case -ERESTARTSYS: 258 case -ERESTARTSYS:
268 if (!(ka->sa.sa_flags & SA_RESTART)) { 259 if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
269 regs->r0 = -EINTR; 260 regs->r0 = -EINTR;
270 break; 261 break;
271 } 262 }
@@ -278,10 +269,9 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
278 } 269 }
279 270
280 /* Set up the stack frame */ 271 /* Set up the stack frame */
281 if (setup_rt_frame(sig, ka, info, sigmask_to_save(), regs)) 272 ret = setup_rt_frame(ksig, sigmask_to_save(), regs);
282 return;
283 273
284 signal_delivered(sig, info, ka, regs, 0); 274 signal_setup_done(ret, ksig, 0);
285} 275}
286 276
287/* 277/*
@@ -291,9 +281,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
291 */ 281 */
292static void do_signal(struct pt_regs *regs) 282static void do_signal(struct pt_regs *regs)
293{ 283{
294 siginfo_t info; 284 struct ksignal ksig;
295 int signr;
296 struct k_sigaction ka;
297 285
298 /* 286 /*
299 * We want the common case to go fast, which 287 * We want the common case to go fast, which
@@ -304,8 +292,7 @@ static void do_signal(struct pt_regs *regs)
304 if (!user_mode(regs)) 292 if (!user_mode(regs))
305 return; 293 return;
306 294
307 signr = get_signal_to_deliver(&info, &ka, regs, NULL); 295 if (get_signal(&ksig)) {
308 if (signr > 0) {
309 /* Re-enable any watchpoints before delivering the 296 /* Re-enable any watchpoints before delivering the
310 * signal to user space. The processor register will 297 * signal to user space. The processor register will
311 * have been cleared if the watchpoint triggered 298 * have been cleared if the watchpoint triggered
@@ -313,7 +300,7 @@ static void do_signal(struct pt_regs *regs)
313 */ 300 */
314 301
315 /* Whee! Actually deliver the signal. */ 302 /* Whee! Actually deliver the signal. */
316 handle_signal(signr, &ka, &info, regs); 303 handle_signal(&ksig, regs);
317 304
318 return; 305 return;
319 } 306 }