1 /*
2  *  linux/arch/ppc64/kernel/signal.c
3  *
4  *  PowerPC version
5  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
6  *
7  *  Derived from "arch/i386/kernel/signal.c"
8  *    Copyright (C) 1991, 1992 Linus Torvalds
9  *    1997-11-28  Modified for POSIX.1b signals by Richard Henderson
10  *
11  *  This program is free software; you can redistribute it and/or
12  *  modify it under the terms of the GNU General Public License
13  *  as published by the Free Software Foundation; either version
14  *  2 of the License, or (at your option) any later version.
15  */
16 
17 #include <linux/sched.h>
18 #include <linux/mm.h>
19 #include <linux/smp.h>
20 #include <linux/smp_lock.h>
21 #include <linux/kernel.h>
22 #include <linux/signal.h>
23 #include <linux/errno.h>
24 #include <linux/wait.h>
25 #include <linux/ptrace.h>
26 #include <linux/unistd.h>
27 #include <linux/stddef.h>
28 #include <linux/elf.h>
29 #include <asm/ppc32.h>
30 #include <asm/sigcontext.h>
31 #include <asm/ucontext.h>
32 #include <asm/uaccess.h>
33 #include <asm/pgtable.h>
34 #include <asm/unistd.h>
35 #include <asm/processor.h>
36 
37 #define DEBUG_SIG 0
38 
39 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
40 
41 #ifndef MIN
42 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
43 #endif
44 
45 #define GP_REGS_SIZE	MIN(sizeof(elf_gregset_t), sizeof(struct pt_regs))
46 #define FP_REGS_SIZE	sizeof(elf_fpregset_t)
47 
48 #define TRAMP_TRACEBACK	3
49 #define TRAMP_SIZE	6
50 
51 /*
52  * When we have signals to deliver, we set up on the user stack,
53  * going down from the original stack pointer:
54  *	1) a sigframe/rt_sigframe struct which contains the sigcontext/ucontext
55  *	2) a gap of __SIGNAL_FRAMESIZE bytes which acts as a dummy caller
56  *	   frame for the signal handler.
57  */
58 
59 struct sigframe {
60 	/* sys_sigreturn requires the sigcontext be the first field */
61 	struct sigcontext sc;
62 	unsigned int tramp[TRAMP_SIZE];
63 	/* 64 bit ABI allows for 288 bytes below sp before decrementing it. */
64 	char abigap[288];
65 };
66 
67 struct rt_sigframe {
68 	/* sys_rt_sigreturn requires the ucontext be the first field */
69 	struct ucontext uc;
70 	unsigned long _unused[2];
71 	unsigned int tramp[TRAMP_SIZE];
72 	struct siginfo *pinfo;
73 	void *puc;
74 	struct siginfo info;
75 	/* 64 bit ABI allows for 288 bytes below sp before decrementing it. */
76 	char abigap[288];
77 };
78 
79 extern long sys_wait4(pid_t pid, unsigned int *stat_addr,
80 		     int options, /*unsigned long*/ struct rusage *ru);
81 
82 int
copy_siginfo_to_user(siginfo_t * to,siginfo_t * from)83 copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
84 {
85 	if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
86 		return -EFAULT;
87 	if (from->si_code < 0)
88 		return __copy_to_user(to, from, sizeof(siginfo_t));
89 	else {
90 		int err;
91 
92 		/* If you change siginfo_t structure, please be sure
93 		   this code is fixed accordingly.
94 		   It should never copy any pad contained in the structure
95 		   to avoid security leaks, but must copy the generic
96 		   3 ints plus the relevant union member.  */
97 		err = __put_user(from->si_signo, &to->si_signo);
98 		err |= __put_user(from->si_errno, &to->si_errno);
99 		err |= __put_user((short)from->si_code, &to->si_code);
100 		/* First 32bits of unions are always present.  */
101 		err |= __put_user(from->si_pid, &to->si_pid);
102 		switch (from->si_code >> 16) {
103 		case __SI_FAULT >> 16:
104 			err |= __put_user(from->si_addr, &to->si_addr);
105 			break;
106 		case __SI_CHLD >> 16:
107 			err |= __put_user(from->si_utime, &to->si_utime);
108 			err |= __put_user(from->si_stime, &to->si_stime);
109 			err |= __put_user(from->si_status, &to->si_status);
110 		default:
111 			err |= __put_user(from->si_uid, &to->si_uid);
112 			break;
113 		/* case __SI_RT: This is not generated by the kernel as of now.  */
114 		}
115 		return err;
116 	}
117 }
118 
119 int do_signal(sigset_t *oldset, struct pt_regs *regs);
120 
121 /*
122  * Atomically swap in the new signal mask, and wait for a signal.
123  */
124 asmlinkage long
sys_sigsuspend(old_sigset_t mask,int p2,int p3,int p4,int p6,int p7,struct pt_regs * regs)125 sys_sigsuspend(old_sigset_t mask, int p2, int p3, int p4, int p6, int p7,
126 	       struct pt_regs *regs)
127 {
128 	sigset_t saveset;
129 
130 	mask &= _BLOCKABLE;
131 	spin_lock_irq(&current->sigmask_lock);
132 	saveset = current->blocked;
133 	siginitset(&current->blocked, mask);
134 	recalc_sigpending(current);
135 	spin_unlock_irq(&current->sigmask_lock);
136 
137 	regs->result = -EINTR;
138 	regs->gpr[3] = EINTR;
139 	regs->ccr |= 0x10000000;
140 	while (1) {
141 		set_current_state(TASK_INTERRUPTIBLE);
142 		schedule();
143 		if (do_signal(&saveset, regs))
144 			/*
145 			 * If a signal handler needs to be called,
146 			 * do_signal() has set R3 to the signal number (the
147 			 * first argument of the signal handler), so don't
148 			 * overwrite that with EINTR !
149 			 * In the other cases, do_signal() doesn't touch
150 			 * R3, so it's still set to -EINTR (see above).
151 			 */
152 			return regs->gpr[3];
153 	}
154 }
155 
156 asmlinkage long
sys_rt_sigsuspend(sigset_t * unewset,size_t sigsetsize,int p3,int p4,int p6,int p7,struct pt_regs * regs)157 sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, int p3, int p4, int p6,
158 		  int p7, struct pt_regs *regs)
159 {
160 	sigset_t saveset, newset;
161 
162 	/* XXX: Don't preclude handling different sized sigset_t's.  */
163 	if (sigsetsize != sizeof(sigset_t))
164 		return -EINVAL;
165 
166 	if (copy_from_user(&newset, unewset, sizeof(newset)))
167 		return -EFAULT;
168 	sigdelsetmask(&newset, ~_BLOCKABLE);
169 
170 	spin_lock_irq(&current->sigmask_lock);
171 	saveset = current->blocked;
172 	current->blocked = newset;
173 	recalc_sigpending(current);
174 	spin_unlock_irq(&current->sigmask_lock);
175 
176 	regs->result = -EINTR;
177 	regs->gpr[3] = EINTR;
178 	regs->ccr |= 0x10000000;
179 	while (1) {
180 		current->state = TASK_INTERRUPTIBLE;
181 		schedule();
182 		if (do_signal(&saveset, regs))
183 			return regs->gpr[3];
184 	}
185 }
186 
187 asmlinkage long
sys_sigaltstack(const stack_t * uss,stack_t * uoss,unsigned long r5,unsigned long r6,unsigned long r7,unsigned long r8,struct pt_regs * regs)188 sys_sigaltstack(const stack_t *uss, stack_t *uoss, unsigned long r5,
189 		unsigned long r6, unsigned long r7, unsigned long r8,
190 		struct pt_regs *regs)
191 {
192         return do_sigaltstack(uss, uoss, regs->gpr[1]);
193 }
194 
195 asmlinkage long
sys_sigaction(int sig,const struct old_sigaction * act,struct old_sigaction * oact)196 sys_sigaction(int sig, const struct old_sigaction *act,
197 	      struct old_sigaction *oact)
198 {
199 	struct k_sigaction new_ka, old_ka;
200 	int ret;
201 
202 	if (act) {
203 		old_sigset_t mask;
204 
205 		if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
206 		    __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
207 		    __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
208 			return -EFAULT;
209 		__get_user(new_ka.sa.sa_flags, &act->sa_flags);
210 		__get_user(mask, &act->sa_mask);
211 		siginitset(&new_ka.sa.sa_mask, mask);
212 	}
213 
214 	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
215 	if (!ret && oact) {
216 		if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
217 		    __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
218 		    __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
219 			return -EFAULT;
220 		__put_user(old_ka.sa.sa_flags, &oact->sa_flags);
221 		__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
222 	}
223 
224 	return ret;
225 }
226 
227 /*
228  * Set up the sigcontext for the signal frame.
229  */
230 
231 static int
setup_sigcontext(struct sigcontext * sc,struct pt_regs * regs,int signr,sigset_t * set,unsigned long handler)232 setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
233 		 int signr, sigset_t *set, unsigned long handler)
234 {
235 	int err = 0;
236 
237 	if (regs->msr & MSR_FP)
238 		giveup_fpu(current);
239 	err |= __put_user(&sc->gp_regs, &sc->regs);
240 	err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE);
241 	err |= __copy_to_user(&sc->fp_regs, &current->thread.fpr, FP_REGS_SIZE);
242 	current->thread.fpscr = 0;
243 
244 	err |= __put_user(signr, &sc->signal);
245 	err |= __put_user(handler, &sc->handler);
246 	if (set != NULL)
247 		err |=  __put_user(set->sig[0], &sc->oldmask);
248 
249 	return err;
250 }
251 
252 /*
253  * Restore the sigcontext from the signal frame.
254  */
255 
256 static int
restore_sigcontext(struct pt_regs * regs,sigset_t * set,struct sigcontext * sc)257 restore_sigcontext(struct pt_regs *regs, sigset_t *set, struct sigcontext *sc)
258 {
259 	unsigned int err = 0;
260 	int i;
261 	elf_greg_t *gregs = (elf_greg_t *)regs;
262 	unsigned long msr;
263 
264 	/* copy up to but not including MSR */
265 	err |= __copy_from_user(regs, &sc->gp_regs,
266 				PT_MSR * sizeof(elf_greg_t));
267 	/* get the MSR value from the stack but don't put it in regs->msr */
268 	err |= __get_user(msr, &sc->gp_regs[PT_MSR]);
269 	/* copy from orig_r3 (the word after the MSR) to the end,
270 	 * but don't copy softe */
271 	for (i = PT_ORIG_R3; err == 0 && i <= PT_RESULT; ++i)
272 		if (i != PT_SOFTE)
273 			err |= __get_user(gregs[i], &sc->gp_regs[i]);
274 
275 	/* make the process reload FP regs if it executes an FP instr */
276 	regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);
277 #ifndef CONFIG_SMP
278 	if (last_task_used_math == current)
279 		last_task_used_math = NULL;
280 #endif
281 	err |= __copy_from_user(&current->thread.fpr, &sc->fp_regs, FP_REGS_SIZE);
282 
283 	/* restore the signal mask */
284 	if (set != NULL)
285 		err |=  __get_user(set->sig[0], &sc->oldmask);
286 
287 	return err;
288 }
289 
290 /*
291  * Allocate space for the signal frame
292  */
293 static inline void *
get_sigframe(struct k_sigaction * ka,struct pt_regs * regs,size_t frame_size)294 get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
295 {
296         unsigned long newsp;
297 
298         /* Default to using normal stack */
299         newsp = regs->gpr[1];
300 
301 	if (ka->sa.sa_flags & SA_ONSTACK) {
302 		if (! on_sig_stack(regs->gpr[1]))
303 			newsp = (current->sas_ss_sp + current->sas_ss_size);
304 	}
305 
306 	/* The ABI requires quadword alignment for the stack. */
307 	return (void *)((newsp - frame_size) & -16ul);
308 
309 }
310 
311 static int
setup_trampoline(unsigned int syscall,unsigned int * tramp)312 setup_trampoline(unsigned int syscall, unsigned int *tramp)
313 {
314 	int i, err = 0;
315 
316 	/* addi r1, r1, __SIGNAL_FRAMESIZE  # Pop the dummy stackframe */
317 	err |= __put_user(0x38210000UL | (__SIGNAL_FRAMESIZE & 0xffff), &tramp[0]);
318 	/* li r0, __NR_[rt_]sigreturn| */
319 	err |= __put_user(0x38000000UL | (syscall & 0xffff), &tramp[1]);
320 	/* sc */
321 	err |= __put_user(0x44000002UL, &tramp[2]);
322 
323 	/* Minimal traceback info */
324 	for (i=TRAMP_TRACEBACK; i < TRAMP_SIZE ;i++)
325 		err |= __put_user(0, &tramp[i]);
326 
327 	if (!err)
328 		flush_icache_range((unsigned long) &tramp[0],
329 			   (unsigned long) &tramp[TRAMP_SIZE]);
330 
331 	return err;
332 }
333 
334 
335 asmlinkage long
sys_rt_sigreturn(unsigned long r3,unsigned long r4,unsigned long r5,unsigned long r6,unsigned long r7,unsigned long r8,struct pt_regs * regs)336 sys_rt_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5,
337 		 unsigned long r6, unsigned long r7, unsigned long r8,
338 		 struct pt_regs *regs)
339 {
340 	struct ucontext *uc = (struct ucontext *)regs->gpr[1];
341 	sigset_t set;
342 	stack_t st;
343 
344 	if (verify_area(VERIFY_READ, uc, sizeof(*uc)))
345 		goto badframe;
346 
347 	if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set)))
348 		goto badframe;
349 
350 	sigdelsetmask(&set, ~_BLOCKABLE);
351 	spin_lock_irq(&current->sigmask_lock);
352 	current->blocked = set;
353 	recalc_sigpending(current);
354 	spin_unlock_irq(&current->sigmask_lock);
355 
356 	if (restore_sigcontext(regs, NULL, &uc->uc_mcontext))
357 		goto badframe;
358 
359 	if (__copy_from_user(&st, &uc->uc_stack, sizeof(st)))
360 		goto badframe;
361 
362 	/* This function sets back the stack flags into
363 	   the current task structure.  */
364 	sys_sigaltstack(&st, NULL, 0, 0, 0, 0, regs);
365 
366 	return regs->result;
367 
368 badframe:
369 	do_exit(SIGSEGV);
370 }
371 
372 static void
setup_rt_frame(int signr,struct k_sigaction * ka,siginfo_t * info,sigset_t * set,struct pt_regs * regs)373 setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info,
374 		sigset_t *set, struct pt_regs *regs)
375 {
376 	/* Handler is *really* a pointer to the function descriptor for
377 	 * the signal routine.  The first entry in the function
378 	 * descriptor is the entry address of signal and the second
379 	 * entry is the TOC value we need to use.
380 	 */
381 	func_descr_t *funct_desc_ptr;
382 	struct rt_sigframe *frame;
383 	unsigned long newsp;
384 	int err = 0;
385 
386 	frame = get_sigframe(ka, regs, sizeof(*frame));
387 
388 	if (verify_area(VERIFY_WRITE, frame, sizeof(*frame)))
389 		goto give_sigsegv;
390 
391 	err |= __put_user(&frame->info, &frame->pinfo);
392 	err |= __put_user(&frame->uc, &frame->puc);
393 	err |= copy_siginfo_to_user(&frame->info, info);
394 	if (err)
395 		goto give_sigsegv;
396 
397 	/* Create the ucontext.  */
398 	err |= __put_user(0, &frame->uc.uc_flags);
399 	err |= __put_user(0, &frame->uc.uc_link);
400 	err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
401 	err |= __put_user(sas_ss_flags(regs->gpr[1]),
402 			  &frame->uc.uc_stack.ss_flags);
403 	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
404 	err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, signr, NULL,
405 				(unsigned long)ka->sa.sa_handler);
406 	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
407 	if (err)
408 		goto give_sigsegv;
409 
410 	/* Set up to return from userspace. */
411 	err |= setup_trampoline(__NR_rt_sigreturn, &frame->tramp[0]);
412 	if (err)
413 		goto give_sigsegv;
414 
415 	funct_desc_ptr = (func_descr_t *) ka->sa.sa_handler;
416 
417 	/* Allocate a dummy caller frame for the signal handler. */
418 	newsp = (unsigned long)frame - __SIGNAL_FRAMESIZE;
419 	err |= put_user(0, (unsigned long *)newsp);
420 
421 	/* Set up "regs" so we "return" to the signal handler. */
422 	err |= get_user(regs->nip, &funct_desc_ptr->entry);
423 	regs->link = (unsigned long) &frame->tramp[0];
424 	regs->gpr[1] = newsp;
425 	err |= get_user(regs->gpr[2], &funct_desc_ptr->toc);
426 	regs->gpr[3] = signr;
427 	err |= get_user(regs->gpr[4], (unsigned long *)&frame->pinfo);
428 	err |= get_user(regs->gpr[5], (unsigned long *)&frame->puc);
429 	regs->gpr[6] = (unsigned long) frame;
430 	if (err)
431 		goto give_sigsegv;
432 
433 	return;
434 
435 give_sigsegv:
436 #if DEBUG_SIG
437 	printk("badframe in setup_rt_frame, regs=%p frame=%p, newsp=0x%lx\n",
438 		regs, frame, newsp);
439 #endif
440 	do_exit(SIGSEGV);
441 }
442 
443 /*
444  * Do a signal return; undo the signal stack.
445  */
446 asmlinkage long
sys_sigreturn(unsigned long r3,unsigned long r4,unsigned long r5,unsigned long r6,unsigned long r7,unsigned long r8,struct pt_regs * regs)447 sys_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5,
448 	      unsigned long r6, unsigned long r7, unsigned long r8,
449 	      struct pt_regs *regs)
450 {
451 	struct sigcontext *sc = (struct sigcontext *)regs->gpr[1];
452 	sigset_t set;
453 
454 	if (verify_area(VERIFY_READ, sc, sizeof(*sc)))
455 		goto badframe;
456 
457 	if (restore_sigcontext(regs, &set, sc))
458 		goto badframe;
459 
460 	sigdelsetmask(&set, ~_BLOCKABLE);
461 	spin_lock_irq(&current->sigmask_lock);
462 	current->blocked = set;
463 	recalc_sigpending(current);
464 	spin_unlock_irq(&current->sigmask_lock);
465 
466 	return regs->result;
467 
468 badframe:
469 	do_exit(SIGSEGV);
470 }
471 
472 
473 static void
setup_frame(int signr,struct k_sigaction * ka,sigset_t * set,struct pt_regs * regs)474 setup_frame(int signr, struct k_sigaction *ka, sigset_t *set,
475 	    struct pt_regs *regs)
476 {
477 	/* Handler is *really* a pointer to the function descriptor for
478 	 * the signal routine.  The first entry in the function
479 	 * descriptor is the entry address of signal and the second
480 	 * entry is the TOC value we need to use.
481 	 */
482 	func_descr_t *funct_desc_ptr;
483 	struct sigframe *frame;
484 	unsigned long newsp;
485 	int err = 0;
486 
487 	frame = get_sigframe(ka, regs, sizeof(*frame));
488 
489 	if (verify_area(VERIFY_WRITE, frame, sizeof(*frame)))
490 		goto badframe;
491 
492 	err |= setup_sigcontext(&frame->sc, regs, signr, set,
493 				(unsigned long)ka->sa.sa_handler);
494 
495 	/* Set up to return from userspace. */
496 	err |= setup_trampoline(__NR_sigreturn, &frame->tramp[0]);
497 	if (err)
498 		goto badframe;
499 
500 	funct_desc_ptr = (func_descr_t *) ka->sa.sa_handler;
501 
502 	/* Allocate a dummy caller frame for the signal handler. */
503 	newsp = (unsigned long)frame - __SIGNAL_FRAMESIZE;
504 	err |= put_user(0, (unsigned long *)newsp);
505 
506 	/* Set up "regs" so we "return" to the signal handler. */
507 	err |= get_user(regs->nip, &funct_desc_ptr->entry);
508 	regs->link = (unsigned long) &frame->tramp[0];
509 	regs->gpr[1] = newsp;
510 	err |= get_user(regs->gpr[2], &funct_desc_ptr->toc);
511 	regs->gpr[3] = signr;
512 	regs->gpr[4] = (unsigned long) &frame->sc;
513 	if (err)
514 		goto badframe;
515 
516 	return;
517 
518 badframe:
519 #if DEBUG_SIG
520 	printk("badframe in setup_frame, regs=%p frame=%p newsp=%lx\n",
521 	       regs, frame, newsp);
522 #endif
523 	do_exit(SIGSEGV);
524 }
525 
526 /*
527  * OK, we're invoking a handler
528  */
529 static void
handle_signal(unsigned long sig,struct k_sigaction * ka,siginfo_t * info,sigset_t * oldset,struct pt_regs * regs)530 handle_signal(unsigned long sig, struct k_sigaction *ka,
531 	      siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
532 {
533 	/* Set up Signal Frame */
534 	if (ka->sa.sa_flags & SA_SIGINFO)
535 		setup_rt_frame(sig, ka, info, oldset, regs);
536 	else
537 		setup_frame(sig, ka, oldset, regs);
538 
539 	if (ka->sa.sa_flags & SA_ONESHOT)
540 		ka->sa.sa_handler = SIG_DFL;
541 
542 	if (!(ka->sa.sa_flags & SA_NODEFER)) {
543 		spin_lock_irq(&current->sigmask_lock);
544 		sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
545 		sigaddset(&current->blocked,sig);
546 		recalc_sigpending(current);
547 		spin_unlock_irq(&current->sigmask_lock);
548 	}
549 }
550 
551 static inline void
syscall_restart(struct pt_regs * regs,struct k_sigaction * ka)552 syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
553 {
554 	switch ((int)regs->result) {
555 		case -ERESTARTNOHAND:
556 			/* ERESTARTNOHAND means that the syscall should only
557 			   be restarted if there was no handler for the signal,
558 			   and since we only get here if there is a handler,
559 			   we dont restart */
560 			regs->result = -EINTR;
561 			break;
562 
563 		case -ERESTARTSYS:
564 			/* ERESTARTSYS means to restart the syscall if there is
565 			   no handler or the handler was registered with SA_RESTART */
566 			if (!(ka->sa.sa_flags & SA_RESTART)) {
567 				regs->result = -EINTR;
568 				break;
569 			}
570 		/* fallthrough */
571 		case -ERESTARTNOINTR:
572 			/* ERESTARTNOINTR means that the syscall should be
573 			   called again after the signal handler returns */
574 			regs->gpr[3] = regs->orig_gpr3;
575 			regs->nip -= 4;
576 			regs->result = 0;
577 	}
578 }
579 
580 static int
get_signal_to_deliver(siginfo_t * info,struct pt_regs * regs)581 get_signal_to_deliver(siginfo_t *info, struct pt_regs *regs)
582 {
583 	for (;;) {
584 		unsigned long signr;
585 		struct k_sigaction *ka;
586 
587 		spin_lock_irq(&current->sigmask_lock);
588 		signr = dequeue_signal(&current->blocked, info);
589 		spin_unlock_irq(&current->sigmask_lock);
590 
591 		if (!signr)
592 			break;
593 
594 		if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
595 			/* Let the debugger run.  */
596 			current->exit_code = signr;
597 			current->state = TASK_STOPPED;
598 			notify_parent(current, SIGCHLD);
599 			schedule();
600 
601 			/* We're back.  Did the debugger cancel the sig?  */
602 			signr = current->exit_code;
603 			if (signr == 0)
604 				continue;
605 			current->exit_code = 0;
606 
607 			/* The debugger continued.  Ignore SIGSTOP.  */
608 			if (signr == SIGSTOP)
609 				continue;
610 
611 			/* Update the siginfo structure.  Is this good?  */
612 			if (signr != info->si_signo) {
613 				info->si_signo = signr;
614 				info->si_errno = 0;
615 				info->si_code = SI_USER;
616 				info->si_pid = current->p_pptr->pid;
617 				info->si_uid = current->p_pptr->uid;
618 			}
619 
620 			/* If the (new) signal is now blocked, requeue it.  */
621 			if (sigismember(&current->blocked, signr)) {
622 				send_sig_info(signr, info, current);
623 				continue;
624 			}
625 		}
626 
627 		ka = &current->sig->action[signr-1];
628 
629 		if (ka->sa.sa_handler == SIG_IGN) {
630 			if (signr != SIGCHLD)
631 				continue;
632 			/* Check for SIGCHLD: it's special.  */
633 			while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
634 				/* nothing */;
635 			continue;
636 		}
637 
638 		if (ka->sa.sa_handler == SIG_DFL) {
639 			int exit_code = signr;
640 
641 			/* Init gets no signals it doesn't want.  */
642 			if (current->pid == 1)
643 				continue;
644 
645 			switch (signr) {
646 			case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
647 				continue;
648 
649 			case SIGTSTP: case SIGTTIN: case SIGTTOU:
650 				if (is_orphaned_pgrp(current->pgrp))
651 					continue;
652 				/* FALLTHRU */
653 
654 			case SIGSTOP: {
655 				struct signal_struct *sig;
656 				current->state = TASK_STOPPED;
657 				current->exit_code = signr;
658 				sig = current->p_pptr->sig;
659 				if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
660 					notify_parent(current, SIGCHLD);
661 				schedule();
662 				continue;
663 			}
664 
665 			case SIGQUIT: case SIGILL: case SIGTRAP:
666 			case SIGABRT: case SIGFPE: case SIGSEGV:
667 			case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
668 				if (do_coredump(signr, regs))
669 					exit_code |= 0x80;
670 				/* FALLTHRU */
671 
672 			default:
673 				sig_exit(signr, exit_code, info);
674 				/* NOTREACHED */
675 			}
676 		}
677 		return signr;
678 	}
679 	return 0;
680 }
681 
682 /*
683  * Note that 'init' is a special process: it doesn't get signals it doesn't
684  * want to handle. Thus you cannot kill init even with a SIGKILL even by
685  * mistake.
686  */
687 extern int do_signal32(sigset_t *oldset, struct pt_regs *regs);
688 
689 int
do_signal(sigset_t * oldset,struct pt_regs * regs)690 do_signal(sigset_t *oldset, struct pt_regs *regs)
691 {
692 	siginfo_t info;
693 	int signr;
694 
695 	/*
696 	 * If the current thread is 32 bit - invoke the
697 	 * 32 bit signal handling code
698 	 */
699 	if (current->thread.flags & PPC_FLAG_32BIT)
700 		return do_signal32(oldset, regs);
701 
702         if (!oldset)
703 		oldset = &current->blocked;
704 
705 	signr = get_signal_to_deliver(&info, regs);
706 	if (signr > 0) {
707 		struct k_sigaction *ka = &current->sig->action[signr-1];
708 
709 		/* Whee!  Actually deliver the signal.  */
710 		if (regs->trap == 0x0C00)
711 			syscall_restart(regs, ka);
712 		handle_signal(signr, ka, &info, oldset, regs);
713 		return 1;
714 	}
715 
716 	if (regs->trap == 0x0C00 /* System Call! */ &&
717 	    ((int)regs->result == -ERESTARTNOHAND ||
718 	     (int)regs->result == -ERESTARTSYS ||
719 	     (int)regs->result == -ERESTARTNOINTR)) {
720 		regs->gpr[3] = regs->orig_gpr3;
721 		regs->nip -= 4;		/* Back up & retry system call */
722 		regs->result = 0;
723 	}
724 
725 	return 0;
726 }
727 
728 
729 
730