From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 69824 invoked by alias); 13 Jan 2016 21:52:10 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 69799 invoked by uid 89); 13 Jan 2016 21:52:09 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.6 required=5.0 tests=AWL,BAYES_50,SPF_HELO_PASS,SPF_SOFTFAIL autolearn=no version=3.3.2 spammy=1217, alloca, D*FreeBSD.org, jhbFreeBSDorg 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; Wed, 13 Jan 2016 21:52:07 +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 4BB4DB9A5; Wed, 13 Jan 2016 16:46:29 -0500 (EST) From: John Baldwin To: gdb-patches@sourceware.org, binutils@sourceware.org Subject: [PATCH v2 4/6] Use LWP IDs with ptrace register requests on FreeBSD. Date: Wed, 13 Jan 2016 21:52:00 -0000 Message-Id: <1452721551-657-5-git-send-email-jhb@FreeBSD.org> In-Reply-To: <1452721551-657-1-git-send-email-jhb@FreeBSD.org> References: <1452721551-657-1-git-send-email-jhb@FreeBSD.org> X-IsSubscribed: yes X-SW-Source: 2016-01/txt/msg00279.txt.bz2 This allows gdb to fetch per-thread registers for multi-threaded FreeBSD processes. NetBSD and OpenBSD also accept LWP IDs for ptrace requests to fetch per-thread state. gdb/ChangeLog: * amd64bsd-nat.c (get_ptrace_pid): New function. (amd64bsd_fetch_inferior_registers): Use new function. (amd64bsd_store_inferior_registers): Use new function. (amd64bsd_dr_get): Use new function. (amd64bsd_dr_set): Use new function. * i386bsd-nat.c (get_ptrace_pid): New function. (i386bsd_fetch_inferior_registers): Use new function. (i386bsd_store_inferior_registers): Use new function. (i386bsd_dr_get): Use new function. (i386bsd_dr_set): Use new function. * ppcfbsd-nat.c (get_ptrace_pid): New function. (ppcfbsd_fetch_inferior_registers): Use new function. (ppcfbsd_store_inferior_registers): Use new function. --- gdb/ChangeLog | 15 +++++++++++++++ gdb/amd64bsd-nat.c | 35 +++++++++++++++++++++++------------ gdb/i386bsd-nat.c | 41 ++++++++++++++++++++++++++--------------- gdb/ppcfbsd-nat.c | 23 +++++++++++++++++------ 4 files changed, 81 insertions(+), 33 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 93760ba..0accac9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,18 @@ +2016-01-10 John Baldwin + * amd64bsd-nat.c (get_ptrace_pid): New function. + (amd64bsd_fetch_inferior_registers): Use new function. + (amd64bsd_store_inferior_registers): Use new function. + (amd64bsd_dr_get): Use new function. + (amd64bsd_dr_set): Use new function. + * i386bsd-nat.c (get_ptrace_pid): New function. + (i386bsd_fetch_inferior_registers): Use new function. + (i386bsd_store_inferior_registers): Use new function. + (i386bsd_dr_get): Use new function. + (i386bsd_dr_set): Use new function. + * ppcfbsd-nat.c (get_ptrace_pid): New function. + (ppcfbsd_fetch_inferior_registers): Use new function. + (ppcfbsd_store_inferior_registers): Use new function. + 2016-01-09 John Baldwin * fbsd_tdep.c (fbsd_core_pid_to_str): New function. diff --git a/gdb/amd64bsd-nat.c b/gdb/amd64bsd-nat.c index aa79c13..7e4adc8 100644 --- a/gdb/amd64bsd-nat.c +++ b/gdb/amd64bsd-nat.c @@ -39,6 +39,17 @@ size_t amd64bsd_xsave_len; #endif +static pid_t +get_ptrace_pid (ptid_t ptid) +{ + pid_t pid; + + pid = ptid_get_lwp (ptid); + if (pid == 0) + pid = ptid_get_pid (ptid); + return pid; +} + /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this for all registers (including the floating-point registers). */ @@ -52,7 +63,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 +81,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 +90,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 +111,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 +134,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 +183,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 +195,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 +206,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..df112c3 100644 --- a/gdb/i386bsd-nat.c +++ b/gdb/i386bsd-nat.c @@ -87,6 +87,17 @@ size_t i386bsd_xsave_len; #endif +static pid_t +get_ptrace_pid (ptid_t ptid) +{ + pid_t pid; + + pid = ptid_get_lwp (ptid); + if (pid == 0) + pid = ptid_get_pid (ptid); + return pid; +} + /* Supply the general-purpose registers in GREGS, to REGCACHE. */ static void @@ -138,7 +149,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 +171,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 +182,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 +192,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 +214,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 +241,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 +256,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 +271,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 +316,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 +328,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 +339,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/ppcfbsd-nat.c b/gdb/ppcfbsd-nat.c index b41ed70..e4240c8 100644 --- a/gdb/ppcfbsd-nat.c +++ b/gdb/ppcfbsd-nat.c @@ -37,6 +37,17 @@ #include "inf-ptrace.h" #include "bsd-kvm.h" +static pid_t +get_ptrace_pid (ptid_t ptid) +{ + pid_t pid; + + pid = ptid_get_lwp (ptid); + if (pid == 0) + pid = ptid_get_pid (ptid); + return pid; +} + /* Fill GDB's register array with the general-purpose register values in *GREGSETP. */ @@ -121,7 +132,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, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); @@ -132,7 +143,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, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get FP registers")); @@ -149,13 +160,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, get_ptrace_pid (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, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); @@ -163,13 +174,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, get_ptrace_pid (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, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't set FP registers")); } -- 2.7.0