xref: /csrg-svn/sys/kern/kern_sig.c (revision 47540)
123374Smckusick /*
2*47540Skarels  * Copyright (c) 1982, 1986, 1989, 1991 Regents of the University of California.
337580Smckusick  * All rights reserved.
423374Smckusick  *
544440Sbostic  * %sccs.include.redist.c%
637580Smckusick  *
7*47540Skarels  *	@(#)kern_sig.c	7.27 (Berkeley) 03/17/91
823374Smckusick  */
97421Sroot 
10*47540Skarels #define	SIGPROP		/* include signal properties table */
1117092Sbloom #include "param.h"
12*47540Skarels /*#include "signalvar.h" */
13*47540Skarels #include "user.h"		/* XXX */
1437580Smckusick #include "vnode.h"
1517092Sbloom #include "proc.h"
16*47540Skarels #include "kinfo_proc.h"
17*47540Skarels #include "systm.h"
1817092Sbloom #include "timeb.h"
1917092Sbloom #include "times.h"
2017092Sbloom #include "buf.h"
2117092Sbloom #include "seg.h"
2217092Sbloom #include "acct.h"
2337580Smckusick #include "file.h"
2417092Sbloom #include "kernel.h"
2539513Skarels #include "wait.h"
2640807Smarc #include "ktrace.h"
277421Sroot 
2845741Smckusick #include "../vm/vm_param.h"
2937581Smckusick 
3017013Smckusick /*
31*47540Skarels  * Can process p, with pcred pc, send the signal signo to process q?
3217013Smckusick  */
33*47540Skarels #define CANSIGNAL(p, pc, q, signo) \
34*47540Skarels 	((pc)->pc_ucred->cr_uid == 0 || \
35*47540Skarels 	    (pc)->p_ruid == (q)->p_cred->p_ruid || \
36*47540Skarels 	    (pc)->pc_ucred->cr_uid == (q)->p_cred->p_ruid || \
37*47540Skarels 	    (pc)->p_ruid == (q)->p_ucred->cr_uid || \
38*47540Skarels 	    (pc)->pc_ucred->cr_uid == (q)->p_ucred->cr_uid || \
3942920Skarels 	    ((signo) == SIGCONT && (q)->p_session == (p)->p_session))
4039513Skarels 
4142920Skarels /* ARGSUSED */
4242920Skarels sigaction(p, uap, retval)
4342920Skarels 	struct proc *p;
4442920Skarels 	register struct args {
4512882Ssam 		int	signo;
4639513Skarels 		struct	sigaction *nsa;
4739513Skarels 		struct	sigaction *osa;
4842920Skarels 	} *uap;
4942920Skarels 	int *retval;
5042920Skarels {
5139513Skarels 	struct sigaction vec;
5239513Skarels 	register struct sigaction *sa;
53*47540Skarels 	register struct sigacts *ps = p->p_sigacts;
5412882Ssam 	register int sig;
5539513Skarels 	int bit, error;
567421Sroot 
5712882Ssam 	sig = uap->signo;
5839513Skarels 	if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP)
5944405Skarels 		return (EINVAL);
6039513Skarels 	sa = &vec;
6139513Skarels 	if (uap->osa) {
62*47540Skarels 		sa->sa_handler = ps->ps_sigact[sig];
63*47540Skarels 		sa->sa_mask = ps->ps_catchmask[sig];
6418308Smckusick 		bit = sigmask(sig);
6539513Skarels 		sa->sa_flags = 0;
66*47540Skarels 		if ((ps->ps_sigonstack & bit) != 0)
6739513Skarels 			sa->sa_flags |= SA_ONSTACK;
68*47540Skarels 		if ((ps->ps_sigintr & bit) == 0)
6939513Skarels 			sa->sa_flags |= SA_RESTART;
7042920Skarels 		if (p->p_flag & SNOCLDSTOP)
7139513Skarels 			sa->sa_flags |= SA_NOCLDSTOP;
7239513Skarels 		if (error = copyout((caddr_t)sa, (caddr_t)uap->osa,
7339513Skarels 		    sizeof (vec)))
7444405Skarels 			return (error);
7512951Ssam 	}
7639513Skarels 	if (uap->nsa) {
7739513Skarels 		if (error = copyin((caddr_t)uap->nsa, (caddr_t)sa,
7839513Skarels 		    sizeof (vec)))
7944405Skarels 			return (error);
8042920Skarels 		setsigvec(p, sig, sa);
8112951Ssam 	}
8244405Skarels 	return (0);
837421Sroot }
847421Sroot 
8542920Skarels setsigvec(p, sig, sa)
8642920Skarels 	register struct proc *p;
8712951Ssam 	int sig;
8839513Skarels 	register struct sigaction *sa;
8912882Ssam {
90*47540Skarels 	register struct sigacts *ps = p->p_sigacts;
9112951Ssam 	register int bit;
9212882Ssam 
9317153Sbloom 	bit = sigmask(sig);
9412882Ssam 	/*
9512882Ssam 	 * Change setting atomically.
9612882Ssam 	 */
9717153Sbloom 	(void) splhigh();
98*47540Skarels 	ps->ps_sigact[sig] = sa->sa_handler;
99*47540Skarels 	ps->ps_catchmask[sig] = sa->sa_mask &~ sigcantmask;
10039513Skarels 	if ((sa->sa_flags & SA_RESTART) == 0)
101*47540Skarels 		ps->ps_sigintr |= bit;
10218308Smckusick 	else
103*47540Skarels 		ps->ps_sigintr &= ~bit;
10439513Skarels 	if (sa->sa_flags & SA_ONSTACK)
105*47540Skarels 		ps->ps_sigonstack |= bit;
10612951Ssam 	else
107*47540Skarels 		ps->ps_sigonstack &= ~bit;
10839513Skarels 	if (sig == SIGCHLD) {
10939513Skarels 		if (sa->sa_flags & SA_NOCLDSTOP)
11039513Skarels 			p->p_flag |= SNOCLDSTOP;
11139513Skarels 		else
11239513Skarels 			p->p_flag &= ~SNOCLDSTOP;
11339513Skarels 	}
11439513Skarels 	/*
11539513Skarels 	 * Set bit in p_sigignore for signals that are set to SIG_IGN,
11639513Skarels 	 * and for signals set to SIG_DFL where the default is to ignore.
11739513Skarels 	 * However, don't put SIGCONT in p_sigignore,
11839513Skarels 	 * as we have to restart the process.
11939513Skarels 	 */
12039513Skarels 	if (sa->sa_handler == SIG_IGN ||
121*47540Skarels 	    (sigprop[sig] & SA_IGNORE && sa->sa_handler == SIG_DFL)) {
12212951Ssam 		p->p_sig &= ~bit;		/* never to be seen again */
12339513Skarels 		if (sig != SIGCONT)
12439513Skarels 			p->p_sigignore |= bit;	/* easier in psignal */
12512951Ssam 		p->p_sigcatch &= ~bit;
12612882Ssam 	} else {
12712951Ssam 		p->p_sigignore &= ~bit;
12839513Skarels 		if (sa->sa_handler == SIG_DFL)
12912951Ssam 			p->p_sigcatch &= ~bit;
13012882Ssam 		else
13112951Ssam 			p->p_sigcatch |= bit;
13212882Ssam 	}
13312882Ssam 	(void) spl0();
13412882Ssam }
13512882Ssam 
13639513Skarels /*
13739513Skarels  * Initialize signal state for process 0;
13839513Skarels  * set to ignore signals that are ignored by default.
13939513Skarels  */
140*47540Skarels void
14139513Skarels siginit(p)
14239513Skarels 	struct proc *p;
1437421Sroot {
144*47540Skarels 	register int i;
14539513Skarels 
146*47540Skarels 	for (i = 0; i < NSIG; i++)
147*47540Skarels 		if (sigprop[i] & SA_IGNORE && i != SIGCONT)
148*47540Skarels 			p->p_sigignore |= sigmask(i);
14939513Skarels }
15039513Skarels 
15139513Skarels /*
15239513Skarels  * Reset signals for an exec of the specified process.
15339513Skarels  */
154*47540Skarels void
15539513Skarels execsigs(p)
15639513Skarels 	register struct proc *p;
15739513Skarels {
158*47540Skarels 	register struct sigacts *ps = p->p_sigacts;
15939513Skarels 	register int nc, mask;
16039513Skarels 
16139513Skarels 	/*
16239513Skarels 	 * Reset caught signals.  Held signals remain held
16339513Skarels 	 * through p_sigmask (unless they were caught,
16439513Skarels 	 * and are now ignored by default).
16539513Skarels 	 */
16639513Skarels 	while (p->p_sigcatch) {
16739513Skarels 		nc = ffs((long)p->p_sigcatch);
16839513Skarels 		mask = sigmask(nc);
16939513Skarels 		p->p_sigcatch &= ~mask;
170*47540Skarels 		if (sigprop[nc] & SA_IGNORE) {
17139513Skarels 			if (nc != SIGCONT)
17239513Skarels 				p->p_sigignore |= mask;
17339513Skarels 			p->p_sig &= ~mask;
17439513Skarels 		}
175*47540Skarels 		ps->ps_sigact[nc] = SIG_DFL;
17639513Skarels 	}
17739513Skarels 	/*
17839513Skarels 	 * Reset stack state to the user stack.
17939513Skarels 	 * Clear set of signals caught on the signal stack.
18039513Skarels 	 */
181*47540Skarels 	ps->ps_onstack = 0;
182*47540Skarels 	ps->ps_sigsp = 0;
183*47540Skarels 	ps->ps_sigonstack = 0;
18439513Skarels }
18539513Skarels 
18639513Skarels /*
18739513Skarels  * Manipulate signal mask.
18839513Skarels  * Note that we receive new mask, not pointer,
18939513Skarels  * and return old mask as return value;
19039513Skarels  * the library stub does the rest.
19139513Skarels  */
19242920Skarels sigprocmask(p, uap, retval)
19342920Skarels 	register struct proc *p;
19442920Skarels 	struct args {
19539513Skarels 		int	how;
19639513Skarels 		sigset_t mask;
19742920Skarels 	} *uap;
19842920Skarels 	int *retval;
19942920Skarels {
20039513Skarels 	int error = 0;
20139513Skarels 
20242920Skarels 	*retval = p->p_sigmask;
20339513Skarels 	(void) splhigh();
20439513Skarels 
20539513Skarels 	switch (uap->how) {
20639513Skarels 	case SIG_BLOCK:
20739513Skarels 		p->p_sigmask |= uap->mask &~ sigcantmask;
20839513Skarels 		break;
20939513Skarels 
21039513Skarels 	case SIG_UNBLOCK:
21139513Skarels 		p->p_sigmask &= ~uap->mask;
21239513Skarels 		break;
21339513Skarels 
21439513Skarels 	case SIG_SETMASK:
21539513Skarels 		p->p_sigmask = uap->mask &~ sigcantmask;
21639513Skarels 		break;
21739513Skarels 
21839513Skarels 	default:
21939513Skarels 		error = EINVAL;
22039513Skarels 		break;
22139513Skarels 	}
22239513Skarels 	(void) spl0();
22344405Skarels 	return (error);
22439513Skarels }
22539513Skarels 
22642920Skarels /* ARGSUSED */
22742920Skarels sigpending(p, uap, retval)
22842920Skarels 	struct proc *p;
22942920Skarels 	void *uap;
23042920Skarels 	int *retval;
23139513Skarels {
23239513Skarels 
23342920Skarels 	*retval = p->p_sig;
23444405Skarels 	return (0);
23539513Skarels }
23639513Skarels 
23739513Skarels #ifdef COMPAT_43
23839513Skarels /*
23939513Skarels  * Generalized interface signal handler, 4.3-compatible.
24039513Skarels  */
24142920Skarels /* ARGSUSED */
24242920Skarels osigvec(p, uap, retval)
24342920Skarels 	struct proc *p;
24442920Skarels 	register struct args {
24539513Skarels 		int	signo;
24639513Skarels 		struct	sigvec *nsv;
24739513Skarels 		struct	sigvec *osv;
24842920Skarels 	} *uap;
24942920Skarels 	int *retval;
25042920Skarels {
25139513Skarels 	struct sigvec vec;
252*47540Skarels 	register struct sigacts *ps = p->p_sigacts;
25339513Skarels 	register struct sigvec *sv;
25439513Skarels 	register int sig;
25539513Skarels 	int bit, error;
25639513Skarels 
25739513Skarels 	sig = uap->signo;
25839513Skarels 	if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP)
25944405Skarels 		return (EINVAL);
26039513Skarels 	sv = &vec;
26139513Skarels 	if (uap->osv) {
262*47540Skarels 		*(sig_t *)&sv->sv_handler = ps->ps_sigact[sig];
263*47540Skarels 		sv->sv_mask = ps->ps_catchmask[sig];
26439513Skarels 		bit = sigmask(sig);
26539513Skarels 		sv->sv_flags = 0;
266*47540Skarels 		if ((ps->ps_sigonstack & bit) != 0)
26739513Skarels 			sv->sv_flags |= SV_ONSTACK;
268*47540Skarels 		if ((ps->ps_sigintr & bit) != 0)
26939513Skarels 			sv->sv_flags |= SV_INTERRUPT;
27042920Skarels 		if (p->p_flag & SNOCLDSTOP)
27139513Skarels 			sv->sv_flags |= SA_NOCLDSTOP;
27239513Skarels 		if (error = copyout((caddr_t)sv, (caddr_t)uap->osv,
27339513Skarels 		    sizeof (vec)))
27444405Skarels 			return (error);
27539513Skarels 	}
27639513Skarels 	if (uap->nsv) {
27739513Skarels 		if (error = copyin((caddr_t)uap->nsv, (caddr_t)sv,
27839513Skarels 		    sizeof (vec)))
27944405Skarels 			return (error);
28039513Skarels 		sv->sv_flags ^= SA_RESTART;	/* opposite of SV_INTERRUPT */
28142920Skarels 		setsigvec(p, sig, (struct sigaction *)sv);
28239513Skarels 	}
28344405Skarels 	return (0);
28439513Skarels }
28539513Skarels 
28642920Skarels osigblock(p, uap, retval)
28742920Skarels 	register struct proc *p;
28842920Skarels 	struct args {
28942920Skarels 		int	mask;
29042920Skarels 	} *uap;
29142920Skarels 	int *retval;
29239513Skarels {
2937499Sroot 
29417153Sbloom 	(void) splhigh();
29542920Skarels 	*retval = p->p_sigmask;
29639513Skarels 	p->p_sigmask |= uap->mask &~ sigcantmask;
29712882Ssam 	(void) spl0();
29844405Skarels 	return (0);
2997499Sroot }
3007499Sroot 
30142920Skarels osigsetmask(p, uap, retval)
30242920Skarels 	struct proc *p;
30342920Skarels 	struct args {
30442920Skarels 		int	mask;
30542920Skarels 	} *uap;
30642920Skarels 	int *retval;
3077499Sroot {
3087499Sroot 
30917153Sbloom 	(void) splhigh();
31042920Skarels 	*retval = p->p_sigmask;
31139513Skarels 	p->p_sigmask = uap->mask &~ sigcantmask;
31212882Ssam 	(void) spl0();
31344405Skarels 	return (0);
3147499Sroot }
31539513Skarels #endif
3167499Sroot 
31739513Skarels /*
31839513Skarels  * Suspend process until signal, providing mask to be set
31939513Skarels  * in the meantime.  Note nonstandard calling convention:
32039513Skarels  * libc stub passes mask, not pointer, to save a copyin.
32139513Skarels  */
32242920Skarels /* ARGSUSED */
32342920Skarels sigsuspend(p, uap, retval)
32442920Skarels 	register struct proc *p;
32542920Skarels 	struct args {
32642920Skarels 		sigset_t mask;
32742920Skarels 	} *uap;
32842920Skarels 	int *retval;
3297499Sroot {
330*47540Skarels 	register struct sigacts *ps = p->p_sigacts;
3317499Sroot 
33212882Ssam 	/*
33312882Ssam 	 * When returning from sigpause, we want
33412882Ssam 	 * the old mask to be restored after the
33512882Ssam 	 * signal handler has finished.  Thus, we
33612882Ssam 	 * save it here and mark the proc structure
337*47540Skarels 	 * to indicate this (should be in sigacts).
33812882Ssam 	 */
339*47540Skarels 	ps->ps_oldmask = p->p_sigmask;
340*47540Skarels 	ps->ps_flags |= SA_OLDMASK;
34139513Skarels 	p->p_sigmask = uap->mask &~ sigcantmask;
342*47540Skarels 	(void) tsleep((caddr_t) ps, PPAUSE|PCATCH, "pause", 0);
34340807Smarc 	/* always return EINTR rather than ERESTART... */
34444405Skarels 	return (EINTR);
3457499Sroot }
3467499Sroot 
34742920Skarels /* ARGSUSED */
34842920Skarels sigstack(p, uap, retval)
34942920Skarels 	struct proc *p;
35042920Skarels 	register struct args {
35112951Ssam 		struct	sigstack *nss;
35212951Ssam 		struct	sigstack *oss;
35342920Skarels 	} *uap;
35442920Skarels 	int *retval;
35542920Skarels {
35612951Ssam 	struct sigstack ss;
35739513Skarels 	int error = 0;
3587499Sroot 
359*47540Skarels 	if (uap->oss && (error = copyout((caddr_t)&p->p_sigacts->ps_sigstack,
36039513Skarels 	    (caddr_t)uap->oss, sizeof (struct sigstack))))
36144405Skarels 		return (error);
36239513Skarels 	if (uap->nss && (error = copyin((caddr_t)uap->nss, (caddr_t)&ss,
36339513Skarels 	    sizeof (ss))) == 0)
364*47540Skarels 		p->p_sigacts->ps_sigstack = ss;
36544405Skarels 	return (error);
3667499Sroot }
3677499Sroot 
36842920Skarels /* ARGSUSED */
36942920Skarels kill(cp, uap, retval)
37042920Skarels 	register struct proc *cp;
37142920Skarels 	register struct args {
37212882Ssam 		int	pid;
37312882Ssam 		int	signo;
37442920Skarels 	} *uap;
37542920Skarels 	int *retval;
37642920Skarels {
37718336Smckusick 	register struct proc *p;
378*47540Skarels 	register struct pcred *pc = cp->p_cred;
3798032Sroot 
38039513Skarels 	if ((unsigned) uap->signo >= NSIG)
38144405Skarels 		return (EINVAL);
38218336Smckusick 	if (uap->pid > 0) {
38318336Smckusick 		/* kill single process */
38418336Smckusick 		p = pfind(uap->pid);
38539513Skarels 		if (p == 0)
38644405Skarels 			return (ESRCH);
387*47540Skarels 		if (!CANSIGNAL(cp, pc, p, uap->signo))
38844405Skarels 			return (EPERM);
38939513Skarels 		if (uap->signo)
39018336Smckusick 			psignal(p, uap->signo);
39144405Skarels 		return (0);
39218336Smckusick 	}
39318336Smckusick 	switch (uap->pid) {
39418336Smckusick 	case -1:		/* broadcast signal */
39544405Skarels 		return (killpg1(cp, uap->signo, 0, 1));
39618336Smckusick 	case 0:			/* signal own process group */
39744405Skarels 		return (killpg1(cp, uap->signo, 0, 0));
39818336Smckusick 	default:		/* negative explicit process group */
39944405Skarels 		return (killpg1(cp, uap->signo, -uap->pid, 0));
40018336Smckusick 	}
40139513Skarels 	/* NOTREACHED */
4028032Sroot }
4038032Sroot 
40439513Skarels #ifdef COMPAT_43
40542920Skarels /* ARGSUSED */
40642920Skarels okillpg(p, uap, retval)
40742920Skarels 	struct proc *p;
40842920Skarels 	register struct args {
40937581Smckusick 		int	pgid;
4109989Ssam 		int	signo;
41142920Skarels 	} *uap;
41242920Skarels 	int *retval;
41342920Skarels {
4148032Sroot 
41539513Skarels 	if ((unsigned) uap->signo >= NSIG)
41644405Skarels 		return (EINVAL);
41744405Skarels 	return (killpg1(p, uap->signo, uap->pgid, 0));
4188032Sroot }
41939513Skarels #endif
4208032Sroot 
42142920Skarels /*
42242920Skarels  * Common code for kill process group/broadcast kill.
42342920Skarels  * cp is calling process.
42442920Skarels  */
42542920Skarels killpg1(cp, signo, pgid, all)
42642920Skarels 	register struct proc *cp;
42737581Smckusick 	int signo, pgid, all;
4289989Ssam {
4299989Ssam 	register struct proc *p;
430*47540Skarels 	register struct pcred *pc = cp->p_cred;
43137581Smckusick 	struct pgrp *pgrp;
432*47540Skarels 	int nfound = 0;
43337581Smckusick 
43437581Smckusick 	if (all)
43537581Smckusick 		/*
43637581Smckusick 		 * broadcast
4377421Sroot 		 */
43837581Smckusick 		for (p = allproc; p != NULL; p = p->p_nxt) {
439*47540Skarels 			if (p->p_pid <= 1 || p->p_flag&SSYS ||
440*47540Skarels 			    p == cp || !CANSIGNAL(cp, pc, p, signo))
44137581Smckusick 				continue;
442*47540Skarels 			nfound++;
44337581Smckusick 			if (signo)
44437581Smckusick 				psignal(p, signo);
44537581Smckusick 		}
44637581Smckusick 	else {
44737581Smckusick 		if (pgid == 0)
44837581Smckusick 			/*
44937581Smckusick 			 * zero pgid means send to my process group.
45037581Smckusick 			 */
451*47540Skarels 			pgrp = cp->p_pgrp;
45237581Smckusick 		else {
45337581Smckusick 			pgrp = pgfind(pgid);
45437581Smckusick 			if (pgrp == NULL)
45539513Skarels 				return (ESRCH);
45637581Smckusick 		}
45737581Smckusick 		for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) {
458*47540Skarels 			if (p->p_pid <= 1 || p->p_flag&SSYS ||
459*47540Skarels 			    !CANSIGNAL(cp, pc, p, signo))
46037581Smckusick 				continue;
461*47540Skarels 			nfound++;
46237581Smckusick 			if (signo)
46337581Smckusick 				psignal(p, signo);
46418336Smckusick 		}
4657421Sroot 	}
466*47540Skarels 	return (nfound ? 0 : ESRCH);
4677421Sroot }
4687421Sroot 
46942920Skarels /*
4707421Sroot  * Send the specified signal to
47137581Smckusick  * all processes with 'pgid' as
4727421Sroot  * process group.
4737421Sroot  */
474*47540Skarels void
47537581Smckusick gsignal(pgid, sig)
476*47540Skarels 	int pgid, sig;
4777421Sroot {
47839513Skarels 	struct pgrp *pgrp;
4797421Sroot 
48039513Skarels 	if (pgid && (pgrp = pgfind(pgid)))
48142207Smarc 		pgsignal(pgrp, sig, 0);
4827421Sroot }
48342920Skarels 
48440807Smarc /*
48542207Smarc  * Send sig to every member of a process group.
48642207Smarc  * If checktty is 1, limit to members which have a controlling
48742207Smarc  * terminal.
48840807Smarc  */
489*47540Skarels void
49042207Smarc pgsignal(pgrp, sig, checkctty)
49139513Skarels 	struct pgrp *pgrp;
492*47540Skarels 	int sig, checkctty;
49337581Smckusick {
49437581Smckusick 	register struct proc *p;
49537581Smckusick 
49640807Smarc 	if (pgrp)
49740807Smarc 		for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt)
49842207Smarc 			if (checkctty == 0 || p->p_flag&SCTTY)
49942207Smarc 				psignal(p, sig);
50037581Smckusick }
50137581Smckusick 
5027421Sroot /*
50339513Skarels  * Send a signal caused by a trap to the current process.
50439513Skarels  * If it will be caught immediately, deliver it with correct code.
50539513Skarels  * Otherwise, post it normally.
50639513Skarels  */
507*47540Skarels void
508*47540Skarels trapsignal(p, sig, code)
509*47540Skarels 	struct proc *p;
51039513Skarels 	register int sig;
51139513Skarels 	unsigned code;
51239513Skarels {
513*47540Skarels 	register struct sigacts *ps = p->p_sigacts;
51439513Skarels 	int mask;
51539513Skarels 
51639513Skarels 	mask = sigmask(sig);
51739513Skarels 	if ((p->p_flag & STRC) == 0 && (p->p_sigcatch & mask) != 0 &&
51839513Skarels 	    (p->p_sigmask & mask) == 0) {
519*47540Skarels 		p->p_stats->p_ru.ru_nsignals++;
52040807Smarc #ifdef KTRACE
52140807Smarc 		if (KTRPOINT(p, KTR_PSIG))
522*47540Skarels 			ktrpsig(p->p_tracep, sig, ps->ps_sigact[sig],
52340807Smarc 				p->p_sigmask, code);
52440807Smarc #endif
52546008Swilliam #if	defined(i386)
526*47540Skarels 		sendsig(ps->ps_sigact[sig], sig, p->p_sigmask, code, 0x100);
52746008Swilliam #else
528*47540Skarels 		sendsig(ps->ps_sigact[sig], sig, p->p_sigmask, code);
52946008Swilliam #endif
530*47540Skarels 		p->p_sigmask |= ps->ps_catchmask[sig] | mask;
53139513Skarels 	} else {
532*47540Skarels 		ps->ps_code = code;	/* XXX for core dump/debugger */
53339513Skarels 		psignal(p, sig);
53439513Skarels 	}
53539513Skarels }
53639513Skarels 
53739513Skarels /*
53840807Smarc  * Send the specified signal to the specified process.
539*47540Skarels  * If the signal has an action, the action is usually performed
540*47540Skarels  * by the target process rather than the caller; we simply add
541*47540Skarels  * the signal to the set of pending signals for the process.
54240807Smarc  * Exceptions:
54340807Smarc  *   o When a stop signal is sent to a sleeping process that takes the default
54440807Smarc  *     action, the process is stopped without awakening it.
54540807Smarc  *   o SIGCONT restarts stopped processes (or puts them back to sleep)
54640807Smarc  *     regardless of the signal action (eg, blocked or ignored).
54740807Smarc  * Other ignored signals are discarded immediately.
5487421Sroot  */
549*47540Skarels void
5507421Sroot psignal(p, sig)
5517421Sroot 	register struct proc *p;
5527421Sroot 	register int sig;
5537421Sroot {
554*47540Skarels 	register int s, prop;
55539513Skarels 	register sig_t action;
55617153Sbloom 	int mask;
5577421Sroot 
55839513Skarels 	if ((unsigned)sig >= NSIG || sig == 0)
55939513Skarels 		panic("psignal sig");
56017153Sbloom 	mask = sigmask(sig);
561*47540Skarels 	prop = sigprop[sig];
5627421Sroot 
5637421Sroot 	/*
5647421Sroot 	 * If proc is traced, always give parent a chance.
5657421Sroot 	 */
5667421Sroot 	if (p->p_flag & STRC)
5677421Sroot 		action = SIG_DFL;
5687421Sroot 	else {
5697421Sroot 		/*
57012882Ssam 		 * If the signal is being ignored,
57112882Ssam 		 * then we forget about it immediately.
57239513Skarels 		 * (Note: we don't set SIGCONT in p_sigignore,
57339513Skarels 		 * and if it is set to SIG_IGN,
57439513Skarels 		 * action will be SIG_DFL here.)
5757421Sroot 		 */
57617153Sbloom 		if (p->p_sigignore & mask)
5777421Sroot 			return;
57817153Sbloom 		if (p->p_sigmask & mask)
57912882Ssam 			action = SIG_HOLD;
58017153Sbloom 		else if (p->p_sigcatch & mask)
58112882Ssam 			action = SIG_CATCH;
58242437Skarels 		else
58312882Ssam 			action = SIG_DFL;
5847421Sroot 	}
5857421Sroot 
586*47540Skarels 	if (p->p_nice > NZERO && (sig == SIGKILL ||
587*47540Skarels 	    sig == SIGTERM && (p->p_flag&STRC || action != SIG_DFL)))
588*47540Skarels 		p->p_nice = NZERO;
5897421Sroot 
590*47540Skarels 	if (prop & SA_CONT)
59139513Skarels 		p->p_sig &= ~stopsigmask;
59239513Skarels 
593*47540Skarels 	if (prop & SA_STOP) {
59445672Skarels 		/*
59545672Skarels 		 * If sending a tty stop signal to a member of an orphaned
59645672Skarels 		 * process group, discard the signal here if the action
59745672Skarels 		 * is default; don't stop the process below if sleeping,
59845672Skarels 		 * and don't clear any pending SIGCONT.
59945672Skarels 		 */
600*47540Skarels 		if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0 &&
601*47540Skarels 		    action == SIG_DFL)
60245741Smckusick 		        return;
603*47540Skarels 		p->p_sig &= ~contsigmask;
6047421Sroot 	}
60539513Skarels 	p->p_sig |= mask;
60639513Skarels 
6077421Sroot 	/*
60839513Skarels 	 * Defer further processing for signals which are held,
60939513Skarels 	 * except that stopped processes must be continued by SIGCONT.
6107421Sroot 	 */
611*47540Skarels 	if (action == SIG_HOLD && ((prop & SA_CONT) == 0 || p->p_stat != SSTOP))
6127421Sroot 		return;
61317153Sbloom 	s = splhigh();
6147421Sroot 	switch (p->p_stat) {
6157421Sroot 
6167421Sroot 	case SSLEEP:
6177421Sroot 		/*
61840807Smarc 		 * If process is sleeping uninterruptibly
6197421Sroot 		 * we can't interrupt the sleep... the signal will
6207421Sroot 		 * be noticed when the process returns through
6217421Sroot 		 * trap() or syscall().
6227421Sroot 		 */
62340807Smarc 		if ((p->p_flag & SSINTR) == 0)
6247421Sroot 			goto out;
6257421Sroot 		/*
6267421Sroot 		 * Process is sleeping and traced... make it runnable
6277421Sroot 		 * so it can discover the signal in issig() and stop
6287421Sroot 		 * for the parent.
6297421Sroot 		 */
6307421Sroot 		if (p->p_flag&STRC)
6317421Sroot 			goto run;
63239513Skarels 		/*
63339513Skarels 		 * When a sleeping process receives a stop
63439513Skarels 		 * signal, process immediately if possible.
63539513Skarels 		 * All other (caught or default) signals
63639513Skarels 		 * cause the process to run.
63739513Skarels 		 */
638*47540Skarels 		if (prop & SA_STOP) {
6397421Sroot 			if (action != SIG_DFL)
64039513Skarels 				goto runfast;
6417421Sroot 			/*
642*47540Skarels 			 * If a child holding parent blocked,
643*47540Skarels 			 * stopping could cause deadlock.
6447421Sroot 			 */
645*47540Skarels 			if (p->p_flag&SPPWAIT)
6467421Sroot 				goto out;
64717153Sbloom 			p->p_sig &= ~mask;
64843895Skarels 			p->p_xstat = sig;
64939513Skarels 			if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0)
65039513Skarels 				psignal(p->p_pptr, SIGCHLD);
6517421Sroot 			stop(p);
6527421Sroot 			goto out;
65339513Skarels 		} else
65439513Skarels 			goto runfast;
6557421Sroot 		/*NOTREACHED*/
6567421Sroot 
6577421Sroot 	case SSTOP:
6587421Sroot 		/*
6597421Sroot 		 * If traced process is already stopped,
6607421Sroot 		 * then no further action is necessary.
6617421Sroot 		 */
6627421Sroot 		if (p->p_flag&STRC)
6637421Sroot 			goto out;
6647421Sroot 
665*47540Skarels 		/*
666*47540Skarels 		 * Kill signal always sets processes running.
667*47540Skarels 		 */
668*47540Skarels 		if (sig == SIGKILL)
66939513Skarels 			goto runfast;
6707421Sroot 
671*47540Skarels 		if (prop & SA_CONT) {
6727421Sroot 			/*
67339513Skarels 			 * If SIGCONT is default (or ignored), we continue
67439513Skarels 			 * the process but don't leave the signal in p_sig,
67539513Skarels 			 * as it has no further action.  If SIGCONT is held,
67639513Skarels 			 * continue the process and leave the signal in p_sig.
6777421Sroot 			 * If the process catches SIGCONT, let it handle
6787421Sroot 			 * the signal itself.  If it isn't waiting on
6797421Sroot 			 * an event, then it goes back to run state.
6807421Sroot 			 * Otherwise, process goes back to sleep state.
6817421Sroot 			 */
68239513Skarels 			if (action == SIG_DFL)
68339513Skarels 				p->p_sig &= ~mask;
68439513Skarels 			if (action == SIG_CATCH)
68539513Skarels 				goto runfast;
68639513Skarels 			if (p->p_wchan == 0)
6877421Sroot 				goto run;
6887421Sroot 			p->p_stat = SSLEEP;
6897421Sroot 			goto out;
690*47540Skarels 		}
6917421Sroot 
692*47540Skarels 		if (prop & SA_STOP) {
6937421Sroot 			/*
6947421Sroot 			 * Already stopped, don't need to stop again.
6957421Sroot 			 * (If we did the shell could get confused.)
6967421Sroot 			 */
69717153Sbloom 			p->p_sig &= ~mask;		/* take it away */
6987421Sroot 			goto out;
6997421Sroot 		}
7007421Sroot 
701*47540Skarels 		/*
702*47540Skarels 		 * If process is sleeping interruptibly, then
703*47540Skarels 		 * simulate a wakeup so that when it is continued,
704*47540Skarels 		 * it will be made runnable and can look at the signal.
705*47540Skarels 		 * But don't setrun the process, leave it stopped.
706*47540Skarels 		 */
707*47540Skarels 		if (p->p_wchan && p->p_flag & SSINTR)
708*47540Skarels 			unsleep(p);
709*47540Skarels 		goto out;
710*47540Skarels 
7117421Sroot 	default:
7127421Sroot 		/*
7137421Sroot 		 * SRUN, SIDL, SZOMB do nothing with the signal,
7147421Sroot 		 * other than kicking ourselves if we are running.
7157421Sroot 		 * It will either never be noticed, or noticed very soon.
7167421Sroot 		 */
717*47540Skarels 		if (p == curproc && !noproc)
7187421Sroot 			aston();
7197421Sroot 		goto out;
7207421Sroot 	}
7217421Sroot 	/*NOTREACHED*/
72239513Skarels 
72339513Skarels runfast:
7247421Sroot 	/*
7257421Sroot 	 * Raise priority to at least PUSER.
7267421Sroot 	 */
7277421Sroot 	if (p->p_pri > PUSER)
72817399Skarels 		p->p_pri = PUSER;
72939513Skarels run:
7307421Sroot 	setrun(p);
7317421Sroot out:
7327421Sroot 	splx(s);
7337421Sroot }
7347421Sroot 
7357421Sroot /*
73640807Smarc  * If the current process has a signal to process (should be caught
73740807Smarc  * or cause termination, should interrupt current syscall),
73840807Smarc  * return the signal number.  Stop signals with default action
73940807Smarc  * are processed immediately, then cleared; they aren't returned.
740*47540Skarels  * This is checked after each entry to the system for a syscall
741*47540Skarels  * or trap (though this can usually be done without actually calling
742*47540Skarels  * issig by checking the pending signal masks in the CURSIG macro.)
743*47540Skarels  * The normal call sequence is
744*47540Skarels  *
745*47540Skarels  *	while (sig = CURSIG(curproc))
746*47540Skarels  *		psig(sig);
7477421Sroot  */
748*47540Skarels issig(p)
749*47540Skarels 	register struct proc *p;
7507421Sroot {
751*47540Skarels 	register int sig, mask, prop;
7527421Sroot 
7537421Sroot 	for (;;) {
75439513Skarels 		mask = p->p_sig &~ p->p_sigmask;
755*47540Skarels 		if (p->p_flag&SPPWAIT)
75639513Skarels 			mask &= ~stopsigmask;
75740807Smarc 		if (mask == 0)	 	/* no signal to send */
75840807Smarc 			return (0);
75939513Skarels 		sig = ffs((long)mask);
76017153Sbloom 		mask = sigmask(sig);
761*47540Skarels 		prop = sigprop[sig];
76240807Smarc 		/*
76340807Smarc 		 * We should see pending but ignored signals
76440807Smarc 		 * only if STRC was on when they were posted.
76540807Smarc 		 */
76640807Smarc 		if (mask & p->p_sigignore && (p->p_flag&STRC) == 0) {
76740807Smarc 			p->p_sig &= ~mask;
76840807Smarc 			continue;
76940807Smarc 		}
770*47540Skarels 		if (p->p_flag&STRC && (p->p_flag&SPPWAIT) == 0) {
7717421Sroot 			/*
7727421Sroot 			 * If traced, always stop, and stay
7737421Sroot 			 * stopped until released by the parent.
7747421Sroot 			 */
77543895Skarels 			p->p_xstat = sig;
77618331Skarels 			psignal(p->p_pptr, SIGCHLD);
7777421Sroot 			do {
7787421Sroot 				stop(p);
7797421Sroot 				swtch();
78042926Smckusick 			} while (!procxmt(p) && p->p_flag&STRC);
7817421Sroot 
7827421Sroot 			/*
78314782Ssam 			 * If the traced bit got turned off,
78440807Smarc 			 * go back up to the top to rescan signals.
78514782Ssam 			 * This ensures that p_sig* and u_signal are consistent.
7867421Sroot 			 */
78740807Smarc 			if ((p->p_flag&STRC) == 0)
7887421Sroot 				continue;
7897421Sroot 
7907421Sroot 			/*
7917421Sroot 			 * If parent wants us to take the signal,
79243895Skarels 			 * then it will leave it in p->p_xstat;
7937421Sroot 			 * otherwise we just look for signals again.
7947421Sroot 			 */
79540807Smarc 			p->p_sig &= ~mask;	/* clear the old signal */
79643895Skarels 			sig = p->p_xstat;
7977421Sroot 			if (sig == 0)
7987421Sroot 				continue;
79914782Ssam 
80014782Ssam 			/*
80140807Smarc 			 * Put the new signal into p_sig.
80240807Smarc 			 * If signal is being masked,
80340807Smarc 			 * look for other signals.
80414782Ssam 			 */
80517153Sbloom 			mask = sigmask(sig);
80640807Smarc 			p->p_sig |= mask;
80740807Smarc 			if (p->p_sigmask & mask)
80814782Ssam 				continue;
8097421Sroot 		}
81040807Smarc 
81140807Smarc 		/*
81240807Smarc 		 * Decide whether the signal should be returned.
81340807Smarc 		 * Return the signal's number, or fall through
81440807Smarc 		 * to clear it from the pending mask.
81540807Smarc 		 */
816*47540Skarels 		switch ((int)p->p_sigacts->ps_sigact[sig]) {
8177421Sroot 
8187421Sroot 		case SIG_DFL:
8197421Sroot 			/*
8207421Sroot 			 * Don't take default actions on system processes.
8217421Sroot 			 */
822*47540Skarels 			if (p->p_pid <= 1)
82340807Smarc 				break;		/* == ignore */
82440807Smarc 			/*
82540807Smarc 			 * If there is a pending stop signal to process
82640807Smarc 			 * with default action, stop here,
82742437Skarels 			 * then clear the signal.  However,
82842437Skarels 			 * if process is member of an orphaned
82942437Skarels 			 * process group, ignore tty stop signals.
83040807Smarc 			 */
831*47540Skarels 			if (prop & SA_STOP) {
83242437Skarels 				if (p->p_flag&STRC ||
83342437Skarels 		    		    (p->p_pgrp->pg_jobc == 0 &&
834*47540Skarels 				    prop & SA_TTYSTOP))
83540807Smarc 					break;	/* == ignore */
83643895Skarels 				p->p_xstat = sig;
8377421Sroot 				stop(p);
83839513Skarels 				if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0)
83939513Skarels 					psignal(p->p_pptr, SIGCHLD);
8407421Sroot 				swtch();
84140807Smarc 				break;
842*47540Skarels 			} else if (prop & SA_IGNORE) {
8437421Sroot 				/*
84439513Skarels 				 * Except for SIGCONT, shouldn't get here.
84539513Skarels 				 * Default action is to ignore; drop it.
8467421Sroot 				 */
84740807Smarc 				break;		/* == ignore */
84839513Skarels 			} else
84940807Smarc 				return (sig);
8507421Sroot 			/*NOTREACHED*/
8517421Sroot 
8527421Sroot 		case SIG_IGN:
8537421Sroot 			/*
85439513Skarels 			 * Masking above should prevent us ever trying
85539513Skarels 			 * to take action on an ignored signal other
85639513Skarels 			 * than SIGCONT, unless process is traced.
8577421Sroot 			 */
858*47540Skarels 			if ((prop & SA_CONT) == 0 && (p->p_flag&STRC) == 0)
8597421Sroot 				printf("issig\n");
86040807Smarc 			break;		/* == ignore */
8617421Sroot 
8627421Sroot 		default:
8637421Sroot 			/*
8647421Sroot 			 * This signal has an action, let
8657421Sroot 			 * psig process it.
8667421Sroot 			 */
86740807Smarc 			return (sig);
8687421Sroot 		}
86940807Smarc 		p->p_sig &= ~mask;		/* take the signal! */
8707421Sroot 	}
87140807Smarc 	/* NOTREACHED */
8727421Sroot }
8737421Sroot 
8747421Sroot /*
8757421Sroot  * Put the argument process into the stopped
87618331Skarels  * state and notify the parent via wakeup.
87718331Skarels  * Signals are handled elsewhere.
87840807Smarc  * The process must not be on the run queue.
8797421Sroot  */
8807421Sroot stop(p)
8817421Sroot 	register struct proc *p;
8827421Sroot {
8837421Sroot 
8847421Sroot 	p->p_stat = SSTOP;
8857421Sroot 	p->p_flag &= ~SWTED;
8867421Sroot 	wakeup((caddr_t)p->p_pptr);
8877421Sroot }
8887421Sroot 
8897421Sroot /*
890*47540Skarels  * Take the action for the specified signal
891*47540Skarels  * from the current set of pending signals.
8927421Sroot  */
893*47540Skarels void
89446008Swilliam #if defined(i386)
89546008Swilliam psig(sig, flags)
89646008Swilliam #else
89740807Smarc psig(sig)
89846008Swilliam #endif
89940807Smarc 	register int sig;
9007421Sroot {
901*47540Skarels 	register struct proc *p = curproc;
902*47540Skarels 	register struct sigacts *ps = p->p_sigacts;
903*47540Skarels 	register sig_t action;
90439513Skarels 	int mask, returnmask;
9057421Sroot 
90640807Smarc #ifdef DIAGNOSTIC
907*47540Skarels 	if (sig == 0)
908*47540Skarels 		panic("psig");
90940807Smarc #endif
910*47540Skarels 	mask = sigmask(sig);
911*47540Skarels 	p->p_sig &= ~mask;
912*47540Skarels 	action = ps->ps_sigact[sig];
91340807Smarc #ifdef KTRACE
914*47540Skarels 	if (KTRPOINT(p, KTR_PSIG))
915*47540Skarels 		ktrpsig(p->p_tracep, sig, action, ps->ps_flags & SA_OLDMASK ?
916*47540Skarels 		    ps->ps_oldmask : p->p_sigmask, 0);
91740807Smarc #endif
918*47540Skarels 	if (action == SIG_DFL) {
919*47540Skarels 		/*
920*47540Skarels 		 * Default action, where the default is to kill
921*47540Skarels 		 * the process.  (Other cases were ignored above.)
922*47540Skarels 		 * Mark the accounting record with the signal termination.
923*47540Skarels 		 * If dumping core, save the signal number for the debugger.
924*47540Skarels 		 */
925*47540Skarels 		p->p_acflag |= AXSIG;
926*47540Skarels 		if (sigprop[sig] & SA_CORE) {
927*47540Skarels 			ps->ps_sig = sig;
928*47540Skarels 			if (coredump(p) == 0)
929*47540Skarels 				sig |= WCOREFLAG;
930*47540Skarels 		}
931*47540Skarels 		exit(p, W_EXITCODE(0, sig));
932*47540Skarels 		/* NOTREACHED */
933*47540Skarels 	} else {
934*47540Skarels 		/*
935*47540Skarels 		 * If we get here, the signal must be caught.
936*47540Skarels 		 */
93739513Skarels #ifdef DIAGNOSTIC
938*47540Skarels 		if (action == SIG_IGN || (p->p_sigmask & mask))
939*47540Skarels 			panic("psig action");
94039513Skarels #endif
941*47540Skarels 		/*
942*47540Skarels 		 * Set the new mask value and also defer further
943*47540Skarels 		 * occurences of this signal.
944*47540Skarels 		 *
945*47540Skarels 		 * Special case: user has done a sigpause.  Here the
946*47540Skarels 		 * current mask is not of interest, but rather the
947*47540Skarels 		 * mask from before the sigpause is what we want
948*47540Skarels 		 * restored after the signal processing is completed.
949*47540Skarels 		 */
950*47540Skarels 		(void) splhigh();
951*47540Skarels 		if (ps->ps_flags & SA_OLDMASK) {
952*47540Skarels 			returnmask = ps->ps_oldmask;
953*47540Skarels 			ps->ps_flags &= ~SA_OLDMASK;
954*47540Skarels 		} else
955*47540Skarels 			returnmask = p->p_sigmask;
956*47540Skarels 		p->p_sigmask |= ps->ps_catchmask[sig] | mask;
957*47540Skarels 		(void) spl0();
958*47540Skarels 		p->p_stats->p_ru.ru_nsignals++;
95946008Swilliam #if	defined(i386)
960*47540Skarels 		sendsig(action, sig, returnmask, 0, flags);
96146008Swilliam #else
962*47540Skarels 		sendsig(action, sig, returnmask, 0);
96346008Swilliam #endif
964*47540Skarels 	}
9657421Sroot }
9667421Sroot 
9677421Sroot /*
968*47540Skarels  * Create a core dump.
969*47540Skarels  * The file name should probably be "core.progname"
970*47540Skarels  * (or "mos.progname", or "dram.progname", or ...).
971*47540Skarels  * Core dumps aren't created if the process
9727421Sroot  */
973*47540Skarels coredump(p)
974*47540Skarels 	register struct proc *p;
9757421Sroot {
97637728Smckusick 	register struct vnode *vp;
977*47540Skarels 	register struct pcred *pcred = p->p_cred;
978*47540Skarels 	register struct ucred *cred = pcred->pc_ucred;
979*47540Skarels 	register struct vmspace *vm = p->p_vmspace;
98037580Smckusick 	struct vattr vattr;
98137580Smckusick 	int error;
982*47540Skarels 	struct nameidata nd;
9837421Sroot 
984*47540Skarels 	if (pcred->p_svuid != pcred->p_ruid ||
985*47540Skarels 	    pcred->p_svgid != pcred->p_rgid)
98637580Smckusick 		return (EFAULT);
987*47540Skarels 	if (ctob(UPAGES + vm->vm_dsize + vm->vm_ssize) >=
988*47540Skarels 	    p->p_rlimit[RLIMIT_CORE].rlim_cur)
98937580Smckusick 		return (EFAULT);
990*47540Skarels 	nd.ni_segflg = UIO_SYSSPACE;
991*47540Skarels 	nd.ni_dirp = "core";
992*47540Skarels 	if (error = vn_open(&nd, p, FCREAT|FWRITE, 0644))
99337580Smckusick 		return (error);
994*47540Skarels 	vp = nd.ni_vp;
99538394Smckusick 	VOP_LOCK(vp);
996*47540Skarels 	if (vp->v_type != VREG || VOP_GETATTR(vp, &vattr, cred) ||
99737580Smckusick 	    vattr.va_nlink != 1) {
99838394Smckusick 		vput(vp);
99938394Smckusick 		return (EFAULT);
10007818Sroot 	}
100141362Smckusick 	VATTR_NULL(&vattr);
100237580Smckusick 	vattr.va_size = 0;
1003*47540Skarels 	VOP_SETATTR(vp, &vattr, cred);
1004*47540Skarels 	p->p_acflag |= ACORE;
100542004Smckusick #ifdef HPUXCOMPAT
100642004Smckusick 	/*
100742004Smckusick 	 * BLETCH!  If we loaded from an HPUX format binary file
100842004Smckusick 	 * we have to dump an HPUX style user struct so that the
100942004Smckusick 	 * HPUX debuggers can grok it.
101042004Smckusick 	 */
101142004Smckusick 	if (u.u_pcb.pcb_flags & PCB_HPUXBIN)
1012*47540Skarels 		error = hpuxdumpu(vp, cred);
101342004Smckusick 	else
101442004Smckusick #endif
101537580Smckusick 	error = vn_rdwr(UIO_WRITE, vp, (caddr_t)&u, ctob(UPAGES), (off_t)0,
1016*47540Skarels 	    UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, cred, (int *)0);
101737580Smckusick 	if (error == 0)
1018*47540Skarels 		error = vn_rdwr(UIO_WRITE, vp, vm->vm_daddr,
1019*47540Skarels 		    (int)ctob(vm->vm_dsize), (off_t)ctob(UPAGES), UIO_USERSPACE,
1020*47540Skarels 		    IO_NODELOCKED|IO_UNIT, cred, (int *)0);
102137580Smckusick 	if (error == 0)
102237580Smckusick 		error = vn_rdwr(UIO_WRITE, vp,
1023*47540Skarels 		    trunc_page(USRSTACK - ctob(vm->vm_ssize)),
1024*47540Skarels 		    round_page(ctob(vm->vm_ssize)),
1025*47540Skarels 		    (off_t)ctob(UPAGES) + ctob(vm->vm_dsize), UIO_USERSPACE,
1026*47540Skarels 		    IO_NODELOCKED|IO_UNIT, cred, (int *)0);
102738394Smckusick 	vput(vp);
102837580Smckusick 	return (error);
10297421Sroot }
103039513Skarels 
103139513Skarels /*
103239513Skarels  * Nonexistent system call-- signal process (may want to handle it).
103339513Skarels  * Flag error in case process won't see signal immediately (blocked or ignored).
103439513Skarels  */
103543364Smckusick /* ARGSUSED */
103643364Smckusick nosys(p, args, retval)
103743364Smckusick 	struct proc *p;
103843364Smckusick 	void *args;
103943364Smckusick 	int *retval;
104039513Skarels {
104139513Skarels 
104243364Smckusick 	psignal(p, SIGSYS);
104344405Skarels 	return (EINVAL);
104439513Skarels }
1045