From owner-svn-ports-head@freebsd.org Wed Mar 14 14:33:23 2018 Return-Path: Delivered-To: svn-ports-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 3F53FF55AA2; Wed, 14 Mar 2018 14:33:23 +0000 (UTC) (envelope-from pizzamig@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id E0E9883422; Wed, 14 Mar 2018 14:33:22 +0000 (UTC) (envelope-from pizzamig@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id DB8021094; Wed, 14 Mar 2018 14:33:22 +0000 (UTC) (envelope-from pizzamig@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w2EEXMuV079362; Wed, 14 Mar 2018 14:33:22 GMT (envelope-from pizzamig@FreeBSD.org) Received: (from pizzamig@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w2EEXMGn079353; Wed, 14 Mar 2018 14:33:22 GMT (envelope-from pizzamig@FreeBSD.org) Message-Id: <201803141433.w2EEXMGn079353@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: pizzamig set sender to pizzamig@FreeBSD.org using -f From: Luca Pizzamiglio Date: Wed, 14 Mar 2018 14:33:22 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r464493 - in head/devel/gdb: . files files/kgdb X-SVN-Group: ports-head X-SVN-Commit-Author: pizzamig X-SVN-Commit-Paths: in head/devel/gdb: . files files/kgdb X-SVN-Commit-Revision: 464493 X-SVN-Commit-Repository: ports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-head@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: SVN commit messages for the ports tree for head List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 14 Mar 2018 14:33:23 -0000 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 +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 +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 +-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> ++ gdb::unique_xmalloc_ptr + 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 +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 + +-@node SVR4 Process Information +-@subsection SVR4 Process Information ++@node Process Information ++@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 +-@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, +-@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 +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. ++@item set debug fbsd-nat ++@cindex FreeBSD native target debug messages ++Turns on or off debugging messages from the FreeBSD native target. ++@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 +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 + #include + #include +@@ -45,6 +46,14 @@ + + #include + ++#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 +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 +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. + 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. 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 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 + #include + #include +-#ifdef HAVE_KINFO_GETVMMAP ++#if defined(HAVE_KINFO_GETFILE) || defined(HAVE_KINFO_GETVMMAP) + #include +-#else ++#endif ++#if !defined(HAVE_KINFO_GETVMMAP) + #include "filestuff.h" + #endif + + #include "elf-bfd.h" + #include "fbsd-nat.h" ++#include "fbsd-tdep.h" + + #include + +@@ -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 ++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 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 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 ***