1 /*
2  *  linux/arch/i386/kernel/signal.c
3  *
4  *  Copyright (C) 1991, 1992  Linus Torvalds
5  *
6  *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
7  *  2000-06-20  Pentium III FXSR, SSE support by Gareth Hughes
8  */
9 
10 #include <linux/sched.h>
11 #include <linux/mm.h>
12 #include <linux/smp.h>
13 #include <linux/smp_lock.h>
14 #include <linux/kernel.h>
15 #include <linux/signal.h>
16 #include <linux/errno.h>
17 #include <linux/wait.h>
18 #include <linux/ptrace.h>
19 #include <linux/unistd.h>
20 #include <linux/stddef.h>
21 #include <linux/tty.h>
22 #include <linux/personality.h>
23 #include <asm/ucontext.h>
24 #include <asm/uaccess.h>
25 #include <asm/i387.h>
26 
27 #define DEBUG_SIG 0
28 
29 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
30 
31 int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));
32 
copy_siginfo_to_user(siginfo_t * to,siginfo_t * from)33 int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
34 {
35 	if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
36 		return -EFAULT;
37 	if (from->si_code < 0)
38 		return __copy_to_user(to, from, sizeof(siginfo_t));
39 	else {
40 		int err;
41 
42 		/* If you change siginfo_t structure, please be sure
43 		   this code is fixed accordingly.
44 		   It should never copy any pad contained in the structure
45 		   to avoid security leaks, but must copy the generic
46 		   3 ints plus the relevant union member.  */
47 		err = __put_user(from->si_signo, &to->si_signo);
48 		err |= __put_user(from->si_errno, &to->si_errno);
49 		err |= __put_user((short)from->si_code, &to->si_code);
50 		/* First 32bits of unions are always present.  */
51 		err |= __put_user(from->si_pid, &to->si_pid);
52 		switch (from->si_code >> 16) {
53 		case __SI_FAULT >> 16:
54 			break;
55 		case __SI_CHLD >> 16:
56 			err |= __put_user(from->si_utime, &to->si_utime);
57 			err |= __put_user(from->si_stime, &to->si_stime);
58 			err |= __put_user(from->si_status, &to->si_status);
59 		default:
60 			err |= __put_user(from->si_uid, &to->si_uid);
61 			break;
62 		/* case __SI_RT: This is not generated by the kernel as of now.  */
63 		}
64 		return err;
65 	}
66 }
67 
68 /*
69  * Atomically swap in the new signal mask, and wait for a signal.
70  */
71 asmlinkage int
sys_sigsuspend(int history0,int history1,old_sigset_t mask)72 sys_sigsuspend(int history0, int history1, old_sigset_t mask)
73 {
74 	struct pt_regs * regs = (struct pt_regs *) &history0;
75 	sigset_t saveset;
76 
77 	mask &= _BLOCKABLE;
78 	spin_lock_irq(&current->sigmask_lock);
79 	saveset = current->blocked;
80 	siginitset(&current->blocked, mask);
81 	recalc_sigpending(current);
82 	spin_unlock_irq(&current->sigmask_lock);
83 
84 	regs->eax = -EINTR;
85 	while (1) {
86 		current->state = TASK_INTERRUPTIBLE;
87 		schedule();
88 		if (do_signal(regs, &saveset))
89 			return -EINTR;
90 	}
91 }
92 
93 asmlinkage int
sys_rt_sigsuspend(sigset_t * unewset,size_t sigsetsize)94 sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize)
95 {
96 	struct pt_regs * regs = (struct pt_regs *) &unewset;
97 	sigset_t saveset, newset;
98 
99 	/* XXX: Don't preclude handling different sized sigset_t's.  */
100 	if (sigsetsize != sizeof(sigset_t))
101 		return -EINVAL;
102 
103 	if (copy_from_user(&newset, unewset, sizeof(newset)))
104 		return -EFAULT;
105 	sigdelsetmask(&newset, ~_BLOCKABLE);
106 
107 	spin_lock_irq(&current->sigmask_lock);
108 	saveset = current->blocked;
109 	current->blocked = newset;
110 	recalc_sigpending(current);
111 	spin_unlock_irq(&current->sigmask_lock);
112 
113 	regs->eax = -EINTR;
114 	while (1) {
115 		current->state = TASK_INTERRUPTIBLE;
116 		schedule();
117 		if (do_signal(regs, &saveset))
118 			return -EINTR;
119 	}
120 }
121 
122 asmlinkage int
sys_sigaction(int sig,const struct old_sigaction * act,struct old_sigaction * oact)123 sys_sigaction(int sig, const struct old_sigaction *act,
124 	      struct old_sigaction *oact)
125 {
126 	struct k_sigaction new_ka, old_ka;
127 	int ret;
128 
129 	if (act) {
130 		old_sigset_t mask;
131 		if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
132 		    __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
133 		    __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
134 			return -EFAULT;
135 		__get_user(new_ka.sa.sa_flags, &act->sa_flags);
136 		__get_user(mask, &act->sa_mask);
137 		siginitset(&new_ka.sa.sa_mask, mask);
138 	}
139 
140 	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
141 
142 	if (!ret && oact) {
143 		if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
144 		    __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
145 		    __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
146 			return -EFAULT;
147 		__put_user(old_ka.sa.sa_flags, &oact->sa_flags);
148 		__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
149 	}
150 
151 	return ret;
152 }
153 
154 asmlinkage int
sys_sigaltstack(const stack_t * uss,stack_t * uoss)155 sys_sigaltstack(const stack_t *uss, stack_t *uoss)
156 {
157 	struct pt_regs *regs = (struct pt_regs *) &uss;
158 	return do_sigaltstack(uss, uoss, regs->esp);
159 }
160 
161 
162 /*
163  * Do a signal return; undo the signal stack.
164  */
165 
166 struct sigframe
167 {
168 	char *pretcode;
169 	int sig;
170 	struct sigcontext sc;
171 	struct _fpstate fpstate;
172 	unsigned long extramask[_NSIG_WORDS-1];
173 	char retcode[8];
174 };
175 
176 struct rt_sigframe
177 {
178 	char *pretcode;
179 	int sig;
180 	struct siginfo *pinfo;
181 	void *puc;
182 	struct siginfo info;
183 	struct ucontext uc;
184 	struct _fpstate fpstate;
185 	char retcode[8];
186 };
187 
188 static int
restore_sigcontext(struct pt_regs * regs,struct sigcontext * sc,int * peax)189 restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc, int *peax)
190 {
191 	unsigned int err = 0;
192 
193 #define COPY(x)		err |= __get_user(regs->x, &sc->x)
194 
195 #define COPY_SEG(seg)							\
196 	{ unsigned short tmp;						\
197 	  err |= __get_user(tmp, &sc->seg);				\
198 	  regs->x##seg = tmp; }
199 
200 #define COPY_SEG_STRICT(seg)						\
201 	{ unsigned short tmp;						\
202 	  err |= __get_user(tmp, &sc->seg);				\
203 	  regs->x##seg = tmp|3; }
204 
205 #define GET_SEG(seg)							\
206 	{ unsigned short tmp;						\
207 	  err |= __get_user(tmp, &sc->seg);				\
208 	  loadsegment(seg,tmp); }
209 
210 	GET_SEG(gs);
211 	GET_SEG(fs);
212 	COPY_SEG(es);
213 	COPY_SEG(ds);
214 	COPY(edi);
215 	COPY(esi);
216 	COPY(ebp);
217 	COPY(esp);
218 	COPY(ebx);
219 	COPY(edx);
220 	COPY(ecx);
221 	COPY(eip);
222 	COPY_SEG_STRICT(cs);
223 	COPY_SEG_STRICT(ss);
224 
225 	{
226 		unsigned int tmpflags;
227 		err |= __get_user(tmpflags, &sc->eflags);
228 		regs->eflags = (regs->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
229 		regs->orig_eax = -1;		/* disable syscall checks */
230 	}
231 
232 	{
233 		struct _fpstate * buf;
234 		err |= __get_user(buf, &sc->fpstate);
235 		if (buf) {
236 			if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
237 				goto badframe;
238 			err |= restore_i387(buf);
239 		}
240 	}
241 
242 	err |= __get_user(*peax, &sc->eax);
243 	return err;
244 
245 badframe:
246 	return 1;
247 }
248 
sys_sigreturn(unsigned long __unused)249 asmlinkage int sys_sigreturn(unsigned long __unused)
250 {
251 	struct pt_regs *regs = (struct pt_regs *) &__unused;
252 	struct sigframe *frame = (struct sigframe *)(regs->esp - 8);
253 	sigset_t set;
254 	int eax;
255 
256 	if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
257 		goto badframe;
258 	if (__get_user(set.sig[0], &frame->sc.oldmask)
259 	    || (_NSIG_WORDS > 1
260 		&& __copy_from_user(&set.sig[1], &frame->extramask,
261 				    sizeof(frame->extramask))))
262 		goto badframe;
263 
264 	sigdelsetmask(&set, ~_BLOCKABLE);
265 	spin_lock_irq(&current->sigmask_lock);
266 	current->blocked = set;
267 	recalc_sigpending(current);
268 	spin_unlock_irq(&current->sigmask_lock);
269 
270 	if (restore_sigcontext(regs, &frame->sc, &eax))
271 		goto badframe;
272 	return eax;
273 
274 badframe:
275 	force_sig(SIGSEGV, current);
276 	return 0;
277 }
278 
sys_rt_sigreturn(unsigned long __unused)279 asmlinkage int sys_rt_sigreturn(unsigned long __unused)
280 {
281 	struct pt_regs *regs = (struct pt_regs *) &__unused;
282 	struct rt_sigframe *frame = (struct rt_sigframe *)(regs->esp - 4);
283 	sigset_t set;
284 	stack_t st;
285 	int eax;
286 
287 	if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
288 		goto badframe;
289 	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
290 		goto badframe;
291 
292 	sigdelsetmask(&set, ~_BLOCKABLE);
293 	spin_lock_irq(&current->sigmask_lock);
294 	current->blocked = set;
295 	recalc_sigpending(current);
296 	spin_unlock_irq(&current->sigmask_lock);
297 
298 	if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &eax))
299 		goto badframe;
300 
301 	if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
302 		goto badframe;
303 	/* It is more difficult to avoid calling this function than to
304 	   call it and ignore errors.  */
305 	do_sigaltstack(&st, NULL, regs->esp);
306 
307 	return eax;
308 
309 badframe:
310 	force_sig(SIGSEGV, current);
311 	return 0;
312 }
313 
314 /*
315  * Set up a signal frame.
316  */
317 
318 static int
setup_sigcontext(struct sigcontext * sc,struct _fpstate * fpstate,struct pt_regs * regs,unsigned long mask)319 setup_sigcontext(struct sigcontext *sc, struct _fpstate *fpstate,
320 		 struct pt_regs *regs, unsigned long mask)
321 {
322 	int tmp, err = 0;
323 
324 	tmp = 0;
325 	__asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
326 	err |= __put_user(tmp, (unsigned int *)&sc->gs);
327 	__asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
328 	err |= __put_user(tmp, (unsigned int *)&sc->fs);
329 
330 	err |= __put_user(regs->xes, (unsigned int *)&sc->es);
331 	err |= __put_user(regs->xds, (unsigned int *)&sc->ds);
332 	err |= __put_user(regs->edi, &sc->edi);
333 	err |= __put_user(regs->esi, &sc->esi);
334 	err |= __put_user(regs->ebp, &sc->ebp);
335 	err |= __put_user(regs->esp, &sc->esp);
336 	err |= __put_user(regs->ebx, &sc->ebx);
337 	err |= __put_user(regs->edx, &sc->edx);
338 	err |= __put_user(regs->ecx, &sc->ecx);
339 	err |= __put_user(regs->eax, &sc->eax);
340 	err |= __put_user(current->thread.trap_no, &sc->trapno);
341 	err |= __put_user(current->thread.error_code, &sc->err);
342 	err |= __put_user(regs->eip, &sc->eip);
343 	err |= __put_user(regs->xcs, (unsigned int *)&sc->cs);
344 	err |= __put_user(regs->eflags, &sc->eflags);
345 	err |= __put_user(regs->esp, &sc->esp_at_signal);
346 	err |= __put_user(regs->xss, (unsigned int *)&sc->ss);
347 
348 	tmp = save_i387(fpstate);
349 	if (tmp < 0)
350 	  err = 1;
351 	else
352 	  err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate);
353 
354 	/* non-iBCS2 extensions.. */
355 	err |= __put_user(mask, &sc->oldmask);
356 	err |= __put_user(current->thread.cr2, &sc->cr2);
357 
358 	return err;
359 }
360 
361 /*
362  * Determine which stack to use..
363  */
364 static inline void *
get_sigframe(struct k_sigaction * ka,struct pt_regs * regs,size_t frame_size)365 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
366 {
367 	unsigned long esp;
368 
369 	/* Default to using normal stack */
370 	esp = regs->esp;
371 
372 	/* This is the X/Open sanctioned signal stack switching.  */
373 	if (ka->sa.sa_flags & SA_ONSTACK) {
374 		if (sas_ss_flags(esp) == 0)
375 			esp = current->sas_ss_sp + current->sas_ss_size;
376 	}
377 
378 	/* This is the legacy signal stack switching. */
379 	else if ((regs->xss & 0xffff) != __USER_DS &&
380 		 !(ka->sa.sa_flags & SA_RESTORER) &&
381 		 ka->sa.sa_restorer) {
382 		esp = (unsigned long) ka->sa.sa_restorer;
383 	}
384 
385 	return (void *)((esp - frame_size) & -8ul);
386 }
387 
setup_frame(int sig,struct k_sigaction * ka,sigset_t * set,struct pt_regs * regs)388 static void setup_frame(int sig, struct k_sigaction *ka,
389 			sigset_t *set, struct pt_regs * regs)
390 {
391 	struct sigframe *frame;
392 	int err = 0;
393 
394 	frame = get_sigframe(ka, regs, sizeof(*frame));
395 
396 	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
397 		goto give_sigsegv;
398 
399 	err |= __put_user((current->exec_domain
400 		           && current->exec_domain->signal_invmap
401 		           && sig < 32
402 		           ? current->exec_domain->signal_invmap[sig]
403 		           : sig),
404 		          &frame->sig);
405 	if (err)
406 		goto give_sigsegv;
407 
408 	err |= setup_sigcontext(&frame->sc, &frame->fpstate, regs, set->sig[0]);
409 	if (err)
410 		goto give_sigsegv;
411 
412 	if (_NSIG_WORDS > 1) {
413 		err |= __copy_to_user(frame->extramask, &set->sig[1],
414 				      sizeof(frame->extramask));
415 	}
416 	if (err)
417 		goto give_sigsegv;
418 
419 	/* Set up to return from userspace.  If provided, use a stub
420 	   already in userspace.  */
421 	if (ka->sa.sa_flags & SA_RESTORER) {
422 		err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
423 	} else {
424 		err |= __put_user(frame->retcode, &frame->pretcode);
425 		/* This is popl %eax ; movl $,%eax ; int $0x80 */
426 		err |= __put_user(0xb858, (short *)(frame->retcode+0));
427 		err |= __put_user(__NR_sigreturn, (int *)(frame->retcode+2));
428 		err |= __put_user(0x80cd, (short *)(frame->retcode+6));
429 	}
430 
431 	if (err)
432 		goto give_sigsegv;
433 
434 	/* Set up registers for signal handler */
435 	regs->esp = (unsigned long) frame;
436 	regs->eip = (unsigned long) ka->sa.sa_handler;
437 
438 	set_fs(USER_DS);
439 	regs->xds = __USER_DS;
440 	regs->xes = __USER_DS;
441 	regs->xss = __USER_DS;
442 	regs->xcs = __USER_CS;
443 	regs->eflags &= ~TF_MASK;
444 
445 #if DEBUG_SIG
446 	printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
447 		current->comm, current->pid, frame, regs->eip, frame->pretcode);
448 #endif
449 
450 	return;
451 
452 give_sigsegv:
453 	if (sig == SIGSEGV)
454 		ka->sa.sa_handler = SIG_DFL;
455 	force_sig(SIGSEGV, current);
456 }
457 
setup_rt_frame(int sig,struct k_sigaction * ka,siginfo_t * info,sigset_t * set,struct pt_regs * regs)458 static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
459 			   sigset_t *set, struct pt_regs * regs)
460 {
461 	struct rt_sigframe *frame;
462 	int err = 0;
463 
464 	frame = get_sigframe(ka, regs, sizeof(*frame));
465 
466 	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
467 		goto give_sigsegv;
468 
469 	err |= __put_user((current->exec_domain
470 		    	   && current->exec_domain->signal_invmap
471 		    	   && sig < 32
472 		    	   ? current->exec_domain->signal_invmap[sig]
473 			   : sig),
474 			  &frame->sig);
475 	err |= __put_user(&frame->info, &frame->pinfo);
476 	err |= __put_user(&frame->uc, &frame->puc);
477 	err |= copy_siginfo_to_user(&frame->info, info);
478 	if (err)
479 		goto give_sigsegv;
480 
481 	/* Create the ucontext.  */
482 	err |= __put_user(0, &frame->uc.uc_flags);
483 	err |= __put_user(0, &frame->uc.uc_link);
484 	err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
485 	err |= __put_user(sas_ss_flags(regs->esp),
486 			  &frame->uc.uc_stack.ss_flags);
487 	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
488 	err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate,
489 			        regs, set->sig[0]);
490 	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
491 	if (err)
492 		goto give_sigsegv;
493 
494 	/* Set up to return from userspace.  If provided, use a stub
495 	   already in userspace.  */
496 	if (ka->sa.sa_flags & SA_RESTORER) {
497 		err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
498 	} else {
499 		err |= __put_user(frame->retcode, &frame->pretcode);
500 		/* This is movl $,%eax ; int $0x80 */
501 		err |= __put_user(0xb8, (char *)(frame->retcode+0));
502 		err |= __put_user(__NR_rt_sigreturn, (int *)(frame->retcode+1));
503 		err |= __put_user(0x80cd, (short *)(frame->retcode+5));
504 	}
505 
506 	if (err)
507 		goto give_sigsegv;
508 
509 	/* Set up registers for signal handler */
510 	regs->esp = (unsigned long) frame;
511 	regs->eip = (unsigned long) ka->sa.sa_handler;
512 
513 	set_fs(USER_DS);
514 	regs->xds = __USER_DS;
515 	regs->xes = __USER_DS;
516 	regs->xss = __USER_DS;
517 	regs->xcs = __USER_CS;
518 	regs->eflags &= ~TF_MASK;
519 
520 #if DEBUG_SIG
521 	printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
522 		current->comm, current->pid, frame, regs->eip, frame->pretcode);
523 #endif
524 
525 	return;
526 
527 give_sigsegv:
528 	if (sig == SIGSEGV)
529 		ka->sa.sa_handler = SIG_DFL;
530 	force_sig(SIGSEGV, current);
531 }
532 
533 /*
534  * OK, we're invoking a handler
535  */
536 
537 static void
handle_signal(unsigned long sig,struct k_sigaction * ka,siginfo_t * info,sigset_t * oldset,struct pt_regs * regs)538 handle_signal(unsigned long sig, struct k_sigaction *ka,
539 	      siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
540 {
541 	/* Are we from a system call? */
542 	if (regs->orig_eax >= 0) {
543 		/* If so, check system call restarting.. */
544 		switch (regs->eax) {
545 			case -ERESTARTNOHAND:
546 				regs->eax = -EINTR;
547 				break;
548 
549 			case -ERESTARTSYS:
550 				if (!(ka->sa.sa_flags & SA_RESTART)) {
551 					regs->eax = -EINTR;
552 					break;
553 				}
554 			/* fallthrough */
555 			case -ERESTARTNOINTR:
556 				regs->eax = regs->orig_eax;
557 				regs->eip -= 2;
558 		}
559 	}
560 
561 	/* Set up the stack frame */
562 	if (ka->sa.sa_flags & SA_SIGINFO)
563 		setup_rt_frame(sig, ka, info, oldset, regs);
564 	else
565 		setup_frame(sig, ka, oldset, regs);
566 
567 	if (ka->sa.sa_flags & SA_ONESHOT)
568 		ka->sa.sa_handler = SIG_DFL;
569 
570 	if (!(ka->sa.sa_flags & SA_NODEFER)) {
571 		spin_lock_irq(&current->sigmask_lock);
572 		sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
573 		sigaddset(&current->blocked,sig);
574 		recalc_sigpending(current);
575 		spin_unlock_irq(&current->sigmask_lock);
576 	}
577 }
578 
579 /*
580  * Note that 'init' is a special process: it doesn't get signals it doesn't
581  * want to handle. Thus you cannot kill init even with a SIGKILL even by
582  * mistake.
583  */
do_signal(struct pt_regs * regs,sigset_t * oldset)584 int fastcall do_signal(struct pt_regs *regs, sigset_t *oldset)
585 {
586 	siginfo_t info;
587 	struct k_sigaction *ka;
588 
589 	/*
590 	 * We want the common case to go fast, which
591 	 * is why we may in certain cases get here from
592 	 * kernel mode. Just return without doing anything
593 	 * if so.
594 	 */
595 	if ((regs->xcs & 3) != 3)
596 		return 1;
597 
598 	if (!oldset)
599 		oldset = &current->blocked;
600 
601 	for (;;) {
602 		unsigned long signr;
603 
604 		spin_lock_irq(&current->sigmask_lock);
605 		signr = dequeue_signal(&current->blocked, &info);
606 		spin_unlock_irq(&current->sigmask_lock);
607 
608 		if (!signr)
609 			break;
610 
611 		if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
612 			/* Let the debugger run.  */
613 			current->exit_code = signr;
614 			current->state = TASK_STOPPED;
615 			notify_parent(current, SIGCHLD);
616 			schedule();
617 
618 			/* We're back.  Did the debugger cancel the sig?  */
619 			if (!(signr = current->exit_code))
620 				continue;
621 			current->exit_code = 0;
622 
623 			/* The debugger continued.  Ignore SIGSTOP.  */
624 			if (signr == SIGSTOP)
625 				continue;
626 
627 			/* Update the siginfo structure.  Is this good?  */
628 			if (signr != info.si_signo) {
629 				info.si_signo = signr;
630 				info.si_errno = 0;
631 				info.si_code = SI_USER;
632 				info.si_pid = current->p_pptr->pid;
633 				info.si_uid = current->p_pptr->uid;
634 			}
635 
636 			/* If the (new) signal is now blocked, requeue it.  */
637 			if (sigismember(&current->blocked, signr)) {
638 				send_sig_info(signr, &info, current);
639 				continue;
640 			}
641 		}
642 
643 		ka = &current->sig->action[signr-1];
644 		if (ka->sa.sa_handler == SIG_IGN) {
645 			if (signr != SIGCHLD)
646 				continue;
647 			/* Check for SIGCHLD: it's special.  */
648 			while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
649 				/* nothing */;
650 			continue;
651 		}
652 
653 		if (ka->sa.sa_handler == SIG_DFL) {
654 			int exit_code = signr;
655 
656 			/* Init gets no signals it doesn't want.  */
657 			if (current->pid == 1)
658 				continue;
659 
660 			switch (signr) {
661 			case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
662 				continue;
663 
664 			case SIGTSTP: case SIGTTIN: case SIGTTOU:
665 				if (is_orphaned_pgrp(current->pgrp))
666 					continue;
667 				/* FALLTHRU */
668 
669 			case SIGSTOP: {
670 				struct signal_struct *sig;
671 				current->state = TASK_STOPPED;
672 				current->exit_code = signr;
673 				sig = current->p_pptr->sig;
674 				if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
675 					notify_parent(current, SIGCHLD);
676 				schedule();
677 				continue;
678 			}
679 
680 			case SIGQUIT: case SIGILL: case SIGTRAP:
681 			case SIGABRT: case SIGFPE: case SIGSEGV:
682 			case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
683 				if (do_coredump(signr, regs))
684 					exit_code |= 0x80;
685 				/* FALLTHRU */
686 
687 			default:
688 				sig_exit(signr, exit_code, &info);
689 				/* NOTREACHED */
690 			}
691 		}
692 
693 		/* Reenable any watchpoints before delivering the
694 		 * signal to user space. The processor register will
695 		 * have been cleared if the watchpoint triggered
696 		 * inside the kernel.
697 		 */
698 		__asm__("movl %0,%%db7"	: : "r" (current->thread.debugreg[7]));
699 
700 		/* Whee!  Actually deliver the signal.  */
701 		handle_signal(signr, ka, &info, oldset, regs);
702 		return 1;
703 	}
704 
705 	/* Did we come from a system call? */
706 	if (regs->orig_eax >= 0) {
707 		/* Restart the system call - no handlers present */
708 		if (regs->eax == -ERESTARTNOHAND ||
709 		    regs->eax == -ERESTARTSYS ||
710 		    regs->eax == -ERESTARTNOINTR) {
711 			regs->eax = regs->orig_eax;
712 			regs->eip -= 2;
713 		}
714 	}
715 	return 0;
716 }
717