From patchwork Mon Jan 18 02:27:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Baldwin X-Patchwork-Id: 10416 Received: (qmail 109927 invoked by alias); 18 Jan 2016 02:28:20 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 109597 invoked by uid 89); 18 Jan 2016 02:28:18 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.4 required=5.0 tests=AWL, BAYES_50, SPF_HELO_PASS, SPF_SOFTFAIL autolearn=no version=3.3.2 spammy=1387, 138, 7, 797, 1327 X-Spam-User: qpsmtpd, 2 recipients X-HELO: bigwig.baldwin.cx Received: from bigwig.baldwin.cx (HELO bigwig.baldwin.cx) (96.47.65.170) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (CAMELLIA256-SHA encrypted) ESMTPS; Mon, 18 Jan 2016 02:28:16 +0000 Received: from ralph.com (c-73-231-226-104.hsd1.ca.comcast.net [73.231.226.104]) by bigwig.baldwin.cx (Postfix) with ESMTPSA id 2C832B9A6; Sun, 17 Jan 2016 21:28:14 -0500 (EST) From: John Baldwin To: gdb-patches@sourceware.org, binutils@sourceware.org Subject: [PATCH v3 4/6] Use LWP IDs with ptrace register requests on FreeBSD. Date: Sun, 17 Jan 2016 18:27:25 -0800 Message-Id: <1453084047-16175-5-git-send-email-jhb@FreeBSD.org> In-Reply-To: <1453084047-16175-1-git-send-email-jhb@FreeBSD.org> References: <1453084047-16175-1-git-send-email-jhb@FreeBSD.org> X-IsSubscribed: yes This allows gdb to fetch per-thread registers for multi-threaded FreeBSD processes. Export get_ptrace_pid() from inf-ptrace.c and use it to determine the PID to pass to ptrace in pan-BSD native targets. NetBSD and OpenBSD also accept LWP IDs for ptrace requests to fetch per-thread state. gdb/ChangeLog: * amd64bsd-nat.c (amd64bsd_fetch_inferior_registers): Use get_ptrace_pid. (amd64bsd_store_inferior_registers): Use get_ptrace_pid. (amd64bsd_dr_get): Use get_ptrace_pid. (amd64bsd_dr_set): Use get_ptrace_pid. * i386bsd-nat.c (i386bsd_fetch_inferior_registers): Use get_ptrace_pid. (i386bsd_store_inferior_registers): Use get_ptrace_pid. (i386bsd_dr_get): Use get_ptrace_pid. (i386bsd_dr_set): Use get_ptrace_pid. * inf-ptrace.c (get_ptrace_pid): Export. * inf-ptrace.h (get_ptrace_pid): Declare. * ppcfbsd-nat.c (ppcfbsd_fetch_inferior_registers): Use lwp id. (ppcfbsd_store_inferior_registers): Use lwp id. --- gdb/ChangeLog | 16 ++++++++++++++++ gdb/amd64bsd-nat.c | 24 ++++++++++++------------ gdb/i386bsd-nat.c | 30 +++++++++++++++--------------- gdb/inf-ptrace.c | 2 +- gdb/inf-ptrace.h | 5 +++++ gdb/ppcfbsd-nat.c | 12 ++++++------ 6 files changed, 55 insertions(+), 34 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8f28959..feed337 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,21 @@ 2016-01-16 John Baldwin + * amd64bsd-nat.c (amd64bsd_fetch_inferior_registers): Use + get_ptrace_pid. + (amd64bsd_store_inferior_registers): Use get_ptrace_pid. + (amd64bsd_dr_get): Use get_ptrace_pid. + (amd64bsd_dr_set): Use get_ptrace_pid. + * i386bsd-nat.c (i386bsd_fetch_inferior_registers): Use get_ptrace_pid. + (i386bsd_store_inferior_registers): Use get_ptrace_pid. + (i386bsd_dr_get): Use get_ptrace_pid. + (i386bsd_dr_set): Use get_ptrace_pid. + * inf-ptrace.c (get_ptrace_pid): Export. + * inf-ptrace.h (get_ptrace_pid): Declare. + * ppcfbsd-nat.c (ppcfbsd_fetch_inferior_registers): Use lwp id. + (ppcfbsd_store_inferior_registers): Use lwp id. + +2016-01-16 John Baldwin + * fbsd_tdep.c (fbsd_core_pid_to_str): New function. (fbsd_init_abi): Add "core_pid_to_str" gdbarch method. diff --git a/gdb/amd64bsd-nat.c b/gdb/amd64bsd-nat.c index aa79c13..fb7e4fa 100644 --- a/gdb/amd64bsd-nat.c +++ b/gdb/amd64bsd-nat.c @@ -52,7 +52,7 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops, { struct reg regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); @@ -70,7 +70,7 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops, if (amd64bsd_xsave_len != 0) { xstateregs = alloca (amd64bsd_xsave_len); - if (ptrace (PT_GETXSTATE, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) perror_with_name (_("Couldn't get extended state status")); @@ -79,7 +79,7 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops, } #endif - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); @@ -100,13 +100,13 @@ amd64bsd_store_inferior_registers (struct target_ops *ops, { struct reg regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); amd64_collect_native_gregset (regcache, ®s, regnum); - if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); @@ -123,26 +123,26 @@ amd64bsd_store_inferior_registers (struct target_ops *ops, if (amd64bsd_xsave_len != 0) { xstateregs = alloca (amd64bsd_xsave_len); - if (ptrace (PT_GETXSTATE, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) perror_with_name (_("Couldn't get extended state status")); amd64_collect_xsave (regcache, regnum, xstateregs, 0); - if (ptrace (PT_SETXSTATE, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETXSTATE, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xstateregs, amd64bsd_xsave_len) == -1) perror_with_name (_("Couldn't write extended state status")); return; } #endif - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); amd64_collect_fxsave (regcache, regnum, &fpregs); - if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETFPREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't write floating point status")); } @@ -172,7 +172,7 @@ amd64bsd_dr_get (ptid_t ptid, int regnum) { struct dbreg dbregs; - if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't read debug registers")); @@ -184,7 +184,7 @@ amd64bsd_dr_set (int regnum, unsigned long value) { struct dbreg dbregs; - if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't get debug registers")); @@ -195,7 +195,7 @@ amd64bsd_dr_set (int regnum, unsigned long value) DBREG_DRX ((&dbregs), regnum) = value; - if (ptrace (PT_SETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETDBREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't write debug registers")); } diff --git a/gdb/i386bsd-nat.c b/gdb/i386bsd-nat.c index 71f962c..5d45c33 100644 --- a/gdb/i386bsd-nat.c +++ b/gdb/i386bsd-nat.c @@ -138,7 +138,7 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops, { struct reg regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); @@ -160,7 +160,7 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops, char *xstateregs; xstateregs = alloca (i386bsd_xsave_len); - if (ptrace (PT_GETXSTATE, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) perror_with_name (_("Couldn't get extended state status")); @@ -171,7 +171,7 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops, #ifdef HAVE_PT_GETXMMREGS if (have_ptrace_xmmregs != 0 - && ptrace(PT_GETXMMREGS, ptid_get_pid (inferior_ptid), + && ptrace(PT_GETXMMREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xmmregs, 0) == 0) { have_ptrace_xmmregs = 1; @@ -181,7 +181,7 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops, { have_ptrace_xmmregs = 0; #endif - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); @@ -203,13 +203,13 @@ i386bsd_store_inferior_registers (struct target_ops *ops, { struct reg regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); i386bsd_collect_gregset (regcache, ®s, regnum); - if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); @@ -230,13 +230,13 @@ i386bsd_store_inferior_registers (struct target_ops *ops, char *xstateregs; xstateregs = alloca (i386bsd_xsave_len); - if (ptrace (PT_GETXSTATE, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) perror_with_name (_("Couldn't get extended state status")); i387_collect_xsave (regcache, -1, xstateregs, 0); - if (ptrace (PT_SETXSTATE, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETXSTATE, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xstateregs, i386bsd_xsave_len) == -1) perror_with_name (_("Couldn't write extended state status")); return; @@ -245,14 +245,14 @@ i386bsd_store_inferior_registers (struct target_ops *ops, #ifdef HAVE_PT_GETXMMREGS if (have_ptrace_xmmregs != 0 - && ptrace(PT_GETXMMREGS, ptid_get_pid (inferior_ptid), + && ptrace(PT_GETXMMREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xmmregs, 0) == 0) { have_ptrace_xmmregs = 1; i387_collect_fxsave (regcache, regnum, xmmregs); - if (ptrace (PT_SETXMMREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETXMMREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xmmregs, 0) == -1) perror_with_name (_("Couldn't write XMM registers")); } @@ -260,13 +260,13 @@ i386bsd_store_inferior_registers (struct target_ops *ops, { have_ptrace_xmmregs = 0; #endif - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); i387_collect_fsave (regcache, regnum, &fpregs); - if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETFPREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't write floating point status")); #ifdef HAVE_PT_GETXMMREGS @@ -305,7 +305,7 @@ i386bsd_dr_get (ptid_t ptid, int regnum) { struct dbreg dbregs; - if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't read debug registers")); @@ -317,7 +317,7 @@ i386bsd_dr_set (int regnum, unsigned int value) { struct dbreg dbregs; - if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't get debug registers")); @@ -328,7 +328,7 @@ i386bsd_dr_set (int regnum, unsigned int value) DBREG_DRX ((&dbregs), regnum) = value; - if (ptrace (PT_SETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETDBREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't write debug registers")); } diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c index 8f8f4ee..329d8fb 100644 --- a/gdb/inf-ptrace.c +++ b/gdb/inf-ptrace.c @@ -304,7 +304,7 @@ inf_ptrace_interrupt (struct target_ops *self, ptid_t ptid) /* Return which PID to pass to ptrace in order to observe/control the tracee identified by PTID. */ -static pid_t +pid_t get_ptrace_pid (ptid_t ptid) { pid_t pid; diff --git a/gdb/inf-ptrace.h b/gdb/inf-ptrace.h index ec40590..0a26720 100644 --- a/gdb/inf-ptrace.h +++ b/gdb/inf-ptrace.h @@ -33,4 +33,9 @@ extern struct target_ops * inf_ptrace_trad_target (CORE_ADDR (*register_u_offset) (struct gdbarch *, int, int)); +/* Return which PID to pass to ptrace in order to observe/control the + tracee identified by PTID. */ + +extern pid_t get_ptrace_pid (ptid_t); + #endif diff --git a/gdb/ppcfbsd-nat.c b/gdb/ppcfbsd-nat.c index b41ed70..999e383 100644 --- a/gdb/ppcfbsd-nat.c +++ b/gdb/ppcfbsd-nat.c @@ -121,7 +121,7 @@ ppcfbsd_fetch_inferior_registers (struct target_ops *ops, { gdb_gregset_t regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, ptid_get_lwp (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); @@ -132,7 +132,7 @@ ppcfbsd_fetch_inferior_registers (struct target_ops *ops, const struct regset *fpregset = ppc_fbsd_fpregset (); gdb_fpregset_t fpregs; - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, ptid_get_lwp (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get FP registers")); @@ -149,13 +149,13 @@ ppcfbsd_store_inferior_registers (struct target_ops *ops, { gdb_gregset_t regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, ptid_get_lwp (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); fill_gregset (regcache, ®s, regno); - if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETREGS, ptid_get_lwp (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); @@ -163,13 +163,13 @@ ppcfbsd_store_inferior_registers (struct target_ops *ops, { gdb_fpregset_t fpregs; - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, ptid_get_lwp (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get FP registers")); fill_fpregset (regcache, &fpregs, regno); - if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETFPREGS, ptid_get_lwp (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't set FP registers")); }