Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/kern Correct passing debugger related events for LWP cre...



details:   https://anonhg.NetBSD.org/src/rev/9f41df3d0c41
branches:  trunk
changeset: 450977:9f41df3d0c41
user:      kamil <kamil%NetBSD.org@localhost>
date:      Wed May 01 21:57:34 2019 +0000

description:
Correct passing debugger related events for LWP create and exit

Add MI toplevel startlwp function.

Switch all userland LWPs to go through lwp_create using a shared
mi_startlwp() function between all MD ABIs.

Add debugger related event handling in mi_startlwp() and continue with
standard p->p_emul->e_startlwp at the end of this routine.

Use eventswitch() to notify the event of LWP exit in lwp_exit().

ATF ptrace(2) tests signal9 and signal10 now pass.

diffstat:

 sys/kern/kern_lwp.c |  53 +++++++++++++++--------------------------------------
 sys/kern/sys_lwp.c  |  34 +++++++++++++++++++++++++++++++---
 2 files changed, 46 insertions(+), 41 deletions(-)

diffs (154 lines):

diff -r dc0983ef1fcb -r 9f41df3d0c41 sys/kern/kern_lwp.c
--- a/sys/kern/kern_lwp.c       Wed May 01 21:52:35 2019 +0000
+++ b/sys/kern/kern_lwp.c       Wed May 01 21:57:34 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: kern_lwp.c,v 1.197 2019/04/19 01:52:55 ozaki-r Exp $   */
+/*     $NetBSD: kern_lwp.c,v 1.198 2019/05/01 21:57:34 kamil 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.197 2019/04/19 01:52:55 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.198 2019/05/01 21:57:34 kamil Exp $");
 
 #include "opt_ddb.h"
 #include "opt_lockdebug.h"
@@ -969,24 +969,6 @@
        if (p2->p_emul->e_lwp_fork)
                (*p2->p_emul->e_lwp_fork)(l1, l2);
 
-       /* If the process is traced, report lwp creation to a debugger */
-       if ((p2->p_slflag & (PSL_TRACED|PSL_TRACELWP_CREATE|PSL_SYSCALL)) ==
-           (PSL_TRACED|PSL_TRACELWP_CREATE)) {
-               ksiginfo_t ksi;
-
-               /* Tracing */
-               KASSERT((l2->l_flag & LW_SYSTEM) == 0);
-
-               p2->p_lwp_created = l2->l_lid;
-
-               KSI_INIT_EMPTY(&ksi);
-               ksi.ksi_signo = SIGTRAP;
-               ksi.ksi_code = TRAP_LWP;
-               mutex_enter(proc_lock);
-               kpsignal(p2, &ksi, NULL);
-               mutex_exit(proc_lock);
-       }
-
        return (0);
 }
 
@@ -1050,24 +1032,6 @@
         */
        LOCKDEBUG_BARRIER(&kernel_lock, 0);
 
-       /* If the process is traced, report lwp termination to a debugger */
-       if ((p->p_slflag & (PSL_TRACED|PSL_TRACELWP_EXIT|PSL_SYSCALL)) ==
-           (PSL_TRACED|PSL_TRACELWP_EXIT)) {
-               ksiginfo_t ksi;
-
-               /* Tracing */
-               KASSERT((l->l_flag & LW_SYSTEM) == 0);
-
-               p->p_lwp_exited = l->l_lid;
-
-               KSI_INIT_EMPTY(&ksi);
-               ksi.ksi_signo = SIGTRAP;
-               ksi.ksi_code = TRAP_LWP;
-               mutex_enter(proc_lock);
-               kpsignal(p, &ksi, NULL);
-               mutex_exit(proc_lock);
-       }
-
        /*
         * If we are the last live LWP in a process, we need to exit the
         * entire process.  We do so with an exit status of zero, because
@@ -1108,10 +1072,23 @@
        callout_destroy(&l->l_timeout_ch);
 
        /*
+        * If traced, report LWP exit event to the debugger.
+        *
         * Remove the LWP from the global list.
         * Free its LID from the PID namespace if needed.
         */
        mutex_enter(proc_lock);
+
+       if ((p->p_slflag & (PSL_TRACED|PSL_TRACELWP_EXIT|PSL_SYSCALL)) ==
+           (PSL_TRACED|PSL_TRACELWP_EXIT)) {
+               mutex_enter(p->p_lock);
+               p->p_lwp_exited = l->l_lid;
+               eventswitch(SIGTRAP, TRAP_LWP);
+               // XXX ktrpoint(KTR_PSIG)
+               mutex_exit(p->p_lock);
+               mutex_enter(proc_lock);
+       }
+
        LIST_REMOVE(l, l_list);
        if ((l->l_pflag & LP_PIDLID) != 0 && l->l_lid != p->p_pid) {
                proc_free_pid(l->l_lid);
diff -r dc0983ef1fcb -r 9f41df3d0c41 sys/kern/sys_lwp.c
--- a/sys/kern/sys_lwp.c        Wed May 01 21:52:35 2019 +0000
+++ b/sys/kern/sys_lwp.c        Wed May 01 21:57:34 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sys_lwp.c,v 1.63 2018/01/30 07:52:23 ozaki-r Exp $     */
+/*     $NetBSD: sys_lwp.c,v 1.64 2019/05/01 21:57:34 kamil Exp $       */
 
 /*-
  * Copyright (c) 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_lwp.c,v 1.63 2018/01/30 07:52:23 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_lwp.c,v 1.64 2019/05/01 21:57:34 kamil Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -69,6 +69,34 @@
        sleeptab_init(&lwp_park_tab);
 }
 
+static void
+mi_startlwp(void *arg)
+{
+       struct lwp *l = curlwp;
+       struct proc *p = l->l_proc;
+
+       /* If the process is traced, report lwp creation to a debugger */
+       if ((p->p_slflag & (PSL_TRACED|PSL_TRACELWP_CREATE|PSL_SYSCALL)) ==
+           (PSL_TRACED|PSL_TRACELWP_CREATE)) {
+               /* Paranoid check */
+               mutex_enter(proc_lock);
+               if ((p->p_slflag & (PSL_TRACED|PSL_TRACELWP_CREATE|PSL_SYSCALL)) !=
+                   (PSL_TRACED|PSL_TRACELWP_CREATE)) {
+                       mutex_exit(proc_lock);
+                       goto my_tracer_is_gone;
+               }
+
+               mutex_enter(p->p_lock);
+               p->p_lwp_created = l->l_lid;
+               eventswitch(SIGTRAP, TRAP_LWP);
+               // XXX ktrpoint(KTR_PSIG)
+               mutex_exit(p->p_lock);
+       }
+
+my_tracer_is_gone:
+       (p->p_emul->e_startlwp)(arg);
+}
+
 int
 do_lwp_create(lwp_t *l, void *arg, u_long flags, lwpid_t *new_lwp,
     const sigset_t *sigmask, const stack_t *sigstk)
@@ -86,7 +114,7 @@
                return ENOMEM;
 
        error = lwp_create(l, p, uaddr, flags & LWP_DETACHED, NULL, 0,
-           p->p_emul->e_startlwp, arg, &l2, l->l_class, sigmask, &SS_INIT);
+           mi_startlwp, arg, &l2, l->l_class, sigmask, &SS_INIT);
        if (__predict_false(error)) {
                uvm_uarea_free(uaddr);
                return error;



Home | Main Index | Thread Index | Old Index