Module Name: src Committed By: martin Date: Fri Mar 31 08:47:04 UTC 2017
Modified Files: src/sys/arch/x86/x86: syscall.c src/sys/kern: kern_fork.c kern_sig.c Log Message: PR kern/52117: move stop code for debuged children after fork into MI code. XXX we might want to revisit this when handling the same event for vfork better. To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.15 src/sys/arch/x86/x86/syscall.c cvs rdiff -u -r1.199 -r1.200 src/sys/kern/kern_fork.c cvs rdiff -u -r1.334 -r1.335 src/sys/kern/kern_sig.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/x86/x86/syscall.c diff -u src/sys/arch/x86/x86/syscall.c:1.14 src/sys/arch/x86/x86/syscall.c:1.15 --- src/sys/arch/x86/x86/syscall.c:1.14 Thu Jul 7 06:55:40 2016 +++ src/sys/arch/x86/x86/syscall.c Fri Mar 31 08:47:04 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: syscall.c,v 1.14 2016/07/07 06:55:40 msaitoh Exp $ */ +/* $NetBSD: syscall.c,v 1.15 2017/03/31 08:47:04 martin Exp $ */ /*- * Copyright (c) 1998, 2000, 2009 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.14 2016/07/07 06:55:40 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.15 2017/03/31 08:47:04 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -65,18 +65,6 @@ child_return(void *arg) { struct lwp *l = arg; struct trapframe *tf = l->l_md.md_regs; - struct proc *p = l->l_proc; - - if (p->p_slflag & PSL_TRACED) { - ksiginfo_t ksi; - - mutex_enter(proc_lock); - KSI_INIT_EMPTY(&ksi); - ksi.ksi_signo = SIGTRAP; - ksi.ksi_lid = l->l_lid; - kpsignal(p, &ksi, NULL); - mutex_exit(proc_lock); - } X86_TF_RAX(tf) = 0; X86_TF_RFLAGS(tf) &= ~PSL_C; Index: src/sys/kern/kern_fork.c diff -u src/sys/kern/kern_fork.c:1.199 src/sys/kern/kern_fork.c:1.200 --- src/sys/kern/kern_fork.c:1.199 Fri Jan 13 23:00:35 2017 +++ src/sys/kern/kern_fork.c Fri Mar 31 08:47:04 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_fork.c,v 1.199 2017/01/13 23:00:35 kamil Exp $ */ +/* $NetBSD: kern_fork.c,v 1.200 2017/03/31 08:47:04 martin 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.199 2017/01/13 23:00:35 kamil Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.200 2017/03/31 08:47:04 martin Exp $"); #include "opt_ktrace.h" #include "opt_dtrace.h" @@ -500,6 +500,17 @@ fork1(struct lwp *l1, int flags, int exi (*p2->p_emul->e_syscall_intern)(p2); #endif + /* if we are being traced, give the owner a chance to interfere */ + if (p2->p_slflag & PSL_TRACED) { + ksiginfo_t ksi; + + KSI_INIT_EMPTY(&ksi); + ksi.ksi_signo = SIGTRAP; + ksi.ksi_code = TRAP_CHLD; + ksi.ksi_lid = l2->l_lid; + kpsignal(p2, &ksi, NULL); + } + /* * Update stats now that we know the fork was successful. */ Index: src/sys/kern/kern_sig.c diff -u src/sys/kern/kern_sig.c:1.334 src/sys/kern/kern_sig.c:1.335 --- src/sys/kern/kern_sig.c:1.334 Fri Mar 24 17:40:44 2017 +++ src/sys/kern/kern_sig.c Fri Mar 31 08:47:04 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sig.c,v 1.334 2017/03/24 17:40:44 christos Exp $ */ +/* $NetBSD: kern_sig.c,v 1.335 2017/03/31 08:47:04 martin 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.334 2017/03/24 17:40:44 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.335 2017/03/31 08:47:04 martin Exp $"); #include "opt_ptrace.h" #include "opt_dtrace.h" @@ -1224,7 +1224,7 @@ kpsignal2(struct proc *p, ksiginfo_t *ks ksiginfo_t *kp; lwpid_t lid; sig_t action; - bool toall; + bool toall, debtrap = false; int error = 0; KASSERT(!cpu_intr_p()); @@ -1237,8 +1237,13 @@ kpsignal2(struct proc *p, ksiginfo_t *ks * If the process is being created by fork, is a zombie or is * exiting, then just drop the signal here and bail out. */ - if (p->p_stat != SACTIVE && p->p_stat != SSTOP) + if (p->p_stat == SIDL && signo == SIGTRAP + && (p->p_slflag & PSL_TRACED)) { + /* allow an initial SIGTRAP for traced processes */ + debtrap = true; + } else if (p->p_stat != SACTIVE && p->p_stat != SSTOP) { return 0; + } /* XXX for core dump/debugger */ p->p_sigctx.ps_lwp = ksi->ksi_lid; @@ -1353,7 +1358,13 @@ kpsignal2(struct proc *p, ksiginfo_t *ks * the signal to it. */ if (lid != 0) { - l = lwp_find(p, lid); + if (__predict_false(debtrap)) { + l = LIST_FIRST(&p->p_lwps); + if (l->l_lid != lid) + l = NULL; + } else { + l = lwp_find(p, lid); + } if (l != NULL) { if ((error = sigput(&l->l_sigpend, p, kp)) != 0) goto out;