Use LWP IDs with ptrace register requests on FreeBSD.
authorJohn Baldwin <jhb@FreeBSD.org>
Fri, 15 Jan 2016 20:21:07 +0000 (12:21 -0800)
committerJohn Baldwin <jhb@FreeBSD.org>
Tue, 19 Jan 2016 16:18:49 +0000 (08:18 -0800)
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
gdb/amd64bsd-nat.c
gdb/i386bsd-nat.c
gdb/inf-ptrace.c
gdb/inf-ptrace.h
gdb/ppcfbsd-nat.c

index 400305a49b27c0390f2134704883924f0354f55c..0d9a7fb05dc116db20992f908cbae79c1d2d5c71 100644 (file)
@@ -1,3 +1,19 @@
+2016-01-19  John Baldwin  <jhb@FreeBSD.org>
+
+       * 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-19  John Baldwin  <jhb@FreeBSD.org>
 
        * fbsd_tdep.c (fbsd_core_pid_to_str): New function.
index aa79c130d41331d7b3cef234f0bbf82d8ea89f1f..fb7e4fa061ff79ef2fcea5c6e0f93a816e969d0c 100644 (file)
@@ -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) &regs, 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) &regs, 0) == -1)
         perror_with_name (_("Couldn't get registers"));
 
       amd64_collect_native_gregset (regcache, &regs, regnum);
 
-      if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid),
+      if (ptrace (PT_SETREGS, get_ptrace_pid (inferior_ptid),
                  (PTRACE_TYPE_ARG3) &regs, 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"));
 }
index 71f962c52db4c21bc8cb0f7826dabdb47a35a3e1..5d45c3384b2828c7f37bfdcff2c647e728417740 100644 (file)
@@ -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) &regs, 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) &regs, 0) == -1)
         perror_with_name (_("Couldn't get registers"));
 
       i386bsd_collect_gregset (regcache, &regs, regnum);
 
-      if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid),
+      if (ptrace (PT_SETREGS, get_ptrace_pid (inferior_ptid),
                  (PTRACE_TYPE_ARG3) &regs, 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"));
 }
index 8f8f4ee464b62a1ddfe971cf1e4c019016794b57..329d8fb2d8c560c8d025c73ba90f138d27fa972d 100644 (file)
@@ -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;
index ec405904a4cf17d21d46b257bcd68ce80301ef17..0a267202eccbe6140bc68d211b9fef2cd25b1146 100644 (file)
@@ -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
index b41ed70521eff0ccd1156fcfb9716b882402c1da..999e383d44f0b4ce685fc2e20fa3055ed786ebaa 100644 (file)
@@ -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) &regs, 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) &regs, 0) == -1)
     perror_with_name (_("Couldn't get registers"));
 
   fill_gregset (regcache, &regs, regno);
 
-  if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid),
+  if (ptrace (PT_SETREGS, ptid_get_lwp (inferior_ptid),
              (PTRACE_TYPE_ARG3) &regs, 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"));
     }