Module Name:    src
Committed By:   kamil
Date:           Wed May  1 17:21:55 UTC 2019

Modified Files:
        src/sys/kern: kern_exec.c kern_fork.c kern_sig.c
        src/sys/sys: signalvar.h

Log Message:
Add eventswitch() in signal code

Route all crash and debugger related signal through eventswitch(), that
calls sigswitch() with preprocessed arguments.

This code avoids code duplication and allows to introduce changes that
will affect all callers of sigswitch() in debugger-related events.

No functional change intended.


To generate a diff of this commit:
cvs rdiff -u -r1.462 -r1.463 src/sys/kern/kern_exec.c
cvs rdiff -u -r1.209 -r1.210 src/sys/kern/kern_fork.c
cvs rdiff -u -r1.352 -r1.353 src/sys/kern/kern_sig.c
cvs rdiff -u -r1.91 -r1.92 src/sys/sys/signalvar.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_exec.c
diff -u src/sys/kern/kern_exec.c:1.462 src/sys/kern/kern_exec.c:1.463
--- src/sys/kern/kern_exec.c:1.462	Sun Nov 11 10:55:58 2018
+++ src/sys/kern/kern_exec.c	Wed May  1 17:21:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exec.c,v 1.462 2018/11/11 10:55:58 maxv Exp $	*/
+/*	$NetBSD: kern_exec.c,v 1.463 2019/05/01 17:21:55 kamil 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.462 2018/11/11 10:55:58 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.463 2019/05/01 17:21:55 kamil Exp $");
 
 #include "opt_exec.h"
 #include "opt_execfmt.h"
@@ -1271,11 +1271,7 @@ execve_runproc(struct lwp *l, struct exe
 
 	if ((p->p_slflag & (PSL_TRACED|PSL_SYSCALL)) == PSL_TRACED) {
 		mutex_enter(p->p_lock);
-		p->p_xsig = SIGTRAP;
-		p->p_sigctx.ps_faked = true; // XXX
-		p->p_sigctx.ps_info._signo = p->p_xsig;
-		p->p_sigctx.ps_info._code = TRAP_EXEC;
-		sigswitch(0, SIGTRAP, false);
+		eventswitch(SIGTRAP, TRAP_EXEC);
 		// XXX ktrpoint(KTR_PSIG)
 		mutex_exit(p->p_lock);
 		mutex_enter(proc_lock);

Index: src/sys/kern/kern_fork.c
diff -u src/sys/kern/kern_fork.c:1.209 src/sys/kern/kern_fork.c:1.210
--- src/sys/kern/kern_fork.c:1.209	Sun Apr  7 14:50:41 2019
+++ src/sys/kern/kern_fork.c	Wed May  1 17:21:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_fork.c,v 1.209 2019/04/07 14:50:41 kamil Exp $	*/
+/*	$NetBSD: kern_fork.c,v 1.210 2019/05/01 17:21:55 kamil Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2001, 2004, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.209 2019/04/07 14:50:41 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.210 2019/05/01 17:21:55 kamil Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_dtrace.h"
@@ -575,11 +575,7 @@ fork1(struct lwp *l1, int flags, int exi
 	 */
 	if (tracefork || tracevfork) {
 		mutex_enter(p1->p_lock);
-		p1->p_xsig = SIGTRAP;
-		p1->p_sigctx.ps_faked = true; // XXX
-		p1->p_sigctx.ps_info._signo = p1->p_xsig;
-		p1->p_sigctx.ps_info._code = TRAP_CHLD;
-		sigswitch(0, SIGTRAP, false);
+		eventswitch(SIGTRAP, TRAP_CHLD);
 		// XXX ktrpoint(KTR_PSIG)
 		mutex_exit(p1->p_lock);
 		mutex_enter(proc_lock);
@@ -597,12 +593,8 @@ fork1(struct lwp *l1, int flags, int exi
 	 */
 	if (tracevforkdone) {
 		mutex_enter(p1->p_lock);
-		p1->p_xsig = SIGTRAP;
-		p1->p_sigctx.ps_faked = true; // XXX
-		p1->p_sigctx.ps_info._signo = p1->p_xsig;
-		p1->p_sigctx.ps_info._code = TRAP_CHLD;
 		p1->p_vfpid_done = retval[0];
-		sigswitch(0, SIGTRAP, false);
+		eventswitch(SIGTRAP, TRAP_CHLD);
 		// XXX ktrpoint(KTR_PSIG)
 		mutex_exit(p1->p_lock);
 		// proc_lock unlocked
@@ -627,11 +619,7 @@ child_return(void *arg)
 		}
 
 		mutex_enter(p->p_lock);
-		p->p_xsig = SIGTRAP;
-		p->p_sigctx.ps_faked = true; // XXX
-		p->p_sigctx.ps_info._signo = p->p_xsig;
-		p->p_sigctx.ps_info._code = TRAP_CHLD;
-		sigswitch(0, SIGTRAP, false);
+		eventswitch(SIGTRAP, TRAP_CHLD);
 		// XXX ktrpoint(KTR_PSIG)
 		mutex_exit(p->p_lock);
 	}

Index: src/sys/kern/kern_sig.c
diff -u src/sys/kern/kern_sig.c:1.352 src/sys/kern/kern_sig.c:1.353
--- src/sys/kern/kern_sig.c:1.352	Wed Apr  3 08:34:33 2019
+++ src/sys/kern/kern_sig.c	Wed May  1 17:21:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_sig.c,v 1.352 2019/04/03 08:34:33 kamil Exp $	*/
+/*	$NetBSD: kern_sig.c,v 1.353 2019/05/01 17:21:55 kamil 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.352 2019/04/03 08:34:33 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.353 2019/05/01 17:21:55 kamil Exp $");
 
 #include "opt_ptrace.h"
 #include "opt_dtrace.h"
@@ -914,11 +914,7 @@ trapsignal(struct lwp *l, ksiginfo_t *ks
 
 	if (ISSET(p->p_slflag, PSL_TRACED) &&
 	    !(p->p_pptr == p->p_opptr && ISSET(p->p_lflag, PL_PPWAIT))) {
-		p->p_xsig = signo;
-		p->p_sigctx.ps_faked = true; // XXX
-		p->p_sigctx.ps_info._signo = signo;
-		p->p_sigctx.ps_info._code = ksi->ksi_code;
-		sigswitch(0, signo, false);
+		eventswitch(signo, ksi->ksi_code);
 		// XXX ktrpoint(KTR_PSIG)
 		mutex_exit(p->p_lock);
 		return;
@@ -1537,6 +1533,25 @@ proc_stop_done(struct proc *p, int ppmas
 	}
 }
 
+void
+eventswitch(int signo, int code)
+{
+	struct lwp *l = curlwp;
+	struct proc *p = l->l_proc;
+
+	KASSERT(mutex_owned(proc_lock));
+	KASSERT(mutex_owned(p->p_lock));
+	KASSERT(l->l_stat == LSONPROC);
+	KASSERT(p->p_nrlwps > 0);
+
+	p->p_xsig = signo;
+	p->p_sigctx.ps_faked = true;
+	p->p_sigctx.ps_info._signo = signo;
+	p->p_sigctx.ps_info._code = code;
+
+	sigswitch(0, signo, false);
+}
+
 /*
  * Stop the current process and switch away when being stopped or traced.
  */

Index: src/sys/sys/signalvar.h
diff -u src/sys/sys/signalvar.h:1.91 src/sys/sys/signalvar.h:1.92
--- src/sys/sys/signalvar.h:1.91	Sun May 20 04:00:35 2018
+++ src/sys/sys/signalvar.h	Wed May  1 17:21:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: signalvar.h,v 1.91 2018/05/20 04:00:35 kamil Exp $	*/
+/*	$NetBSD: signalvar.h,v 1.92 2019/05/01 17:21:55 kamil Exp $	*/
 
 /*
  * Copyright (c) 1991, 1993
@@ -136,6 +136,7 @@ void	killproc(struct proc *, const char 
 void	setsigvec(struct proc *, int, struct sigaction *);
 int	killpg1(struct lwp *, struct ksiginfo *, int, int);
 void	proc_unstop(struct proc *p);
+void	eventswitch(int, int);
 void	sigswitch(int, int, bool);
 
 

Reply via email to