Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Feb 2015 19:24:16 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r379311 - in head/devel/gdb: . files
Message-ID:  <201502181924.t1IJOGJQ055693@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb (src,doc committer)
Date: Wed Feb 18 19:24:15 2015
New Revision: 379311
URL: https://svnweb.freebsd.org/changeset/ports/379311
QAT: https://qat.redports.org/buildarchive/r379311/

Log:
  - Add support for XSAVE on amd64 and i386 using the recently added
    PT_GETXSTATE_INFO and XSTATE core dump sections.
  - Use kern.proc.sigtramp on i386 to fix unwinding across signal
    frames.
  - Change the amd64 FreeBSD ABI to return an i386 target description
    when debugging a 32-bit process.  This allows XSAVE debugging to
    work for an i386 binary on amd64.
  - Rework thread patches to pull all threads-related patches out of
    the main port patches and into a single optional patch.
  - Adjust the thread patches so that fbsd-threads.c passes register
    requests for LWPs down to the native target instead of calling
    ptrace directly.  This allows XSAVE to work with threads without
    any other changes.  The x86 nat.c files now pass LWP IDs to
    ptrace register operations (other platforms already did this).
    The supply/collect regset stubs are now only needed to support
    userland threads for libkse.
  
  PR:		197501
  Approved by:	maintainer, bdrewery

Added:
  head/devel/gdb/files/extrapatch-threads   (contents, props changed)
  head/devel/gdb/files/patch-xsave   (contents, props changed)
Deleted:
  head/devel/gdb/files/extrapatch-gdb-Makefile.in
  head/devel/gdb/files/extrapatch-gdb-configure.tgt
  head/devel/gdb/files/patch-gdb-i386bsd-nat.c
  head/devel/gdb/files/patch-gdb-i386bsd-nat.h
  head/devel/gdb/files/patch-gdb-i386fbsd-tdep.c
Modified:
  head/devel/gdb/Makefile
  head/devel/gdb/files/fbsd-threads.c
  head/devel/gdb/files/patch-gdb-amd64fbsd-nat.c
  head/devel/gdb/files/patch-gdb-amd64fbsd-tdep.c
  head/devel/gdb/files/patch-gdb-i386fbsd-nat.c

Modified: head/devel/gdb/Makefile
==============================================================================
--- head/devel/gdb/Makefile	Wed Feb 18 19:17:14 2015	(r379310)
+++ head/devel/gdb/Makefile	Wed Feb 18 19:24:15 2015	(r379311)
@@ -3,6 +3,7 @@
 
 PORTNAME=	gdb
 PORTVERSION=	7.8.2
+PORTREVISION=	1
 CATEGORIES=	devel
 MASTER_SITES=	GNU
 
@@ -69,11 +70,6 @@ TUI_CONFIGURE_ENABLE=	tui
 EXCLUDE+=	readline
 .endif
 
-.if ${PORT_OPTIONS:MTHREADS}
-EXTRA_PATCHES+=	${FILESDIR}/extrapatch-gdb-configure.tgt \
-		${FILESDIR}/extrapatch-gdb-Makefile.in
-.endif
-
 .if ${ARCH} == "amd64"
 CONFIGURE_TARGET=	x86_64-portbld-freebsd${OSREL}
 .endif
@@ -81,9 +77,9 @@ CONFIGURE_TARGET=	x86_64-portbld-freebsd
 post-patch:
 	@${REINPLACE_CMD} -e 's|$$| [GDB v${PORTVERSION} for FreeBSD]|' \
 		${WRKSRC}/gdb/version.in
-
 .if ${PORT_OPTIONS:MTHREADS}
 	@${CP} ${FILESDIR}/fbsd-threads.c ${WRKSRC}/gdb/
+	@${PATCH} ${PATCH_ARGS} < ${FILESDIR}/extrapatch-threads
 .endif
 
 do-install:

Added: head/devel/gdb/files/extrapatch-threads
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/extrapatch-threads	Wed Feb 18 19:24:15 2015	(r379311)
@@ -0,0 +1,712 @@
+diff --git a/gdb/Makefile.in b/gdb/Makefile.in
+index ea27cf5..d17752f 100644
+--- gdb/Makefile.in
++++ gdb/Makefile.in
+@@ -668,6 +668,7 @@ ALL_TARGET_OBS = \
+ 	xtensa-config.o xtensa-tdep.o xtensa-linux-tdep.o \
+ 	glibc-tdep.o \
+ 	bsd-uthread.o \
++	fbsd-threads.o \
+ 	nbsd-tdep.o obsd-tdep.o \
+ 	sol2-tdep.o \
+ 	solib-frv.o solib-irix.o solib-svr4.o \
+@@ -1327,7 +1328,7 @@ libgdb.a: $(LIBGDB_OBS)
+ # Removing the old gdb first works better if it is running, at least on SunOS.
+ gdb$(EXEEXT): gdb.o $(LIBGDB_OBS) $(ADD_DEPS) $(CDEPS) $(TDEPLIBS)
+ 	rm -f gdb$(EXEEXT)
+-	$(CC_LD) $(INTERNAL_LDFLAGS) $(WIN32LDAPP) \
++	$(CC_LD) $(INTERNAL_LDFLAGS) $(WIN32LDAPP) -Wl,-E \
+ 		-o gdb$(EXEEXT) gdb.o $(LIBGDB_OBS) \
+ 		$(TDEPLIBS) $(TUI_LIBRARY) $(CLIBS) $(LOADLIBES)
+ 
+@@ -1600,7 +1601,7 @@ ALLDEPFILES = \
+ 	armnbsd-nat.c armbsd-tdep.c armnbsd-tdep.c armobsd-tdep.c \
+ 	avr-tdep.c \
+ 	bfin-linux-tdep.c bfin-tdep.c \
+-	bsd-uthread.c bsd-kvm.c \
++	bsd-uthread.c fbsd-threads.c bsd-kvm.c \
+ 	core-regset.c \
+ 	dcache.c dicos-tdep.c darwin-nat.c \
+ 	exec.c \
+diff --git a/gdb/amd64bsd-nat.c b/gdb/amd64bsd-nat.c
+index 9e6a0df..7aff6f0 100644
+--- gdb/amd64bsd-nat.c
++++ gdb/amd64bsd-nat.c
+@@ -41,6 +41,19 @@
+ size_t x86_xsave_len;
+ #endif
+ 
++static pid_t
++ptrace_pid (ptid_t ptid)
++{
++  pid_t pid;
++
++#ifdef __FreeBSD__
++  pid = ptid_get_lwp (ptid);
++  if (pid == 0)
++#endif
++    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).  */
+ 
+@@ -54,7 +67,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, ptrace_pid (inferior_ptid),
+ 		  (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+ 	perror_with_name (_("Couldn't get registers"));
+ 
+@@ -72,7 +85,7 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops,
+       if (x86_xsave_len != 0)
+ 	{
+ 	  xstateregs = alloca(x86_xsave_len);
+-	  if (ptrace (PT_GETXSTATE, ptid_get_pid (inferior_ptid),
++	  if (ptrace (PT_GETXSTATE, ptrace_pid (inferior_ptid),
+ 		      (PTRACE_TYPE_ARG3) xstateregs, 0) == -1)
+ 	    perror_with_name (_("Couldn't get extended state status"));
+ 
+@@ -81,7 +94,7 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops,
+ 	}
+ #endif
+ 
+-      if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid),
++      if (ptrace (PT_GETFPREGS, ptrace_pid (inferior_ptid),
+ 		  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+ 	perror_with_name (_("Couldn't get floating point status"));
+ 
+@@ -104,11 +117,11 @@ amd64bsd_store_inferior_registers (struct target_ops *ops,
+ 
+       memset( &regs, 0, sizeof(struct reg));
+       memset( &oldregs, 0, sizeof(struct reg));
+-      if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid),
++      if (ptrace (PT_GETREGS, ptrace_pid (inferior_ptid),
+                   (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+         perror_with_name (_("Couldn't get registers"));
+ 
+-      ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid),
++      ptrace (PT_GETREGS, ptrace_pid (inferior_ptid),
+                   (PTRACE_TYPE_ARG3) &oldregs, 0);
+       amd64_collect_native_gregset (regcache, &regs, regnum);
+ 
+@@ -118,7 +131,7 @@ amd64bsd_store_inferior_registers (struct target_ops *ops,
+         regs.r_rflags ^= (regs.r_rflags ^ oldregs.r_rflags ) & ~PSL_USERCHANGE;
+         //printf("    allowed regs.r_rflags = 0x%8.8X\n", regs.r_rflags );
+       }
+-      if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid),
++      if (ptrace (PT_SETREGS, ptrace_pid (inferior_ptid),
+ 	          (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+         perror_with_name (_("Couldn't write registers"));
+ 
+@@ -135,26 +148,26 @@ amd64bsd_store_inferior_registers (struct target_ops *ops,
+       if (x86_xsave_len != 0)
+ 	{
+ 	  xstateregs = alloca(x86_xsave_len);
+-	  if (ptrace (PT_GETXSTATE, ptid_get_pid (inferior_ptid),
++	  if (ptrace (PT_GETXSTATE, 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, ptrace_pid (inferior_ptid),
+ 		      (PTRACE_TYPE_ARG3) xstateregs, x86_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, 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, ptrace_pid (inferior_ptid),
+ 		  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+ 	perror_with_name (_("Couldn't write floating point status"));
+     }
+@@ -184,7 +197,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, ptrace_pid (inferior_ptid),
+ 	      (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+     perror_with_name (_("Couldn't read debug registers"));
+ 
+@@ -196,7 +209,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, ptrace_pid (inferior_ptid),
+               (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+     perror_with_name (_("Couldn't get debug registers"));
+ 
+@@ -207,7 +220,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, ptrace_pid (inferior_ptid),
+               (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+     perror_with_name (_("Couldn't write debug registers"));
+ }
+diff --git a/gdb/amd64fbsd-nat.c b/gdb/amd64fbsd-nat.c
+index eea2472..9ce6a54 100644
+--- gdb/amd64fbsd-nat.c
++++ gdb/amd64fbsd-nat.c
+@@ -18,6 +18,7 @@
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+ 
+ #include "defs.h"
++#include "gregset.h"
+ #include "inferior.h"
+ #include "regcache.h"
+ #include "target.h"
+@@ -95,6 +96,46 @@ static int amd64fbsd32_r_reg_offset[I386_NUM_GREGS] =
+ };
+ 
+ 
++/* Transfering the registers between GDB, inferiors and core files.  */
++
++/* Fill GDB's register array with the general-purpose register values
++   in *GREGSETP.  */
++
++void
++supply_gregset (struct regcache *regcache, const gregset_t *gregsetp)
++{
++  amd64_supply_native_gregset (regcache, gregsetp, -1);
++}
++
++/* Fill register REGNUM (if it is a general-purpose register) in
++   *GREGSETPS with the value in GDB's register array.  If REGNUM is -1,
++   do this for all registers.  */
++
++void
++fill_gregset (const struct regcache *regcache, gdb_gregset_t *gregsetp, int regnum)
++{
++  amd64_collect_native_gregset (regcache, gregsetp, regnum);
++}
++
++/* Fill GDB's register array with the floating-point register values
++   in *FPREGSETP.  */
++
++void
++supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp)
++{
++  amd64_supply_fxsave (regcache, -1, fpregsetp);
++}
++
++/* Fill register REGNUM (if it is a floating-point register) in
++   *FPREGSETP with the value in GDB's register array.  If REGNUM is -1,
++   do this for all registers.  */
++
++void
++fill_fpregset (const struct regcache *regcache, gdb_fpregset_t *fpregsetp, int regnum)
++{
++  amd64_collect_fxsave (regcache, regnum, fpregsetp);
++}
++
+ /* Support for debugging kernel virtual memory images.  */
+ 
+ #include <machine/pcb.h>
+diff --git a/gdb/amd64fbsd-tdep.c b/gdb/amd64fbsd-tdep.c
+index 582ae50..8e07369 100644
+--- gdb/amd64fbsd-tdep.c
++++ gdb/amd64fbsd-tdep.c
+@@ -31,7 +31,6 @@
+ #include <string.h>
+ 
+ #include "amd64-tdep.h"
+-#include "bsd-uthread.h"
+ #include "solib-svr4.h"
+ 
+ /* Supported register note sections.  */
+@@ -178,46 +177,6 @@ amd64fbsd_core_read_description (struct gdbarch *gdbarch,
+ }
+ 
+ static void
+-amd64fbsd_supply_uthread (struct regcache *regcache,
+-			  int regnum, CORE_ADDR addr)
+-{
+-  gdb_byte buf[8];
+-  int i;
+-
+-  gdb_assert (regnum >= -1);
+-
+-  for (i = 0; i < ARRAY_SIZE (amd64fbsd_jmp_buf_reg_offset); i++)
+-    {
+-      if (amd64fbsd_jmp_buf_reg_offset[i] != -1
+-	  && (regnum == -1 || regnum == i))
+-	{
+-	  read_memory (addr + amd64fbsd_jmp_buf_reg_offset[i], buf, 8);
+-	  regcache_raw_supply (regcache, i, buf);
+-	}
+-    }
+-}
+-
+-static void
+-amd64fbsd_collect_uthread (const struct regcache *regcache,
+-			   int regnum, CORE_ADDR addr)
+-{
+-  gdb_byte buf[8];
+-  int i;
+-
+-  gdb_assert (regnum >= -1);
+-
+-  for (i = 0; i < ARRAY_SIZE (amd64fbsd_jmp_buf_reg_offset); i++)
+-    {
+-      if (amd64fbsd_jmp_buf_reg_offset[i] != -1
+-	  && (regnum == -1 || regnum == i))
+-	{
+-	  regcache_raw_collect (regcache, i, buf);
+-	  write_memory (addr + amd64fbsd_jmp_buf_reg_offset[i], buf, 8);
+-	}
+-    }
+-}
+-
+-static void
+ amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+ {
+   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+@@ -245,10 +204,6 @@ amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+   set_gdbarch_core_read_description (gdbarch,
+ 				     amd64fbsd_core_read_description);
+ 
+-  /* FreeBSD provides a user-level threads implementation.  */
+-  bsd_uthread_set_supply_uthread (gdbarch, amd64fbsd_supply_uthread);
+-  bsd_uthread_set_collect_uthread (gdbarch, amd64fbsd_collect_uthread);
+-
+   /* FreeBSD uses SVR4-style shared libraries.  */
+   set_solib_svr4_fetch_link_map_offsets
+     (gdbarch, svr4_lp64_fetch_link_map_offsets);
+diff --git a/gdb/configure.tgt b/gdb/configure.tgt
+index 01311b2..0929a25 100644
+--- gdb/configure.tgt
++++ gdb/configure.tgt
+@@ -189,7 +189,7 @@ i[34567]86-*-dicos*)
+ i[34567]86-*-freebsd* | i[34567]86-*-kfreebsd*-gnu)
+ 	# Target: FreeBSD/i386
+ 	gdb_target_obs="i386-tdep.o i387-tdep.o i386bsd-tdep.o i386fbsd-tdep.o \
+-			bsd-uthread.o solib-svr4.o"
++			fbsd-threads.o solib-svr4.o"
+ 	;;
+ i[34567]86-*-netbsd* | i[34567]86-*-knetbsd*-gnu)
+ 	# Target: NetBSD/i386
+@@ -415,7 +415,7 @@ nios2*-*-*)
+ powerpc*-*-freebsd*)
+ 	# Target: FreeBSD/powerpc
+ 	gdb_target_obs="rs6000-tdep.o ppc-sysv-tdep.o ppc64-tdep.o \
+-		        ppcfbsd-tdep.o solib-svr4.o \
++		        ppcfbsd-tdep.o solib-svr4.o fbsd-threads.o \
+ 			ravenscar-thread.o ppc-ravenscar-thread.o"
+ 	;;
+ 
+@@ -667,7 +667,7 @@ x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
+ 	# Target: FreeBSD/amd64
+ 	gdb_target_obs="amd64-tdep.o amd64fbsd-tdep.o i386-tdep.o \
+ 			i387-tdep.o i386bsd-tdep.o i386fbsd-tdep.o \
+-			bsd-uthread.o solib-svr4.o"
++			fbsd-threads.o solib-svr4.o"
+ 	;;
+ x86_64-*-mingw* | x86_64-*-cygwin*)
+         # Target: MingW/amd64
+diff --git a/gdb/i386bsd-nat.c b/gdb/i386bsd-nat.c
+index c26e830..246acdd 100644
+--- gdb/i386bsd-nat.c
++++ gdb/i386bsd-nat.c
+@@ -89,9 +89,22 @@ size_t x86_xsave_len;
+ #endif
+ 
+ 
++static pid_t
++ptrace_pid (ptid_t ptid)
++{
++  pid_t pid;
++
++#ifdef __FreeBSD__
++  pid = ptid_get_lwp (ptid);
++  if (pid == 0)
++#endif
++    pid = ptid_get_pid (ptid);
++  return pid;
++}
++  
+ /* Supply the general-purpose registers in GREGS, to REGCACHE.  */
+ 
+-static void
++void
+ i386bsd_supply_gregset (struct regcache *regcache, const void *gregs)
+ {
+   const char *regs = gregs;
+@@ -110,7 +123,7 @@ i386bsd_supply_gregset (struct regcache *regcache, const void *gregs)
+    GREGS.  If REGNUM is -1, collect and store all appropriate
+    registers.  */
+ 
+-static void
++void
+ i386bsd_collect_gregset (const struct regcache *regcache,
+ 			 void *gregs, int regnum)
+ {
+@@ -140,7 +153,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, ptrace_pid (inferior_ptid),
+ 		  (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+ 	perror_with_name (_("Couldn't get registers"));
+ 
+@@ -162,7 +175,7 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops,
+ 	  char *xstateregs;
+ 
+ 	  xstateregs = alloca(x86_xsave_len);
+-	  if (ptrace (PT_GETXSTATE, ptid_get_pid (inferior_ptid),
++	  if (ptrace (PT_GETXSTATE, ptrace_pid (inferior_ptid),
+ 		      (PTRACE_TYPE_ARG3) xstateregs, 0) == -1)
+ 	    perror_with_name (_("Couldn't get extended state status"));
+ 
+@@ -174,7 +187,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, ptrace_pid (inferior_ptid),
+ 		    (PTRACE_TYPE_ARG3) xmmregs, 0) == 0)
+ 	{
+ 	  have_ptrace_xmmregs = 1;
+@@ -184,7 +197,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, ptrace_pid (inferior_ptid),
+ 		      (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+ 	    perror_with_name (_("Couldn't get floating point status"));
+ 
+@@ -206,13 +219,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, 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, ptrace_pid (inferior_ptid),
+ 	          (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+         perror_with_name (_("Couldn't write registers"));
+ 
+@@ -233,13 +246,13 @@ i386bsd_store_inferior_registers (struct target_ops *ops,
+ 	  char *xstateregs;
+ 
+ 	  xstateregs = alloca(x86_xsave_len);
+-	  if (ptrace (PT_GETXSTATE, ptid_get_pid (inferior_ptid),
++	  if (ptrace (PT_GETXSTATE, 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, ptrace_pid (inferior_ptid),
+ 		      (PTRACE_TYPE_ARG3) xstateregs, x86_xsave_len) == -1)
+ 	    perror_with_name (_("Couldn't write extended state status"));
+ 	}
+@@ -247,14 +260,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, 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, ptrace_pid (inferior_ptid),
+ 		      (PTRACE_TYPE_ARG3) xmmregs, 0) == -1)
+             perror_with_name (_("Couldn't write XMM registers"));
+ 	}
+@@ -262,13 +275,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, 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, ptrace_pid (inferior_ptid),
+ 		      (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+ 	    perror_with_name (_("Couldn't write floating point status"));
+ #ifdef HAVE_PT_GETXMMREGS
+@@ -307,7 +320,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, ptrace_pid (inferior_ptid),
+ 	      (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+     perror_with_name (_("Couldn't read debug registers"));
+ 
+@@ -319,7 +332,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, ptrace_pid (inferior_ptid),
+               (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+     perror_with_name (_("Couldn't get debug registers"));
+ 
+@@ -330,7 +343,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, ptrace_pid (inferior_ptid),
+               (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+     perror_with_name (_("Couldn't write debug registers"));
+ }
+diff --git a/gdb/i386bsd-nat.h b/gdb/i386bsd-nat.h
+index 044f530..2fca773 100644
+--- gdb/i386bsd-nat.h
++++ gdb/i386bsd-nat.h
+@@ -38,6 +38,14 @@ extern CORE_ADDR i386bsd_dr_get_addr (int regnum);
+ 
+ extern unsigned long i386bsd_dr_get_status (void);
+ 
++/* low level i386 register functions used in i386fbsd-nat.c. */
++
++extern void i386bsd_supply_gregset (struct regcache *regcache,
++				    const void *gregs);
++
++extern void i386bsd_collect_gregset (const struct regcache *regcache,
++				     void *gregs, int regnum);
++
+ extern unsigned long i386bsd_dr_get_control (void);
+ 
+ #endif /* i386bsd-nat.h */
+diff --git a/gdb/i386fbsd-nat.c b/gdb/i386fbsd-nat.c
+index b9620e1..71abcdf 100644
+--- gdb/i386fbsd-nat.c
++++ gdb/i386fbsd-nat.c
+@@ -21,6 +21,7 @@
+ #include "inferior.h"
+ #include "regcache.h"
+ #include "target.h"
++#include "gregset.h"
+ 
+ #include <sys/types.h>
+ #include <sys/ptrace.h>
+@@ -82,6 +83,49 @@ i386fbsd_resume (struct target_ops *ops,
+ }
+ 
+ 
++/* Transfering the registers between GDB, inferiors and core files.  */
++
++/* Fill GDB's register array with the general-purpose register values
++   in *GREGSETP.  */
++
++void
++supply_gregset (struct regcache *regcache, const gregset_t *gregsetp)
++{
++  i386bsd_supply_gregset (regcache, gregsetp);
++}
++
++/* Fill register REGNUM (if it is a general-purpose register) in
++   *GREGSETPS with the value in GDB's register array.  If REGNUM is -1,
++   do this for all registers.  */
++
++void
++fill_gregset (const struct regcache *regcache, gdb_gregset_t *gregsetp, int regnum)
++{
++  i386bsd_collect_gregset (regcache, gregsetp, regnum);
++}
++
++#include "i387-tdep.h"
++
++/* Fill GDB's register array with the floating-point register values
++   in *FPREGSETP.  */
++
++void
++supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp)
++{
++  i387_supply_fsave (regcache, -1, fpregsetp);
++}
++
++/* Fill register REGNUM (if it is a floating-point register) in
++   *FPREGSETP with the value in GDB's register array.  If REGNUM is -1,
++   do this for all registers.  */
++
++void
++fill_fpregset (const struct regcache *regcache, gdb_fpregset_t *fpregsetp, int regnum)
++{
++  i387_collect_fsave (regcache, regnum, fpregsetp);
++}
++
++
+ /* Support for debugging kernel virtual memory images.  */
+ 
+ #include <machine/pcb.h>
+diff --git a/gdb/i386fbsd-tdep.c b/gdb/i386fbsd-tdep.c
+index 8f7109f..fcb85d8 100644
+--- gdb/i386fbsd-tdep.c
++++ gdb/i386fbsd-tdep.c
+@@ -30,7 +30,6 @@
+ 
+ #include "i386-tdep.h"
+ #include "i387-tdep.h"
+-#include "bsd-uthread.h"
+ #include "solib-svr4.h"
+ 
+ /* FreeBSD 3.0-RELEASE or later.  */
+@@ -153,46 +152,6 @@ i386fbsd_core_read_description (struct gdbarch *gdbarch,
+ }
+ 
+ static void
+-i386fbsd_supply_uthread (struct regcache *regcache,
+-			 int regnum, CORE_ADDR addr)
+-{
+-  gdb_byte buf[4];
+-  int i;
+-
+-  gdb_assert (regnum >= -1);
+-
+-  for (i = 0; i < ARRAY_SIZE (i386fbsd_jmp_buf_reg_offset); i++)
+-    {
+-      if (i386fbsd_jmp_buf_reg_offset[i] != -1
+-	  && (regnum == -1 || regnum == i))
+-	{
+-	  read_memory (addr + i386fbsd_jmp_buf_reg_offset[i], buf, 4);
+-	  regcache_raw_supply (regcache, i, buf);
+-	}
+-    }
+-}
+-
+-static void
+-i386fbsd_collect_uthread (const struct regcache *regcache,
+-			  int regnum, CORE_ADDR addr)
+-{
+-  gdb_byte buf[4];
+-  int i;
+-
+-  gdb_assert (regnum >= -1);
+-
+-  for (i = 0; i < ARRAY_SIZE (i386fbsd_jmp_buf_reg_offset); i++)
+-    {
+-      if (i386fbsd_jmp_buf_reg_offset[i] != -1
+-	  && (regnum == -1 || regnum == i))
+-	{
+-	  regcache_raw_collect (regcache, i, buf);
+-	  write_memory (addr + i386fbsd_jmp_buf_reg_offset[i], buf, 4);
+-	}
+-    }
+-}
+-
+-static void
+ i386fbsdaout_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+ {
+   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+@@ -217,10 +176,6 @@ i386fbsdaout_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+   /* FreeBSD has a more complete `struct sigcontext'.  */
+   tdep->sc_reg_offset = i386fbsd_sc_reg_offset;
+   tdep->sc_num_regs = ARRAY_SIZE (i386fbsd_sc_reg_offset);
+-
+-  /* FreeBSD provides a user-level threads implementation.  */
+-  bsd_uthread_set_supply_uthread (gdbarch, i386fbsd_supply_uthread);
+-  bsd_uthread_set_collect_uthread (gdbarch, i386fbsd_collect_uthread);
+ }
+ 
+ static void
+diff --git a/gdb/ppcfbsd-nat.c b/gdb/ppcfbsd-nat.c
+index 079bd12..74922f2 100644
+--- gdb/ppcfbsd-nat.c
++++ gdb/ppcfbsd-nat.c
+@@ -39,6 +39,19 @@
+ #include "inf-ptrace.h"
+ #include "bsd-kvm.h"
+ 
++static pid_t
++ptrace_pid (ptid_t ptid)
++{
++  pid_t pid;
++
++#ifdef __FreeBSD__
++  pid = ptid_get_lwp (ptid);
++  if (pid == 0)
++#endif
++    pid = ptid_get_pid (ptid);
++  return pid;
++}
++  
+ /* Fill GDB's register array with the general-purpose register values
+    in *GREGSETP.  */
+ 
+@@ -123,7 +136,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, ptrace_pid (inferior_ptid),
+ 	      (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+     perror_with_name (_("Couldn't get registers"));
+ 
+@@ -134,7 +147,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, ptrace_pid (inferior_ptid),
+ 		  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+ 	perror_with_name (_("Couldn't get FP registers"));
+ 
+@@ -151,13 +164,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, ptrace_pid (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, ptrace_pid (inferior_ptid),
+ 	      (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+     perror_with_name (_("Couldn't write registers"));
+ 
+@@ -165,13 +178,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, 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, ptrace_pid (inferior_ptid),
+ 		  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
+ 	perror_with_name (_("Couldn't set FP registers"));
+     }

Modified: head/devel/gdb/files/fbsd-threads.c
==============================================================================
--- head/devel/gdb/files/fbsd-threads.c	Wed Feb 18 19:17:14 2015	(r379310)
+++ head/devel/gdb/files/fbsd-threads.c	Wed Feb 18 19:24:15 2015	(r379311)
@@ -803,47 +803,6 @@ fbsd_thread_wait (struct target_ops *ops
 }
 
 static void
-fbsd_lwp_fetch_registers (struct target_ops *ops,
-			  struct regcache *regcache, int regnum)
-{
-  gregset_t gregs;
-  fpregset_t fpregs;
-  lwpid_t lwp;
-#ifdef PT_GETXMMREGS
-  char xmmregs[512];
-#endif
-
-  if (!target_has_execution)
-    {
-      struct target_ops *beneath = find_target_beneath (ops);
-
-      beneath->to_fetch_registers (ops, regcache, regnum);
-      return;
-    }
-
-  lwp = GET_LWP (inferior_ptid);
-
-  if (ptrace (PT_GETREGS, lwp, (caddr_t) &gregs, 0) == -1)
-    error ("Cannot get lwp %d registers: %s\n", lwp, safe_strerror (errno));
-  supply_gregset (regcache, &gregs);
-
-#ifdef PT_GETXMMREGS
-  if (ptrace (PT_GETXMMREGS, lwp, xmmregs, 0) == 0)
-    {
-      i387_supply_fxsave (regcache, -1, xmmregs);
-    }
-  else
-    {
-#endif
-      if (ptrace (PT_GETFPREGS, lwp, (caddr_t) &fpregs, 0) == -1)
-	error ("Cannot get lwp %d registers: %s\n ", lwp, safe_strerror (errno));
-      supply_fpregset (regcache, &fpregs);
-#ifdef PT_GETXMMREGS
-    }
-#endif
-}
-
-static void
 fbsd_thread_fetch_registers (struct target_ops *ops,
 			     struct regcache *regcache, int regnum)
 {
@@ -857,7 +816,9 @@ fbsd_thread_fetch_registers (struct targ
 
   if (!IS_THREAD (inferior_ptid))
     {
-      fbsd_lwp_fetch_registers (ops, regcache, regnum);
+      struct target_ops *beneath = find_target_beneath (ops);
+
+      beneath->to_fetch_registers (ops, regcache, regnum);
       return;
     }
 
@@ -895,60 +856,6 @@ fbsd_thread_fetch_registers (struct targ
 }
 
 static void
-fbsd_lwp_store_registers (struct target_ops *ops,
-			  struct regcache *regcache, int regnum)
-{
-  gregset_t gregs;
-  fpregset_t fpregs;
-  lwpid_t lwp;
-#ifdef PT_GETXMMREGS
-  char xmmregs[512];
-#endif
-
-  /* FIXME, is it possible ? */
-  if (!IS_LWP (inferior_ptid))
-    {
-      struct target_ops *beneath = find_target_beneath (ops);
-
-      beneath->to_store_registers (ops, regcache, regnum);
-      return ;
-    }
-
-  lwp = GET_LWP (inferior_ptid);
-  if (regnum != -1)
-    if (ptrace (PT_GETREGS, lwp, (caddr_t) &gregs, 0) == -1)
-      error ("Cannot get lwp %d registers: %s\n", lwp, safe_strerror (errno));
-
-  fill_gregset (regcache, &gregs, regnum);
-  if (ptrace (PT_SETREGS, lwp, (caddr_t) &gregs, 0) == -1)
-      error ("Cannot set lwp %d registers: %s\n", lwp, safe_strerror (errno));
-
-#ifdef PT_GETXMMREGS
-  if (regnum != -1)
-    if (ptrace (PT_GETXMMREGS, lwp, xmmregs, 0) == -1)
-      goto noxmm;
-
-  i387_collect_fxsave (regcache, regnum, xmmregs);
-  if (ptrace (PT_SETXMMREGS, lwp, xmmregs, 0) == -1)
-    goto noxmm;
-
-  return;
-
-noxmm:
-#endif
-
-  if (regnum != -1)
-    if (ptrace (PT_GETFPREGS, lwp, (caddr_t) &fpregs, 0) == -1)
-      error ("Cannot get lwp %d float registers: %s\n", lwp,
-             safe_strerror (errno));
-
-  fill_fpregset (regcache, &fpregs, regnum);
-  if (ptrace (PT_SETFPREGS, lwp, (caddr_t) &fpregs, 0) == -1)
-     error ("Cannot set lwp %d float registers: %s\n", lwp,
-            safe_strerror (errno));
-}
-
-static void
 fbsd_thread_store_registers (struct target_ops *ops,
 			     struct regcache *regcache, int regnum)
 {
@@ -962,7 +869,9 @@ fbsd_thread_store_registers (struct targ
 
   if (!IS_THREAD (inferior_ptid))
     {
-      fbsd_lwp_store_registers (ops, regcache, regnum);
+      struct target_ops *beneath = find_target_beneath (ops);
+
+      beneath->to_store_registers (ops, regcache, regnum);
       return;
     }
 

Modified: head/devel/gdb/files/patch-gdb-amd64fbsd-nat.c
==============================================================================
--- head/devel/gdb/files/patch-gdb-amd64fbsd-nat.c	Wed Feb 18 19:17:14 2015	(r379310)
+++ head/devel/gdb/files/patch-gdb-amd64fbsd-nat.c	Wed Feb 18 19:24:15 2015	(r379311)
@@ -1,10 +1,9 @@
 --- gdb/amd64fbsd-nat.c.orig	2014-06-11 18:34:41.000000000 +0200
 +++ gdb/amd64fbsd-nat.c	2014-09-24 18:27:50.618458853 +0200
-@@ -21,13 +21,17 @@
+@@ -21,13 +21,16 @@
  #include "inferior.h"
  #include "regcache.h"
  #include "target.h"
-+#include "gregset.h"
  
  #include "gdb_assert.h"
  #include <signal.h>
@@ -18,53 +17,6 @@
  #include <machine/reg.h>
  
  #include "fbsd-nat.h"
-@@ -93,6 +97,46 @@
- };
- 
- 
-+/* Transfering the registers between GDB, inferiors and core files.  */
-+
-+/* Fill GDB's register array with the general-purpose register values
-+   in *GREGSETP.  */
-+
-+void
-+supply_gregset (struct regcache *regcache, const gregset_t *gregsetp)
-+{
-+  amd64_supply_native_gregset (regcache, gregsetp, -1);
-+}
-+
-+/* Fill register REGNUM (if it is a general-purpose register) in
-+   *GREGSETPS with the value in GDB's register array.  If REGNUM is -1,
-+   do this for all registers.  */
-+
-+void
-+fill_gregset (const struct regcache *regcache, gdb_gregset_t *gregsetp, int regnum)
-+{
-+  amd64_collect_native_gregset (regcache, gregsetp, regnum);
-+}
-+
-+/* Fill GDB's register array with the floating-point register values
-+   in *FPREGSETP.  */
-+
-+void
-+supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp)
-+{
-+  amd64_supply_fxsave (regcache, -1, fpregsetp);
-+}
-+
-+/* Fill register REGNUM (if it is a floating-point register) in
-+   *FPREGSETP with the value in GDB's register array.  If REGNUM is -1,
-+   do this for all registers.  */
-+
-+void
-+fill_fpregset (const struct regcache *regcache, gdb_fpregset_t *fpregsetp, int regnum)
-+{
-+  amd64_collect_fxsave (regcache, regnum, fpregsetp);
-+}
-+
- /* Support for debugging kernel virtual memory images.  */
- 
- #include <machine/pcb.h>
 @@ -247,6 +291,10 @@
  
    SC_RBP_OFFSET = offset;

Modified: head/devel/gdb/files/patch-gdb-amd64fbsd-tdep.c
==============================================================================
--- head/devel/gdb/files/patch-gdb-amd64fbsd-tdep.c	Wed Feb 18 19:17:14 2015	(r379310)
+++ head/devel/gdb/files/patch-gdb-amd64fbsd-tdep.c	Wed Feb 18 19:24:15 2015	(r379311)
@@ -1,13 +1,5 @@
 --- gdb/amd64fbsd-tdep.c.orig	2010-01-01 02:31:29.000000000 -0500
 +++ gdb/amd64fbsd-tdep.c	2011-01-05 17:27:29.264869000 -0500
-@@ -29,7 +29,6 @@
- #include "gdb_string.h"
- 
- #include "amd64-tdep.h"
--#include "bsd-uthread.h"
- #include "solib-svr4.h"
- 
- /* Support for signal handlers.  */
 @@ -40,12 +39,16 @@
  static CORE_ADDR
  amd64fbsd_sigcontext_addr (struct frame_info *this_frame)
@@ -26,61 +18,3 @@
    return sp + 16;
  }
  
-@@ -142,46 +145,6 @@
- };
- 
- static void
--amd64fbsd_supply_uthread (struct regcache *regcache,
--			  int regnum, CORE_ADDR addr)
--{
--  gdb_byte buf[8];
--  int i;
--
--  gdb_assert (regnum >= -1);
--
--  for (i = 0; i < ARRAY_SIZE (amd64fbsd_jmp_buf_reg_offset); i++)
--    {
--      if (amd64fbsd_jmp_buf_reg_offset[i] != -1
--	  && (regnum == -1 || regnum == i))
--	{
--	  read_memory (addr + amd64fbsd_jmp_buf_reg_offset[i], buf, 8);
--	  regcache_raw_supply (regcache, i, buf);
--	}
--    }
--}
--
--static void
--amd64fbsd_collect_uthread (const struct regcache *regcache,
--			   int regnum, CORE_ADDR addr)
--{
--  gdb_byte buf[8];
--  int i;
--
--  gdb_assert (regnum >= -1);

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201502181924.t1IJOGJQ055693>