Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F165005098
D17085.id47825.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
109 KB
Referenced Files
None
Subscribers
None
D17085.id47825.diff
View Options
Index: devel/gdb/Makefile
===================================================================
--- devel/gdb/Makefile
+++ devel/gdb/Makefile
@@ -2,7 +2,7 @@
# $FreeBSD$
PORTNAME= gdb
-PORTVERSION= 8.1.1
+PORTVERSION= 8.2
CATEGORIES= devel
MASTER_SITES= GNU
@@ -23,7 +23,7 @@
# C++14. However, clang in 10.3 crashes while building this port.
# Requiring C++14 forces 10.3 to use an external version of clang while
# still using the base system clang on 11.0 and later.
-USES= compiler:c++14-lang cpe gmake libtool tar:xz
+USES= compiler:c++14-lang cpe gettext-runtime gmake libtool tar:xz
USE_CSTD= gnu89
CPE_VENDOR= gnu
GNU_CONFIGURE= yes
@@ -40,16 +40,7 @@
CFLAGS+= -Wno-unknown-warning-option
EXCLUDE= dejagnu expect sim texinfo intl
EXTRACT_AFTER_ARGS= ${EXCLUDE:S/^/--exclude /}
-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
+EXTRA_PATCHES= ${FILESDIR}/commit-8aa0243d54
LIB_DEPENDS+= libexpat.so:textproc/expat2
VER= ${PORTVERSION:S/.//g}
Index: devel/gdb/distinfo
===================================================================
--- devel/gdb/distinfo
+++ devel/gdb/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1533926440
-SHA256 (gdb-8.1.1.tar.xz) = 97dcc3169bd430270fc29adb65145846a58c1b55cdbb73382a4a89307bdad03c
-SIZE (gdb-8.1.1.tar.xz) = 20064728
+TIMESTAMP = 1536418789
+SHA256 (gdb-8.2.tar.xz) = c3a441a29c7c89720b734e5a9c6289c0a06be7e0c76ef538f7bbcef389347c39
+SIZE (gdb-8.2.tar.xz) = 20173112
Index: devel/gdb/files/commit-12279366d7
===================================================================
--- devel/gdb/files/commit-12279366d7
+++ /dev/null
@@ -1,121 +0,0 @@
-commit 12279366d71627bfbdd74d1a6675dca825d8feca
-Author: John Baldwin <jhb@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
Index: devel/gdb/files/commit-262f62f57d
===================================================================
--- devel/gdb/files/commit-262f62f57d
+++ /dev/null
@@ -1,43 +0,0 @@
-commit 262f62f57d987269152412a55c458a03adc6ddd6
-Author: John Baldwin <jhb@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."));
Index: devel/gdb/files/commit-2d97a5d9d3
===================================================================
--- devel/gdb/files/commit-2d97a5d9d3
+++ /dev/null
@@ -1,169 +0,0 @@
-commit 2d97a5d9d33aea87c3bd02fd1fa417f5d4e1fa05
-Author: John Baldwin <jhb@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
-
--@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
Index: devel/gdb/files/commit-386a867618
===================================================================
--- devel/gdb/files/commit-386a867618
+++ /dev/null
@@ -1,115 +0,0 @@
-commit 386a86761838df16c1459275d465ed21a1c35d9f
-Author: John Baldwin <jhb@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.
-+@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
- }
Index: devel/gdb/files/commit-7efba073e2
===================================================================
--- devel/gdb/files/commit-7efba073e2
+++ /dev/null
@@ -1,184 +0,0 @@
-commit 7efba073e2b83803a47fd89e701fe60b98f2debc
-Author: John Baldwin <jhb@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;
Index: devel/gdb/files/commit-8aa0243d54
===================================================================
--- /dev/null
+++ devel/gdb/files/commit-8aa0243d54
@@ -0,0 +1,197 @@
+commit 739ab2e92e1840c9285f3cfce1f1236c0fa68730
+Author: Simon Ser <contact@emersion.fr>
+Date: Thu Sep 6 15:03:19 2018 -0700
+
+ Generate NT_PROCSTAT_{AUXV,VMMAP,PS_STRINGS} in FreeBSD coredumps
+
+ gcore generates NT_AUXV and NT_FILE notes for Linux targets. On
+ FreeBSD auxv is stored in a NT_PROCSTAT_AUXV section, virtual memory
+ mappings are stored in a NT_PROCSTAT_VMMAP, and both are prefixed with
+ the struct size. In addition, store a NT_PROCSTAT_PS_STRINGS note
+ saving the initial location of the argv[] and environment[] arrays.
+
+ gdb/ChangeLog:
+
+ PR gdb/23105
+ * fbsd-nat.c (fbsd_nat_target::xfer_partial): Add support for
+ TARGET_OBJECT_FREEBSD_VMMAP and TARGET_OBJECT_FREEBSD_PS_STRINGS.
+ * fbsd-tdep.c (fbsd_make_note_desc): New.
+ (fbsd_make_corefile_notes): Write NT_PROCSTAT_AUXV,
+ NT_PROCSTAT_VMMAP and NT_PROCSTAT_PS_STRINGS notes.
+ * target.h (enum target_object) Add FreeBSD-specific
+ TARGET_OBJECT_FREEBSD_VMMAP and TARGET_OBJECT_FREEBSD_PS_STRINGS.
+
+diff --git gdb/ChangeLog gdb/ChangeLog
+index 410fbef920..e6f44a3ac2 100644
+--- gdb/ChangeLog
++++ gdb/ChangeLog
+@@ -1,3 +1,14 @@
++2018-09-06 Simon Ser <contact@emersion.fr>
++
++ PR gdb/23105
++ * fbsd-nat.c (fbsd_nat_target::xfer_partial): Add support for
++ TARGET_OBJECT_FREEBSD_VMMAP and TARGET_OBJECT_FREEBSD_PS_STRINGS.
++ * fbsd-tdep.c (fbsd_make_note_desc): New.
++ (fbsd_make_corefile_notes): Write NT_PROCSTAT_AUXV,
++ NT_PROCSTAT_VMMAP and NT_PROCSTAT_PS_STRINGS notes.
++ * target.h (enum target_object) Add FreeBSD-specific
++ TARGET_OBJECT_FREEBSD_VMMAP and TARGET_OBJECT_FREEBSD_PS_STRINGS.
++
+ 2018-09-06 Simon Marchi <simon.marchi@ericsson.com>
+
+ * compile/compile-c.h (generate_c_for_variable_locations):
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index 115deac070..a255318d14 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -751,6 +751,61 @@ fbsd_nat_target::xfer_partial (enum target_object object,
+ }
+ return TARGET_XFER_E_IO;
+ }
++ case TARGET_OBJECT_FREEBSD_VMMAP:
++ case TARGET_OBJECT_FREEBSD_PS_STRINGS:
++ {
++ gdb::byte_vector buf_storage;
++ gdb_byte *buf;
++ size_t buflen;
++ int mib[4];
++
++ int proc_target;
++ uint32_t struct_size;
++ switch (object)
++ {
++ case TARGET_OBJECT_FREEBSD_VMMAP:
++ proc_target = KERN_PROC_VMMAP;
++ struct_size = sizeof (struct kinfo_vmentry);
++ break;
++ case TARGET_OBJECT_FREEBSD_PS_STRINGS:
++ proc_target = KERN_PROC_PS_STRINGS;
++ struct_size = sizeof (void *);
++ break;
++ }
++
++ if (writebuf != NULL)
++ return TARGET_XFER_E_IO;
++
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_PROC;
++ mib[2] = proc_target;
++ mib[3] = pid;
++
++ if (sysctl (mib, 4, NULL, &buflen, NULL, 0) != 0)
++ return TARGET_XFER_E_IO;
++ buflen += sizeof (struct_size);
++
++ if (offset >= buflen)
++ {
++ *xfered_len = 0;
++ return TARGET_XFER_EOF;
++ }
++
++ buf_storage.resize (buflen);
++ buf = buf_storage.data ();
++
++ memcpy (buf, &struct_size, sizeof (struct_size));
++ buflen -= sizeof (struct_size);
++ if (sysctl (mib, 4, buf + sizeof (struct_size), &buflen, NULL, 0) != 0)
++ return TARGET_XFER_E_IO;
++ buflen += sizeof (struct_size);
++
++ if (buflen - offset < len)
++ len = buflen - offset;
++ memcpy (readbuf, buf + offset, len);
++ *xfered_len = len;
++ return TARGET_XFER_OK;
++ }
+ default:
+ return inf_ptrace_target::xfer_partial (object, annex,
+ readbuf, writebuf, offset,
+diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c
+index 78d0c3d830..ed43087169 100644
+--- gdb/fbsd-tdep.c
++++ gdb/fbsd-tdep.c
+@@ -512,6 +512,28 @@ fbsd_corefile_thread (struct thread_info *info,
+ args->note_size, args->stop_signal);
+ }
+
++/* Return a byte_vector containing the contents of a core dump note
++ for the target object of type OBJECT. If STRUCTSIZE is non-zero,
++ the data is prefixed with a 32-bit integer size to match the format
++ used in FreeBSD NT_PROCSTAT_* notes. */
++
++static gdb::optional<gdb::byte_vector>
++fbsd_make_note_desc (enum target_object object, uint32_t structsize)
++{
++ gdb::optional<gdb::byte_vector> buf =
++ target_read_alloc (current_top_target (), object, NULL);
++ if (!buf || buf->empty ())
++ return {};
++
++ if (structsize == 0)
++ return buf;
++
++ gdb::byte_vector desc (sizeof (structsize) + buf->size ());
++ memcpy (desc.data (), &structsize, sizeof (structsize));
++ memcpy (desc.data () + sizeof (structsize), buf->data (), buf->size ());
++ return desc;
++}
++
+ /* Create appropriate note sections for a corefile, returning them in
+ allocated memory. */
+
+@@ -586,6 +608,40 @@ fbsd_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
+
+ note_data = thread_args.note_data;
+
++ /* Auxiliary vector. */
++ uint32_t structsize = gdbarch_ptr_bit (gdbarch) / 4; /* Elf_Auxinfo */
++ gdb::optional<gdb::byte_vector> note_desc =
++ fbsd_make_note_desc (TARGET_OBJECT_AUXV, structsize);
++ if (note_desc && !note_desc->empty ())
++ {
++ note_data = elfcore_write_note (obfd, note_data, note_size, "FreeBSD",
++ NT_FREEBSD_PROCSTAT_AUXV,
++ note_desc->data (), note_desc->size ());
++ if (!note_data)
++ return NULL;
++ }
++
++ /* Virtual memory mappings. */
++ note_desc = fbsd_make_note_desc (TARGET_OBJECT_FREEBSD_VMMAP, 0);
++ if (note_desc && !note_desc->empty ())
++ {
++ note_data = elfcore_write_note (obfd, note_data, note_size, "FreeBSD",
++ NT_FREEBSD_PROCSTAT_VMMAP,
++ note_desc->data (), note_desc->size ());
++ if (!note_data)
++ return NULL;
++ }
++
++ note_desc = fbsd_make_note_desc (TARGET_OBJECT_FREEBSD_PS_STRINGS, 0);
++ if (note_desc && !note_desc->empty ())
++ {
++ note_data = elfcore_write_note (obfd, note_data, note_size, "FreeBSD",
++ NT_FREEBSD_PROCSTAT_PSSTRINGS,
++ note_desc->data (), note_desc->size ());
++ if (!note_data)
++ return NULL;
++ }
++
+ return note_data;
+ }
+
+diff --git gdb/target.h gdb/target.h
+index 229b5d0551..a3000c80c6 100644
+--- gdb/target.h
++++ gdb/target.h
+@@ -202,6 +202,10 @@ enum target_object
+ of the process ID of the process in question, in hexadecimal
+ format. */
+ TARGET_OBJECT_EXEC_FILE,
++ /* FreeBSD virtual memory mappings. */
++ TARGET_OBJECT_FREEBSD_VMMAP,
++ /* FreeBSD process strings. */
++ TARGET_OBJECT_FREEBSD_PS_STRINGS,
+ /* Possible future objects: TARGET_OBJECT_FILE, ... */
+ };
+
Index: devel/gdb/files/commit-906b4aac4c
===================================================================
--- devel/gdb/files/commit-906b4aac4c
+++ /dev/null
@@ -1,29 +0,0 @@
-commit 906b4aac4c1d3cdb2b1ea7105133cfbe25e04e14
-Author: John Baldwin <jhb@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
Index: devel/gdb/files/commit-92fce24de2
===================================================================
--- devel/gdb/files/commit-92fce24de2
+++ /dev/null
@@ -1,548 +0,0 @@
-commit 92fce24de299a8b9a9a1c0c6b98e0e9c1656f99c
-Author: John Baldwin <jhb@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."));
-+ }
-+
-+ gdb_argv built_argv (args);
-+ if (built_argv.count () == 0)
-+ {
-+ pid = ptid_get_pid (inferior_ptid);
-+ if (pid == 0)
-+ error (_("No current process: you must name one."));
-+ }
-+ else if (built_argv.count () == 1 && isdigit (built_argv[0][0]))
-+ pid = strtol (built_argv[0], NULL, 10);
-+ else
-+ error (_("Invalid arguments."));
-+
-+ printf_filtered (_("process %d\n"), pid);
-+#ifdef HAVE_KINFO_GETFILE
-+ if (do_cwd || do_exe)
-+ fdtbl.reset (kinfo_getfile (pid, &nfd));
-+#endif
-+
-+ if (do_cmdline)
-+ {
-+ gdb::unique_xmalloc_ptr<char> cmdline = fbsd_fetch_cmdline (pid);
-+ if (cmdline != nullptr)
-+ printf_filtered ("cmdline = '%s'\n", cmdline.get ());
-+ else
-+ warning (_("unable to fetch command line"));
-+ }
-+ if (do_cwd)
-+ {
-+ const char *cwd = NULL;
-+#ifdef HAVE_KINFO_GETFILE
-+ struct kinfo_file *kf = fdtbl.get ();
-+ for (int i = 0; i < nfd; i++, kf++)
-+ {
-+ if (kf->kf_type == KF_TYPE_VNODE && kf->kf_fd == KF_FD_TYPE_CWD)
-+ {
-+ cwd = kf->kf_path;
-+ break;
-+ }
-+ }
-+#endif
-+ if (cwd != NULL)
-+ printf_filtered ("cwd = '%s'\n", cwd);
-+ else
-+ warning (_("unable to fetch current working directory"));
-+ }
-+ if (do_exe)
-+ {
-+ const char *exe = NULL;
-+#ifdef HAVE_KINFO_GETFILE
-+ struct kinfo_file *kf = fdtbl.get ();
-+ for (int i = 0; i < nfd; i++, kf++)
-+ {
-+ if (kf->kf_type == KF_TYPE_VNODE && kf->kf_fd == KF_FD_TYPE_TEXT)
-+ {
-+ exe = kf->kf_path;
-+ break;
-+ }
-+ }
-+#endif
-+ if (exe == NULL)
-+ exe = fbsd_pid_to_exec_file (ops, pid);
-+ if (exe != NULL)
-+ printf_filtered ("exe = '%s'\n", exe);
-+ else
-+ warning (_("unable to fetch executable path name"));
-+ }
-+#ifdef HAVE_KINFO_GETVMMAP
-+ if (do_mappings)
-+ {
-+ int nvment;
-+ gdb::unique_xmalloc_ptr<struct kinfo_vmentry>
-+ vmentl (kinfo_getvmmap (pid, &nvment));
-+
-+ if (vmentl != nullptr)
-+ {
-+ printf_filtered (_("Mapped address spaces:\n\n"));
-+#ifdef __LP64__
-+ printf_filtered (" %18s %18s %10s %10s %9s %s\n",
-+ "Start Addr",
-+ " End Addr",
-+ " Size", " Offset", "Flags ", "File");
-+#else
-+ printf_filtered ("\t%10s %10s %10s %10s %9s %s\n",
-+ "Start Addr",
-+ " End Addr",
-+ " Size", " Offset", "Flags ", "File");
-+#endif
-+
-+ struct kinfo_vmentry *kve = vmentl.get ();
-+ for (int i = 0; i < nvment; i++, kve++)
-+ {
-+ ULONGEST start, end;
-+
-+ start = kve->kve_start;
-+ end = kve->kve_end;
-+#ifdef __LP64__
-+ printf_filtered (" %18s %18s %10s %10s %9s %s\n",
-+ hex_string (start),
-+ hex_string (end),
-+ hex_string (end - start),
-+ hex_string (kve->kve_offset),
-+ fbsd_vm_map_entry_flags (kve->kve_flags,
-+ kve->kve_protection),
-+ kve->kve_path);
-+#else
-+ printf_filtered ("\t%10s %10s %10s %10s %9s %s\n",
-+ hex_string (start),
-+ hex_string (end),
-+ hex_string (end - start),
-+ hex_string (kve->kve_offset),
-+ fbsd_vm_map_entry_flags (kve->kve_flags,
-+ kve->kve_protection),
-+ kve->kve_path);
-+#endif
-+ }
-+ }
-+ else
-+ warning (_("unable to fetch virtual memory map"));
-+ }
-+#endif
-+ if (do_status)
-+ {
-+ if (!fbsd_fetch_kinfo_proc (pid, &kp))
-+ warning (_("Failed to fetch process information"));
-+ else
-+ {
-+ const char *state;
-+ int pgtok;
-+
-+ printf_filtered ("Name: %s\n", kp.ki_comm);
-+ switch (kp.ki_stat)
-+ {
-+ case SIDL:
-+ state = "I (idle)";
-+ break;
-+ case SRUN:
-+ state = "R (running)";
-+ break;
-+ case SSTOP:
-+ state = "T (stopped)";
-+ break;
-+ case SZOMB:
-+ state = "Z (zombie)";
-+ break;
-+ case SSLEEP:
-+ state = "S (sleeping)";
-+ break;
-+ case SWAIT:
-+ state = "W (interrupt wait)";
-+ break;
-+ case SLOCK:
-+ state = "L (blocked on lock)";
-+ break;
-+ default:
-+ state = "? (unknown)";
-+ break;
-+ }
-+ printf_filtered ("State: %s\n", state);
-+ printf_filtered ("Parent process: %d\n", kp.ki_ppid);
-+ printf_filtered ("Process group: %d\n", kp.ki_pgid);
-+ printf_filtered ("Session id: %d\n", kp.ki_sid);
-+ printf_filtered ("TTY: %ju\n", (uintmax_t) kp.ki_tdev);
-+ printf_filtered ("TTY owner process group: %d\n", kp.ki_tpgid);
-+ printf_filtered ("User IDs (real, effective, saved): %d %d %d\n",
-+ kp.ki_ruid, kp.ki_uid, kp.ki_svuid);
-+ printf_filtered ("Group IDs (real, effective, saved): %d %d %d\n",
-+ kp.ki_rgid, kp.ki_groups[0], kp.ki_svgid);
-+ printf_filtered ("Groups: ");
-+ for (int i = 0; i < kp.ki_ngroups; i++)
-+ printf_filtered ("%d ", kp.ki_groups[i]);
-+ printf_filtered ("\n");
-+ printf_filtered ("Minor faults (no memory page): %ld\n",
-+ kp.ki_rusage.ru_minflt);
-+ printf_filtered ("Minor faults, children: %ld\n",
-+ kp.ki_rusage_ch.ru_minflt);
-+ printf_filtered ("Major faults (memory page faults): %ld\n",
-+ kp.ki_rusage.ru_majflt);
-+ printf_filtered ("Major faults, children: %ld\n",
-+ kp.ki_rusage_ch.ru_majflt);
-+ printf_filtered ("utime: %jd.%06ld\n",
-+ (intmax_t) kp.ki_rusage.ru_utime.tv_sec,
-+ kp.ki_rusage.ru_utime.tv_usec);
-+ printf_filtered ("stime: %jd.%06ld\n",
-+ (intmax_t) kp.ki_rusage.ru_stime.tv_sec,
-+ kp.ki_rusage.ru_stime.tv_usec);
-+ printf_filtered ("utime, children: %jd.%06ld\n",
-+ (intmax_t) kp.ki_rusage_ch.ru_utime.tv_sec,
-+ kp.ki_rusage_ch.ru_utime.tv_usec);
-+ printf_filtered ("stime, children: %jd.%06ld\n",
-+ (intmax_t) kp.ki_rusage_ch.ru_stime.tv_sec,
-+ kp.ki_rusage_ch.ru_stime.tv_usec);
-+ printf_filtered ("'nice' value: %d\n", kp.ki_nice);
-+ printf_filtered ("Start time: %jd.%06ld\n", kp.ki_start.tv_sec,
-+ kp.ki_start.tv_usec);
-+ pgtok = getpagesize () / 1024;
-+ printf_filtered ("Virtual memory size: %ju kB\n",
-+ (uintmax_t) kp.ki_size / 1024);
-+ printf_filtered ("Data size: %ju kB\n",
-+ (uintmax_t) kp.ki_dsize * pgtok);
-+ printf_filtered ("Stack size: %ju kB\n",
-+ (uintmax_t) kp.ki_ssize * pgtok);
-+ printf_filtered ("Text size: %ju kB\n",
-+ (uintmax_t) kp.ki_tsize * pgtok);
-+ printf_filtered ("Resident set size: %ju kB\n",
-+ (uintmax_t) kp.ki_rssize * pgtok);
-+ printf_filtered ("Maximum RSS: %ju kB\n",
-+ (uintmax_t) kp.ki_rusage.ru_maxrss);
-+ printf_filtered ("Pending Signals: ");
-+ for (int i = 0; i < _SIG_WORDS; i++)
-+ printf_filtered ("%08x ", kp.ki_siglist.__bits[i]);
-+ printf_filtered ("\n");
-+ printf_filtered ("Ignored Signals: ");
-+ for (int i = 0; i < _SIG_WORDS; i++)
-+ printf_filtered ("%08x ", kp.ki_sigignore.__bits[i]);
-+ printf_filtered ("\n");
-+ printf_filtered ("Caught Signals: ");
-+ for (int i = 0; i < _SIG_WORDS; i++)
-+ printf_filtered ("%08x ", kp.ki_sigcatch.__bits[i]);
-+ printf_filtered ("\n");
-+ }
-+ }
-+}
-+
- #ifdef KERN_PROC_AUXV
- static enum target_xfer_status (*super_xfer_partial) (struct target_ops *ops,
- enum target_object object,
-@@ -455,26 +782,6 @@ show_fbsd_lwp_debug (struct ui_file *file, int from_tty,
- fprintf_filtered (file, _("Debugging of FreeBSD lwp module is %s.\n"), value);
- }
-
--#if defined(TDP_RFPPWAIT) || defined(HAVE_STRUCT_PTRACE_LWPINFO_PL_TDNAME)
--/* Fetch the external variant of the kernel's internal process
-- structure for the process PID into KP. */
--
--static void
--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;
-- if (sysctl (mib, 4, kp, &len, NULL, 0) == -1)
-- perror_with_name (("sysctl"));
--}
--#endif
--
- /*
- 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
-@@ -560,7 +867,8 @@ fbsd_thread_name (struct target_ops *self, struct thread_info *thr)
- /* Note that ptrace_lwpinfo returns the process command in pl_tdname
- if a name has not been set explicitly. Return a NULL name in
- that case. */
-- fbsd_fetch_kinfo_proc (pid, &kp);
-+ if (!fbsd_fetch_kinfo_proc (pid, &kp))
-+ perror_with_name (_("Failed to fetch process information"));
- if (ptrace (PT_LWPINFO, lwp, (caddr_t) &pl, sizeof pl) == -1)
- perror_with_name (("ptrace"));
- if (strcmp (kp.ki_comm, pl.pl_tdname) == 0)
-@@ -970,9 +1278,13 @@ fbsd_wait (struct target_ops *ops,
- #ifndef PTRACE_VFORK
- /* For vfork, the child process will have the P_PPWAIT
- flag set. */
-- fbsd_fetch_kinfo_proc (child, &kp);
-- if (kp.ki_flag & P_PPWAIT)
-- ourstatus->kind = TARGET_WAITKIND_VFORKED;
-+ if (fbsd_fetch_kinfo_proc (child, &kp))
-+ {
-+ if (kp.ki_flag & P_PPWAIT)
-+ ourstatus->kind = TARGET_WAITKIND_VFORKED;
-+ }
-+ else
-+ warning (_("Failed to fetch process information"));
- #endif
- ourstatus->value.related_pid = child_ptid;
-
-@@ -1176,6 +1488,7 @@ fbsd_nat_add_target (struct target_ops *t)
- {
- t->to_pid_to_exec_file = fbsd_pid_to_exec_file;
- t->to_find_memory_regions = fbsd_find_memory_regions;
-+ t->to_info_proc = fbsd_info_proc;
- #ifdef KERN_PROC_AUXV
- super_xfer_partial = t->to_xfer_partial;
- t->to_xfer_partial = fbsd_xfer_partial;
Index: devel/gdb/files/commit-b999e2038d
===================================================================
--- devel/gdb/files/commit-b999e2038d
+++ /dev/null
@@ -1,32 +0,0 @@
-commit b999e2038dbc54e2c8b1c390f8b8fe50d0f1d10a
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Jan 9 13:35:17 2018 -0800
-
- Don't return stale data from fbsd_pid_to_exec_file for kernel processes.
-
- For processes without an associated executable (such as kernel processes),
- the kern.proc.pathname.<pid> system control node returns a length of zero
- without modifying the user's buffer. Detect this case and return NULL
- rather than the previous contents of the static buffer 'buf'.
-
- gdb/ChangeLog:
-
- * fbsd-nat.c (fbsd_pid_to_exec_file) [KERN_PROC_PATHNAME]: Return
- NULL for an empty pathname.
-
-diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
-index ec4eed9abe..d0aaf89145 100644
---- gdb/fbsd-nat.c
-+++ gdb/fbsd-nat.c
-@@ -63,7 +63,10 @@ fbsd_pid_to_exec_file (struct target_ops *self, int pid)
- mib[3] = pid;
- buflen = sizeof buf;
- if (sysctl (mib, 4, buf, &buflen, NULL, 0) == 0)
-- return buf;
-+ /* The kern.proc.pathname.<pid> sysctl returns a length of zero
-+ for processes without an associated executable such as kernel
-+ processes. */
-+ return buflen == 0 ? NULL : buf;
- #endif
-
- xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid);
Index: devel/gdb/files/commit-d2176225dc
===================================================================
--- devel/gdb/files/commit-d2176225dc
+++ /dev/null
@@ -1,725 +0,0 @@
-commit d2176225dc982c22640215a0e611e997e8eeb030
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Jan 9 13:35:17 2018 -0800
-
- Support 'info proc' for FreeBSD process core dumps.
-
- - Command line arguments are obtained from the pr_psargs[] array
- saved in the NT_PRPSINFO note.
- - The 'cwd' and 'exe' values are obtained from the per-process file
- descriptor table stored in the NT_PROCSTAT_FILES core note.
- - 'mappings' is implemented by walking the array of VM map entries
- stored in the NT_PROCSTAT_VMMAP core note.
- - 'status' output is generated by outputting fields from
- the first structure stored in the NT_PROCSTAT_PROC core note.
- - 'stat' is aliased to 'status'.
-
- gdb/ChangeLog:
-
- * fbsd-tdep.c (KVE_STRUCTSIZE, KVE_START, KVE_END, KVE_OFFSET)
- (KVE_FLAGS, KVE_PROTECTION, KVE_PATH, KINFO_VME_PROT_READ)
- (KINFO_VME_PROT_WRITE, KINFO_VME_PROT_EXEC, KINFO_VME_FLAG_COW)
- (KINFO_VME_FLAG_NEEDS_COPY, KINFO_VME_FLAG_NOCOREDUMP)
- (KINFO_VME_FLAG_SUPER, KINFO_VME_FLAG_GROWS_UP)
- (KINFO_VME_FLAG_GROWS_DOWN, KF_STRUCTSIZE, KF_TYPE, KF_FD)
- (KF_PATH, KINFO_FILE_TYPE_VNODE, KINFO_FILE_FD_TYPE_CWD)
- (KINFO_FILE_FD_TYPE_TEXT, SIG_WORDS, struct kinfo_proc_layout)
- (kinfo_proc_layout_32, kinfo_proc_layout_i386)
- (kinfo_proc_layout_64, fbsd_vm_map_entry_flags)
- (fbsd_core_info_proc_mappings, fbsd_core_vnode_path)
- (fbsd_core_fetch_timeval, fbsd_print_sigset)
- (fbsd_core_info_proc_status, fbsd_core_info_proc): New.
- (fbsd_init_abi): Install gdbarch "core_info_proc" method.
- * fbsd-tdep.h (fbsd_vm_map_entry_flags): New.
-
-diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c
-index ce17c672d9..8aa0243d54 100644
---- gdb/fbsd-tdep.c
-+++ gdb/fbsd-tdep.c
-@@ -52,6 +52,228 @@
- #define SIZE64_SIGINFO_T 80
- #define SIZE32_SIGINFO_T 64
-
-+/* Offsets in data structure used in NT_FREEBSD_PROCSTAT_VMMAP core
-+ dump notes. See <sys/user.h> for the definition of struct
-+ kinfo_vmentry. This data structure should have the same layout on
-+ all architectures. */
-+
-+#define KVE_STRUCTSIZE 0x0
-+#define KVE_START 0x8
-+#define KVE_END 0x10
-+#define KVE_OFFSET 0x18
-+#define KVE_FLAGS 0x2c
-+#define KVE_PROTECTION 0x56
-+#define KVE_PATH 0x88
-+
-+/* Flags in the 'kve_protection' field in struct kinfo_vmentry. These
-+ match the KVME_PROT_* constants in <sys/user.h>. */
-+
-+#define KINFO_VME_PROT_READ 0x00000001
-+#define KINFO_VME_PROT_WRITE 0x00000002
-+#define KINFO_VME_PROT_EXEC 0x00000004
-+
-+/* Flags in the 'kve_flags' field in struct kinfo_vmentry. These
-+ match the KVME_FLAG_* constants in <sys/user.h>. */
-+
-+#define KINFO_VME_FLAG_COW 0x00000001
-+#define KINFO_VME_FLAG_NEEDS_COPY 0x00000002
-+#define KINFO_VME_FLAG_NOCOREDUMP 0x00000004
-+#define KINFO_VME_FLAG_SUPER 0x00000008
-+#define KINFO_VME_FLAG_GROWS_UP 0x00000010
-+#define KINFO_VME_FLAG_GROWS_DOWN 0x00000020
-+
-+/* Offsets in data structure used in NT_FREEBSD_PROCSTAT_FILES core
-+ dump notes. See <sys/user.h> for the definition of struct
-+ kinfo_file. This data structure should have the same layout on all
-+ architectures. */
-+
-+#define KF_STRUCTSIZE 0x0
-+#define KF_TYPE 0x4
-+#define KF_FD 0x8
-+#define KF_PATH 0x170
-+
-+/* Constants for the 'kf_type' field in struct kinfo_file. These
-+ match the KF_TYPE_* constants in <sys/user.h>. */
-+
-+#define KINFO_FILE_TYPE_VNODE 1
-+
-+/* Special values for the 'kf_fd' field in struct kinfo_file. These
-+ match the KF_FD_TYPE_* constants in <sys/user.h>. */
-+
-+#define KINFO_FILE_FD_TYPE_CWD -1
-+#define KINFO_FILE_FD_TYPE_TEXT -5
-+
-+/* Number of 32-bit words in a signal set. This matches _SIG_WORDS in
-+ <sys/_sigset.h> and is the same value on all architectures. */
-+
-+#define SIG_WORDS 4
-+
-+/* Offsets in data structure used in NT_FREEBSD_PROCSTAT_PROC core
-+ dump notes. See <sys/user.h> for the definition of struct
-+ kinfo_proc. This data structure has different layouts on different
-+ architectures mostly due to ILP32 vs LP64. However, FreeBSD/i386
-+ uses a 32-bit time_t while all other architectures use a 64-bit
-+ time_t.
-+
-+ The core dump note actually contains one kinfo_proc structure for
-+ each thread, but all of the process-wide data can be obtained from
-+ the first structure. One result of this note's format is that some
-+ of the process-wide status available in the native target method
-+ from the kern.proc.pid.<pid> sysctl such as ki_stat and ki_siglist
-+ is not available from a core dump. Instead, the per-thread data
-+ structures contain the value of these fields for individual
-+ threads. */
-+
-+struct kinfo_proc_layout
-+{
-+ /* Offsets of struct kinfo_proc members. */
-+ int ki_layout;
-+ int ki_pid;
-+ int ki_ppid;
-+ int ki_pgid;
-+ int ki_tpgid;
-+ int ki_sid;
-+ int ki_tdev_freebsd11;
-+ int ki_sigignore;
-+ int ki_sigcatch;
-+ int ki_uid;
-+ int ki_ruid;
-+ int ki_svuid;
-+ int ki_rgid;
-+ int ki_svgid;
-+ int ki_ngroups;
-+ int ki_groups;
-+ int ki_size;
-+ int ki_rssize;
-+ int ki_tsize;
-+ int ki_dsize;
-+ int ki_ssize;
-+ int ki_start;
-+ int ki_nice;
-+ int ki_comm;
-+ int ki_tdev;
-+ int ki_rusage;
-+ int ki_rusage_ch;
-+
-+ /* Offsets of struct rusage members. */
-+ int ru_utime;
-+ int ru_stime;
-+ int ru_maxrss;
-+ int ru_minflt;
-+ int ru_majflt;
-+};
-+
-+const struct kinfo_proc_layout kinfo_proc_layout_32 =
-+ {
-+ .ki_layout = 0x4,
-+ .ki_pid = 0x28,
-+ .ki_ppid = 0x2c,
-+ .ki_pgid = 0x30,
-+ .ki_tpgid = 0x34,
-+ .ki_sid = 0x38,
-+ .ki_tdev_freebsd11 = 0x44,
-+ .ki_sigignore = 0x68,
-+ .ki_sigcatch = 0x78,
-+ .ki_uid = 0x88,
-+ .ki_ruid = 0x8c,
-+ .ki_svuid = 0x90,
-+ .ki_rgid = 0x94,
-+ .ki_svgid = 0x98,
-+ .ki_ngroups = 0x9c,
-+ .ki_groups = 0xa0,
-+ .ki_size = 0xe0,
-+ .ki_rssize = 0xe4,
-+ .ki_tsize = 0xec,
-+ .ki_dsize = 0xf0,
-+ .ki_ssize = 0xf4,
-+ .ki_start = 0x118,
-+ .ki_nice = 0x145,
-+ .ki_comm = 0x17f,
-+ .ki_tdev = 0x1f0,
-+ .ki_rusage = 0x220,
-+ .ki_rusage_ch = 0x278,
-+
-+ .ru_utime = 0x0,
-+ .ru_stime = 0x10,
-+ .ru_maxrss = 0x20,
-+ .ru_minflt = 0x30,
-+ .ru_majflt = 0x34,
-+ };
-+
-+const struct kinfo_proc_layout kinfo_proc_layout_i386 =
-+ {
-+ .ki_layout = 0x4,
-+ .ki_pid = 0x28,
-+ .ki_ppid = 0x2c,
-+ .ki_pgid = 0x30,
-+ .ki_tpgid = 0x34,
-+ .ki_sid = 0x38,
-+ .ki_tdev_freebsd11 = 0x44,
-+ .ki_sigignore = 0x68,
-+ .ki_sigcatch = 0x78,
-+ .ki_uid = 0x88,
-+ .ki_ruid = 0x8c,
-+ .ki_svuid = 0x90,
-+ .ki_rgid = 0x94,
-+ .ki_svgid = 0x98,
-+ .ki_ngroups = 0x9c,
-+ .ki_groups = 0xa0,
-+ .ki_size = 0xe0,
-+ .ki_rssize = 0xe4,
-+ .ki_tsize = 0xec,
-+ .ki_dsize = 0xf0,
-+ .ki_ssize = 0xf4,
-+ .ki_start = 0x118,
-+ .ki_nice = 0x135,
-+ .ki_comm = 0x16f,
-+ .ki_tdev = 0x1e0,
-+ .ki_rusage = 0x210,
-+ .ki_rusage_ch = 0x258,
-+
-+ .ru_utime = 0x0,
-+ .ru_stime = 0x8,
-+ .ru_maxrss = 0x10,
-+ .ru_minflt = 0x20,
-+ .ru_majflt = 0x24,
-+ };
-+
-+const struct kinfo_proc_layout kinfo_proc_layout_64 =
-+ {
-+ .ki_layout = 0x4,
-+ .ki_pid = 0x48,
-+ .ki_ppid = 0x4c,
-+ .ki_pgid = 0x50,
-+ .ki_tpgid = 0x54,
-+ .ki_sid = 0x58,
-+ .ki_tdev_freebsd11 = 0x64,
-+ .ki_sigignore = 0x88,
-+ .ki_sigcatch = 0x98,
-+ .ki_uid = 0xa8,
-+ .ki_ruid = 0xac,
-+ .ki_svuid = 0xb0,
-+ .ki_rgid = 0xb4,
-+ .ki_svgid = 0xb8,
-+ .ki_ngroups = 0xbc,
-+ .ki_groups = 0xc0,
-+ .ki_size = 0x100,
-+ .ki_rssize = 0x108,
-+ .ki_tsize = 0x118,
-+ .ki_dsize = 0x120,
-+ .ki_ssize = 0x128,
-+ .ki_start = 0x150,
-+ .ki_nice = 0x185,
-+ .ki_comm = 0x1bf,
-+ .ki_tdev = 0x230,
-+ .ki_rusage = 0x260,
-+ .ki_rusage_ch = 0x2f0,
-+
-+ .ru_utime = 0x0,
-+ .ru_stime = 0x10,
-+ .ru_maxrss = 0x20,
-+ .ru_minflt = 0x40,
-+ .ru_majflt = 0x48,
-+ };
-+
- static struct gdbarch_data *fbsd_gdbarch_data_handle;
-
- struct fbsd_gdbarch_data
-@@ -367,6 +589,433 @@ fbsd_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
- return note_data;
- }
-
-+/* Helper function to generate mappings flags for a single VM map
-+ entry in 'info proc mappings'. */
-+
-+const char *
-+fbsd_vm_map_entry_flags (int kve_flags, int kve_protection)
-+{
-+ static char vm_flags[9];
-+
-+ vm_flags[0] = (kve_protection & KINFO_VME_PROT_READ) ? 'r' : '-';
-+ vm_flags[1] = (kve_protection & KINFO_VME_PROT_WRITE) ? 'w' : '-';
-+ vm_flags[2] = (kve_protection & KINFO_VME_PROT_EXEC) ? 'x' : '-';
-+ vm_flags[3] = ' ';
-+ vm_flags[4] = (kve_flags & KINFO_VME_FLAG_COW) ? 'C' : '-';
-+ vm_flags[5] = (kve_flags & KINFO_VME_FLAG_NEEDS_COPY) ? 'N' : '-';
-+ vm_flags[6] = (kve_flags & KINFO_VME_FLAG_SUPER) ? 'S' : '-';
-+ vm_flags[7] = (kve_flags & KINFO_VME_FLAG_GROWS_UP) ? 'U'
-+ : (kve_flags & KINFO_VME_FLAG_GROWS_DOWN) ? 'D' : '-';
-+ vm_flags[8] = '\0';
-+
-+ return vm_flags;
-+}
-+
-+/* Implement "info proc mappings" for a corefile. */
-+
-+static void
-+fbsd_core_info_proc_mappings (struct gdbarch *gdbarch)
-+{
-+ asection *section;
-+ unsigned char *descdata, *descend;
-+ size_t note_size;
-+
-+ section = bfd_get_section_by_name (core_bfd, ".note.freebsdcore.vmmap");
-+ if (section == NULL)
-+ {
-+ warning (_("unable to find mappings in core file"));
-+ return;
-+ }
-+
-+ note_size = bfd_get_section_size (section);
-+ if (note_size < 4)
-+ error (_("malformed core note - too short for header"));
-+
-+ gdb::def_vector<unsigned char> contents (note_size);
-+ if (!bfd_get_section_contents (core_bfd, section, contents.data (),
-+ 0, note_size))
-+ error (_("could not get core note contents"));
-+
-+ descdata = contents.data ();
-+ descend = descdata + note_size;
-+
-+ /* Skip over the structure size. */
-+ descdata += 4;
-+
-+ printf_filtered (_("Mapped address spaces:\n\n"));
-+ if (gdbarch_addr_bit (gdbarch) == 64)
-+ {
-+ printf_filtered (" %18s %18s %10s %10s %9s %s\n",
-+ "Start Addr",
-+ " End Addr",
-+ " Size", " Offset", "Flags ", "File");
-+ }
-+ else
-+ {
-+ printf_filtered ("\t%10s %10s %10s %10s %9s %s\n",
-+ "Start Addr",
-+ " End Addr",
-+ " Size", " Offset", "Flags ", "File");
-+ }
-+
-+ while (descdata + KVE_PATH < descend)
-+ {
-+ ULONGEST start, end, offset, flags, prot, structsize;
-+
-+ structsize = bfd_get_32 (core_bfd, descdata + KVE_STRUCTSIZE);
-+ if (structsize < KVE_PATH)
-+ error (_("malformed core note - vmmap entry too small"));
-+
-+ start = bfd_get_64 (core_bfd, descdata + KVE_START);
-+ end = bfd_get_64 (core_bfd, descdata + KVE_END);
-+ offset = bfd_get_64 (core_bfd, descdata + KVE_OFFSET);
-+ flags = bfd_get_32 (core_bfd, descdata + KVE_FLAGS);
-+ prot = bfd_get_32 (core_bfd, descdata + KVE_PROTECTION);
-+ if (gdbarch_addr_bit (gdbarch) == 64)
-+ {
-+ printf_filtered (" %18s %18s %10s %10s %9s %s\n",
-+ paddress (gdbarch, start),
-+ paddress (gdbarch, end),
-+ hex_string (end - start),
-+ hex_string (offset),
-+ fbsd_vm_map_entry_flags (flags, prot),
-+ descdata + KVE_PATH);
-+ }
-+ else
-+ {
-+ printf_filtered ("\t%10s %10s %10s %10s %9s %s\n",
-+ paddress (gdbarch, start),
-+ paddress (gdbarch, end),
-+ hex_string (end - start),
-+ hex_string (offset),
-+ fbsd_vm_map_entry_flags (flags, prot),
-+ descdata + KVE_PATH);
-+ }
-+
-+ descdata += structsize;
-+ }
-+}
-+
-+/* Fetch the pathname of a vnode for a single file descriptor from the
-+ file table core note. */
-+
-+static gdb::unique_xmalloc_ptr<char>
-+fbsd_core_vnode_path (struct gdbarch *gdbarch, int fd)
-+{
-+ asection *section;
-+ unsigned char *descdata, *descend;
-+ size_t note_size;
-+
-+ section = bfd_get_section_by_name (core_bfd, ".note.freebsdcore.files");
-+ if (section == NULL)
-+ return nullptr;
-+
-+ note_size = bfd_get_section_size (section);
-+ if (note_size < 4)
-+ error (_("malformed core note - too short for header"));
-+
-+ gdb::def_vector<unsigned char> contents (note_size);
-+ if (!bfd_get_section_contents (core_bfd, section, contents.data (),
-+ 0, note_size))
-+ error (_("could not get core note contents"));
-+
-+ descdata = contents.data ();
-+ descend = descdata + note_size;
-+
-+ /* Skip over the structure size. */
-+ descdata += 4;
-+
-+ while (descdata + KVE_PATH < descend)
-+ {
-+ ULONGEST structsize;
-+
-+ structsize = bfd_get_32 (core_bfd, descdata + KF_STRUCTSIZE);
-+ if (structsize < KVE_PATH)
-+ error (_("malformed core note - vmmap entry too small"));
-+
-+ if (bfd_get_32 (core_bfd, descdata + KF_TYPE) == KINFO_FILE_TYPE_VNODE
-+ && bfd_get_signed_32 (core_bfd, descdata + KF_FD) == fd)
-+ {
-+ char *path = (char *) descdata + KF_PATH;
-+ return gdb::unique_xmalloc_ptr<char> (xstrdup (path));
-+ }
-+
-+ descdata += structsize;
-+ }
-+ return nullptr;
-+}
-+
-+/* Helper function to read a struct timeval. */
-+
-+static void
-+fbsd_core_fetch_timeval (struct gdbarch *gdbarch, unsigned char *data,
-+ LONGEST &sec, ULONGEST &usec)
-+{
-+ if (gdbarch_addr_bit (gdbarch) == 64)
-+ {
-+ sec = bfd_get_signed_64 (core_bfd, data);
-+ usec = bfd_get_64 (core_bfd, data + 8);
-+ }
-+ else if (bfd_get_arch (core_bfd) == bfd_arch_i386)
-+ {
-+ sec = bfd_get_signed_32 (core_bfd, data);
-+ usec = bfd_get_32 (core_bfd, data + 4);
-+ }
-+ else
-+ {
-+ sec = bfd_get_signed_64 (core_bfd, data);
-+ usec = bfd_get_32 (core_bfd, data + 8);
-+ }
-+}
-+
-+/* Print out the contents of a signal set. */
-+
-+static void
-+fbsd_print_sigset (const char *descr, unsigned char *sigset)
-+{
-+ printf_filtered ("%s: ", descr);
-+ for (int i = 0; i < SIG_WORDS; i++)
-+ printf_filtered ("%08x ",
-+ (unsigned int) bfd_get_32 (core_bfd, sigset + i * 4));
-+ printf_filtered ("\n");
-+}
-+
-+/* Implement "info proc status" for a corefile. */
-+
-+static void
-+fbsd_core_info_proc_status (struct gdbarch *gdbarch)
-+{
-+ const struct kinfo_proc_layout *kp;
-+ asection *section;
-+ const char *state;
-+ unsigned char *descdata;
-+ int addr_bit, long_bit;
-+ size_t note_size;
-+ ULONGEST value;
-+ LONGEST sec;
-+
-+ section = bfd_get_section_by_name (core_bfd, ".note.freebsdcore.proc");
-+ if (section == NULL)
-+ {
-+ warning (_("unable to find process info in core file"));
-+ return;
-+ }
-+
-+ addr_bit = gdbarch_addr_bit (gdbarch);
-+ if (addr_bit == 64)
-+ kp = &kinfo_proc_layout_64;
-+ else if (bfd_get_arch (core_bfd) == bfd_arch_i386)
-+ kp = &kinfo_proc_layout_i386;
-+ else
-+ kp = &kinfo_proc_layout_32;
-+ long_bit = gdbarch_long_bit (gdbarch);
-+
-+ /*
-+ * Ensure that the note is large enough for all of the fields fetched
-+ * by this function. In particular, the note must contain the 32-bit
-+ * structure size, then it must be long enough to access the last
-+ * field used (ki_rusage_ch.ru_majflt) which is the size of a long.
-+ */
-+ note_size = bfd_get_section_size (section);
-+ if (note_size < (4 + kp->ki_rusage_ch + kp->ru_majflt
-+ + long_bit / TARGET_CHAR_BIT))
-+ error (_("malformed core note - too short"));
-+
-+ gdb::def_vector<unsigned char> contents (note_size);
-+ if (!bfd_get_section_contents (core_bfd, section, contents.data (),
-+ 0, note_size))
-+ error (_("could not get core note contents"));
-+
-+ descdata = contents.data ();
-+
-+ /* Skip over the structure size. */
-+ descdata += 4;
-+
-+ /* Verify 'ki_layout' is 0. */
-+ if (bfd_get_32 (core_bfd, descdata + kp->ki_layout) != 0)
-+ {
-+ warning (_("unsupported process information in core file"));
-+ return;
-+ }
-+
-+ printf_filtered ("Name: %.19s\n", descdata + kp->ki_comm);
-+ printf_filtered ("Process ID: %s\n",
-+ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_pid)));
-+ printf_filtered ("Parent process: %s\n",
-+ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_ppid)));
-+ printf_filtered ("Process group: %s\n",
-+ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_pgid)));
-+ printf_filtered ("Session id: %s\n",
-+ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_sid)));
-+
-+ /* FreeBSD 12.0 and later store a 64-bit dev_t at 'ki_tdev'. Older
-+ kernels store a 32-bit dev_t at 'ki_tdev_freebsd11'. In older
-+ kernels the 64-bit 'ki_tdev' field is in a reserved section of
-+ the structure that is cleared to zero. Assume that a zero value
-+ in ki_tdev indicates a core dump from an older kernel and use the
-+ value in 'ki_tdev_freebsd11' instead. */
-+ value = bfd_get_64 (core_bfd, descdata + kp->ki_tdev);
-+ if (value == 0)
-+ value = bfd_get_32 (core_bfd, descdata + kp->ki_tdev_freebsd11);
-+ printf_filtered ("TTY: %s\n", pulongest (value));
-+ printf_filtered ("TTY owner process group: %s\n",
-+ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_tpgid)));
-+ printf_filtered ("User IDs (real, effective, saved): %s %s %s\n",
-+ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_ruid)),
-+ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_uid)),
-+ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_svuid)));
-+ printf_filtered ("Group IDs (real, effective, saved): %s %s %s\n",
-+ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_rgid)),
-+ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_groups)),
-+ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_svgid)));
-+ printf_filtered ("Groups: ");
-+ uint16_t ngroups = bfd_get_16 (core_bfd, descdata + kp->ki_ngroups);
-+ for (int i = 0; i < ngroups; i++)
-+ printf_filtered ("%s ",
-+ pulongest (bfd_get_32 (core_bfd,
-+ descdata + kp->ki_groups + i * 4)));
-+ printf_filtered ("\n");
-+ value = bfd_get (long_bit, core_bfd,
-+ descdata + kp->ki_rusage + kp->ru_minflt);
-+ printf_filtered ("Minor faults (no memory page): %s\n", pulongest (value));
-+ value = bfd_get (long_bit, core_bfd,
-+ descdata + kp->ki_rusage_ch + kp->ru_minflt);
-+ printf_filtered ("Minor faults, children: %s\n", pulongest (value));
-+ value = bfd_get (long_bit, core_bfd,
-+ descdata + kp->ki_rusage + kp->ru_majflt);
-+ printf_filtered ("Major faults (memory page faults): %s\n",
-+ pulongest (value));
-+ value = bfd_get (long_bit, core_bfd,
-+ descdata + kp->ki_rusage_ch + kp->ru_majflt);
-+ printf_filtered ("Major faults, children: %s\n", pulongest (value));
-+ fbsd_core_fetch_timeval (gdbarch,
-+ descdata + kp->ki_rusage + kp->ru_utime,
-+ sec, value);
-+ printf_filtered ("utime: %s.%06d\n", plongest (sec), (int) value);
-+ fbsd_core_fetch_timeval (gdbarch,
-+ descdata + kp->ki_rusage + kp->ru_stime,
-+ sec, value);
-+ printf_filtered ("stime: %s.%06d\n", plongest (sec), (int) value);
-+ fbsd_core_fetch_timeval (gdbarch,
-+ descdata + kp->ki_rusage_ch + kp->ru_utime,
-+ sec, value);
-+ printf_filtered ("utime, children: %s.%06d\n", plongest (sec), (int) value);
-+ fbsd_core_fetch_timeval (gdbarch,
-+ descdata + kp->ki_rusage_ch + kp->ru_stime,
-+ sec, value);
-+ printf_filtered ("stime, children: %s.%06d\n", plongest (sec), (int) value);
-+ printf_filtered ("'nice' value: %d\n",
-+ bfd_get_signed_8 (core_bfd, descdata + kp->ki_nice));
-+ fbsd_core_fetch_timeval (gdbarch, descdata + kp->ki_start, sec, value);
-+ printf_filtered ("Start time: %s.%06d\n", plongest (sec), (int) value);
-+ printf_filtered ("Virtual memory size: %s kB\n",
-+ pulongest (bfd_get (addr_bit, core_bfd,
-+ descdata + kp->ki_size) / 1024));
-+ printf_filtered ("Data size: %s pages\n",
-+ pulongest (bfd_get (addr_bit, core_bfd,
-+ descdata + kp->ki_dsize)));
-+ printf_filtered ("Stack size: %s pages\n",
-+ pulongest (bfd_get (addr_bit, core_bfd,
-+ descdata + kp->ki_ssize)));
-+ printf_filtered ("Text size: %s pages\n",
-+ pulongest (bfd_get (addr_bit, core_bfd,
-+ descdata + kp->ki_tsize)));
-+ printf_filtered ("Resident set size: %s pages\n",
-+ pulongest (bfd_get (addr_bit, core_bfd,
-+ descdata + kp->ki_rssize)));
-+ printf_filtered ("Maximum RSS: %s pages\n",
-+ pulongest (bfd_get (long_bit, core_bfd,
-+ descdata + kp->ki_rusage
-+ + kp->ru_maxrss)));
-+ fbsd_print_sigset ("Ignored Signals", descdata + kp->ki_sigignore);
-+ fbsd_print_sigset ("Caught Signals", descdata + kp->ki_sigcatch);
-+}
-+
-+/* Implement the "core_info_proc" gdbarch method. */
-+
-+static void
-+fbsd_core_info_proc (struct gdbarch *gdbarch, const char *args,
-+ enum info_proc_what what)
-+{
-+ bool do_cmdline = false;
-+ bool do_cwd = false;
-+ bool do_exe = false;
-+ bool do_mappings = false;
-+ bool do_status = false;
-+ int pid;
-+
-+ switch (what)
-+ {
-+ case IP_MINIMAL:
-+ do_cmdline = true;
-+ do_cwd = true;
-+ do_exe = true;
-+ break;
-+ case IP_MAPPINGS:
-+ do_mappings = true;
-+ break;
-+ 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;
-+ do_mappings = true;
-+ do_status = true;
-+ break;
-+ default:
-+ return;
-+ }
-+
-+ pid = bfd_core_file_pid (core_bfd);
-+ if (pid != 0)
-+ printf_filtered (_("process %d\n"), pid);
-+
-+ if (do_cmdline)
-+ {
-+ const char *cmdline;
-+
-+ cmdline = bfd_core_file_failing_command (core_bfd);
-+ if (cmdline)
-+ printf_filtered ("cmdline = '%s'\n", cmdline);
-+ else
-+ warning (_("Command line unavailable"));
-+ }
-+ if (do_cwd)
-+ {
-+ gdb::unique_xmalloc_ptr<char> cwd =
-+ fbsd_core_vnode_path (gdbarch, KINFO_FILE_FD_TYPE_CWD);
-+ if (cwd)
-+ printf_filtered ("cwd = '%s'\n", cwd.get ());
-+ else
-+ warning (_("unable to read current working directory"));
-+ }
-+ if (do_exe)
-+ {
-+ gdb::unique_xmalloc_ptr<char> exe =
-+ fbsd_core_vnode_path (gdbarch, KINFO_FILE_FD_TYPE_TEXT);
-+ if (exe)
-+ printf_filtered ("exe = '%s'\n", exe.get ());
-+ else
-+ warning (_("unable to read executable path name"));
-+ }
-+ if (do_mappings)
-+ fbsd_core_info_proc_mappings (gdbarch);
-+ if (do_status)
-+ fbsd_core_info_proc_status (gdbarch);
-+}
-+
- /* Print descriptions of FreeBSD-specific AUXV entries to FILE. */
-
- static void
-@@ -519,6 +1168,7 @@ fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
- set_gdbarch_core_thread_name (gdbarch, fbsd_core_thread_name);
- set_gdbarch_core_xfer_siginfo (gdbarch, fbsd_core_xfer_siginfo);
- set_gdbarch_make_corefile_notes (gdbarch, fbsd_make_corefile_notes);
-+ set_gdbarch_core_info_proc (gdbarch, fbsd_core_info_proc);
- set_gdbarch_print_auxv_entry (gdbarch, fbsd_print_auxv_entry);
- set_gdbarch_get_siginfo_type (gdbarch, fbsd_get_siginfo_type);
-
-diff --git gdb/fbsd-tdep.h gdb/fbsd-tdep.h
-index 9769903dec..0b293e5a25 100644
---- gdb/fbsd-tdep.h
-+++ gdb/fbsd-tdep.h
-@@ -22,4 +22,11 @@
-
- extern void fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch);
-
-+/* Helper function to generate mappings flags for a single VM map
-+ entry in 'info proc mappings'. The KVE_FLAGS and KVE_PROTECTION
-+ parameters should contain the values of the corresponding fields in
-+ a 'struct kinfo_vmentry'. */
-+
-+extern const char *fbsd_vm_map_entry_flags (int kve_flags, int kve_protection);
-+
- #endif /* fbsd-tdep.h */
Index: devel/gdb/files/commit-f169cfdc08
===================================================================
--- devel/gdb/files/commit-f169cfdc08
+++ /dev/null
@@ -1,84 +0,0 @@
-commit f169cfdc08761a3d9fcd587ad8661102672403ec
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Oct 24 21:06:00 2017 -0700
-
- Workaround a FreeBSD ptrace() bug with clearing thread events.
-
- When multiple threads within a process wish to report STOPPED events
- from wait(), the kernel picks one thread event as the thread event to
- report. The chosen thread event is retrieved via PT_LWPINFO by
- passing the process ID as the request pid. If multiple events are
- pending, then the subsequent wait() after resuming a process will
- report another STOPPED event after resuming the process to handle the
- next thread event and so on.
-
- A single thread event is cleared as a side effect of resuming the
- process with PT_CONTINUE, PT_STEP, etc. In older kernels, however,
- the request pid was used to select which thread's event was cleared
- rather than always clearing the event that was just reported. To
- avoid clearing the event of the wrong LWP, always pass the process ID
- instead of an LWP ID to PT_CONTINUE or PT_SYSCALL.
-
- In the case of stepping, the process ID cannot be used with PT_STEP
- since it would step the thread that reported an event which may not be
- the thread indicated by PTID. For stepping, use PT_SETSTEP to enable
- stepping on the desired thread before resuming the process via
- PT_CONTINUE instead of using PT_STEP.
-
- This manifested as a failure in the
- gdb.threads/continue-pending-status.exp test. Specifically, if thread
- 2 reported a breakpoint and the test thus switched to thread 3 before
- continuing, thread 3's event (if any) was discarded and thread 2's
- breakpoint remained pending and was reported a second time as a
- duplicate event. As a result, the PC was decremented twice for the
- same breakpoint resulting in an illegal instruction fault on x86.
-
- gdb/ChangeLog:
-
- * fbsd-nat.c (fbsd_resume): Use PT_SETSTEP for stepping and a
- wildcard process pid for super_resume for kernels with a
- specific bug.
-
-diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
-index b352418813..3a216abf18 100644
---- gdb/fbsd-nat.c
-+++ gdb/fbsd-nat.c
-@@ -1143,6 +1143,38 @@ fbsd_resume (struct target_ops *ops,
- }
- ptid = inferior_ptid;
- }
-+
-+#if __FreeBSD_version < 1200052
-+ /* When multiple threads within a process wish to report STOPPED
-+ events from wait(), the kernel picks one thread event as the
-+ thread event to report. The chosen thread event is retrieved via
-+ PT_LWPINFO by passing the process ID as the request pid. If
-+ multiple events are pending, then the subsequent wait() after
-+ resuming a process will report another STOPPED event after
-+ resuming the process to handle the next thread event and so on.
-+
-+ A single thread event is cleared as a side effect of resuming the
-+ process with PT_CONTINUE, PT_STEP, etc. In older kernels,
-+ however, the request pid was used to select which thread's event
-+ was cleared rather than always clearing the event that was just
-+ reported. To avoid clearing the event of the wrong LWP, always
-+ pass the process ID instead of an LWP ID to PT_CONTINUE or
-+ PT_SYSCALL.
-+
-+ In the case of stepping, the process ID cannot be used with
-+ PT_STEP since it would step the thread that reported an event
-+ which may not be the thread indicated by PTID. For stepping, use
-+ PT_SETSTEP to enable stepping on the desired thread before
-+ resuming the process via PT_CONTINUE instead of using
-+ PT_STEP. */
-+ if (step)
-+ {
-+ if (ptrace (PT_SETSTEP, get_ptrace_pid (ptid), NULL, 0) == -1)
-+ perror_with_name (("ptrace"));
-+ step = 0;
-+ }
-+ ptid = ptid_t (ptid.pid ());
-+#endif
- super_resume (ops, ptid, step, signo);
- }
-
Index: devel/gdb/files/extrapatch-kgdb
===================================================================
--- devel/gdb/files/extrapatch-kgdb
+++ devel/gdb/files/extrapatch-kgdb
@@ -1,8 +1,8 @@
diff --git gdb/Makefile.in gdb/Makefile.in
-index 17b71c6e7c..95e92d08b4 100644
+index 13627e07e0..a72fd8fe0f 100644
--- gdb/Makefile.in
+++ gdb/Makefile.in
-@@ -230,7 +230,8 @@ INCGNU = -I$(srcdir)/gnulib/import -I$(GNULIB_BUILDDIR)/import
+@@ -236,7 +236,8 @@ INCGNU = -I$(srcdir)/gnulib/import -I$(GNULIB_BUILDDIR)/import
# Generated headers in the gnulib directory. These must be listed
# so that they are generated before other files are compiled.
@@ -12,7 +12,7 @@
#
# CLI sub directory definitons
-@@ -629,6 +630,7 @@ TARGET_OBS = @TARGET_OBS@
+@@ -643,6 +644,7 @@ TARGET_OBS = @TARGET_OBS@
# All target-dependent objects files that require 64-bit CORE_ADDR
# (used with --enable-targets=all --enable-64-bit-bfd).
ALL_64_TARGET_OBS = \
@@ -20,7 +20,7 @@
aarch64-fbsd-tdep.o \
aarch64-linux-tdep.o \
aarch64-newlib-tdep.o \
-@@ -642,6 +644,7 @@ ALL_64_TARGET_OBS = \
+@@ -656,6 +658,7 @@ ALL_64_TARGET_OBS = \
amd64-darwin-tdep.o \
amd64-dicos-tdep.o \
amd64-fbsd-tdep.o \
@@ -28,7 +28,7 @@
amd64-linux-tdep.o \
amd64-nbsd-tdep.o \
amd64-obsd-tdep.o \
-@@ -656,6 +659,7 @@ ALL_64_TARGET_OBS = \
+@@ -670,6 +673,7 @@ ALL_64_TARGET_OBS = \
ia64-vms-tdep.o \
mips64-obsd-tdep.o \
sparc64-fbsd-tdep.o \
@@ -36,15 +36,15 @@
sparc64-linux-tdep.o \
sparc64-nbsd-tdep.o \
sparc64-obsd-tdep.o \
-@@ -670,6 +674,7 @@ ALL_TARGET_OBS = \
- arch/arm-linux.o \
+@@ -685,6 +689,7 @@ ALL_TARGET_OBS = \
arch/i386.o \
+ arch/ppc-linux-common.o \
arm-bsd-tdep.o \
+ arm-fbsd-kern.o \
arm-fbsd-tdep.o \
arm-linux-tdep.o \
arm-nbsd-tdep.o \
-@@ -684,6 +689,8 @@ ALL_TARGET_OBS = \
+@@ -699,6 +704,8 @@ ALL_TARGET_OBS = \
cris-linux-tdep.o \
cris-tdep.o \
dicos-tdep.o \
@@ -53,7 +53,7 @@
fbsd-tdep.o \
frv-linux-tdep.o \
frv-tdep.o \
-@@ -700,6 +707,7 @@ ALL_TARGET_OBS = \
+@@ -715,6 +722,7 @@ ALL_TARGET_OBS = \
i386-darwin-tdep.o \
i386-dicos-tdep.o \
i386-fbsd-tdep.o \
@@ -61,7 +61,7 @@
i386-gnu-tdep.o \
i386-go32-tdep.o \
i386-linux-tdep.o \
-@@ -724,6 +732,7 @@ ALL_TARGET_OBS = \
+@@ -738,6 +746,7 @@ ALL_TARGET_OBS = \
mep-tdep.o \
microblaze-linux-tdep.o \
microblaze-tdep.o \
@@ -69,26 +69,26 @@
mips-fbsd-tdep.o \
mips-linux-tdep.o \
mips-nbsd-tdep.o \
-@@ -741,6 +750,7 @@ ALL_TARGET_OBS = \
- nto-tdep.o \
+@@ -755,6 +764,7 @@ ALL_TARGET_OBS = \
obsd-tdep.o \
+ or1k-tdep.o \
ppc-fbsd-tdep.o \
+ ppcfbsd-kern.o \
ppc-linux-tdep.o \
ppc-nbsd-tdep.o \
ppc-obsd-tdep.o \
-@@ -1610,7 +1620,7 @@ generated_files = \
+@@ -1611,7 +1621,7 @@ generated_files = \
# Flags needed to compile Python code
PYTHON_CFLAGS = @PYTHON_CFLAGS@
--all: gdb$(EXEEXT) $(CONFIG_ALL)
-+all: gdb$(EXEEXT) kgdb$(EXEEXT) $(CONFIG_ALL)
+-all: gdb$(EXEEXT) $(CONFIG_ALL) gdb-gdb.py gdb-gdb.gdb
++all: gdb$(EXEEXT) kgdb$(EXEEXT) $(CONFIG_ALL) gdb-gdb.py gdb-gdb.gdb
@$(MAKE) $(FLAGS_TO_PASS) DO=all "DODIRS=`echo $(SUBDIRS) | sed 's/testsuite//'`" subdir_do
# Rule for compiling .c files in the top-level gdb directory.
-@@ -1920,6 +1930,12 @@ gdb$(EXEEXT): gdb.o $(LIBGDB_OBS) $(ADD_DEPS) $(CDEPS) $(TDEPLIBS)
- -o gdb$(EXEEXT) gdb.o $(LIBGDB_OBS) \
- $(TDEPLIBS) $(TUI_LIBRARY) $(CLIBS) $(LOADLIBES)
+@@ -1924,6 +1934,12 @@ ifneq ($(CODESIGN_CERT),)
+ $(ECHO_SIGN) $(CODESIGN) -s $(CODESIGN_CERT) gdb$(EXEEXT)
+ endif
+kgdb$(EXEEXT): kgdb-main.o $(LIBGDB_OBS) $(ADD_DEPS) $(CDEPS) $(TDEPLIBS)
+ rm -f kgdb$(EXEEXT)
@@ -99,16 +99,16 @@
# Convenience rule to handle recursion.
$(LIBGNU) $(GNULIB_H): all-lib
all-lib: $(GNULIB_BUILDDIR)/Makefile
-@@ -1964,7 +1980,7 @@ clean mostlyclean: $(CONFIG_CLEAN)
+@@ -1968,7 +1984,7 @@ clean mostlyclean: $(CONFIG_CLEAN)
@$(MAKE) $(FLAGS_TO_PASS) DO=clean "DODIRS=$(CLEANDIRS)" subdir_do
rm -f *.o *.a $(ADD_FILES) *~ init.c-tmp init.l-tmp version.c-tmp
- rm -f init.c version.c observer.h observer.inc
+ rm -f init.c version.c
- rm -f gdb$(EXEEXT) core make.log
+ rm -f gdb$(EXEEXT) core make.log kgdb$(EXEEXT)
rm -f gdb[0-9]$(EXEEXT)
rm -f test-cp-name-parser$(EXEEXT)
rm -f xml-builtin.c stamp-xml
-@@ -2178,6 +2194,7 @@ MAKEOVERRIDES =
+@@ -2183,6 +2199,7 @@ MAKEOVERRIDES =
ALLDEPFILES = \
aarch64-fbsd-nat.c \
@@ -116,7 +116,7 @@
aarch64-fbsd-tdep.c \
aarch64-linux-nat.c \
aarch64-linux-tdep.c \
-@@ -2195,6 +2212,7 @@ ALLDEPFILES = \
+@@ -2200,6 +2217,7 @@ ALLDEPFILES = \
amd64-bsd-nat.c \
amd64-darwin-tdep.c \
amd64-dicos-tdep.c \
@@ -124,7 +124,7 @@
amd64-fbsd-nat.c \
amd64-fbsd-tdep.c \
amd64-linux-nat.c \
-@@ -2209,6 +2227,7 @@ ALLDEPFILES = \
+@@ -2214,6 +2232,7 @@ ALLDEPFILES = \
arc-tdep.c \
arm.c \
arm-bsd-tdep.c \
@@ -132,7 +132,7 @@
arm-fbsd-nat.c \
arm-fbsd-tdep.c \
arm-get-next-pcs.c \
-@@ -2228,6 +2247,9 @@ ALLDEPFILES = \
+@@ -2233,6 +2252,9 @@ ALLDEPFILES = \
darwin-nat.c \
dicos-tdep.c \
exec.c \
@@ -142,7 +142,7 @@
fbsd-nat.c \
fbsd-tdep.c \
fork-child.c \
-@@ -2249,6 +2271,7 @@ ALLDEPFILES = \
+@@ -2254,6 +2276,7 @@ ALLDEPFILES = \
i386-darwin-nat.c \
i386-darwin-tdep.c \
i386-dicos-tdep.c \
@@ -150,7 +150,7 @@
i386-fbsd-nat.c \
i386-fbsd-tdep.c \
i386-gnu-nat.c \
-@@ -2290,6 +2313,7 @@ ALLDEPFILES = \
+@@ -2293,6 +2316,7 @@ ALLDEPFILES = \
mingw-hdep.c \
mips-fbsd-nat.c \
mips-fbsd-tdep.c \
@@ -158,7 +158,7 @@
mips-linux-nat.c \
mips-linux-tdep.c \
mips-nbsd-nat.c \
-@@ -2307,6 +2331,7 @@ ALLDEPFILES = \
+@@ -2310,6 +2334,7 @@ ALLDEPFILES = \
obsd-nat.c \
obsd-tdep.c \
posix-hdep.c \
@@ -166,7 +166,7 @@
ppc-fbsd-nat.c \
ppc-fbsd-tdep.c \
ppc-linux-nat.c \
-@@ -2351,6 +2376,7 @@ ALLDEPFILES = \
+@@ -2355,6 +2380,7 @@ ALLDEPFILES = \
sparc-sol2-nat.c \
sparc-sol2-tdep.c \
sparc-tdep.c \
@@ -174,7 +174,7 @@
sparc64-fbsd-nat.c \
sparc64-fbsd-tdep.c \
sparc64-linux-nat.c \
-@@ -2638,7 +2664,7 @@ endif
+@@ -2643,7 +2669,7 @@ endif
# A list of all the objects we might care about in this build, for
# dependency tracking.
@@ -184,10 +184,10 @@
# All the .deps files to include.
diff --git gdb/config.in gdb/config.in
-index 1d11a97080..50a5a5b322 100644
+index 527290296e..8e0e90fd67 100644
--- gdb/config.in
+++ gdb/config.in
-@@ -222,6 +222,9 @@
+@@ -228,6 +228,9 @@
/* Define to 1 if your system has the kinfo_getvmmap function. */
#undef HAVE_KINFO_GETVMMAP
@@ -198,10 +198,10 @@
#undef HAVE_LANGINFO_CODESET
diff --git gdb/configure gdb/configure
-index 84a0790c0d..f4c323d4ab 100755
+index 3849b9494f..18d2e363dc 100755
--- gdb/configure
+++ gdb/configure
-@@ -7927,6 +7927,66 @@ $as_echo "#define HAVE_KINFO_GETVMMAP 1" >>confdefs.h
+@@ -8082,6 +8082,66 @@ $as_echo "#define HAVE_KINFO_GETFILE 1" >>confdefs.h
fi
@@ -269,12 +269,12 @@
if test "X$prefix" = "XNONE"; then
acl_final_prefix="$ac_default_prefix"
diff --git gdb/configure.ac gdb/configure.ac
-index d4133ea71e..bac85c53e0 100644
+index 4c20ea5178..df156b484f 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. ])])
+@@ -534,6 +534,11 @@ 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. ])])
+# kgdb needs kvm_open2 for cross-debugging
+AC_SEARCH_LIBS(kvm_open2, kvm,
@@ -285,7 +285,7 @@
# GDB may fork/exec the iconv program to get the list of supported character
diff --git gdb/configure.nat gdb/configure.nat
-index 8e14892722..ada205f34d 100644
+index 7611266d86..8656015365 100644
--- gdb/configure.nat
+++ gdb/configure.nat
@@ -62,7 +62,8 @@ case ${gdb_host} in
@@ -299,10 +299,10 @@
LOADLIBES='-lkvm'
;;
diff --git gdb/configure.tgt gdb/configure.tgt
-index fb8014a8e8..4bb43e366c 100644
+index f197160896..ced1140328 100644
--- gdb/configure.tgt
+++ gdb/configure.tgt
-@@ -92,7 +92,7 @@ esac
+@@ -94,7 +94,7 @@ esac
case "${targ}" in
*-*-freebsd* | *-*-kfreebsd*-gnu)
@@ -311,7 +311,7 @@
*-*-netbsd* | *-*-knetbsd*-gnu)
os_obs="nbsd-tdep.o solib-svr4.o";;
*-*-openbsd*)
-@@ -109,7 +109,7 @@ aarch64*-*-elf | aarch64*-*-rtems*)
+@@ -111,7 +111,7 @@ aarch64*-*-elf | aarch64*-*-rtems*)
aarch64*-*-freebsd*)
# Target: FreeBSD/aarch64
@@ -320,7 +320,7 @@
;;
aarch64*-*-linux*)
-@@ -162,7 +162,7 @@ arm*-*-linux*)
+@@ -164,7 +164,7 @@ arm*-*-linux*)
;;
arm*-*-freebsd*)
# Target: FreeBSD/arm
@@ -329,7 +329,7 @@
;;
arm*-*-netbsd* | arm*-*-knetbsd*-gnu)
# Target: NetBSD/arm
-@@ -249,7 +249,11 @@ i[34567]86-*-dicos*)
+@@ -251,7 +251,11 @@ i[34567]86-*-dicos*)
;;
i[34567]86-*-freebsd* | i[34567]86-*-kfreebsd*-gnu)
# Target: FreeBSD/i386
@@ -342,7 +342,7 @@
;;
i[34567]86-*-netbsd* | i[34567]86-*-knetbsd*-gnu)
# Target: NetBSD/i386
-@@ -408,7 +412,7 @@ mips*-*-netbsd* | mips*-*-knetbsd*-gnu)
+@@ -405,7 +409,7 @@ mips*-*-netbsd* | mips*-*-knetbsd*-gnu)
;;
mips*-*-freebsd*)
# Target: MIPS running FreeBSD
@@ -351,7 +351,7 @@
gdb_sim=../sim/mips/libsim.a
;;
mips64*-*-openbsd*)
-@@ -472,7 +476,7 @@ or1k-*-* | or1knd-*-*)
+@@ -464,7 +468,7 @@ or1k-*-* | or1knd-*-*)
powerpc*-*-freebsd*)
# Target: FreeBSD/powerpc
gdb_target_obs="rs6000-tdep.o ppc-sysv-tdep.o ppc64-tdep.o \
@@ -360,7 +360,7 @@
ravenscar-thread.o ppc-ravenscar-thread.o"
;;
-@@ -594,6 +598,7 @@ sparc64-*-linux*)
+@@ -587,6 +591,7 @@ sparc64-*-linux*)
sparc*-*-freebsd* | sparc*-*-kfreebsd*-gnu)
# Target: FreeBSD/sparc64
gdb_target_obs="sparc-tdep.o sparc64-tdep.o sparc64-fbsd-tdep.o \
@@ -368,7 +368,7 @@
ravenscar-thread.o sparc-ravenscar-thread.o"
;;
sparc-*-netbsd* | sparc-*-knetbsd*-gnu)
-@@ -716,8 +721,8 @@ x86_64-*-linux*)
+@@ -709,8 +714,8 @@ x86_64-*-linux*)
;;
x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
# Target: FreeBSD/amd64
@@ -380,10 +380,10 @@
x86_64-*-mingw* | x86_64-*-cygwin*)
# Target: MingW/amd64
diff --git gdb/defs.h gdb/defs.h
-index 4fb2129b30..0cb0bad5c5 100644
+index fc4217005a..3d2eb6b1e9 100644
--- gdb/defs.h
+++ gdb/defs.h
-@@ -516,6 +516,7 @@ enum gdb_osabi
+@@ -481,6 +481,7 @@ enum gdb_osabi
GDB_OSABI_SOLARIS,
GDB_OSABI_LINUX,
GDB_OSABI_FREEBSD,
@@ -392,10 +392,10 @@
GDB_OSABI_OPENBSD,
GDB_OSABI_WINCE,
diff --git gdb/gnulib/configure gdb/gnulib/configure
-index 37efd06b67..a23fc0a81c 100644
+index a152abcb76..140c4ad6a8 100644
--- gdb/gnulib/configure
+++ gdb/gnulib/configure
-@@ -16790,6 +16790,7 @@ else
+@@ -17214,6 +17214,7 @@ else
case "$host_os" in
# Guess all is fine on glibc systems.
*-gnu*) gl_cv_func_gettimeofday_clobber="guessing no" ;;
@@ -404,34 +404,33 @@
*) gl_cv_func_gettimeofday_clobber="guessing yes" ;;
esac
diff --git gdb/osabi.c gdb/osabi.c
-index 129164f51e..4eacc074a3 100644
+index 7d0540b181..c61c518652 100644
--- gdb/osabi.c
+++ gdb/osabi.c
-@@ -65,6 +65,7 @@ static const struct osabi_names gdb_osabi_names[] =
+@@ -66,6 +66,7 @@ static const struct osabi_names gdb_osabi_names[] =
{ "Solaris", NULL },
- { "GNU/Linux", "linux(-gnu)?" },
+ { "GNU/Linux", "linux(-gnu[^-]*)?" },
{ "FreeBSD", NULL },
+ { "FreeBSD/kernel", NULL },
{ "NetBSD", NULL },
{ "OpenBSD", NULL },
{ "WindowsCE", NULL },
diff --git gdb/regcache.c gdb/regcache.c
-index fb6a904dec..f9b7105b8f 100644
+index f3f845aad6..7ca007a422 100644
--- gdb/regcache.c
+++ gdb/regcache.c
-@@ -1079,6 +1079,23 @@ regcache::raw_supply_zeroed (int regnum)
+@@ -1035,6 +1035,22 @@ reg_buffer::raw_supply_zeroed (int regnum)
m_register_status[regnum] = REG_VALID;
}
+void
-+regcache::raw_supply_unsigned (int regnum, ULONGEST val)
++reg_buffer::raw_supply_unsigned (int regnum, ULONGEST val)
+{
+ enum bfd_endian byte_order = gdbarch_byte_order (m_descr->gdbarch);
+ gdb_byte *regbuf;
+ size_t regsize;
+
+ assert_regnum (regnum);
-+ gdb_assert (!m_readonly_p);
+
+ regbuf = register_buffer (regnum);
+ regsize = m_descr->sizeof_register[regnum];
@@ -440,19 +439,19 @@
+ m_register_status[regnum] = REG_VALID;
+}
+
- /* Collect register REGNUM from REGCACHE and store its contents in BUF. */
+ /* See common/common-regcache.h. */
void
diff --git gdb/regcache.h gdb/regcache.h
-index 9e3da8c3fc..5c65a9be1e 100644
+index 4a45f33871..94f542c087 100644
--- gdb/regcache.h
+++ gdb/regcache.h
-@@ -294,6 +294,8 @@ public:
- void raw_supply_integer (int regnum, const gdb_byte *addr, int addr_len,
- bool is_signed);
+@@ -207,6 +207,8 @@ public:
+ only LEN, without editing the rest of the register. */
+ void raw_supply_part (int regnum, int offset, int len, const gdb_byte *in);
+ void raw_supply_unsigned (int regnum, ULONGEST val);
+
- void raw_supply_zeroed (int regnum);
+ void invalidate (int regnum);
- enum register_status get_register_status (int regnum) const;
+ virtual ~reg_buffer () = default;
Index: devel/gdb/files/kgdb/amd64fbsd-kern.c
===================================================================
--- devel/gdb/files/kgdb/amd64fbsd-kern.c
+++ devel/gdb/files/kgdb/amd64fbsd-kern.c
@@ -231,7 +231,7 @@
{
amd64_init_abi(info, gdbarch,
- amd64_target_description (X86_XSTATE_SSE_MASK));
+ amd64_target_description (X86_XSTATE_SSE_MASK, true));
frame_unwind_prepend_unwinder(gdbarch, &amd64fbsd_trapframe_unwind);
Index: devel/gdb/files/kgdb/fbsd-kld.c
===================================================================
--- devel/gdb/files/kgdb/fbsd-kld.c
+++ devel/gdb/files/kgdb/fbsd-kld.c
@@ -139,7 +139,7 @@
{
struct kld_info *info;
struct cleanup *cleanup;
- char *module_path;
+ gdb::unique_xmalloc_ptr<char> module_path;
char *module_dir, *cp;
int error;
@@ -157,17 +157,13 @@
target_read_string(info->module_path_addr, &module_path,
PATH_MAX, &error);
if (error == 0) {
- cleanup = make_cleanup(xfree, module_path);
- cp = module_path;
+ cp = module_path.get();
while ((module_dir = strsep(&cp, ";")) != NULL) {
snprintf(path, path_size, "%s/%s", module_dir,
filename);
- if (check_kld_path(path, path_size)) {
- do_cleanups(cleanup);
+ if (check_kld_path(path, path_size))
return (1);
- }
}
- do_cleanups(cleanup);
}
}
return (0);
@@ -200,7 +196,7 @@
{
struct kld_info *info;
CORE_ADDR kld;
- char *kld_filename;
+ gdb::unique_xmalloc_ptr<char> kld_filename;
const char *filename;
int error;
@@ -219,11 +215,8 @@
continue;
/* Compare this kld's filename against our passed in name. */
- if (strcmp(kld_filename, filename) != 0) {
- xfree(kld_filename);
+ if (strcmp(kld_filename.get(), filename) != 0)
continue;
- }
- xfree(kld_filename);
/*
* We found a match, use its address as the base
@@ -259,7 +252,6 @@
static void
load_kld (char *path, CORE_ADDR base_addr, int from_tty)
{
- struct section_addr_info *sap;
struct target_section *sections = NULL, *sections_end = NULL, *s;
struct cleanup *cleanup;
gdb_bfd_ref_ptr bfd;
@@ -289,14 +281,14 @@
adjust_section_address(s, &curr_addr);
/* Build a section addr info to pass to symbol_file_add(). */
- sap = build_section_addr_info_from_section_table (sections,
- sections_end);
- make_cleanup((make_cleanup_ftype *)free_section_addr_info, sap);
+ section_addr_info sap
+ = build_section_addr_info_from_section_table (sections,
+ sections_end);
printf_unfiltered("add symbol table from file \"%s\" at\n", path);
- for (i = 0; i < sap->num_sections; i++)
- printf_unfiltered("\t%s_addr = %s\n", sap->other[i].name,
- paddress(target_gdbarch(), sap->other[i].addr));
+ for (i = 0; i < sap.size(); i++)
+ printf_unfiltered("\t%s_addr = %s\n", sap[i].name.c_str(),
+ paddress(target_gdbarch(), sap[i].addr));
if (from_tty && (!query("%s", "")))
error("Not confirmed.");
@@ -304,7 +296,7 @@
add_flags = 0;
if (from_tty)
add_flags |= SYMFILE_VERBOSE;
- symbol_file_add_from_bfd(bfd.get(), path, add_flags, sap,
+ symbol_file_add_from_bfd(bfd.get(), path, add_flags, &sap,
OBJF_USERLOADED, NULL);
do_cleanups(cleanup);
@@ -436,7 +428,7 @@
struct so_list *head, **prev, *newobj;
struct kld_info *info;
CORE_ADDR kld, kernel;
- char *path;
+ gdb::unique_xmalloc_ptr<char> path;
int error;
info = get_kld_info();
@@ -475,9 +467,8 @@
free_so(newobj);
continue;
}
- strlcpy(newobj->so_original_name, path,
+ strlcpy(newobj->so_original_name, path.get(),
sizeof(newobj->so_original_name));
- xfree(path);
/*
* Try to read the pathname (if it exists) and store
@@ -498,9 +489,8 @@
strlcpy(newobj->so_name, newobj->so_original_name,
sizeof(newobj->so_name));
} else {
- strlcpy(newobj->so_name, path,
+ strlcpy(newobj->so_name, path.get(),
sizeof(newobj->so_name));
- xfree(path);
}
} else
strlcpy(newobj->so_name, newobj->so_original_name,
@@ -540,19 +530,19 @@
static int
kld_find_and_open_solib (const char *solib, unsigned o_flags,
- char **temp_pathname)
+ gdb::unique_xmalloc_ptr<char> *temp_pathname)
{
char path[PATH_MAX];
int fd;
- *temp_pathname = NULL;
+ temp_pathname->reset (NULL);
if (!find_kld_path(solib, path, sizeof(path))) {
errno = ENOENT;
return (-1);
}
fd = open(path, o_flags, 0);
if (fd >= 0)
- *temp_pathname = xstrdup(path);
+ temp_pathname->reset(xstrdup(path));
return (fd);
}
Index: devel/gdb/files/kgdb/fbsd-kvm.c
===================================================================
--- devel/gdb/files/kgdb/fbsd-kvm.c
+++ devel/gdb/files/kgdb/fbsd-kvm.c
@@ -51,10 +51,7 @@
static CORE_ADDR stoppcbs;
static LONGEST pcb_size;
-static void kgdb_core_cleanup(void *);
-
static char *vmcore;
-struct target_ops kgdb_trgt_ops;
/* Per-architecture data key. */
static struct gdbarch_data *fbsd_vmcore_data;
@@ -105,7 +102,6 @@
static CORE_ADDR kernstart;
static kvm_t *kvm;
-static char kvm_err[_POSIX2_LINE_MAX];
int kgdb_quiet;
static ptid_t
@@ -116,14 +112,14 @@
* The remote target stores the 'tid' in the lwp
* field.
*/
- return ptid_build(ptid_get_pid(inferior_ptid), tid, 0);
+ return ptid_t(inferior_ptid.pid(), tid, 0);
/*
* This follows the model described in bsd-kvm.c except that
* in kernel tids are used as the tid of the ptid instead of a
* process ID.
*/
- return ptid_build(1, 1, tid);
+ return ptid_t(1, 1, tid);
}
#define MSGBUF_SEQ_TO_POS(size, seq) ((seq) % (size))
@@ -212,6 +208,49 @@
return (GDB_OSABI_UNKNOWN);
}
+/* The FreeBSD libkvm target. */
+
+static const target_info fbsd_kvm_target_info = {
+ "vmcore",
+ N_("Kernel core dump file"),
+ N_("Use a vmcore file as a target.\n\
+If no filename is specified, /dev/mem is used to examine the running kernel.\n\
+target vmcore [-w] [filename]")
+};
+
+class fbsd_kvm_target final : public target_ops
+{
+public:
+ fbsd_kvm_target ()
+ { this->to_stratum = process_stratum; }
+
+ const target_info &info () const override
+ { return fbsd_kvm_target_info; }
+
+ void close () override;
+
+ void fetch_registers (struct regcache *, int) override;
+ enum target_xfer_status xfer_partial (enum target_object object,
+ const char *annex,
+ gdb_byte *readbuf,
+ const gdb_byte *writebuf,
+ ULONGEST offset, ULONGEST len,
+ ULONGEST *xfered_len) override;
+
+ void files_info () override;
+ bool thread_alive (ptid_t ptid) override;
+ void update_thread_list () override;
+ const char *pid_to_str (ptid_t) override;
+ const char *extra_thread_info (thread_info *) override;
+
+ bool has_memory () override { return true; }
+ bool has_stack () override { return true; }
+ bool has_registers () override { return true; }
+};
+
+/* Target ops for libkvm interface. */
+static fbsd_kvm_target fbsd_kvm_ops;
+
#ifdef HAVE_KVM_OPEN2
static int
kgdb_resolve_symbol(const char *name, kvaddr_t *kva)
@@ -227,10 +266,11 @@
#endif
static void
-kgdb_trgt_open(const char *args, int from_tty)
+fbsd_kvm_target_open (const char *args, int from_tty)
{
struct fbsd_vmcore_ops *ops = (struct fbsd_vmcore_ops *)
gdbarch_data (target_gdbarch(), fbsd_vmcore_data);
+ char kvm_err[_POSIX2_LINE_MAX];
struct inferior *inf;
struct cleanup *old_chain;
struct thread_info *ti;
@@ -288,7 +328,7 @@
/* Don't free the filename now and close any previous vmcore. */
discard_cleanups(old_chain);
- unpush_target(&kgdb_trgt_ops);
+ unpush_target(&fbsd_kvm_ops);
/*
* Determine the first address in KVA. Newer kernels export
@@ -331,11 +371,8 @@
kvm = nkvm;
vmcore = filename;
- old_chain = make_cleanup(kgdb_core_cleanup, NULL);
+ push_target (&fbsd_kvm_ops);
- push_target (&kgdb_trgt_ops);
- discard_cleanups (old_chain);
-
kgdb_dmesg();
inf = current_inferior();
@@ -359,8 +396,8 @@
print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1);
}
-static void
-kgdb_trgt_close(struct target_ops *self)
+void
+fbsd_kvm_target::close()
{
if (kvm != NULL) {
@@ -376,14 +413,8 @@
inferior_ptid = null_ptid;
}
+#if 0
static void
-kgdb_core_cleanup(void *arg)
-{
-
- kgdb_trgt_close(0);
-}
-
-static void
kgdb_trgt_detach(struct target_ops *ops, const char *args, int from_tty)
{
@@ -394,16 +425,17 @@
if (from_tty)
printf_filtered("No vmcore file now.\n");
}
+#endif
-static const char *
-kgdb_trgt_extra_thread_info(struct target_ops *ops, struct thread_info *ti)
+const char *
+fbsd_kvm_target::extra_thread_info(thread_info *ti)
{
- return (kgdb_thr_extra_thread_info(ptid_get_tid(ti->ptid)));
+ return (kgdb_thr_extra_thread_info(ti->ptid.tid()));
}
-static void
-kgdb_trgt_files_info(struct target_ops *target)
+void
+fbsd_kvm_target::files_info()
{
printf_filtered ("\t`%s', ", vmcore);
@@ -411,8 +443,8 @@
printf_filtered ("file type %s.\n", "FreeBSD kernel vmcore");
}
-static void
-kgdb_trgt_update_thread_list(struct target_ops *ops)
+void
+fbsd_kvm_target::update_thread_list()
{
/*
* XXX: We should probably rescan the thread list here and update
@@ -435,24 +467,23 @@
#endif
}
-static const char *
-kgdb_trgt_pid_to_str(struct target_ops *ops, ptid_t ptid)
+const char *
+fbsd_kvm_target::pid_to_str(ptid_t ptid)
{
static char buf[33];
- snprintf(buf, sizeof(buf), "Thread %ld", ptid_get_tid(ptid));
+ snprintf(buf, sizeof(buf), "Thread %ld", ptid.tid());
return (buf);
}
-static int
-kgdb_trgt_thread_alive(struct target_ops *ops, ptid_t ptid)
+bool
+fbsd_kvm_target::thread_alive(ptid_t ptid)
{
- return (kgdb_thr_lookup_tid(ptid_get_tid(ptid)) != NULL);
+ return (kgdb_thr_lookup_tid(ptid.tid()) != NULL);
}
-static void
-kgdb_trgt_fetch_registers(struct target_ops *tops,
- struct regcache *regcache, int regnum)
+void
+fbsd_kvm_target::fetch_registers(struct regcache *regcache, int regnum)
{
struct fbsd_vmcore_ops *ops = (struct fbsd_vmcore_ops *)
gdbarch_data (target_gdbarch(), fbsd_vmcore_data);
@@ -460,14 +491,14 @@
if (ops->supply_pcb == NULL)
return;
- kt = kgdb_thr_lookup_tid(ptid_get_tid(inferior_ptid));
+ kt = kgdb_thr_lookup_tid(inferior_ptid.tid());
if (kt == NULL)
return;
ops->supply_pcb(regcache, kt->pcb);
}
-static enum target_xfer_status
-kgdb_trgt_xfer_partial(struct target_ops *ops, enum target_object object,
+enum target_xfer_status
+fbsd_kvm_target::xfer_partial(enum target_object object,
const char *annex, gdb_byte *readbuf,
const gdb_byte *writebuf,
ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
@@ -497,6 +528,7 @@
}
}
+#if 0
static int
kgdb_trgt_insert_breakpoint(struct target_ops *ops, struct gdbarch *gdbarch,
struct bp_target_info *bp_tgt)
@@ -512,6 +544,7 @@
return 0;
}
+#endif
static void
kgdb_switch_to_thread(const char *arg, int tid)
@@ -570,42 +603,11 @@
kgdb_switch_to_thread(arg, addr);
}
-static int
-kgdb_trgt_return_one(struct target_ops *ops)
-{
-
- return 1;
-}
-
void
_initialize_kgdb_target(void)
{
- kgdb_trgt_ops.to_magic = OPS_MAGIC;
- kgdb_trgt_ops.to_shortname = "vmcore";
- kgdb_trgt_ops.to_longname = "kernel core dump file";
- kgdb_trgt_ops.to_doc = "Use a vmcore file as a target.\n\
-If no filename is specified, /dev/mem is used to examine the running kernel.\n\
-target vmcore [-w] [filename]";
- kgdb_trgt_ops.to_stratum = process_stratum;
- kgdb_trgt_ops.to_has_memory = kgdb_trgt_return_one;
- kgdb_trgt_ops.to_has_registers = kgdb_trgt_return_one;
- kgdb_trgt_ops.to_has_stack = kgdb_trgt_return_one;
-
- kgdb_trgt_ops.to_open = kgdb_trgt_open;
- kgdb_trgt_ops.to_close = kgdb_trgt_close;
- kgdb_trgt_ops.to_detach = kgdb_trgt_detach;
- kgdb_trgt_ops.to_extra_thread_info = kgdb_trgt_extra_thread_info;
- kgdb_trgt_ops.to_fetch_registers = kgdb_trgt_fetch_registers;
- kgdb_trgt_ops.to_files_info = kgdb_trgt_files_info;
- kgdb_trgt_ops.to_update_thread_list = kgdb_trgt_update_thread_list;
- kgdb_trgt_ops.to_pid_to_str = kgdb_trgt_pid_to_str;
- kgdb_trgt_ops.to_thread_alive = kgdb_trgt_thread_alive;
- kgdb_trgt_ops.to_xfer_partial = kgdb_trgt_xfer_partial;
- kgdb_trgt_ops.to_insert_breakpoint = kgdb_trgt_insert_breakpoint;
- kgdb_trgt_ops.to_remove_breakpoint = kgdb_trgt_remove_breakpoint;
-
- add_target(&kgdb_trgt_ops);
+ add_target(fbsd_kvm_target_info, fbsd_kvm_target_open);
fbsd_vmcore_data = gdbarch_data_register_pre_init(fbsd_vmcore_init);
Index: devel/gdb/files/kgdb/i386fbsd-kern.c
===================================================================
--- devel/gdb/files/kgdb/i386fbsd-kern.c
+++ devel/gdb/files/kgdb/i386fbsd-kern.c
@@ -186,7 +186,7 @@
struct segment_descriptor sd;
CORE_ADDR addr, cpu0prvpage, tss;
- kt = kgdb_thr_lookup_tid(ptid_get_tid(inferior_ptid));
+ kt = kgdb_thr_lookup_tid(inferior_ptid.tid());
if (kt == NULL || kt->cpu == NOCPU || kt->cpu < 0)
return (0);
Index: devel/gdb/files/kgdb/kgdb-main.c
===================================================================
--- devel/gdb/files/kgdb/kgdb-main.c
+++ devel/gdb/files/kgdb/kgdb-main.c
@@ -50,7 +50,6 @@
#include <cli-out.h>
#include <main.h>
#include <objfiles.h>
-#include "observer.h"
#include <target.h>
#include <top.h>
#include <ui-file.h>
Index: devel/gdb/files/kgdb/kgdb.h
===================================================================
--- devel/gdb/files/kgdb/kgdb.h
+++ devel/gdb/files/kgdb/kgdb.h
@@ -41,7 +41,6 @@
extern struct kthr *curkthr;
extern struct target_so_ops kld_so_ops;
-extern struct target_ops kgdb_trgt_ops;
extern int kgdb_quiet;
CORE_ADDR kgdb_trgt_stop_pcb(u_int);
Index: devel/gdb/files/patch-gdb_configure
===================================================================
--- devel/gdb/files/patch-gdb_configure
+++ devel/gdb/files/patch-gdb_configure
@@ -1,19 +1,16 @@
--- gdb/configure.orig 2017-09-14 09:28:17 UTC
+++ gdb/configure
-@@ -15292,13 +15292,10 @@ if test "${ERROR_ON_WARNING}" = yes ; then
- WERROR_CFLAGS="-Werror"
- fi
+@@ -15467,10 +15467,10 @@ fi
--# The options we'll try to enable.
-+# These options work in either C or C++ modes.
+ # The options we'll try to enable.
build_warnings="-Wall -Wpointer-arith \
--Wno-unused -Wunused-value -Wunused-function \
---Wno-switch -Wno-char-subscripts \
++-Wno-unused \
+ -Wno-switch -Wno-char-subscripts \
--Wempty-body -Wunused-but-set-parameter -Wunused-but-set-variable \
--Wno-sign-compare -Wno-narrowing -Wno-error=maybe-uninitialized \
---Wno-mismatched-tags"
-+-Wno-unused -Wno-switch -Wno-char-subscripts \
-+-Wempty-body -Wno-sign-compare -Wno-narrowing -Wno-mismatched-tags"
-
- case "${host}" in
- *-*-mingw32*)
++-Wempty-body \
++-Wno-sign-compare -Wno-narrowing \
+ -Wno-mismatched-tags \
+ -Wno-error=deprecated-register \
+ -Wsuggest-override \
Index: devel/gdb/files/patch-gdb_corelow.c
===================================================================
--- devel/gdb/files/patch-gdb_corelow.c
+++ /dev/null
@@ -1,11 +0,0 @@
---- gdb/corelow.c.orig 2017-07-29 11:06:52 UTC
-+++ gdb/corelow.c
-@@ -517,7 +517,7 @@ get_core_register_section (struct regcache *regcache,
- bool variable_size_section = (regset != NULL
- && regset->flags & REGSET_VARIABLE_SIZE);
-
-- thread_section_name section_name (name, regcache->ptid ());
-+ thread_section_name section_name (name, regcache_get_ptid (regcache));
-
- section = bfd_get_section_by_name (core_bfd, section_name.c_str ());
- if (! section)
Index: devel/gdb/files/patch-gdb_fbsd-nat.c
===================================================================
--- devel/gdb/files/patch-gdb_fbsd-nat.c
+++ devel/gdb/files/patch-gdb_fbsd-nat.c
@@ -1,6 +1,6 @@
--- gdb/fbsd-nat.c.orig 2017-09-14 09:28:17 UTC
+++ gdb/fbsd-nat.c
-@@ -682,6 +682,14 @@ fbsd_resume (struct target_ops *ops,
+@@ -1108,6 +1108,14 @@ fbsd_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signo)
struct thread_info *tp;
int request;
@@ -14,4 +14,4 @@
+#endif
ALL_NON_EXITED_THREADS (tp)
{
- if (ptid_get_pid (tp->ptid) != ptid_get_pid (ptid))
+ if (tp->ptid.pid () != ptid.pid ())
Index: devel/gdb/files/patch-gdb_i386-fbsd-nat.c
===================================================================
--- devel/gdb/files/patch-gdb_i386-fbsd-nat.c
+++ devel/gdb/files/patch-gdb_i386-fbsd-nat.c
@@ -1,10 +1,27 @@
--- gdb/i386-fbsd-nat.c 2017-09-14 09:28:17 UTC
+++ gdb/i386-fbsd-nat.c
-@@ -163,7 +163,6 @@ _initialize_i386fbsd_nat (void)
- t->to_read_description = i386fbsd_read_description;
+@@ -43,8 +43,6 @@ public:
+ const struct target_desc *read_description () override;
#endif
-- t->to_resume = i386fbsd_resume;
- fbsd_nat_add_target (t);
+- void resume (ptid_t, int, enum gdb_signal) override;
+-
+ #if defined(HAVE_PT_GETDBREGS) && defined(USE_SIGTRAP_SIGINFO)
+ bool supports_stopped_by_hw_breakpoint () override;
+ #endif
+@@ -52,6 +50,7 @@ public:
- /* Support debugging kernel virtual memory images. */
+ static i386_fbsd_nat_target the_i386_fbsd_nat_target;
+
++#if 0
+ /* Resume execution of the inferior process. If STEP is nonzero,
+ single-step it. If SIGNAL is nonzero, give it that signal. */
+
+@@ -98,6 +97,7 @@ i386_fbsd_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
+ gdb_signal_to_host (signal)) == -1)
+ perror_with_name (("ptrace"));
+ }
++#endif
+
+
+ /* Support for debugging kernel virtual memory images. */
Index: devel/gdb/files/patch-gdb_python_python-config.py
===================================================================
--- devel/gdb/files/patch-gdb_python_python-config.py
+++ devel/gdb/files/patch-gdb_python_python-config.py
@@ -3,7 +3,7 @@
@@ -59,6 +59,8 @@ for opt in opt_flags:
elif opt in ('--libs', '--ldflags'):
- libs = []
+ libs = ['-lpython' + pyver + abiflags]
+ if getvar('LDFLAGS') is not None:
+ libs.extend(getvar('LDFLAGS').split())
if getvar('LIBS') is not None:
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Aug 6, 7:29 AM (8 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36096130
Default Alt Text
D17085.id47825.diff (109 KB)
Attached To
Mode
D17085: devel/gdb: Upgrade to 8.2.
Attached
Detach File
Event Timeline
Log In to Comment