Module Name:    src
Committed By:   christos
Date:           Fri Mar 24 17:40:44 UTC 2017

Modified Files:
        src/sys/kern: kern_sig.c kern_syscall.c sys_process.c
        src/sys/sys: proc.h ptrace.h

Log Message:
Instead of copying parts of sigswitch to process_stoptrace, use it directly.
Rename process_stoptrace -> proc_stoptrace and put it in kern_sig.c so we
don't need to expose any more functions from it.


To generate a diff of this commit:
cvs rdiff -u -r1.333 -r1.334 src/sys/kern/kern_sig.c
cvs rdiff -u -r1.15 -r1.16 src/sys/kern/kern_syscall.c
cvs rdiff -u -r1.177 -r1.178 src/sys/kern/sys_process.c
cvs rdiff -u -r1.338 -r1.339 src/sys/sys/proc.h
cvs rdiff -u -r1.59 -r1.60 src/sys/sys/ptrace.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_sig.c
diff -u src/sys/kern/kern_sig.c:1.333 src/sys/kern/kern_sig.c:1.334
--- src/sys/kern/kern_sig.c:1.333	Thu Mar 23 17:59:55 2017
+++ src/sys/kern/kern_sig.c	Fri Mar 24 13:40:44 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_sig.c,v 1.333 2017/03/23 21:59:55 christos Exp $	*/
+/*	$NetBSD: kern_sig.c,v 1.334 2017/03/24 17:40:44 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.333 2017/03/23 21:59:55 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.334 2017/03/24 17:40:44 christos Exp $");
 
 #include "opt_ptrace.h"
 #include "opt_dtrace.h"
@@ -83,6 +83,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v
 #include <sys/param.h>
 #include <sys/signalvar.h>
 #include <sys/proc.h>
+#include <sys/ptrace.h>
 #include <sys/systm.h>
 #include <sys/wait.h>
 #include <sys/ktrace.h>
@@ -116,6 +117,7 @@ static sigset_t		stopsigmask	__cacheline
 sigset_t		sigcantmask	__cacheline_aligned;
 
 static void	ksiginfo_exechook(struct proc *, void *);
+static void	proc_stop(struct proc *, int);
 static void	proc_stop_callout(void *);
 static int	sigchecktrace(void);
 static int	sigpost(struct lwp *, sig_t, int, int);
@@ -1535,7 +1537,7 @@ sigswitch(bool ppsig, int ppmask, int si
 	 */
 	if (p->p_stat == SACTIVE && (p->p_sflag & PS_STOPPING) == 0) {
 		KASSERT(signo != 0);
-		proc_stop(p, 0, signo);
+		proc_stop(p, signo);
 		KASSERT(p->p_nrlwps > 0);
 	}
 
@@ -2099,7 +2101,7 @@ sigexit(struct lwp *l, int signo)
  * Put process 'p' into the stopped state and optionally, notify the parent.
  */
 void
-proc_stop(struct proc *p, int now, int signo)
+proc_stop(struct proc *p, int signo)
 {
 	struct lwp *l;
 
@@ -2121,7 +2123,7 @@ proc_stop(struct proc *p, int now, int s
 	 * LWP to stop will take care of it.
 	 */
 
-	if (p->p_nrlwps == 0 || (now && p->p_nrlwps == 1 && p == curproc)) {
+	if (p->p_nrlwps == 0) {
 		proc_stop_done(p, true, PS_NOCLDSTOP);
 	} else {
 		/*
@@ -2254,6 +2256,27 @@ proc_unstop(struct proc *p)
 	}
 }
 
+void
+proc_stoptrace(int trapno)
+{
+	struct lwp *l = curlwp;
+	struct proc *p = l->l_proc, *pp;
+
+	mutex_enter(p->p_lock);
+	pp = p->p_pptr;
+	if (pp->p_pid == 1) {
+		CLR(p->p_slflag, PSL_SYSCALL);	/* XXXSMP */
+		mutex_exit(p->p_lock);
+		return;
+	}
+
+	p->p_xsig = SIGTRAP;
+	p->p_sigctx.ps_info._signo = p->p_xsig;
+	p->p_sigctx.ps_info._code = trapno;
+	sigswitch(true, 0, p->p_xsig);
+	mutex_exit(p->p_lock);
+}
+
 static int
 filt_sigattach(struct knote *kn)
 {

Index: src/sys/kern/kern_syscall.c
diff -u src/sys/kern/kern_syscall.c:1.15 src/sys/kern/kern_syscall.c:1.16
--- src/sys/kern/kern_syscall.c:1.15	Thu Mar 23 17:59:55 2017
+++ src/sys/kern/kern_syscall.c	Fri Mar 24 13:40:44 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_syscall.c,v 1.15 2017/03/23 21:59:55 christos Exp $	*/
+/*	$NetBSD: kern_syscall.c,v 1.16 2017/03/24 17:40:44 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_syscall.c,v 1.15 2017/03/23 21:59:55 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_syscall.c,v 1.16 2017/03/24 17:40:44 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_modular.h"
@@ -248,7 +248,7 @@ trace_enter(register_t code, const struc
 #ifdef PTRACE
 	if ((curlwp->l_proc->p_slflag & (PSL_SYSCALL|PSL_TRACED)) ==
 	    (PSL_SYSCALL|PSL_TRACED)) {
-		process_stoptrace(TRAP_SCE);
+		proc_stoptrace(TRAP_SCE);
 		if (curlwp->l_proc->p_slflag & PSL_SYSCALLEMU) {
 			/* tracer will emulate syscall for us */
 			error = EJUSTRETURN;
@@ -289,7 +289,7 @@ trace_exit(register_t code, const struct
 #ifdef PTRACE
 	if ((p->p_slflag & (PSL_SYSCALL|PSL_TRACED|PSL_SYSCALLEMU)) ==
 	    (PSL_SYSCALL|PSL_TRACED)) {
-		process_stoptrace(TRAP_SCX);
+		proc_stoptrace(TRAP_SCX);
 	}
 	CLR(p->p_slflag, PSL_SYSCALLEMU);
 #endif

Index: src/sys/kern/sys_process.c
diff -u src/sys/kern/sys_process.c:1.177 src/sys/kern/sys_process.c:1.178
--- src/sys/kern/sys_process.c:1.177	Thu Mar 23 17:59:55 2017
+++ src/sys/kern/sys_process.c	Fri Mar 24 13:40:44 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_process.c,v 1.177 2017/03/23 21:59:55 christos Exp $	*/
+/*	$NetBSD: sys_process.c,v 1.178 2017/03/24 17:40:44 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.177 2017/03/23 21:59:55 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_process.c,v 1.178 2017/03/24 17:40:44 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ptrace.h"
@@ -185,44 +185,6 @@ process_domem(struct lwp *curl /*tracer*
 #endif
 	return error;
 }
-
-void
-process_stoptrace(int trapno)
-{
-	struct lwp *l = curlwp;
-	struct proc *p = l->l_proc, *pp;
-
-	mutex_enter(p->p_lock);
-	mutex_enter(proc_lock);
-	pp = p->p_pptr;
-	if (pp->p_pid == 1) {
-		CLR(p->p_slflag, PSL_SYSCALL);	/* XXXSMP */
-		mutex_exit(p->p_lock);
-		mutex_exit(proc_lock);
-		return;
-	}
-
-	p->p_sigctx.ps_info._signo = SIGTRAP;
-	p->p_sigctx.ps_info._code = trapno;
-	p->p_xsig = SIGTRAP;
-	proc_stop(p, 1, SIGSTOP);
-	mutex_exit(proc_lock);
-
-	if (sigispending(l, 0)) {
-		lwp_lock(l);
-		l->l_flag |= LW_PENDSIG;
-		lwp_unlock(l);
-	}
-	/* Switch and wait until we come to a stop */
-	do {
-		mutex_exit(p->p_lock);
-		lwp_lock(l);
-		mi_switch(l);
-		mutex_enter(p->p_lock);
-	} while (p->p_sflag & PS_STOPPING);
-
-	mutex_exit(p->p_lock);
-}
 #endif	/* KTRACE || PTRACE_HOOKS */
 
 /*

Index: src/sys/sys/proc.h
diff -u src/sys/sys/proc.h:1.338 src/sys/sys/proc.h:1.339
--- src/sys/sys/proc.h:1.338	Wed Feb 22 22:34:23 2017
+++ src/sys/sys/proc.h	Fri Mar 24 13:40:44 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: proc.h,v 1.338 2017/02/23 03:34:23 kamil Exp $	*/
+/*	$NetBSD: proc.h,v 1.339 2017/03/24 17:40:44 christos Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -538,7 +538,6 @@ void	syscall_intern(struct proc *);
 void	child_return(void *);
 
 int	proc_isunder(struct proc *, struct lwp *);
-void	proc_stop(struct proc *, int, int);
 int	proc_uidmatch(kauth_cred_t, kauth_cred_t);
 
 int	proc_vmspace_getref(struct proc *, struct vmspace **);

Index: src/sys/sys/ptrace.h
diff -u src/sys/sys/ptrace.h:1.59 src/sys/sys/ptrace.h:1.60
--- src/sys/sys/ptrace.h:1.59	Thu Mar 23 17:59:54 2017
+++ src/sys/sys/ptrace.h	Fri Mar 24 13:40:44 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ptrace.h,v 1.59 2017/03/23 21:59:54 christos Exp $	*/
+/*	$NetBSD: ptrace.h,v 1.60 2017/03/24 17:40:44 christos Exp $	*/
 
 /*-
  * Copyright (c) 1984, 1993
@@ -208,8 +208,7 @@ int	process_validdbregs(struct lwp *);
 
 int	process_domem(struct lwp *, struct lwp *, struct uio *);
 
-void	process_stoptrace(int);
-
+void	proc_stoptrace(int);
 void	proc_reparent(struct proc *, struct proc *);
 void	proc_changeparent(struct proc *, struct proc *);
 

Reply via email to