From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) by sourceware.org (Postfix) with ESMTPS id 7D7AB385BF92 for ; Wed, 1 Apr 2020 21:34:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 7D7AB385BF92 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=gmx.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=n54@gmx.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585776846; bh=SiuxfaFxxSZo1PZ1KP1WFaeP5VbpAAlWjDg4S1/vaNQ=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=GDIB9oNoQvMlgItfy8N0lfiKJAWUjb5K0bcQYvuL8oda9IX1Pi0XKMffgzGWCLqRh Jj7nZVIy203T27ujo3DKcVo8Usq84GOE8IbWdIfMe34gstZ5iunAbXZIOA5tTC9tC+ CUhFrIUHYFJ3vUk7Ei39gq71cDRhoiWaVW8Ya1ls= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([89.79.191.25]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MQv8x-1jf1Xl0ZS3-00Nvke; Wed, 01 Apr 2020 23:34:06 +0200 From: Kamil Rytarowski To: gdb-patches@sourceware.org Cc: tom@tromey.com, simon.marchi@polymtl.ca, jhb@FreeBSD.org, Kamil Rytarowski Subject: [PATCH v4] Implement basic threading support in the NetBSD target Date: Wed, 1 Apr 2020 23:33:21 +0200 Message-Id: <20200401213321.20107-1-n54@gmx.com> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200401210139.27152-1-n54@gmx.com> References: <20200401210139.27152-1-n54@gmx.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:yuk6vD1RlluELCdEcRPC+rvmrlw2SmigH/pFE2aNTEwg6qrhCQB Z3z9/P+wdxkQonaDUvAn/ZIuaoATTQla6Ggbwa2KWccKrM41HAFv74IHe7AS1K3F3XiHl6a bnTCi0Fa1INDOA0Qs5TrPNt6GHq6jgsajBJFruxs2zhd6DvviEUdc3y0PMEogX02O7mEwnv mRy3UbqSUdkNyQi4FvOIA== X-UI-Out-Filterresults: notjunk:1;V03:K0:etaVix75B2w=:prfgExzjGcDFNnkBN4vgbU MvXYBTzv3yA8PkyPSLz4GXXkjiUe0Maehp6a1bnzHdD0OQi+91ilgwipjHCHf7IkLVo2WOj+S RzLD3whjVMolMl4Z0T+CGdsyatcAzFX1MbQApVyjhbQ4Lbyvmt61y7hpDA3erNiMt204USYij WhTkskCi8ldZQZAf5Sn4//vMoUYaTMTTPYv7qFElpaD529evgWLxtB83XPXeAtrd2KQVS2Yd6 2+WfVIZHbSeH2WMuAgXIfiNdBgTZXDkEX+Xj3EYPy5eF2o0WgocjBIqv5UcHMuyYnHSPAgjod CCQVqef8TxwoeuKfWRm86+9Wzvm+gRImWo9uW3e/376UUiI3iRbK0zFZfhksXu4lShDFhKPkp kcPopTwsyiQLI3vAjqc2pVZ7F373okNc5ESBuaXhRJ3B44AkROppX+PZ6F2OtXFxP6ceNF/kJ RaqkAVqOcvU0gPfglkgdf87sbopFbrv5+UOiDn5Xj33CdGH/PPvgEK97jED/nu6NY1gx5t3Lp 9IN0klKffuZuZ9CQILQaK25jDplpP8IpEDseD+ZHie33eBFmOZBNepZ/BSqqOAQsOOYClmJpC Uxt5T3crntFCbHd5p2fR0Zb1CHoBivKjXATYux+k7Nefu1NeyFXNdrZC6ER7yrS4FJNLOhP0r /7MUvSH4ElqQ4CsynxeJ+zj/kLm/rkdY0fbae3QLssyDoagD3opeZeCDHIXAkzO4wk6olkR+h 0EMdx+695N7JzimF0bHVJtcv3zP2UinRtAMggPaFk+9FwICcZbJxf5DCdx+JT6R1roPNZHhdg YZYhXAHTpq1CuKKTz2wxgRgFmhA7RiFsrCMhOWJZuaiiQcNw93FKsXbc+XszXptX3R1Sqqbkc ooeUqA2j8kq28WLfHK2Xsw3jwVJZMbRFWIssWHnvLq9lFj2NQxeaIOoAUYaI3CZVpFR2ZARfF X463X8+IcDzDGfFQT7Z0jeKl9N4KTRqcvSq8qfJFQS1ywFSGuK+mwpVkcnqm/ZDJ4K5+cBeJu FZ+WmkqILYQKOlK8GLjZsrR6A/5OnU7cCTxrRNEoOKvBr6Tnwg9yWT8fuVUwIHfxXxAJIBaaE uwnnbDa32mVdT7272frVwoWMLPP1xCm6kmQ/HSwWllD48PZEmsVNKxEVNi0rW4o6HAKdgeUjj Wy4hmjLYlylGIGoIuSSOHyrP6Yv+McGEeXpBGcIO10SjTbHgU6FnHLL1WQIRbLhad8M/g= X-Spam-Status: No, score=-28.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Apr 2020 21:34:33 -0000 Use sysctl(3) as the portable interface to prompt NetBSD threads on all supported NetBSD versions. In future newer versions could switch to PT_LWPSTATUS ptrace(2) API that will be supported on NetBSD 10.0 and newer. Implement as part of nbsd_nat_target: - thread_name() - read descriptive thread name - thread_alive() - check whether a thread is alive - post_attach() - updates the list of threads after attach - update_thread_list() - updates the list of threads - pid_to_str() - translates ptid to a descriptive string There are two local static functions: - nbsd_thread_lister() - generic LWP lister for a specified pid - nbsd_add_threads() - utility to update the list of threads Now, GDB on NetBSD can attach to a multithreaded process, spawn a multithreaded process, list threads, print their LWP+PID numbers and descriptive thread names. gdb/ChangeLog: * nbsd-nat.h (struct thread_info): Add forward declaration. (nbsd_nat_target::thread_alive): Add. (nbsd_nat_target::thread_name): Likewise. (nbsd_nat_target::update_thread_list): Likewise. (update_thread_list::post_attach): Likewise. (post_attach::pid_to_str): Likewise. * nbsd-nat.c: Include "gdbthread.h" and "inferior.h". (nbsd_thread_lister): Add. (nbsd_nat_target::thread_alive): Likewise. (nbsd_nat_target::thread_name): Likewise. (nbsd_add_threads): Likewise. (update_thread_list::post_attach): Likewise. (nbsd_nat_target::update_thread_list): Likewise. (post_attach::pid_to_str): Likewise. =2D-- gdb/ChangeLog | 17 ++++++ gdb/nbsd-nat.c | 162 +++++++++++++++++++++++++++++++++++++++++++++++++ gdb/nbsd-nat.h | 8 +++ 3 files changed, 187 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ef62216e0ad..764b65d872d 100644 =2D-- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2020-04-01 Kamil Rytarowski + + * nbsd-nat.h (struct thread_info): Add forward declaration. + (nbsd_nat_target::thread_alive): Add. + (nbsd_nat_target::thread_name): Likewise. + (nbsd_nat_target::update_thread_list): Likewise. + (update_thread_list::post_attach): Likewise. + (post_attach::pid_to_str): Likewise. + * nbsd-nat.c: Include "gdbthread.h" and "inferior.h". + (nbsd_thread_lister): Add. + (nbsd_nat_target::thread_alive): Likewise. + (nbsd_nat_target::thread_name): Likewise. + (nbsd_add_threads): Likewise. + (update_thread_list::post_attach): Likewise. + (nbsd_nat_target::update_thread_list): Likewise. + (post_attach::pid_to_str): Likewise. + 2020-04-01 Tankut Baris Aktemur * infrun.c (stop_all_threads): Update assertion, plus when diff --git a/gdb/nbsd-nat.c b/gdb/nbsd-nat.c index 326bbe3aec3..e5510312ed1 100644 =2D-- a/gdb/nbsd-nat.c +++ b/gdb/nbsd-nat.c @@ -20,6 +20,8 @@ #include "defs.h" #include "nbsd-nat.h" +#include "gdbthread.h" +#include "inferior.h" #include #include @@ -39,3 +41,163 @@ nbsd_nat_target::pid_to_exec_file (int pid) return NULL; return buf; } + +/* Generic thread (LWP) lister within a specified process. The callback + parameters is a C++ function that is called for each detected thread. = */ + +static bool +nbsd_thread_lister (const pid_t pid, + gdb::function_view + callback) +{ + int mib[5] =3D {CTL_KERN, KERN_LWP, pid, sizeof (struct kinfo_lwp), 0}; + size_t size; + + if (sysctl (mib, ARRAY_SIZE (mib), NULL, &size, NULL, 0) =3D=3D -1 || s= ize =3D=3D 0) + perror_with_name (("sysctl")); + + mib[4] =3D size / sizeof (size_t); + + gdb::unique_xmalloc_ptr kl + ((struct kinfo_lwp *) xcalloc (size, 1)); + if (kl =3D=3D NULL) + perror_with_name (("calloc")); + + if (sysctl (mib, ARRAY_SIZE (mib), kl.get (), &size, NULL, 0) =3D=3D -1 + || size =3D=3D 0) + perror_with_name (("sysctl")); + + for (size_t i =3D 0; i < size / sizeof (struct kinfo_lwp); i++) + { + struct kinfo_lwp *l =3D &kl.get ()[i]; + + /* Return true if the specified thread is alive. */ + auto lwp_alive + =3D [] (struct kinfo_lwp *lwp) + { + switch (lwp->l_stat) + { + case LSSLEEP: + case LSRUN: + case LSONPROC: + case LSSTOP: + case LSSUSPENDED: + return true; + default: + return false; + } + }; + + /* Ignore embryonic or demised threads. */ + if (!lwp_alive (l)) + continue; + + if (callback (l)) + return true; + } + + return false; +} + +/* Return true if PTID is still active in the inferior. */ + +bool +nbsd_nat_target::thread_alive (ptid_t ptid) +{ + pid_t pid =3D ptid.pid (); + int lwp =3D ptid.lwp (); + + auto fn + =3D [&lwp] (const struct kinfo_lwp *kl) + { + return kl->l_lid =3D=3D lwp; + }; + + return nbsd_thread_lister (pid, fn); +} + +/* Return the name assigned to a thread by an application. Returns + the string in a static buffer. */ + +const char * +nbsd_nat_target::thread_name (struct thread_info *thr) +{ + ptid_t ptid =3D thr->ptid; + pid_t pid =3D ptid.pid (); + int lwp =3D ptid.lwp (); + + static char buf[KI_LNAMELEN] =3D {}; + + auto fn + =3D [&lwp] (const struct kinfo_lwp *kl) + { + if (kl->l_lid =3D=3D lwp) + { + xsnprintf (buf, sizeof buf, "%s", kl->l_name); + return true; + } + return false; + }; + + if (nbsd_thread_lister (pid, fn)) + return buf; + else + return NULL; +} + +/* Implement the "post_attach" target_ops method. */ + +static void +nbsd_add_threads (nbsd_nat_target *target, pid_t pid) +{ + auto fn + =3D [&target, &pid] (const struct kinfo_lwp *kl) + { + ptid_t ptid =3D ptid_t (pid, kl->l_lid, 0); + if (!in_thread_list (target, ptid)) + { + if (inferior_ptid.lwp () =3D=3D 0) + thread_change_ptid (target, inferior_ptid, ptid); + else + add_thread (target, ptid); + } + return false; + }; + + nbsd_thread_lister (pid, fn); +} + +/* Implement the "post_attach" target_ops method. */ + +void +nbsd_nat_target::post_attach (int pid) +{ + nbsd_add_threads (this, pid); +} + +/* Implement the "update_thread_list" target_ops method. */ + +void +nbsd_nat_target::update_thread_list () +{ + prune_threads (); + + nbsd_add_threads (this, inferior_ptid.pid ()); +} + +/* Convert PTID to a string. */ + +std::string +nbsd_nat_target::pid_to_str (ptid_t ptid) +{ + int lwp =3D ptid.lwp (); + + if (lwp !=3D 0) + { + pid_t pid =3D ptid.pid (); + + return string_printf ("LWP %d of process %d", lwp, pid); + } + + return normal_pid_to_str (ptid); +} diff --git a/gdb/nbsd-nat.h b/gdb/nbsd-nat.h index a752fbe572d..3606048cd07 100644 =2D-- a/gdb/nbsd-nat.h +++ b/gdb/nbsd-nat.h @@ -22,11 +22,19 @@ #include "inf-ptrace.h" +struct thread_info; + /* A prototype NetBSD target. */ struct nbsd_nat_target : public inf_ptrace_target { char *pid_to_exec_file (int pid) override; + + bool thread_alive (ptid_t ptid) override; + const char *thread_name (struct thread_info *thr) override; + void post_attach (int pid) override; + void update_thread_list () override; + std::string pid_to_str (ptid_t ptid) override; }; #endif /* nbsd-nat.h */ =2D- 2.25.0