svn commit: r464493 - in head/devel/gdb: . files files/kgdb

Luca Pizzamiglio pizzamig at FreeBSD.org
Wed Mar 14 14:33:23 UTC 2018


Author: pizzamig
Date: Wed Mar 14 14:33:21 2018
New Revision: 464493
URL: https://svnweb.freebsd.org/changeset/ports/464493

Log:
  devel/gdb: Update to version 8.1
  
  The official annoucement is available here:
  https://www.gnu.org/software/gdb/download/ANNOUNCEMENT
  
  Moreover:
  * support for 'info proc' is added (jhb@)
  * update kgdb to use gdb 8.1
  
  Reviewed by:	jhb@
  Differential Revision:	https://reviews.freebsd.org/D14148

Added:
  head/devel/gdb/files/commit-12279366d7   (contents, props changed)
  head/devel/gdb/files/commit-262f62f57d   (contents, props changed)
  head/devel/gdb/files/commit-2d97a5d9d3   (contents, props changed)
  head/devel/gdb/files/commit-386a867618   (contents, props changed)
  head/devel/gdb/files/commit-7efba073e2   (contents, props changed)
  head/devel/gdb/files/commit-906b4aac4c   (contents, props changed)
  head/devel/gdb/files/commit-92fce24de2   (contents, props changed)
  head/devel/gdb/files/commit-b999e2038d   (contents, props changed)
  head/devel/gdb/files/commit-d2176225dc   (contents, props changed)
  head/devel/gdb/files/commit-f169cfdc08   (contents, props changed)
Deleted:
  head/devel/gdb/files/commit-0335ac6d12
  head/devel/gdb/files/commit-0aa37b654c
  head/devel/gdb/files/commit-0b9305edf1
  head/devel/gdb/files/commit-12c4bd7f53
  head/devel/gdb/files/commit-2af9fc4432
  head/devel/gdb/files/commit-382b69bbb7
  head/devel/gdb/files/commit-3c3ae77e68
  head/devel/gdb/files/commit-45eba0ab7d
  head/devel/gdb/files/commit-48aeef91c2
  head/devel/gdb/files/commit-4b654465bf
  head/devel/gdb/files/commit-544c67cda1
  head/devel/gdb/files/commit-6d5be5d6b8
  head/devel/gdb/files/commit-6e5eab33ab
  head/devel/gdb/files/commit-762c974a09
  head/devel/gdb/files/commit-929edea98d
  head/devel/gdb/files/commit-a181c0bf74
  head/devel/gdb/files/commit-a80a647180
  head/devel/gdb/files/commit-b30ff123fb
  head/devel/gdb/files/commit-b5430a3ced
  head/devel/gdb/files/commit-e6f3b9c319
  head/devel/gdb/files/patch-aarch64-fbsd
  head/devel/gdb/files/patch-armfbsd
  head/devel/gdb/files/patch-gdb_configure.host
  head/devel/gdb/files/patch-nowarning
Modified:
  head/devel/gdb/Makefile
  head/devel/gdb/distinfo
  head/devel/gdb/files/extrapatch-kgdb
  head/devel/gdb/files/kgdb/amd64fbsd-kern.c
  head/devel/gdb/files/kgdb/fbsd-kld.c
  head/devel/gdb/files/kgdb/fbsd-kvm.c
  head/devel/gdb/files/kgdb/i386fbsd-kern.c
  head/devel/gdb/files/kgdb/kgdb-main.c
  head/devel/gdb/files/kgdb/mipsfbsd-kern.c
  head/devel/gdb/files/kgdb/ppcfbsd-kern.c
  head/devel/gdb/files/kgdb/sparc64fbsd-kern.c
  head/devel/gdb/files/patch-gdb_configure

Modified: head/devel/gdb/Makefile
==============================================================================
--- head/devel/gdb/Makefile	Wed Mar 14 13:58:03 2018	(r464492)
+++ head/devel/gdb/Makefile	Wed Mar 14 14:33:21 2018	(r464493)
@@ -2,8 +2,7 @@
 # $FreeBSD$
 
 PORTNAME=	gdb
-PORTVERSION=	8.0.1
-PORTREVISION=	2
+PORTVERSION=	8.1
 CATEGORIES=	devel
 MASTER_SITES=	GNU
 
@@ -39,26 +38,16 @@ CFLAGS:=	${CFLAGS:C/ +$//}	# blanks at EOL creep in so
 CFLAGS+=	-DRL_NO_COMPAT -Wno-unused-function -Wno-unused-variable
 EXCLUDE=	dejagnu expect sim texinfo intl
 EXTRACT_AFTER_ARGS=	${EXCLUDE:S/^/--exclude /}
-EXTRA_PATCHES=	${FILESDIR}/commit-45eba0ab7d \
-		${FILESDIR}/commit-3c3ae77e68 \
-		${FILESDIR}/commit-b5430a3ced \
-		${FILESDIR}/commit-762c974a09 \
-		${FILESDIR}/commit-929edea98d \
-		${FILESDIR}/commit-6e5eab33ab \
-		${FILESDIR}/commit-382b69bbb7 \
-		${FILESDIR}/commit-2af9fc4432 \
-		${FILESDIR}/commit-0b9305edf1 \
-		${FILESDIR}/commit-e6f3b9c319 \
-		${FILESDIR}/commit-4b654465bf \
-		${FILESDIR}/commit-b30ff123fb \
-		${FILESDIR}/commit-48aeef91c2 \
-		${FILESDIR}/commit-0aa37b654c \
-		${FILESDIR}/commit-0335ac6d12 \
-		${FILESDIR}/commit-12c4bd7f53 \
-		${FILESDIR}/commit-6d5be5d6b8 \
-		${FILESDIR}/commit-a80a647180 \
-		${FILESDIR}/commit-544c67cda1 \
-		${FILESDIR}/commit-a181c0bf74
+EXTRA_PATCHES=	${FILESDIR}/commit-d2176225dc \
+		${FILESDIR}/commit-b999e2038d \
+		${FILESDIR}/commit-262f62f57d \
+		${FILESDIR}/commit-92fce24de2 \
+		${FILESDIR}/commit-2d97a5d9d3 \
+		${FILESDIR}/commit-906b4aac4c \
+		${FILESDIR}/commit-f169cfdc08 \
+		${FILESDIR}/commit-12279366d7 \
+		${FILESDIR}/commit-386a867618 \
+		${FILESDIR}/commit-7efba073e2
 LIB_DEPENDS+=	libexpat.so:textproc/expat2
 
 VER=		${PORTVERSION:S/.//g}

Modified: head/devel/gdb/distinfo
==============================================================================
--- head/devel/gdb/distinfo	Wed Mar 14 13:58:03 2018	(r464492)
+++ head/devel/gdb/distinfo	Wed Mar 14 14:33:21 2018	(r464493)
@@ -1,3 +1,3 @@
-TIMESTAMP = 1505207991
-SHA256 (gdb-8.0.1.tar.xz) = 3dbd5f93e36ba2815ad0efab030dcd0c7b211d7b353a40a53f4c02d7d56295e3
-SIZE (gdb-8.0.1.tar.xz) = 19583920
+TIMESTAMP = 1517392551
+SHA256 (gdb-8.1.tar.xz) = af61a0263858e69c5dce51eab26662ff3d2ad9aa68da9583e8143b5426be4b34
+SIZE (gdb-8.1.tar.xz) = 20095080

Added: head/devel/gdb/files/commit-12279366d7
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/commit-12279366d7	Wed Mar 14 14:33:21 2018	(r464493)
@@ -0,0 +1,121 @@
+commit 12279366d71627bfbdd74d1a6675dca825d8feca
+Author: John Baldwin <jhb at FreeBSD.org>
+Date:   Sat Mar 3 21:25:33 2018 -0800
+
+    Implement "to_stopped_by_hw_breakpoint" for x86 debug registers.
+    
+    Report that a thread is stopped by a hardware breakpoint if a non-data
+    watchpoint is set in DR6.  This change should be a no-op since a target
+    still needs to implement the "to_supports_stopped_by_hw_breakpoint"
+    method before this function is used.
+    
+    gdb/ChangeLog:
+    
+            * nat/x86-dregs.c (x86_dr_stopped_by_hw_breakpoint): New function.
+            * nat/x86-dregs.h (x86_dr_stopped_by_hw_breakpoint): New
+            prototype.
+            * x86-nat.c (x86_stopped_by_hw_breakpoint): New function.
+            (x86_use_watchpoints): Set "stopped_by_hw_breakpoint" target
+            method.
+
+diff --git gdb/nat/x86-dregs.c gdb/nat/x86-dregs.c
+index c816473628..f11a708e27 100644
+--- gdb/nat/x86-dregs.c
++++ gdb/nat/x86-dregs.c
+@@ -649,3 +649,48 @@ x86_dr_stopped_by_watchpoint (struct x86_debug_reg_state *state)
+   CORE_ADDR addr = 0;
+   return x86_dr_stopped_data_address (state, &addr);
+ }
++
++/* Return non-zero if the inferior has some hardware breakpoint that
++   triggered.  Otherwise return zero.  */
++
++int
++x86_dr_stopped_by_hw_breakpoint (struct x86_debug_reg_state *state)
++{
++  CORE_ADDR addr = 0;
++  int i;
++  int rc = 0;
++  /* The current thread's DR_STATUS.  We always need to read this to
++     check whether some watchpoint caused the trap.  */
++  unsigned status;
++  /* We need DR_CONTROL as well, but only iff DR_STATUS indicates a
++     breakpoint trap.  Only fetch it when necessary, to avoid an
++     unnecessary extra syscall when no watchpoint triggered.  */
++  int control_p = 0;
++  unsigned control = 0;
++
++  /* As above, always read the current thread's debug registers rather
++     than trusting dr_mirror.  */
++  status = x86_dr_low_get_status ();
++
++  ALL_DEBUG_ADDRESS_REGISTERS (i)
++    {
++      if (!X86_DR_WATCH_HIT (status, i))
++	continue;
++
++      if (!control_p)
++	{
++	  control = x86_dr_low_get_control ();
++	  control_p = 1;
++	}
++
++      if (X86_DR_GET_RW_LEN (control, i) == 0)
++	{
++	  addr = x86_dr_low_get_addr (i);
++	  rc = 1;
++	  if (show_debug_regs)
++	    x86_show_dr (state, "watchpoint_hit", addr, -1, hw_execute);
++	}
++    }
++
++  return rc;
++}
+diff --git gdb/nat/x86-dregs.h gdb/nat/x86-dregs.h
+index dd6242eda9..e86e83aea0 100644
+--- gdb/nat/x86-dregs.h
++++ gdb/nat/x86-dregs.h
+@@ -128,4 +128,8 @@ extern int x86_dr_stopped_data_address (struct x86_debug_reg_state *state,
+    Otherwise return false.  */
+ extern int x86_dr_stopped_by_watchpoint (struct x86_debug_reg_state *state);
+ 
++/* Return true if the inferior has some hardware breakpoint that
++   triggered.  Otherwise return false.  */
++extern int x86_dr_stopped_by_hw_breakpoint (struct x86_debug_reg_state *state);
++
+ #endif /* X86_DREGS_H */
+diff --git gdb/x86-nat.c gdb/x86-nat.c
+index b126c47c94..bec51373a6 100644
+--- gdb/x86-nat.c
++++ gdb/x86-nat.c
+@@ -260,6 +260,18 @@ x86_can_use_hw_breakpoint (struct target_ops *self,
+   return 1;
+ }
+ 
++/* Return non-zero if the inferior has some breakpoint that triggered.
++   Otherwise return zero.  */
++
++static int
++x86_stopped_by_hw_breakpoint (struct target_ops *ops)
++{
++  struct x86_debug_reg_state *state
++    = x86_debug_reg_state (ptid_get_pid (inferior_ptid));
++
++  return x86_dr_stopped_by_hw_breakpoint (state);
++}
++
+ static void
+ add_show_debug_regs_command (void)
+ {
+@@ -297,6 +309,11 @@ x86_use_watchpoints (struct target_ops *t)
+   t->to_remove_watchpoint = x86_remove_watchpoint;
+   t->to_insert_hw_breakpoint = x86_insert_hw_breakpoint;
+   t->to_remove_hw_breakpoint = x86_remove_hw_breakpoint;
++
++  /* A target must provide an implementation of the
++     "to_supports_stopped_by_hw_breakpoint" target method before this
++     callback will be used.  */
++  t->to_stopped_by_hw_breakpoint = x86_stopped_by_hw_breakpoint;
+ }
+ 
+ void

Added: head/devel/gdb/files/commit-262f62f57d
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/commit-262f62f57d	Wed Mar 14 14:33:21 2018	(r464493)
@@ -0,0 +1,43 @@
+commit 262f62f57d987269152412a55c458a03adc6ddd6
+Author: John Baldwin <jhb at FreeBSD.org>
+Date:   Tue Jan 9 13:35:17 2018 -0800
+
+    Use gdb::unique_xmalloc_ptr<> instead of a deleter that invokes free().
+    
+    Since xfree() always wraps free(), it is safe to use the xfree deleter
+    for buffers allocated by library routines such as kinfo_getvmmap() that
+    must be released via free().
+    
+    gdb/ChangeLog:
+    
+            * fbsd-nat.c (struct free_deleter): Remove.
+            (fbsd_find_memory_regions): Use gdb::unique_xmalloc_ptr<>.
+
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index d0aaf89145..81f8e27a2d 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -81,14 +81,6 @@ fbsd_pid_to_exec_file (struct target_ops *self, int pid)
+ }
+ 
+ #ifdef HAVE_KINFO_GETVMMAP
+-/* Deleter for std::unique_ptr that invokes free.  */
+-
+-template <typename T>
+-struct free_deleter
+-{
+-  void operator() (T *ptr) const { free (ptr); }
+-};
+-
+ /* Iterate over all the memory regions in the current inferior,
+    calling FUNC for each memory region.  OBFD is passed as the last
+    argument to FUNC.  */
+@@ -102,7 +94,7 @@ fbsd_find_memory_regions (struct target_ops *self,
+   uint64_t size;
+   int i, nitems;
+ 
+-  std::unique_ptr<struct kinfo_vmentry, free_deleter<struct kinfo_vmentry>>
++  gdb::unique_xmalloc_ptr<struct kinfo_vmentry>
+     vmentl (kinfo_getvmmap (pid, &nitems));
+   if (vmentl == NULL)
+     perror_with_name (_("Couldn't fetch VM map entries."));

Added: head/devel/gdb/files/commit-2d97a5d9d3
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/commit-2d97a5d9d3	Wed Mar 14 14:33:21 2018	(r464493)
@@ -0,0 +1,169 @@
+commit 2d97a5d9d33aea87c3bd02fd1fa417f5d4e1fa05
+Author: John Baldwin <jhb at FreeBSD.org>
+Date:   Tue Jan 9 13:35:17 2018 -0800
+
+    Document support for 'info proc' on FreeBSD.
+    
+    Since the 'info proc' support on FreeBSD does not use /proc, reword
+    the documentation for 'info proc' to not assume /proc.  This includes
+    renaming the node to 'Process Information' and suggesting that
+    additional process information can be queried via different
+    OS-specific interfaces.  This is also cleans up the description of
+    'info proc' support for core files a bit as /proc is not used for core
+    file support on any current platform.
+    
+    gdb/ChangeLog:
+    
+            * NEWS: Document that 'info proc' now works on FreeBSD.
+    
+    gdb/doc/ChangeLog:
+    
+            * gdb.texinfo (pwd): Update cross-reference for Process Information
+            node and remove explicit /proc reference.
+            (Native): Rename subsection from SVR4 Process Information to
+            Process Information.
+            (Process Information): Reword introduction to be less /proc
+            centric.  Document support for "info proc" on FreeBSD.
+
+diff --git gdb/NEWS gdb/NEWS
+index 2f834c6ff4..f69173a245 100644
+--- gdb/NEWS
++++ gdb/NEWS
+@@ -3,6 +3,9 @@
+ 
+ *** Changes since GDB 8.1
+ 
++* 'info proc' now works on running processes on FreeBSD systems and core
++  files created on FreeBSD systems.
++
+ *** Changes in GDB 8.1
+ 
+ * GDB now supports dynamically creating arbitrary register groups specified
+diff --git gdb/doc/gdb.texinfo gdb/doc/gdb.texinfo
+index 8bdafb0ba4..096c82cc82 100644
+--- gdb/doc/gdb.texinfo
++++ gdb/doc/gdb.texinfo
+@@ -2523,9 +2523,9 @@ Print the @value{GDBN} working directory.
+ 
+ It is generally impossible to find the current working directory of
+ the process being debugged (since a program can change its directory
+-during its run).  If you work on a system where @value{GDBN} is
+-configured with the @file{/proc} support, you can use the @code{info
+-proc} command (@pxref{SVR4 Process Information}) to find out the
++during its run).  If you work on a system where @value{GDBN} supports
++the @code {info proc} command (@pxref{Process Information}), you can
++use the @code{info proc} command to find out the
+ current working directory of the debuggee.
+ 
+ @node Input/Output
+@@ -21712,7 +21712,7 @@ configurations.
+ 
+ @menu
+ * BSD libkvm Interface::	Debugging BSD kernel memory images
+-* SVR4 Process Information::    SVR4 process information
++* Process Information::         Process information
+ * DJGPP Native::                Features specific to the DJGPP port
+ * Cygwin Native::		Features specific to the Cygwin port
+ * Hurd Native::                 Features specific to @sc{gnu} Hurd
+@@ -21759,24 +21759,32 @@ Set current context from proc address.  This command isn't available on
+ modern FreeBSD systems.
+ @end table
+ 
+- at node SVR4 Process Information
+- at subsection SVR4 Process Information
++ at node Process Information
++ at subsection Process Information
+ @cindex /proc
+ @cindex examine process image
+ @cindex process info via @file{/proc}
+ 
+-Many versions of SVR4 and compatible systems provide a facility called
+- at samp{/proc} that can be used to examine the image of a running
+-process using file-system subroutines.
++Some operating systems provide interfaces to fetch additional
++information about running processes beyond memory and per-thread
++register state.  If @value{GDBN} is configured for an operating system
++with a supported interface, the command @code{info proc} is available
++to report information about the process running your program, or about
++any process running on your system.
+ 
+-If @value{GDBN} is configured for an operating system with this
+-facility, the command @code{info proc} is available to report
+-information about the process running your program, or about any
+-process running on your system.  This includes, as of this writing,
+- at sc{gnu}/Linux and Solaris, for example.
++One supported interface is a facility called @samp{/proc} that can be
++used to examine the image of a running process using file-system
++subroutines.  This facility is supported on @sc{gnu}/Linux and Solaris
++systems.
+ 
+-This command may also work on core files that were created on a system
+-that has the @samp{/proc} facility.
++On FreeBSD systems, system control nodes are used to query process
++information.
++
++In addition, some systems may provide additional process information
++in core files.  Note that a core file may include a subset of the
++information available from a live process.  Process information is
++currently avaiable from cores created on @sc{gnu}/Linux and FreeBSD
++systems.
+ 
+ @table @code
+ @kindex info proc
+@@ -21800,36 +21808,40 @@ a process ID rather than a thread ID).
+ @item info proc cmdline
+ @cindex info proc cmdline
+ Show the original command line of the process.  This command is
+-specific to @sc{gnu}/Linux.
++supported on @sc{gnu}/Linux and FreeBSD.
+ 
+ @item info proc cwd
+ @cindex info proc cwd
+ Show the current working directory of the process.  This command is
+-specific to @sc{gnu}/Linux.
++supported on @sc{gnu}/Linux and FreeBSD.
+ 
+ @item info proc exe
+ @cindex info proc exe
+-Show the name of executable of the process.  This command is specific
+-to @sc{gnu}/Linux.
++Show the name of executable of the process.  This command is supported
++on @sc{gnu}/Linux and FreeBSD.
+ 
+ @item info proc mappings
+ @cindex memory address space mappings
+-Report the memory address space ranges accessible in the program, with
+-information on whether the process has read, write, or execute access
+-rights to each range.  On @sc{gnu}/Linux systems, each memory range
+-includes the object file which is mapped to that range, instead of the
+-memory access rights to that range.
++Report the memory address space ranges accessible in the program.  On
++Solaris and FreeBSD systems, each memory range includes information on
++whether the process has read, write, or execute access rights to each
++range.  On @sc{gnu}/Linux and FreeBSD systems, each memory range
++includes the object file which is mapped to that range.
+ 
+ @item info proc stat
+ @itemx info proc status
+ @cindex process detailed status information
+-These subcommands are specific to @sc{gnu}/Linux systems.  They show
+-the process-related information, including the user ID and group ID;
+-how many threads are there in the process; its virtual memory usage;
+-the signals that are pending, blocked, and ignored; its TTY; its
+-consumption of system and user time; its stack size; its @samp{nice}
+-value; etc.  For more information, see the @samp{proc} man page
+-(type @kbd{man 5 proc} from your shell prompt).
++Show additional process-related information, including the user ID and
++group ID; virtual memory usage; the signals that are pending, blocked,
++and ignored; its TTY; its consumption of system and user time; its
++stack size; its @samp{nice} value; etc.  These commands are supported
++on @sc{gnu}/Linux and FreeBSD.
++
++For @sc{gnu}/Linux systems, see the @samp{proc} man page for more
++information (type @kbd{man 5 proc} from your shell prompt).
++
++For FreeBSD systems, @code{info proc stat} is an alias for @code{info
++proc status}.
+ 
+ @item info proc all
+ Show all the information about the process described under all of the

Added: head/devel/gdb/files/commit-386a867618
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/commit-386a867618	Wed Mar 14 14:33:21 2018	(r464493)
@@ -0,0 +1,115 @@
+commit 386a86761838df16c1459275d465ed21a1c35d9f
+Author: John Baldwin <jhb at FreeBSD.org>
+Date:   Sat Mar 3 21:25:33 2018 -0800
+
+    Add a new debug knob for the FreeBSD native target.
+    
+    For now this just logs information about the state of the current LWP
+    for each STOPPED event in fbsd_wait().
+    
+    gdb/ChangeLog:
+    
+            * NEWS (Changes since GDB 8.1): Add "set/show debug fbsd-nat".
+            * fbsd-nat.c (debug_fbsd_nat): New variable.
+            (show_fbsd_nat_debug): New function.
+            (fbsd_wait): Log LWP info if "debug_fbsd_nat" is enabled.
+            (_initialize_fbsd_nat): Add "fbsd-nat" debug boolean command.
+    
+    gdb/doc/ChangeLog:
+    
+            * gdb.texinfo (Debugging Output): Document "set/show debug
+            fbsd-nat".
+
+diff --git gdb/NEWS gdb/NEWS
+index 1767cef920..867e268a2a 100644
+--- gdb/NEWS
++++ gdb/NEWS
+@@ -6,6 +6,12 @@
+ * 'info proc' now works on running processes on FreeBSD systems and core
+   files created on FreeBSD systems.
+ 
++* New commands
++
++set debug fbsd-nat
++show debug fbsd-nat
++  Control display of debugging info regarding the FreeBSD native target.
++
+ *** Changes in GDB 8.1
+ 
+ * GDB now supports dynamically creating arbitrary register groups specified
+diff --git gdb/doc/gdb.texinfo gdb/doc/gdb.texinfo
+index ee7adc8df2..74e0fdb4a4 100644
+--- gdb/doc/gdb.texinfo
++++ gdb/doc/gdb.texinfo
+@@ -24554,6 +24554,11 @@ Displays the current state of displaying debugging info about
+ Turns on or off debugging messages from the FreeBSD LWP debug support.
+ @item show debug fbsd-lwp
+ Show the current state of FreeBSD LWP debugging messages.
++ at item set debug fbsd-nat
++ at cindex FreeBSD native target debug messages
++Turns on or off debugging messages from the FreeBSD native target.
++ at item show debug fbsd-nat
++Show the current state of FreeBSD native target debugging messages.
+ @item set debug frame
+ @cindex frame debugging info
+ Turns on or off display of @value{GDBN} frame debugging info.  The
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index 3a216abf18..2516ac5552 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -765,6 +765,7 @@ fbsd_xfer_partial (struct target_ops *ops, enum target_object object,
+ 
+ #ifdef PT_LWPINFO
+ static int debug_fbsd_lwp;
++static int debug_fbsd_nat;
+ 
+ static void (*super_resume) (struct target_ops *,
+ 			     ptid_t,
+@@ -782,6 +783,14 @@ show_fbsd_lwp_debug (struct ui_file *file, int from_tty,
+   fprintf_filtered (file, _("Debugging of FreeBSD lwp module is %s.\n"), value);
+ }
+ 
++static void
++show_fbsd_nat_debug (struct ui_file *file, int from_tty,
++		     struct cmd_list_element *c, const char *value)
++{
++  fprintf_filtered (file, _("Debugging of FreeBSD native target is %s.\n"),
++		    value);
++}
++
+ /*
+   FreeBSD's first thread support was via a "reentrant" version of libc
+   (libc_r) that first shipped in 2.2.7.  This library multiplexed all
+@@ -1212,6 +1221,18 @@ fbsd_wait (struct target_ops *ops,
+ 
+ 	  wptid = ptid_build (pid, pl.pl_lwpid, 0);
+ 
++	  if (debug_fbsd_nat)
++	    {
++	      fprintf_unfiltered (gdb_stdlog,
++				  "FNAT: stop for LWP %u event %d flags %#x\n",
++				  pl.pl_lwpid, pl.pl_event, pl.pl_flags);
++	      if (pl.pl_flags & PL_FLAG_SI)
++		fprintf_unfiltered (gdb_stdlog,
++				    "FNAT: si_signo %u si_code %u\n",
++				    pl.pl_siginfo.si_signo,
++				    pl.pl_siginfo.si_code);
++	    }
++
+ #ifdef PT_LWP_EVENTS
+ 	  if (pl.pl_flags & PL_FLAG_EXITED)
+ 	    {
+@@ -1569,5 +1590,13 @@ Enables printf debugging output."),
+ 			   NULL,
+ 			   &show_fbsd_lwp_debug,
+ 			   &setdebuglist, &showdebuglist);
++  add_setshow_boolean_cmd ("fbsd-nat", class_maintenance,
++			   &debug_fbsd_nat, _("\
++Set debugging of FreeBSD native target."), _("\
++Show debugging of FreeBSD native target."), _("\
++Enables printf debugging output."),
++			   NULL,
++			   &show_fbsd_nat_debug,
++			   &setdebuglist, &showdebuglist);
+ #endif
+ }

Added: head/devel/gdb/files/commit-7efba073e2
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/commit-7efba073e2	Wed Mar 14 14:33:21 2018	(r464493)
@@ -0,0 +1,184 @@
+commit 7efba073e2b83803a47fd89e701fe60b98f2debc
+Author: John Baldwin <jhb at FreeBSD.org>
+Date:   Sat Mar 3 21:25:33 2018 -0800
+
+    Use signal information to determine SIGTRAP type for FreeBSD.
+    
+    Use the signal code from siginfo_t to distinguish SIGTRAP events due
+    to trace traps (TRAP_TRACE) and software breakpoints (TRAP_BRKPT).
+    For software breakpoints, adjust the PC when the event is reported as
+    part of the API when supplying "stopped_by_sw_breakpoint".  Currently
+    FreeBSD only supports hardware watchpoints and breakpoints on x86
+    which are reported as trace traps.  Signal information is not used on
+    MIPS and sparc64 kernels which do not reliably report TRAP_BRKPT for
+    software breakpoints.
+    
+    gdb/ChangeLog:
+    
+            * fbsd-nat.c: Include "inf-ptrace.h".
+            (USE_SIGTRAP_SIGINFO): Conditionally define.
+            [USE_SIGTRAP_SIGINFO] (fbsd_handle_debug_trap): New function.
+            (fbsd_wait) [USE_SIGTRAP_SIGINFO]: Call "fbsd_handle_debug_trap".
+            [USE_SIGTRAP_SIGINFO] (fbsd_stopped_by_sw_breakpoint): New
+            function.
+            [USE_SIGTRAP_SIGINFO] (fbsd_supports_stopped_by_sw_breakpoint):
+            Likewise.
+            [USE_SIGTRAP_SIGINFO] (fbsd_supports_stopped_by_hw_breakpoint):
+            Likewise.
+            (fbsd_nat_add_target) [USE_SIGTRAP_SIGINFO]: Set
+            "stopped_by_sw_breakpoint", "supports_stopped_by_sw_breakpoint",
+            "supports_stopped_by_hw_breakpoint" target methods.
+
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index 2516ac5552..bea7f42c7e 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -26,6 +26,7 @@
+ #include "gdbcmd.h"
+ #include "gdbthread.h"
+ #include "gdb_wait.h"
++#include "inf-ptrace.h"
+ #include <sys/types.h>
+ #include <sys/procfs.h>
+ #include <sys/ptrace.h>
+@@ -45,6 +46,14 @@
+ 
+ #include <list>
+ 
++#ifdef TRAP_BRKPT
++/* MIPS does not set si_code for SIGTRAP.  sparc64 reports
++   non-standard values in si_code for SIGTRAP.  */
++# if !defined(__mips__) && !defined(__sparc64__)
++#  define USE_SIGTRAP_SIGINFO
++# endif
++#endif
++
+ /* Return the name of a file that can be opened to get the symbols for
+    the child process identified by PID.  */
+ 
+@@ -1187,6 +1196,56 @@ fbsd_resume (struct target_ops *ops,
+   super_resume (ops, ptid, step, signo);
+ }
+ 
++#ifdef USE_SIGTRAP_SIGINFO
++/* Handle breakpoint and trace traps reported via SIGTRAP.  If the
++   trap was a breakpoint or trace trap that should be reported to the
++   core, return true.  */
++
++static bool
++fbsd_handle_debug_trap (struct target_ops *ops, ptid_t ptid,
++			const struct ptrace_lwpinfo &pl)
++{
++
++  /* Ignore traps without valid siginfo or for signals other than
++     SIGTRAP.  */
++  if (! (pl.pl_flags & PL_FLAG_SI) || pl.pl_siginfo.si_signo != SIGTRAP)
++    return false;
++
++  /* Trace traps are either a single step or a hardware watchpoint or
++     breakpoint.  */
++  if (pl.pl_siginfo.si_code == TRAP_TRACE)
++    {
++      if (debug_fbsd_nat)
++	fprintf_unfiltered (gdb_stdlog,
++			    "FNAT: trace trap for LWP %ld\n", ptid.lwp ());
++      return true;
++    }
++
++  if (pl.pl_siginfo.si_code == TRAP_BRKPT)
++    {
++      /* Fixup PC for the software breakpoint.  */
++      struct regcache *regcache = get_thread_regcache (ptid);
++      struct gdbarch *gdbarch = regcache->arch ();
++      int decr_pc = gdbarch_decr_pc_after_break (gdbarch);
++
++      if (debug_fbsd_nat)
++	fprintf_unfiltered (gdb_stdlog,
++			    "FNAT: sw breakpoint trap for LWP %ld\n",
++			    ptid.lwp ());
++      if (decr_pc != 0)
++	{
++	  CORE_ADDR pc;
++
++	  pc = regcache_read_pc (regcache);
++	  regcache_write_pc (regcache, pc - decr_pc);
++	}
++      return true;
++    }
++
++  return false;
++}
++#endif
++
+ /* Wait for the child specified by PTID to do something.  Return the
+    process ID of the child, or MINUS_ONE_PTID in case of error; store
+    the status in *OURSTATUS.  */
+@@ -1372,6 +1431,11 @@ fbsd_wait (struct target_ops *ops,
+ 	    }
+ #endif
+ 
++#ifdef USE_SIGTRAP_SIGINFO
++	  if (fbsd_handle_debug_trap (ops, wptid, pl))
++	    return wptid;
++#endif
++
+ 	  /* Note that PL_FLAG_SCE is set for any event reported while
+ 	     a thread is executing a system call in the kernel.  In
+ 	     particular, signals that interrupt a sleep in a system
+@@ -1410,6 +1474,42 @@ fbsd_wait (struct target_ops *ops,
+     }
+ }
+ 
++#ifdef USE_SIGTRAP_SIGINFO
++/* Implement the "to_stopped_by_sw_breakpoint" target_ops method.  */
++
++static int
++fbsd_stopped_by_sw_breakpoint (struct target_ops *ops)
++{
++  struct ptrace_lwpinfo pl;
++
++  if (ptrace (PT_LWPINFO, get_ptrace_pid (inferior_ptid), (caddr_t) &pl,
++	      sizeof pl) == -1)
++    return 0;
++
++  return ((pl.pl_flags & PL_FLAG_SI)
++	  && pl.pl_siginfo.si_signo == SIGTRAP
++	  && pl.pl_siginfo.si_code == TRAP_BRKPT);
++}
++
++/* Implement the "to_supports_stopped_by_sw_breakpoint" target_ops
++   method.  */
++
++static int
++fbsd_supports_stopped_by_sw_breakpoint (struct target_ops *ops)
++{
++  return 1;
++}
++
++/* Implement the "to_supports_stopped_by_hw_breakpoint" target_ops
++   method.  */
++
++static int
++fbsd_supports_stopped_by_hw_breakpoint (struct target_ops *ops)
++{
++  return ops->to_stopped_by_hw_breakpoint != NULL;
++}
++#endif
++
+ #ifdef TDP_RFPPWAIT
+ /* Target hook for follow_fork.  On entry and at return inferior_ptid is
+    the ptid of the followed inferior.  */
+@@ -1560,6 +1660,13 @@ fbsd_nat_add_target (struct target_ops *t)
+   t->to_wait = fbsd_wait;
+   t->to_post_startup_inferior = fbsd_post_startup_inferior;
+   t->to_post_attach = fbsd_post_attach;
++#ifdef USE_SIGTRAP_SIGINFO
++  t->to_stopped_by_sw_breakpoint = fbsd_stopped_by_sw_breakpoint;
++  t->to_supports_stopped_by_sw_breakpoint
++    = fbsd_supports_stopped_by_sw_breakpoint;
++  t->to_supports_stopped_by_hw_breakpoint
++    = fbsd_supports_stopped_by_hw_breakpoint;
++#endif
+ #ifdef TDP_RFPPWAIT
+   t->to_follow_fork = fbsd_follow_fork;
+   t->to_insert_fork_catchpoint = fbsd_insert_fork_catchpoint;

Added: head/devel/gdb/files/commit-906b4aac4c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/commit-906b4aac4c	Wed Mar 14 14:33:21 2018	(r464493)
@@ -0,0 +1,29 @@
+commit 906b4aac4c1d3cdb2b1ea7105133cfbe25e04e14
+Author: John Baldwin <jhb at FreeBSD.org>
+Date:   Fri Jan 12 12:05:50 2018 -0800
+
+    Use the correct value for the offset of 'kve_protection'.
+    
+    I had forgotten to convert the decimal output of 'ptype /o' to hex
+    (but still used a 0x prefix) for the KVE_PROTECTION constant defining
+    the offset of the 'kve_protection' field in the 'kinfo_vmentry'
+    structure.  This resulted in garbage permissions for entries in 'info
+    proc mappings' for FreeBSD core dumps.
+    
+    gdb/ChangeLog:
+    
+            * fbsd-tdep.c (KVE_PROTECTION): Correct value.
+
+diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c
+index 8aa0243d54..e49a9aff09 100644
+--- gdb/fbsd-tdep.c
++++ gdb/fbsd-tdep.c
+@@ -62,7 +62,7 @@
+ #define	KVE_END			0x10
+ #define	KVE_OFFSET		0x18
+ #define	KVE_FLAGS		0x2c
+-#define	KVE_PROTECTION		0x56
++#define	KVE_PROTECTION		0x38
+ #define	KVE_PATH		0x88
+ 
+ /* Flags in the 'kve_protection' field in struct kinfo_vmentry.  These

Added: head/devel/gdb/files/commit-92fce24de2
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/commit-92fce24de2	Wed Mar 14 14:33:21 2018	(r464493)
@@ -0,0 +1,548 @@
+commit 92fce24de299a8b9a9a1c0c6b98e0e9c1656f99c
+Author: John Baldwin <jhb at FreeBSD.org>
+Date:   Tue Jan 9 13:35:17 2018 -0800
+
+    Support 'info proc' for native FreeBSD processes.
+    
+    - Command line arguments are fetched via the kern.proc.args.<pid>
+      sysctl.
+    - The 'cwd' and 'exe' values are obtained from the per-process
+      file descriptor table returned by kinfo_getfile() from libutil.
+    - 'mappings' is implemented by walking the array of VM map entries
+      returned by kinfo_getvmmap() from libutil.
+    - 'status' output is generated by outputting fields from the structure
+      returned by the kern.proc.pid.<pid> sysctl.
+    - 'stat' is aliased to 'status'.
+    
+    gdb/ChangeLog:
+    
+            * configure.ac: Check for kinfo_getfile in libutil.
+            * configure: Regenerate.
+            * config.in: Regenerate.
+            * fbsd-nat.c: Include "fbsd-tdep.h".
+            (fbsd_fetch_cmdline): New.
+            (fbsd_fetch_kinfo_proc): Move earlier and change to return a bool
+            rather than calling error.
+            (fbsd_info_proc): New.
+            (fbsd_thread_name): Report error if fbsd_fetch_kinfo_proc fails.
+            (fbsd_wait): Report warning if fbsd_fetch_kinfo_proc fails.
+            (fbsd_nat_add_target): Set "to_info_proc" to "fbsd_info_proc".
+
+diff --git gdb/config.in gdb/config.in
+index 1d11a97080..ad2cc1754e 100644
+--- gdb/config.in
++++ gdb/config.in
+@@ -219,6 +219,9 @@
+ /* Define to 1 if you have the <inttypes.h> header file. */
+ #undef HAVE_INTTYPES_H
+ 
++/* Define to 1 if your system has the kinfo_getfile function. */
++#undef HAVE_KINFO_GETFILE
++
+ /* Define to 1 if your system has the kinfo_getvmmap function. */
+ #undef HAVE_KINFO_GETVMMAP
+ 
+diff --git gdb/configure gdb/configure
+index db610f32fc..68b9aad02d 100755
+--- gdb/configure
++++ gdb/configure
+@@ -7927,6 +7927,66 @@ $as_echo "#define HAVE_KINFO_GETVMMAP 1" >>confdefs.h
+ fi
+ 
+ 
++# fbsd-nat.c can also use kinfo_getfile.
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing kinfo_getfile" >&5
++$as_echo_n "checking for library containing kinfo_getfile... " >&6; }
++if test "${ac_cv_search_kinfo_getfile+set}" = set; then :
++  $as_echo_n "(cached) " >&6
++else
++  ac_func_search_save_LIBS=$LIBS
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char kinfo_getfile ();
++int
++main ()
++{
++return kinfo_getfile ();
++  ;
++  return 0;
++}
++_ACEOF
++for ac_lib in '' util util-freebsd; do
++  if test -z "$ac_lib"; then
++    ac_res="none required"
++  else
++    ac_res=-l$ac_lib
++    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
++  fi
++  if ac_fn_c_try_link "$LINENO"; then :
++  ac_cv_search_kinfo_getfile=$ac_res
++fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext
++  if test "${ac_cv_search_kinfo_getfile+set}" = set; then :
++  break
++fi
++done
++if test "${ac_cv_search_kinfo_getfile+set}" = set; then :
++
++else
++  ac_cv_search_kinfo_getfile=no
++fi
++rm conftest.$ac_ext
++LIBS=$ac_func_search_save_LIBS
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_kinfo_getfile" >&5
++$as_echo "$ac_cv_search_kinfo_getfile" >&6; }
++ac_res=$ac_cv_search_kinfo_getfile
++if test "$ac_res" != no; then :
++  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
++
++$as_echo "#define HAVE_KINFO_GETFILE 1" >>confdefs.h
++
++fi
++
++
+ 
+       if test "X$prefix" = "XNONE"; then
+     acl_final_prefix="$ac_default_prefix"
+diff --git gdb/configure.ac gdb/configure.ac
+index 3db44ae758..551afc727e 100644
+--- gdb/configure.ac
++++ gdb/configure.ac
+@@ -523,6 +523,11 @@ AC_SEARCH_LIBS(kinfo_getvmmap, util util-freebsd,
+   [AC_DEFINE(HAVE_KINFO_GETVMMAP, 1,
+             [Define to 1 if your system has the kinfo_getvmmap function. ])])
+ 
++# fbsd-nat.c can also use kinfo_getfile.
++AC_SEARCH_LIBS(kinfo_getfile, util util-freebsd,
++  [AC_DEFINE(HAVE_KINFO_GETFILE, 1,
++            [Define to 1 if your system has the kinfo_getfile function. ])])
++
+ AM_ICONV
+ 
+ # GDB may fork/exec the iconv program to get the list of supported character
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index 81f8e27a2d..b352418813 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -32,14 +32,16 @@
+ #include <sys/signal.h>
+ #include <sys/sysctl.h>
+ #include <sys/user.h>
+-#ifdef HAVE_KINFO_GETVMMAP
++#if defined(HAVE_KINFO_GETFILE) || defined(HAVE_KINFO_GETVMMAP)
+ #include <libutil.h>
+-#else
++#endif
++#if !defined(HAVE_KINFO_GETVMMAP)
+ #include "filestuff.h"
+ #endif
+ 
+ #include "elf-bfd.h"
+ #include "fbsd-nat.h"
++#include "fbsd-tdep.h"
+ 
+ #include <list>
+ 
+@@ -205,6 +207,331 @@ fbsd_find_memory_regions (struct target_ops *self,
+ }
+ #endif
+ 
++/* Fetch the command line for a running process.  */
++
++static gdb::unique_xmalloc_ptr<char>
++fbsd_fetch_cmdline (pid_t pid)
++{
++  size_t len;
++  int mib[4];
++
++  len = 0;
++  mib[0] = CTL_KERN;
++  mib[1] = KERN_PROC;
++  mib[2] = KERN_PROC_ARGS;
++  mib[3] = pid;
++  if (sysctl (mib, 4, NULL, &len, NULL, 0) == -1)
++    return nullptr;
++
++  if (len == 0)
++    return nullptr;
++
++  gdb::unique_xmalloc_ptr<char> cmdline ((char *) xmalloc (len));
++  if (sysctl (mib, 4, cmdline.get (), &len, NULL, 0) == -1)
++    return nullptr;
++
++  return cmdline;
++}
++
++/* Fetch the external variant of the kernel's internal process
++   structure for the process PID into KP.  */
++
++static bool
++fbsd_fetch_kinfo_proc (pid_t pid, struct kinfo_proc *kp)
++{
++  size_t len;
++  int mib[4];
++
++  len = sizeof *kp;
++  mib[0] = CTL_KERN;
++  mib[1] = KERN_PROC;
++  mib[2] = KERN_PROC_PID;
++  mib[3] = pid;
++  return (sysctl (mib, 4, kp, &len, NULL, 0) == 0);
++}
++
++/* Implement the "to_info_proc target_ops" method.  */
++
++static void
++fbsd_info_proc (struct target_ops *ops, const char *args,
++		enum info_proc_what what)
++{
++#ifdef HAVE_KINFO_GETFILE
++  gdb::unique_xmalloc_ptr<struct kinfo_file> fdtbl;
++  int nfd = 0;
++#endif
++  struct kinfo_proc kp;
++  char *tmp;
++  pid_t pid;
++  bool do_cmdline = false;
++  bool do_cwd = false;
++  bool do_exe = false;
++#ifdef HAVE_KINFO_GETVMMAP
++  bool do_mappings = false;
++#endif
++  bool do_status = false;
++
++  switch (what)
++    {
++    case IP_MINIMAL:
++      do_cmdline = true;
++      do_cwd = true;
++      do_exe = true;
++      break;
++#ifdef HAVE_KINFO_GETVMMAP
++    case IP_MAPPINGS:
++      do_mappings = true;
++      break;
++#endif
++    case IP_STATUS:
++    case IP_STAT:
++      do_status = true;
++      break;
++    case IP_CMDLINE:
++      do_cmdline = true;
++      break;
++    case IP_EXE:
++      do_exe = true;
++      break;
++    case IP_CWD:
++      do_cwd = true;
++      break;
++    case IP_ALL:
++      do_cmdline = true;
++      do_cwd = true;
++      do_exe = true;
++#ifdef HAVE_KINFO_GETVMMAP
++      do_mappings = true;
++#endif
++      do_status = true;
++      break;
++    default:
++      error (_("Not supported on this target."));
++    }
++

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


More information about the svn-ports-all mailing list