Module Name:    src
Committed By:   christos
Date:           Mon Apr  4 20:47:57 UTC 2016

Modified Files:
        src/sys/kern: kern_event.c kern_exec.c kern_exit.c kern_lwp.c
            kern_proc.c kern_sig.c kern_synch.c sys_process.c
        src/sys/miscfs/procfs: procfs_ctl.c
        src/sys/rump/librump/rumpkern: lwproc.c
        src/sys/sys: proc.h

Log Message:
Split p_xstat (composite wait(2) status code, or signal number depending
on context) into:
1. p_xexit:             exit code
2. p_xsig:              signal number
3. p_sflag & WCOREFLAG  bit to indicated that the process core-dumped.

Fix the documentation of the flag bits in <sys/proc.h>


To generate a diff of this commit:
cvs rdiff -u -r1.85 -r1.86 src/sys/kern/kern_event.c
cvs rdiff -u -r1.424 -r1.425 src/sys/kern/kern_exec.c
cvs rdiff -u -r1.251 -r1.252 src/sys/kern/kern_exit.c
cvs rdiff -u -r1.182 -r1.183 src/sys/kern/kern_lwp.c
cvs rdiff -u -r1.194 -r1.195 src/sys/kern/kern_proc.c
cvs rdiff -u -r1.321 -r1.322 src/sys/kern/kern_sig.c
cvs rdiff -u -r1.309 -r1.310 src/sys/kern/kern_synch.c
cvs rdiff -u -r1.167 -r1.168 src/sys/kern/sys_process.c
cvs rdiff -u -r1.47 -r1.48 src/sys/miscfs/procfs/procfs_ctl.c
cvs rdiff -u -r1.38 -r1.39 src/sys/rump/librump/rumpkern/lwproc.c
cvs rdiff -u -r1.327 -r1.328 src/sys/sys/proc.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/kern_event.c
diff -u src/sys/kern/kern_event.c:1.85 src/sys/kern/kern_event.c:1.86
--- src/sys/kern/kern_event.c:1.85	Sat Jan 30 23:40:01 2016
+++ src/sys/kern/kern_event.c	Mon Apr  4 16:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_event.c,v 1.85 2016/01/31 04:40:01 christos Exp $	*/
+/*	$NetBSD: kern_event.c,v 1.86 2016/04/04 20:47:57 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -58,11 +58,12 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_event.c,v 1.85 2016/01/31 04:40:01 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_event.c,v 1.86 2016/04/04 20:47:57 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
+#include <sys/wait.h>
 #include <sys/proc.h>
 #include <sys/file.h>
 #include <sys/select.h>
@@ -551,7 +552,7 @@ filt_proc(struct knote *kn, long hint)
 		struct proc *p = kn->kn_obj;
 
 		if (p != NULL)
-			kn->kn_data = p->p_xstat;
+			kn->kn_data = P_WAITSTATUS(p);
 		/*
 		 * Process is gone, so flag the event as finished.
 		 *

Index: src/sys/kern/kern_exec.c
diff -u src/sys/kern/kern_exec.c:1.424 src/sys/kern/kern_exec.c:1.425
--- src/sys/kern/kern_exec.c:1.424	Sun Mar 20 10:58:10 2016
+++ src/sys/kern/kern_exec.c	Mon Apr  4 16:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exec.c,v 1.424 2016/03/20 14:58:10 khorben Exp $	*/
+/*	$NetBSD: kern_exec.c,v 1.425 2016/04/04 20:47:57 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.424 2016/03/20 14:58:10 khorben Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.425 2016/04/04 20:47:57 christos Exp $");
 
 #include "opt_exec.h"
 #include "opt_execfmt.h"
@@ -1350,7 +1350,7 @@ execve_runproc(struct lwp *l, struct exe
 	/* Acquire the sched-state mutex (exit1() will release it). */
 	if (!is_spawn) {
 		mutex_enter(p->p_lock);
-		exit1(l, W_EXITCODE(error, SIGABRT));
+		exit1(l, error, SIGABRT, 0);
 	}
 
 	return error;
@@ -2229,7 +2229,7 @@ spawn_return(void *arg)
 	 * A NetBSD specific workaround is POSIX_SPAWN_RETURNERROR as
 	 * flag bit in the attrp argument to posix_spawn(2), see above.
 	 */
-	exit1(l, W_EXITCODE(127, 0));
+	exit1(l, 127, 0, 0);
 }
 
 void

Index: src/sys/kern/kern_exit.c
diff -u src/sys/kern/kern_exit.c:1.251 src/sys/kern/kern_exit.c:1.252
--- src/sys/kern/kern_exit.c:1.251	Sun Apr  3 19:50:49 2016
+++ src/sys/kern/kern_exit.c	Mon Apr  4 16:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exit.c,v 1.251 2016/04/03 23:50:49 christos Exp $	*/
+/*	$NetBSD: kern_exit.c,v 1.252 2016/04/04 20:47:57 christos Exp $	*/
 
 /*-
  * Copyright (c) 1998, 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.251 2016/04/03 23:50:49 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.252 2016/04/04 20:47:57 christos Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_dtrace.h"
@@ -138,14 +138,19 @@ exit_psignal(struct proc *p, struct proc
 
 	KSI_INIT(ksi);
 	if ((ksi->ksi_signo = P_EXITSIG(p)) == SIGCHLD) {
-		if (WIFSIGNALED(p->p_xstat)) {
-			if (WCOREDUMP(p->p_xstat))
+		if (p->p_xsig) {
+			if (p->p_sflag & PS_COREDUMP)
 				ksi->ksi_code = CLD_DUMPED;
 			else
 				ksi->ksi_code = CLD_KILLED;
+			ksi->ksi_status = p->p_xsig;
 		} else {
 			ksi->ksi_code = CLD_EXITED;
+			ksi->ksi_status = p->p_xexit;
 		}
+	} else {
+		ksi->ksi_code = SI_USER;
+		ksi->ksi_status = p->p_xsig;
 	}
 	/*
 	 * We fill those in, even for non-SIGCHLD.
@@ -153,7 +158,6 @@ exit_psignal(struct proc *p, struct proc
 	 */
 	ksi->ksi_pid = p->p_pid;
 	ksi->ksi_uid = kauth_cred_geteuid(p->p_cred);
-	ksi->ksi_status = p->p_xstat;
 	/* XXX: is this still valid? */
 	ksi->ksi_utime = p->p_stats->p_ru.ru_utime.tv_sec;
 	ksi->ksi_stime = p->p_stats->p_ru.ru_stime.tv_sec;
@@ -179,7 +183,7 @@ sys_exit(struct lwp *l, const struct sys
 	}
 
 	/* exit1() will release the mutex. */
-	exit1(l, W_EXITCODE(SCARG(uap, rval), 0));
+	exit1(l, SCARG(uap, rval), 0, 0);
 	/* NOTREACHED */
 	return (0);
 }
@@ -192,7 +196,7 @@ sys_exit(struct lwp *l, const struct sys
  * Must be called with p->p_lock held.  Does not return.
  */
 void
-exit1(struct lwp *l, int rv)
+exit1(struct lwp *l, int exitcode, int signo, int coredump)
 {
 	struct proc	*p, *child, *next_child, *old_parent, *new_parent;
 	struct pgrp	*pgrp;
@@ -206,8 +210,7 @@ exit1(struct lwp *l, int rv)
 	KASSERT(p->p_vmspace != NULL);
 
 	if (__predict_false(p == initproc)) {
-		panic("init died (signal %d, exit %d)",
-		    WTERMSIG(rv), WEXITSTATUS(rv));
+		panic("init died (signal %d, exit %d)", signo, exitcode);
 	}
 
 	p->p_sflag |= PS_WEXIT;
@@ -269,7 +272,7 @@ exit1(struct lwp *l, int rv)
 	 */
 	rw_enter(&p->p_reflock, RW_WRITER);
 
-	DPRINTF(("exit1: %d.%d exiting.\n", p->p_pid, l->l_lid));
+	DPRINTF(("%s: %d.%d exiting.\n", __func__, p->p_pid, l->l_lid));
 
 	timers_free(p, TIMERS_ALL);
 #if defined(__HAVE_RAS)
@@ -302,13 +305,17 @@ exit1(struct lwp *l, int rv)
 	}
 #endif
 
+	p->p_xexit = exitcode;
+	p->p_xsig = signo;
+	if (coredump)
+		p->p_sflag |= PS_COREDUMP;
+
 	/*
 	 * If emulation has process exit hook, call it now.
 	 * Set the exit status now so that the exit hook has
 	 * an opportunity to tweak it (COMPAT_LINUX requires
 	 * this for thread group emulation)
 	 */
-	p->p_xstat = rv;
 	if (p->p_emul->e_proc_exit)
 		(*p->p_emul->e_proc_exit)(p);
 
@@ -423,8 +430,8 @@ exit1(struct lwp *l, int rv)
 	KNOTE(&p->p_klist, NOTE_EXIT);
 
 	SDT_PROBE(proc, kernel, , exit,
-		(WCOREDUMP(rv) ? CLD_DUMPED :
-		 (WIFSIGNALED(rv) ? CLD_KILLED : CLD_EXITED)),
+		((p->p_sflag & PS_COREDUMP) ? CLD_DUMPED :
+		 (p->p_xsig ? CLD_KILLED : CLD_EXITED)),
 		0,0,0,0);
 
 #if PERFCTRS
@@ -869,15 +876,15 @@ match_process(struct proc *pp, struct pr
 		 *  This is still a rough estimate.  We will fix the
 		 *  cases TRAPPED, STOPPED, and CONTINUED later.
 		 */
-		if (WCOREDUMP(p->p_xstat)) {
+		if (p->p_sflag & PS_COREDUMP) {
 			siginfo->si_code = CLD_DUMPED;
-			siginfo->si_status = WTERMSIG(p->p_xstat);
-		} else if (WIFSIGNALED(p->p_xstat)) {
+			siginfo->si_status = p->p_xsig;
+		} else if (p->p_xsig) {
 			siginfo->si_code = CLD_KILLED;
-			siginfo->si_status = WTERMSIG(p->p_xstat);
+			siginfo->si_status = p->p_xsig;
 		} else {
 			siginfo->si_code = CLD_EXITED;
-			siginfo->si_status = WEXITSTATUS(p->p_xstat);
+			siginfo->si_status = p->p_xexit;
 		}
 
 		siginfo->si_pid = p->p_pid;
@@ -991,13 +998,13 @@ find_stopped_child(struct proc *parent, 
 			}
 
 			if ((options & WCONTINUED) != 0 &&
-			    child->p_xstat == SIGCONT) {
+			    child->p_xsig == SIGCONT) {
 				if ((options & WNOWAIT) == 0) {
 					child->p_waited = 1;
 					parent->p_nstopchild--;
 				}
 				if (si) {
-					si->si_status = child->p_xstat;
+					si->si_status = child->p_xsig;
 					si->si_code = CLD_CONTINUED;
 				}
 				break;
@@ -1013,7 +1020,7 @@ find_stopped_child(struct proc *parent, 
 					parent->p_nstopchild--;
 				}
 				if (si) {
-					si->si_status = child->p_xstat;
+					si->si_status = child->p_xsig;
 					si->si_code = 
 					    (child->p_slflag & PSL_TRACED) ?
 					    CLD_TRAPPED : CLD_STOPPED;
@@ -1030,7 +1037,7 @@ find_stopped_child(struct proc *parent, 
 		if (child != NULL || error != 0 ||
 		    ((options & WNOHANG) != 0 && dead == NULL)) {
 		    	if (child != NULL) {
-			    	*status_p = child->p_xstat;
+			    	*status_p = child->p_xsig;
 			}
 			*child_p = child;
 			return error;
@@ -1109,7 +1116,8 @@ proc_free(struct proc *p, struct wrusage
 		wru->wru_self = p->p_stats->p_ru;
 		wru->wru_children = p->p_stats->p_cru;
 	}
-	p->p_xstat = 0;
+	p->p_xsig = 0;
+	p->p_xexit = 0;
 
 	/*
 	 * At this point we are going to start freeing the final resources. 

Index: src/sys/kern/kern_lwp.c
diff -u src/sys/kern/kern_lwp.c:1.182 src/sys/kern/kern_lwp.c:1.183
--- src/sys/kern/kern_lwp.c:1.182	Thu Nov 26 08:15:34 2015
+++ src/sys/kern/kern_lwp.c	Mon Apr  4 16:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_lwp.c,v 1.182 2015/11/26 13:15:34 martin Exp $	*/
+/*	$NetBSD: kern_lwp.c,v 1.183 2016/04/04 20:47:57 christos Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -211,7 +211,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.182 2015/11/26 13:15:34 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.183 2016/04/04 20:47:57 christos Exp $");
 
 #include "opt_ddb.h"
 #include "opt_lockdebug.h"
@@ -509,7 +509,7 @@ lwp_unstop(struct lwp *l)
 	if (l->l_wchan == NULL) {
 		/* setrunnable() will release the lock. */
 		setrunnable(l);
-	} else if (p->p_xstat && (l->l_flag & LW_SINTR) != 0) {
+	} else if (p->p_xsig && (l->l_flag & LW_SINTR) != 0) {
 		/* setrunnable() so we can receive the signal */
 		setrunnable(l);
 	} else {
@@ -1043,7 +1043,7 @@ lwp_exit(struct lwp *l)
 		KASSERT(current == true);
 		KASSERT(p != &proc0);
 		/* XXXSMP kernel_lock not held */
-		exit1(l, 0);
+		exit1(l, 0, 0, 0);
 		/* NOTREACHED */
 	}
 	p->p_nzlwps++;

Index: src/sys/kern/kern_proc.c
diff -u src/sys/kern/kern_proc.c:1.194 src/sys/kern/kern_proc.c:1.195
--- src/sys/kern/kern_proc.c:1.194	Thu Sep 24 10:33:01 2015
+++ src/sys/kern/kern_proc.c	Mon Apr  4 16:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_proc.c,v 1.194 2015/09/24 14:33:01 christos Exp $	*/
+/*	$NetBSD: kern_proc.c,v 1.195 2016/04/04 20:47:57 christos Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.194 2015/09/24 14:33:01 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.195 2016/04/04 20:47:57 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_kstack.h"
@@ -2283,7 +2283,7 @@ fill_kproc2(struct proc *p, struct kinfo
 	ki->p_stat = p->p_stat; /* Will likely be overridden by LWP status */
 	ki->p_realstat = p->p_stat;
 	ki->p_nice = p->p_nice;
-	ki->p_xstat = p->p_xstat;
+	ki->p_xstat = P_WAITSTATUS(p);
 	ki->p_acflag = p->p_acflag;
 
 	strncpy(ki->p_comm, p->p_comm,

Index: src/sys/kern/kern_sig.c
diff -u src/sys/kern/kern_sig.c:1.321 src/sys/kern/kern_sig.c:1.322
--- src/sys/kern/kern_sig.c:1.321	Tue Oct 13 03:00:59 2015
+++ src/sys/kern/kern_sig.c	Mon Apr  4 16:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_sig.c,v 1.321 2015/10/13 07:00:59 pgoyette Exp $	*/
+/*	$NetBSD: kern_sig.c,v 1.322 2016/04/04 20:47:57 christos Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.321 2015/10/13 07:00:59 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.322 2016/04/04 20:47:57 christos Exp $");
 
 #include "opt_ptrace.h"
 #include "opt_dtrace.h"
@@ -916,19 +916,19 @@ child_psignal(struct proc *p, int mask)
 {
 	ksiginfo_t ksi;
 	struct proc *q;
-	int xstat;
+	int xsig;
 
 	KASSERT(mutex_owned(proc_lock));
 	KASSERT(mutex_owned(p->p_lock));
 
-	xstat = p->p_xstat;
+	xsig = p->p_xsig;
 
 	KSI_INIT(&ksi);
 	ksi.ksi_signo = SIGCHLD;
-	ksi.ksi_code = (xstat == SIGCONT ? CLD_CONTINUED : CLD_STOPPED);
+	ksi.ksi_code = (xsig == SIGCONT ? CLD_CONTINUED : CLD_STOPPED);
 	ksi.ksi_pid = p->p_pid;
 	ksi.ksi_uid = kauth_cred_geteuid(p->p_cred);
-	ksi.ksi_status = xstat;
+	ksi.ksi_status = xsig;
 	ksi.ksi_utime = p->p_stats->p_ru.ru_utime.tv_sec;
 	ksi.ksi_stime = p->p_stats->p_ru.ru_stime.tv_sec;
 
@@ -1566,7 +1566,7 @@ sigchecktrace(void)
 	 * If we are no longer being traced, or the parent didn't
 	 * give us a signal, or we're stopping, look for more signals.
 	 */
-	if ((p->p_slflag & PSL_TRACED) == 0 || p->p_xstat == 0 ||
+	if ((p->p_slflag & PSL_TRACED) == 0 || p->p_xsig == 0 ||
 	    (p->p_sflag & PS_STOPPING) != 0)
 		return 0;
 
@@ -1574,8 +1574,8 @@ sigchecktrace(void)
 	 * If the new signal is being masked, look for other signals.
 	 * `p->p_sigctx.ps_siglist |= mask' is done in setrunnable().
 	 */
-	signo = p->p_xstat;
-	p->p_xstat = 0;
+	signo = p->p_xsig;
+	p->p_xsig = 0;
 	if (sigismember(&l->l_sigmask, signo)) {
 		signo = 0;
 	}
@@ -1685,7 +1685,7 @@ issignal(struct lwp *l)
 			 */
 			if (sp)
 				sigdelset(&sp->sp_set, signo);
-			p->p_xstat = signo;
+			p->p_xsig = signo;
 
 			/* Emulation-specific handling of signal trace */
 			if (p->p_emul->e_tracesig == NULL ||
@@ -1742,9 +1742,9 @@ issignal(struct lwp *l)
 				}
 				/* Take the signal. */
 				(void)sigget(sp, NULL, signo, NULL);
-				p->p_xstat = signo;
+				p->p_xsig = signo;
 				signo = 0;
-				sigswitch(true, PS_NOCLDSTOP, p->p_xstat);
+				sigswitch(true, PS_NOCLDSTOP, p->p_xsig);
 			} else if (prop & SA_IGNORE) {
 				/*
 				 * Except for SIGCONT, shouldn't get here.
@@ -1946,7 +1946,7 @@ killproc(struct proc *p, const char *why
 void
 sigexit(struct lwp *l, int signo)
 {
-	int exitsig, error, docore;
+	int exitsig, error, docore, coreflag = 0;
 	struct proc *p;
 	struct lwp *t;
 
@@ -2018,7 +2018,7 @@ sigexit(struct lwp *l, int signo)
 	if (docore) {
 		mutex_exit(p->p_lock);
 		if ((error = (*coredump_vec)(l, NULL)) == 0)
-			exitsig |= WCOREFLAG;
+			coreflag = 1;
 
 		if (kern_logsigexit) {
 			int uid = l->l_cred ?
@@ -2042,7 +2042,7 @@ sigexit(struct lwp *l, int signo)
 	/* No longer dumping core. */
 	p->p_sflag &= ~PS_WCORE;
 
-	exit1(l, W_EXITCODE(0, exitsig));
+	exit1(l, 0, exitsig, coreflag);
 	/* NOTREACHED */
 }
 
@@ -2183,7 +2183,7 @@ proc_unstop(struct proc *p)
 
 	p->p_stat = SACTIVE;
 	p->p_sflag &= ~PS_STOPPING;
-	sig = p->p_xstat;
+	sig = p->p_xsig;
 
 	if (!p->p_waited)
 		p->p_pptr->p_nstopchild--;

Index: src/sys/kern/kern_synch.c
diff -u src/sys/kern/kern_synch.c:1.309 src/sys/kern/kern_synch.c:1.310
--- src/sys/kern/kern_synch.c:1.309	Mon Oct 12 20:25:51 2015
+++ src/sys/kern/kern_synch.c	Mon Apr  4 16:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_synch.c,v 1.309 2015/10/13 00:25:51 pgoyette Exp $	*/
+/*	$NetBSD: kern_synch.c,v 1.310 2016/04/04 20:47:57 christos Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2004, 2006, 2007, 2008, 2009
@@ -69,7 +69,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_synch.c,v 1.309 2015/10/13 00:25:51 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_synch.c,v 1.310 2016/04/04 20:47:57 christos Exp $");
 
 #include "opt_kstack.h"
 #include "opt_perfctrs.h"
@@ -907,7 +907,7 @@ setrunnable(struct lwp *l)
 		 * If we're being traced (possibly because someone attached us
 		 * while we were stopped), check for a signal from the debugger.
 		 */
-		if ((p->p_slflag & PSL_TRACED) != 0 && p->p_xstat != 0)
+		if ((p->p_slflag & PSL_TRACED) != 0 && p->p_xsig != 0)
 			signotify(l);
 		p->p_nrlwps++;
 		break;

Index: src/sys/kern/sys_process.c
diff -u src/sys/kern/sys_process.c:1.167 src/sys/kern/sys_process.c:1.168
--- src/sys/kern/sys_process.c:1.167	Sat Jan  9 02:52:38 2016
+++ src/sys/kern/sys_process.c	Mon Apr  4 16:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_process.c,v 1.167 2016/01/09 07:52:38 dholland Exp $	*/
+/*	$NetBSD: sys_process.c,v 1.168 2016/04/04 20:47:57 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -118,7 +118,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_process.c,v 1.167 2016/01/09 07:52:38 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_process.c,v 1.168 2016/04/04 20:47:57 christos Exp $");
 
 #include "opt_ptrace.h"
 #include "opt_ktrace.h"
@@ -740,7 +740,7 @@ sys_ptrace(struct lwp *l, const struct s
 			 * signal, make all efforts to ensure that at
 			 * an LWP runs to see it.
 			 */
-			t->p_xstat = signo;
+			t->p_xsig = signo;
 			if (resume_all)
 				proc_unstop(t);
 			else
@@ -1146,7 +1146,7 @@ process_stoptrace(void)
 		return;
 	}
 
-	p->p_xstat = SIGTRAP;
+	p->p_xsig = SIGTRAP;
 	proc_stop(p, 1, SIGSTOP);
 	mutex_exit(proc_lock);
 

Index: src/sys/miscfs/procfs/procfs_ctl.c
diff -u src/sys/miscfs/procfs/procfs_ctl.c:1.47 src/sys/miscfs/procfs/procfs_ctl.c:1.48
--- src/sys/miscfs/procfs/procfs_ctl.c:1.47	Wed Oct 21 17:12:06 2009
+++ src/sys/miscfs/procfs/procfs_ctl.c	Mon Apr  4 16:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: procfs_ctl.c,v 1.47 2009/10/21 21:12:06 rmind Exp $	*/
+/*	$NetBSD: procfs_ctl.c,v 1.48 2016/04/04 20:47:57 christos Exp $	*/
 
 /*
  * Copyright (c) 1993
@@ -72,7 +72,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_ctl.c,v 1.47 2009/10/21 21:12:06 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_ctl.c,v 1.48 2016/04/04 20:47:57 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -317,7 +317,7 @@ procfs_control(struct lwp *curl, struct 
 		/* Finally, deliver the requested signal (or none). */
 		lwp_lock(l);
 		if (l->l_stat == LSSTOP) {
-			p->p_xstat = sig;
+			p->p_xsig = sig;
 			/* setrunnable() will release the lock. */
 			setrunnable(l);
 		} else {

Index: src/sys/rump/librump/rumpkern/lwproc.c
diff -u src/sys/rump/librump/rumpkern/lwproc.c:1.38 src/sys/rump/librump/rumpkern/lwproc.c:1.39
--- src/sys/rump/librump/rumpkern/lwproc.c:1.38	Mon Feb  8 13:18:19 2016
+++ src/sys/rump/librump/rumpkern/lwproc.c	Mon Apr  4 16:47:57 2016
@@ -1,4 +1,4 @@
-/*      $NetBSD: lwproc.c,v 1.38 2016/02/08 18:18:19 pooka Exp $	*/
+/*      $NetBSD: lwproc.c,v 1.39 2016/04/04 20:47:57 christos Exp $	*/
 
 /*
  * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
 #define RUMP__CURLWP_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.38 2016/02/08 18:18:19 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.39 2016/04/04 20:47:57 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -211,7 +211,7 @@ lwproc_newproc(struct proc *parent, stru
 	p->p_mqueue_cnt = p->p_exitsig = 0;
 	p->p_flag = p->p_sflag = p->p_slflag = p->p_lflag = p->p_stflag = 0;
 	p->p_trace_enabled = 0;
-	p->p_xstat = p->p_acflag = 0;
+	p->p_xsig = p->p_xexit = p->p_acflag = 0;
 	p->p_stackbase = 0;
 
 	p->p_stats = pstatscopy(parent->p_stats);

Index: src/sys/sys/proc.h
diff -u src/sys/sys/proc.h:1.327 src/sys/sys/proc.h:1.328
--- src/sys/sys/proc.h:1.327	Mon Nov 30 20:19:02 2015
+++ src/sys/sys/proc.h	Mon Apr  4 16:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: proc.h,v 1.327 2015/12/01 01:19:02 pgoyette Exp $	*/
+/*	$NetBSD: proc.h,v 1.328 2016/04/04 20:47:57 christos Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -326,12 +326,12 @@ struct proc {
 	vaddr_t		p_psstrp;	/* :: address of process's ps_strings */
 	u_int		p_pax;		/* :: PAX flags */
 
+	int		p_xexit;	/* p: exit code */
 /*
  * End area that is copied on creation
  */
-#define	p_endcopy	p_xstat
-
-	u_short		p_xstat;	/* p: Exit status for wait; also stop signal */
+#define	p_endcopy	p_xsig
+	u_short		p_xsig;		/* p: stop signal */
 	u_short		p_acflag;	/* p: Acc. flags; see struct lwp also */
 	struct mdproc	p_md;		/* p: Any machine-dependent fields */
 	vaddr_t		p_stackbase;	/* :: ASLR randomized stack base */
@@ -383,10 +383,11 @@ struct proc {
 #define	PS_STOPEXEC	0x01000000 /* Will be stopped on exec(2) */
 #define	PS_STOPEXIT	0x02000000 /* Will be stopped at process exit */
 #define	PS_NOTIFYSTOP	0x10000000 /* Notify parent of successful STOP */
+#define	PS_COREDUMP	0x20000000 /* Process core-dumped */
 #define	PS_STOPPING	0x80000000 /* Transitioning SACTIVE -> SSTOP */
 
 /*
- * These flags are kept in p_sflag and are protected by the proc_lock
+ * These flags are kept in p_slflag and are protected by the proc_lock
  * and p_lock.  Access from process context only.
  */
 #define	PSL_TRACEFORK	0x00000001 /* traced process wants fork events */
@@ -402,7 +403,7 @@ struct proc {
 #define	PST_PROFIL	0x00000020 /* Has started profiling */
 
 /*
- * The final set are protected by the proc_lock.  Access
+ * Kept in p_lflag and protected by the proc_lock.  Access
  * from process context only.
  */
 #define	PL_CONTROLT	0x00000002 /* Has a controlling terminal */
@@ -417,6 +418,11 @@ struct proc {
  */
 #define	P_EXITSIG(p)	\
     (((p)->p_slflag & (PSL_TRACED|PSL_FSTRACE)) ? SIGCHLD : p->p_exitsig)
+/*
+ * Compute a wait(2) 16 bit exit status code
+ */
+#define P_WAITSTATUS(p) W_EXITCODE((p)->p_xexit, ((p)->p_xsig | \
+    (((p)->p_sflag & PS_COREDUMP) ? WCOREFLAG : 0)))
 
 LIST_HEAD(proclist, proc);		/* A list of processes */
 
@@ -485,7 +491,7 @@ int	tsleep(wchan_t, pri_t, const char *,
 int	mtsleep(wchan_t, pri_t, const char *, int, kmutex_t *);
 void	wakeup(wchan_t);
 int	kpause(const char *, bool, int, kmutex_t *);
-void	exit1(struct lwp *, int) __dead;
+void	exit1(struct lwp *, int, int, int) __dead;
 int	kill1(struct lwp *l, pid_t pid, ksiginfo_t *ksi, register_t *retval);
 int	do_sys_wait(int *, int *, int, struct rusage *);
 struct proc *proc_alloc(void);

Reply via email to