summaryrefslogtreecommitdiff
path: root/devel/gdb/files
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2016-07-15 01:10:15 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2016-07-15 01:10:15 +0000
commit2fab2693cf8c910c01866048213a7a4def3f7b7a (patch)
tree5c731adeded9fc905dd8d25738950fcce182c23f /devel/gdb/files
parentUpgrade third-party brotli module from 4f08382 to ada972b. (diff)
Import several patches recently merged upstream.
- Fix fork following to honor 'detach-on-fork' - Fix vfork following to post a fake vfork_done event to fix breakpoints in vfork parents (a real vfork_done event is pending but requires kernel changes currently in review). - Fix x86 debug registers to work with multiple threads (PR 157755) - Add support for 'info auxv' on both live processes and cores. - Add support for 'catch syscall'. Note that catching system calls by names requires parsing an XML file mapping system call names to numbers. The port now installs the XML syscall files to the data directory. In addition, the EXPAT option is now enabled by default as expat is used to parse the XML files. - Bump PORTREVISION. PR: 157755, 210874 Approved by: luca.pizzamiglio@gmail.com (maintainer), bdrewery
Diffstat (limited to 'devel/gdb/files')
-rw-r--r--devel/gdb/files/commit-21002a6102
-rw-r--r--devel/gdb/files/commit-2c5c2a3214
-rw-r--r--devel/gdb/files/commit-2faa344397
-rw-r--r--devel/gdb/files/commit-3350c5f39
-rw-r--r--devel/gdb/files/commit-5077bff49
-rw-r--r--devel/gdb/files/commit-7697fc9110
-rw-r--r--devel/gdb/files/commit-82372b274
-rw-r--r--devel/gdb/files/commit-8607ea6165
-rw-r--r--devel/gdb/files/commit-a3405d1827
-rw-r--r--devel/gdb/files/commit-aa1ed4a191
-rw-r--r--devel/gdb/files/commit-b00f86d34
-rw-r--r--devel/gdb/files/commit-bb2a62e27
-rw-r--r--devel/gdb/files/commit-e6cdd38644
-rw-r--r--devel/gdb/files/commit-ee9503224
14 files changed, 2897 insertions, 0 deletions
diff --git a/devel/gdb/files/commit-21002a6 b/devel/gdb/files/commit-21002a6
new file mode 100644
index 000000000000..2307041c7599
--- /dev/null
+++ b/devel/gdb/files/commit-21002a6
@@ -0,0 +1,102 @@
+commit 21002a635bf3da33367592e3a3ab3cce24fe5299
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Tue Jan 19 11:02:09 2016 -0800
+
+ Handle void * conversions in FreeBSD/x86 native code to fix C++ build.
+
+ gdb/ChangeLog:
+
+ * amd64bsd-nat.c (amd64bsd_fetch_inferior_registers): Change xstateregs
+ to void *.
+ (amd64bsd_store_inferior_registers): Likewise.
+ * fbsd-nat.c (resume_one_thread_cb): Explicitly cast data to ptid_t *.
+ (resume_all_threads_cb): Likewise.
+ * i386bsd-nat.c (i386bsd_supply_gregset): Cast gregs to char *.
+ (i386bsd_collect_gregset): Likewise.
+ (i386bsd_fetch_inferior_registers): Change xstateregs to void *.
+ (i386bsd_store_inferior_registers): Likewise.
+
+diff --git gdb/amd64bsd-nat.c gdb/amd64bsd-nat.c
+index fb7e4fa..e278a91 100644
+--- gdb/amd64bsd-nat.c
++++ gdb/amd64bsd-nat.c
+@@ -65,7 +65,7 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops,
+ {
+ struct fpreg fpregs;
+ #ifdef PT_GETXSTATE_INFO
+- char *xstateregs;
++ void *xstateregs;
+
+ if (amd64bsd_xsave_len != 0)
+ {
+@@ -118,7 +118,7 @@ amd64bsd_store_inferior_registers (struct target_ops *ops,
+ {
+ struct fpreg fpregs;
+ #ifdef PT_GETXSTATE_INFO
+- char *xstateregs;
++ void *xstateregs;
+
+ if (amd64bsd_xsave_len != 0)
+ {
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index bdf078e..b582abe 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -428,7 +428,7 @@ static void (*super_resume) (struct target_ops *,
+ static int
+ resume_one_thread_cb (struct thread_info *tp, void *data)
+ {
+- ptid_t *ptid = data;
++ ptid_t *ptid = (ptid_t *) data;
+ int request;
+
+ if (ptid_get_pid (tp->ptid) != ptid_get_pid (*ptid))
+@@ -447,7 +447,7 @@ resume_one_thread_cb (struct thread_info *tp, void *data)
+ static int
+ resume_all_threads_cb (struct thread_info *tp, void *data)
+ {
+- ptid_t *filter = data;
++ ptid_t *filter = (ptid_t *) data;
+
+ if (!ptid_match (tp->ptid, *filter))
+ return 0;
+diff --git gdb/i386bsd-nat.c gdb/i386bsd-nat.c
+index 5d45c33..f5f4a0f 100644
+--- gdb/i386bsd-nat.c
++++ gdb/i386bsd-nat.c
+@@ -92,7 +92,7 @@ size_t i386bsd_xsave_len;
+ static void
+ i386bsd_supply_gregset (struct regcache *regcache, const void *gregs)
+ {
+- const char *regs = gregs;
++ const char *regs = (const char *) gregs;
+ int regnum;
+
+ for (regnum = 0; regnum < ARRAY_SIZE (i386bsd_r_reg_offset); regnum++)
+@@ -112,7 +112,7 @@ static void
+ i386bsd_collect_gregset (const struct regcache *regcache,
+ void *gregs, int regnum)
+ {
+- char *regs = gregs;
++ char *regs = (char *) gregs;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE (i386bsd_r_reg_offset); i++)
+@@ -157,7 +157,7 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops,
+ #ifdef PT_GETXSTATE_INFO
+ if (i386bsd_xsave_len != 0)
+ {
+- char *xstateregs;
++ void *xstateregs;
+
+ xstateregs = alloca (i386bsd_xsave_len);
+ if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid),
+@@ -227,7 +227,7 @@ i386bsd_store_inferior_registers (struct target_ops *ops,
+ #ifdef PT_GETXSTATE_INFO
+ if (i386bsd_xsave_len != 0)
+ {
+- char *xstateregs;
++ void *xstateregs;
+
+ xstateregs = alloca (i386bsd_xsave_len);
+ if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid),
diff --git a/devel/gdb/files/commit-2c5c2a3 b/devel/gdb/files/commit-2c5c2a3
new file mode 100644
index 000000000000..35bdb0354dca
--- /dev/null
+++ b/devel/gdb/files/commit-2c5c2a3
@@ -0,0 +1,214 @@
+commit 2c5c2a3321706c28cbf1b85a970a2e32912eb0c8
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Fri Jun 24 21:00:04 2016 -0700
+
+ Fake VFORK_DONE events when following only the parent after a vfork.
+
+ FreeBSD does not currently report a ptrace event for a parent process
+ after it resumes due to the child exiting the shared memory region after
+ a vfork. Take the same approach used in linux-nat.c in this case of
+ sleeping for a while and then reporting a fake VFORK_DONE event.
+
+ gdb/ChangeLog:
+
+ * fbsd-nat.c (struct fbsd_fork_child_info): Rename to ...
+ (struct fbsd_fork_info): ... this.
+ (struct fbsd_fork_info) <child>: Rename to ...
+ (struct fbsd_fork_info) <ptid>: ... this.
+ (fbsd_pending_children): Update type.
+ (fbsd_remember_child): Update type and field name.
+ (fbsd_is_child_pending): Likewise.
+ (fbsd_pending_vfork_done): New variable.
+ (fbsd_is_vfork_done_pending): New function.
+ (fbsd_next_vfork_done): New function.
+ (fbsd_resume): Don't resume processes with a pending vfork done
+ event.
+ (fbsd_wait): Report pending vfork done events.
+ (fbsd_follow_fork): Delay and record a pending vfork done event
+ for a vfork parent when detaching the child.
+
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index daf4580..fcb7ff5 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -530,13 +530,13 @@ fbsd_update_thread_list (struct target_ops *ops)
+ sake. FreeBSD versions newer than 9.1 contain both fixes.
+ */
+
+-struct fbsd_fork_child_info
++struct fbsd_fork_info
+ {
+- struct fbsd_fork_child_info *next;
+- ptid_t child; /* Pid of new child. */
++ struct fbsd_fork_info *next;
++ ptid_t ptid;
+ };
+
+-static struct fbsd_fork_child_info *fbsd_pending_children;
++static struct fbsd_fork_info *fbsd_pending_children;
+
+ /* Record a new child process event that is reported before the
+ corresponding fork event in the parent. */
+@@ -544,9 +544,9 @@ static struct fbsd_fork_child_info *fbsd_pending_children;
+ static void
+ fbsd_remember_child (ptid_t pid)
+ {
+- struct fbsd_fork_child_info *info = XCNEW (struct fbsd_fork_child_info);
++ struct fbsd_fork_info *info = XCNEW (struct fbsd_fork_info);
+
+- info->child = pid;
++ info->ptid = pid;
+ info->next = fbsd_pending_children;
+ fbsd_pending_children = info;
+ }
+@@ -557,25 +557,74 @@ fbsd_remember_child (ptid_t pid)
+ static ptid_t
+ fbsd_is_child_pending (pid_t pid)
+ {
+- struct fbsd_fork_child_info *info, *prev;
++ struct fbsd_fork_info *info, *prev;
+ ptid_t ptid;
+
+ prev = NULL;
+ for (info = fbsd_pending_children; info; prev = info, info = info->next)
+ {
+- if (ptid_get_pid (info->child) == pid)
++ if (ptid_get_pid (info->ptid) == pid)
+ {
+ if (prev == NULL)
+ fbsd_pending_children = info->next;
+ else
+ prev->next = info->next;
+- ptid = info->child;
++ ptid = info->ptid;
+ xfree (info);
+ return ptid;
+ }
+ }
+ return null_ptid;
+ }
++
++static struct fbsd_fork_info *fbsd_pending_vfork_done;
++
++/* Record a pending vfork done event. */
++
++static void
++fbsd_add_vfork_done (ptid_t pid)
++{
++ struct fbsd_fork_info *info = XCNEW (struct fbsd_fork_info);
++
++ info->ptid = pid;
++ info->next = fbsd_pending_vfork_done;
++ fbsd_pending_vfork_done = info;
++}
++
++/* Check for a pending vfork done event for a specific PID. */
++
++static int
++fbsd_is_vfork_done_pending (pid_t pid)
++{
++ struct fbsd_fork_info *info;
++
++ for (info = fbsd_pending_vfork_done; info != NULL; info = info->next)
++ {
++ if (ptid_get_pid (info->ptid) == pid)
++ return 1;
++ }
++ return 0;
++}
++
++/* Check for a pending vfork done event. If one is found, remove it
++ from the list and return the PTID. */
++
++static ptid
++fbsd_next_vfork_done (void)
++{
++ struct fbsd_fork_info *info;
++ ptid_t ptid;
++
++ if (fbsd_pending_vfork_done != NULL)
++ {
++ info = fbsd_pending_vfork_done;
++ fbsd_pending_vfork_done = info->next;
++ ptid = info->ptid;
++ xfree (info);
++ return ptid;
++ }
++ return null_ptid;
++}
+ #endif
+
+ static int
+@@ -616,6 +665,17 @@ static void
+ fbsd_resume (struct target_ops *ops,
+ ptid_t ptid, int step, enum gdb_signal signo)
+ {
++#ifdef TDP_RFPPWAIT
++ pid_t pid;
++
++ /* Don't PT_CONTINUE a process which has a pending vfork done event. */
++ if (ptid_equal (minus_one_ptid, ptid))
++ pid = ptid_get_pid (inferior_ptid);
++ else
++ pid = ptid_get_pid (ptid);
++ if (fbsd_is_vfork_done_pending (pid))
++ return;
++#endif
+
+ if (debug_fbsd_lwp)
+ fprintf_unfiltered (gdb_stdlog,
+@@ -650,6 +710,12 @@ fbsd_wait (struct target_ops *ops,
+
+ while (1)
+ {
++ wptid = fbsd_next_vfork_done ();
++ if (!ptid_equal (wptid, null_ptid))
++ {
++ ourstatus->kind = TARGET_WAITKIND_VFORK_DONE;
++ return wptid;
++ }
+ wptid = super_wait (ops, ptid, ourstatus, target_options);
+ if (ourstatus->kind == TARGET_WAITKIND_STOPPED)
+ {
+@@ -828,6 +894,7 @@ fbsd_follow_fork (struct target_ops *ops, int follow_child,
+ if (!follow_child && detach_fork)
+ {
+ struct thread_info *tp = inferior_thread ();
++ int has_vforked = tp->pending_follow.kind == TARGET_WAITKIND_VFORKED;
+ pid_t child_pid = ptid_get_pid (tp->pending_follow.value.related_pid);
+
+ /* Breakpoints have already been detached from the child by
+@@ -835,6 +902,33 @@ fbsd_follow_fork (struct target_ops *ops, int follow_child,
+
+ if (ptrace (PT_DETACH, child_pid, (PTRACE_TYPE_ARG3)1, 0) == -1)
+ perror_with_name (("ptrace"));
++
++ if (has_vforked)
++ {
++ /* We can't insert breakpoints until the child process has
++ finished with the shared memory region. The parent
++ process doesn't wait for the child process to exit or
++ exec until after it has been resumed from the ptrace stop
++ to report the fork. Once it has been resumed it doesn't
++ stop again before returning to userland, so there is no
++ reliable way to wait on the parent.
++
++ We can't stay attached to the child to wait for an exec
++ or exit because it may invoke ptrace(PT_TRACE_ME)
++ (e.g. if the parent process is a debugger forking a new
++ child process).
++
++ In the end, the best we can do is to make sure it runs
++ for a little while. Hopefully it will be out of range of
++ any breakpoints we reinsert. Usually this is only the
++ single-step breakpoint at vfork's return point. */
++
++ usleep (10000);
++
++ /* Schedule a fake VFORK_DONE event to report on the next
++ wait. */
++ fbsd_add_vfork_done (inferior_ptid);
++ }
+ }
+
+ return 0;
diff --git a/devel/gdb/files/commit-2faa344 b/devel/gdb/files/commit-2faa344
new file mode 100644
index 000000000000..0d83a6a14813
--- /dev/null
+++ b/devel/gdb/files/commit-2faa344
@@ -0,0 +1,397 @@
+commit 2faa34476d9e6120eaf389b7f91b7227183fa2ce
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Sat Jun 11 15:51:38 2016 -0700
+
+ Add a new gdbarch method to print a single AUXV entry.
+
+ Different platforms have different meanings for auxiliary vector
+ entries. The 'print_auxv_entry' gdbarch method allows an architecture
+ to output a suitable description for platform-specific entries.
+
+ A fprint_auxv_entry function is split out of fprint_target_auxv.
+ This function outputs the description of a single auxiliary vector
+ entry to the specified file using caller-supplied formatting and
+ strings to describe the vector type.
+
+ The existing switch on auxiliary vector types is moved out of
+ fprint_target_auxv into a new default_print_auxv_entry function.
+ default_print_auxv_entry chooses an appropriate format and description
+ and calls fprint_single_auxv to describe a single vector entry.
+ This function is used as the default 'print_auxv_entry' gdbarch method.
+
+ fprint_target_auxv now invokes the gdbarch 'print_auxv_entry' method
+ on each vector entry.
+
+ gdb/ChangeLog:
+
+ * auxv.c (fprint_auxv_entry): New function.
+ (default_print_auxv_entry): New function.
+ (fprint_target_auxv): Use gdbarch_print_auxv_entry.
+ * auxv.h (enum auxv_format): New enum.
+ (fprint_auxv_entry): Declare.
+ (default_print_auxv_entry): Declare.
+ * gdbarch.sh (print_auxv_entry): New.
+ * gdbarch.c, gdbarch.h: Re-generated.
+
+diff --git gdb/auxv.c gdb/auxv.c
+index 396862e..de9205d 100644
+--- gdb/auxv.c
++++ gdb/auxv.c
+@@ -407,10 +407,126 @@ target_auxv_search (struct target_ops *ops, CORE_ADDR match, CORE_ADDR *valp)
+ }
+
+
++/* Print the description of a single AUXV entry on the specified file. */
++
++void
++fprint_auxv_entry (struct ui_file *file, const char *name,
++ const char *description, enum auxv_format format,
++ CORE_ADDR type, CORE_ADDR val)
++{
++ fprintf_filtered (file, ("%-4s %-20s %-30s "),
++ plongest (type), name, description);
++ switch (format)
++ {
++ case AUXV_FORMAT_DEC:
++ fprintf_filtered (file, ("%s\n"), plongest (val));
++ break;
++ case AUXV_FORMAT_HEX:
++ fprintf_filtered (file, ("%s\n"), paddress (target_gdbarch (), val));
++ break;
++ case AUXV_FORMAT_STR:
++ {
++ struct value_print_options opts;
++
++ get_user_print_options (&opts);
++ if (opts.addressprint)
++ fprintf_filtered (file, ("%s "), paddress (target_gdbarch (), val));
++ val_print_string (builtin_type (target_gdbarch ())->builtin_char,
++ NULL, val, -1, file, &opts);
++ fprintf_filtered (file, ("\n"));
++ }
++ break;
++ }
++}
++
++/* The default implementation of gdbarch_print_auxv_entry. */
++
++void
++default_print_auxv_entry (struct gdbarch *gdbarch, struct ui_file *file,
++ CORE_ADDR type, CORE_ADDR val)
++{
++ const char *name = "???";
++ const char *description = "";
++ enum auxv_format format = AUXV_FORMAT_HEX;
++
++ switch (type)
++ {
++#define TAG(tag, text, kind) \
++ case tag: name = #tag; description = text; format = kind; break
++ TAG (AT_NULL, _("End of vector"), AUXV_FORMAT_HEX);
++ TAG (AT_IGNORE, _("Entry should be ignored"), AUXV_FORMAT_HEX);
++ TAG (AT_EXECFD, _("File descriptor of program"), AUXV_FORMAT_DEC);
++ TAG (AT_PHDR, _("Program headers for program"), AUXV_FORMAT_HEX);
++ TAG (AT_PHENT, _("Size of program header entry"), AUXV_FORMAT_DEC);
++ TAG (AT_PHNUM, _("Number of program headers"), AUXV_FORMAT_DEC);
++ TAG (AT_PAGESZ, _("System page size"), AUXV_FORMAT_DEC);
++ TAG (AT_BASE, _("Base address of interpreter"), AUXV_FORMAT_HEX);
++ TAG (AT_FLAGS, _("Flags"), AUXV_FORMAT_HEX);
++ TAG (AT_ENTRY, _("Entry point of program"), AUXV_FORMAT_HEX);
++ TAG (AT_NOTELF, _("Program is not ELF"), AUXV_FORMAT_DEC);
++ TAG (AT_UID, _("Real user ID"), AUXV_FORMAT_DEC);
++ TAG (AT_EUID, _("Effective user ID"), AUXV_FORMAT_DEC);
++ TAG (AT_GID, _("Real group ID"), AUXV_FORMAT_DEC);
++ TAG (AT_EGID, _("Effective group ID"), AUXV_FORMAT_DEC);
++ TAG (AT_CLKTCK, _("Frequency of times()"), AUXV_FORMAT_DEC);
++ TAG (AT_PLATFORM, _("String identifying platform"), AUXV_FORMAT_STR);
++ TAG (AT_HWCAP, _("Machine-dependent CPU capability hints"),
++ AUXV_FORMAT_HEX);
++ TAG (AT_FPUCW, _("Used FPU control word"), AUXV_FORMAT_DEC);
++ TAG (AT_DCACHEBSIZE, _("Data cache block size"), AUXV_FORMAT_DEC);
++ TAG (AT_ICACHEBSIZE, _("Instruction cache block size"), AUXV_FORMAT_DEC);
++ TAG (AT_UCACHEBSIZE, _("Unified cache block size"), AUXV_FORMAT_DEC);
++ TAG (AT_IGNOREPPC, _("Entry should be ignored"), AUXV_FORMAT_DEC);
++ TAG (AT_BASE_PLATFORM, _("String identifying base platform"),
++ AUXV_FORMAT_STR);
++ TAG (AT_RANDOM, _("Address of 16 random bytes"), AUXV_FORMAT_HEX);
++ TAG (AT_HWCAP2, _("Extension of AT_HWCAP"), AUXV_FORMAT_HEX);
++ TAG (AT_EXECFN, _("File name of executable"), AUXV_FORMAT_STR);
++ TAG (AT_SECURE, _("Boolean, was exec setuid-like?"), AUXV_FORMAT_DEC);
++ TAG (AT_SYSINFO, _("Special system info/entry points"), AUXV_FORMAT_HEX);
++ TAG (AT_SYSINFO_EHDR, _("System-supplied DSO's ELF header"),
++ AUXV_FORMAT_HEX);
++ TAG (AT_L1I_CACHESHAPE, _("L1 Instruction cache information"),
++ AUXV_FORMAT_HEX);
++ TAG (AT_L1D_CACHESHAPE, _("L1 Data cache information"), AUXV_FORMAT_HEX);
++ TAG (AT_L2_CACHESHAPE, _("L2 cache information"), AUXV_FORMAT_HEX);
++ TAG (AT_L3_CACHESHAPE, _("L3 cache information"), AUXV_FORMAT_HEX);
++ TAG (AT_SUN_UID, _("Effective user ID"), AUXV_FORMAT_DEC);
++ TAG (AT_SUN_RUID, _("Real user ID"), AUXV_FORMAT_DEC);
++ TAG (AT_SUN_GID, _("Effective group ID"), AUXV_FORMAT_DEC);
++ TAG (AT_SUN_RGID, _("Real group ID"), AUXV_FORMAT_DEC);
++ TAG (AT_SUN_LDELF, _("Dynamic linker's ELF header"), AUXV_FORMAT_HEX);
++ TAG (AT_SUN_LDSHDR, _("Dynamic linker's section headers"),
++ AUXV_FORMAT_HEX);
++ TAG (AT_SUN_LDNAME, _("String giving name of dynamic linker"),
++ AUXV_FORMAT_STR);
++ TAG (AT_SUN_LPAGESZ, _("Large pagesize"), AUXV_FORMAT_DEC);
++ TAG (AT_SUN_PLATFORM, _("Platform name string"), AUXV_FORMAT_STR);
++ TAG (AT_SUN_HWCAP, _("Machine-dependent CPU capability hints"),
++ AUXV_FORMAT_HEX);
++ TAG (AT_SUN_IFLUSH, _("Should flush icache?"), AUXV_FORMAT_DEC);
++ TAG (AT_SUN_CPU, _("CPU name string"), AUXV_FORMAT_STR);
++ TAG (AT_SUN_EMUL_ENTRY, _("COFF entry point address"), AUXV_FORMAT_HEX);
++ TAG (AT_SUN_EMUL_EXECFD, _("COFF executable file descriptor"),
++ AUXV_FORMAT_DEC);
++ TAG (AT_SUN_EXECNAME,
++ _("Canonicalized file name given to execve"), AUXV_FORMAT_STR);
++ TAG (AT_SUN_MMU, _("String for name of MMU module"), AUXV_FORMAT_STR);
++ TAG (AT_SUN_LDDATA, _("Dynamic linker's data segment address"),
++ AUXV_FORMAT_HEX);
++ TAG (AT_SUN_AUXFLAGS,
++ _("AF_SUN_ flags passed from the kernel"), AUXV_FORMAT_HEX);
++ }
++
++ fprint_auxv_entry (file, name, description, format, type, val);
++}
++
+ /* Print the contents of the target's AUXV on the specified file. */
++
+ int
+ fprint_target_auxv (struct ui_file *file, struct target_ops *ops)
+ {
++ struct gdbarch *gdbarch = target_gdbarch ();
+ CORE_ADDR type, val;
+ gdb_byte *data;
+ gdb_byte *ptr;
+@@ -426,93 +542,7 @@ fprint_target_auxv (struct ui_file *file, struct target_ops *ops)
+
+ while (target_auxv_parse (ops, &ptr, data + info->length, &type, &val) > 0)
+ {
+- const char *name = "???";
+- const char *description = "";
+- enum { dec, hex, str } flavor = hex;
+-
+- switch (type)
+- {
+-#define TAG(tag, text, kind) \
+- case tag: name = #tag; description = text; flavor = kind; break
+- TAG (AT_NULL, _("End of vector"), hex);
+- TAG (AT_IGNORE, _("Entry should be ignored"), hex);
+- TAG (AT_EXECFD, _("File descriptor of program"), dec);
+- TAG (AT_PHDR, _("Program headers for program"), hex);
+- TAG (AT_PHENT, _("Size of program header entry"), dec);
+- TAG (AT_PHNUM, _("Number of program headers"), dec);
+- TAG (AT_PAGESZ, _("System page size"), dec);
+- TAG (AT_BASE, _("Base address of interpreter"), hex);
+- TAG (AT_FLAGS, _("Flags"), hex);
+- TAG (AT_ENTRY, _("Entry point of program"), hex);
+- TAG (AT_NOTELF, _("Program is not ELF"), dec);
+- TAG (AT_UID, _("Real user ID"), dec);
+- TAG (AT_EUID, _("Effective user ID"), dec);
+- TAG (AT_GID, _("Real group ID"), dec);
+- TAG (AT_EGID, _("Effective group ID"), dec);
+- TAG (AT_CLKTCK, _("Frequency of times()"), dec);
+- TAG (AT_PLATFORM, _("String identifying platform"), str);
+- TAG (AT_HWCAP, _("Machine-dependent CPU capability hints"), hex);
+- TAG (AT_FPUCW, _("Used FPU control word"), dec);
+- TAG (AT_DCACHEBSIZE, _("Data cache block size"), dec);
+- TAG (AT_ICACHEBSIZE, _("Instruction cache block size"), dec);
+- TAG (AT_UCACHEBSIZE, _("Unified cache block size"), dec);
+- TAG (AT_IGNOREPPC, _("Entry should be ignored"), dec);
+- TAG (AT_BASE_PLATFORM, _("String identifying base platform"), str);
+- TAG (AT_RANDOM, _("Address of 16 random bytes"), hex);
+- TAG (AT_HWCAP2, _("Extension of AT_HWCAP"), hex);
+- TAG (AT_EXECFN, _("File name of executable"), str);
+- TAG (AT_SECURE, _("Boolean, was exec setuid-like?"), dec);
+- TAG (AT_SYSINFO, _("Special system info/entry points"), hex);
+- TAG (AT_SYSINFO_EHDR, _("System-supplied DSO's ELF header"), hex);
+- TAG (AT_L1I_CACHESHAPE, _("L1 Instruction cache information"), hex);
+- TAG (AT_L1D_CACHESHAPE, _("L1 Data cache information"), hex);
+- TAG (AT_L2_CACHESHAPE, _("L2 cache information"), hex);
+- TAG (AT_L3_CACHESHAPE, _("L3 cache information"), hex);
+- TAG (AT_SUN_UID, _("Effective user ID"), dec);
+- TAG (AT_SUN_RUID, _("Real user ID"), dec);
+- TAG (AT_SUN_GID, _("Effective group ID"), dec);
+- TAG (AT_SUN_RGID, _("Real group ID"), dec);
+- TAG (AT_SUN_LDELF, _("Dynamic linker's ELF header"), hex);
+- TAG (AT_SUN_LDSHDR, _("Dynamic linker's section headers"), hex);
+- TAG (AT_SUN_LDNAME, _("String giving name of dynamic linker"), str);
+- TAG (AT_SUN_LPAGESZ, _("Large pagesize"), dec);
+- TAG (AT_SUN_PLATFORM, _("Platform name string"), str);
+- TAG (AT_SUN_HWCAP, _("Machine-dependent CPU capability hints"), hex);
+- TAG (AT_SUN_IFLUSH, _("Should flush icache?"), dec);
+- TAG (AT_SUN_CPU, _("CPU name string"), str);
+- TAG (AT_SUN_EMUL_ENTRY, _("COFF entry point address"), hex);
+- TAG (AT_SUN_EMUL_EXECFD, _("COFF executable file descriptor"), dec);
+- TAG (AT_SUN_EXECNAME,
+- _("Canonicalized file name given to execve"), str);
+- TAG (AT_SUN_MMU, _("String for name of MMU module"), str);
+- TAG (AT_SUN_LDDATA, _("Dynamic linker's data segment address"), hex);
+- TAG (AT_SUN_AUXFLAGS,
+- _("AF_SUN_ flags passed from the kernel"), hex);
+- }
+-
+- fprintf_filtered (file, "%-4s %-20s %-30s ",
+- plongest (type), name, description);
+- switch (flavor)
+- {
+- case dec:
+- fprintf_filtered (file, "%s\n", plongest (val));
+- break;
+- case hex:
+- fprintf_filtered (file, "%s\n", paddress (target_gdbarch (), val));
+- break;
+- case str:
+- {
+- struct value_print_options opts;
+-
+- get_user_print_options (&opts);
+- if (opts.addressprint)
+- fprintf_filtered (file, "%s ", paddress (target_gdbarch (), val));
+- val_print_string (builtin_type (target_gdbarch ())->builtin_char,
+- NULL, val, -1, file, &opts);
+- fprintf_filtered (file, "\n");
+- }
+- break;
+- }
++ gdbarch_print_auxv_entry (gdbarch, file, type, val);
+ ++ents;
+ if (type == AT_NULL)
+ break;
+diff --git gdb/auxv.h gdb/auxv.h
+index 9efe604..916f674 100644
+--- gdb/auxv.h
++++ gdb/auxv.h
+@@ -46,6 +46,20 @@ extern int target_auxv_parse (struct target_ops *ops,
+ extern int target_auxv_search (struct target_ops *ops,
+ CORE_ADDR match, CORE_ADDR *valp);
+
++/* Print a description of a single AUXV entry on the specified file. */
++enum auxv_format { AUXV_FORMAT_DEC, AUXV_FORMAT_HEX, AUXV_FORMAT_STR };
++
++extern void fprint_auxv_entry (struct ui_file *file, const char *name,
++ const char *description,
++ enum auxv_format format, CORE_ADDR type,
++ CORE_ADDR val);
++
++/* The default implementation of gdbarch_print_auxv_entry. */
++
++extern void default_print_auxv_entry (struct gdbarch *gdbarch,
++ struct ui_file *file, CORE_ADDR type,
++ CORE_ADDR val);
++
+ /* Print the contents of the target's AUXV on the specified file. */
+ extern int fprint_target_auxv (struct ui_file *file, struct target_ops *ops);
+
+diff --git gdb/gdbarch.c gdb/gdbarch.c
+index 313502b..af7359e 100644
+--- gdb/gdbarch.c
++++ gdb/gdbarch.c
+@@ -47,6 +47,7 @@
+ #include "observer.h"
+ #include "regcache.h"
+ #include "objfiles.h"
++#include "auxv.h"
+
+ /* Static function declarations */
+
+@@ -328,6 +329,7 @@ struct gdbarch
+ gdbarch_insn_is_ret_ftype *insn_is_ret;
+ gdbarch_insn_is_jump_ftype *insn_is_jump;
+ gdbarch_auxv_parse_ftype *auxv_parse;
++ gdbarch_print_auxv_entry_ftype *print_auxv_entry;
+ gdbarch_vsyscall_range_ftype *vsyscall_range;
+ gdbarch_infcall_mmap_ftype *infcall_mmap;
+ gdbarch_infcall_munmap_ftype *infcall_munmap;
+@@ -432,6 +434,7 @@ gdbarch_alloc (const struct gdbarch_info *info,
+ gdbarch->insn_is_call = default_insn_is_call;
+ gdbarch->insn_is_ret = default_insn_is_ret;
+ gdbarch->insn_is_jump = default_insn_is_jump;
++ gdbarch->print_auxv_entry = default_print_auxv_entry;
+ gdbarch->vsyscall_range = default_vsyscall_range;
+ gdbarch->infcall_mmap = default_infcall_mmap;
+ gdbarch->infcall_munmap = default_infcall_munmap;
+@@ -678,6 +681,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
+ /* Skip verify of insn_is_ret, invalid_p == 0 */
+ /* Skip verify of insn_is_jump, invalid_p == 0 */
+ /* Skip verify of auxv_parse, has predicate. */
++ /* Skip verify of print_auxv_entry, invalid_p == 0 */
+ /* Skip verify of vsyscall_range, invalid_p == 0 */
+ /* Skip verify of infcall_mmap, invalid_p == 0 */
+ /* Skip verify of infcall_munmap, invalid_p == 0 */
+@@ -1167,6 +1171,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
+ "gdbarch_dump: pointer_to_address = <%s>\n",
+ host_address_to_string (gdbarch->pointer_to_address));
+ fprintf_unfiltered (file,
++ "gdbarch_dump: print_auxv_entry = <%s>\n",
++ host_address_to_string (gdbarch->print_auxv_entry));
++ fprintf_unfiltered (file,
+ "gdbarch_dump: print_float_info = <%s>\n",
+ host_address_to_string (gdbarch->print_float_info));
+ fprintf_unfiltered (file,
+@@ -4769,6 +4776,23 @@ set_gdbarch_auxv_parse (struct gdbarch *gdbarch,
+ gdbarch->auxv_parse = auxv_parse;
+ }
+
++void
++gdbarch_print_auxv_entry (struct gdbarch *gdbarch, struct ui_file *file, CORE_ADDR type, CORE_ADDR val)
++{
++ gdb_assert (gdbarch != NULL);
++ gdb_assert (gdbarch->print_auxv_entry != NULL);
++ if (gdbarch_debug >= 2)
++ fprintf_unfiltered (gdb_stdlog, "gdbarch_print_auxv_entry called\n");
++ gdbarch->print_auxv_entry (gdbarch, file, type, val);
++}
++
++void
++set_gdbarch_print_auxv_entry (struct gdbarch *gdbarch,
++ gdbarch_print_auxv_entry_ftype print_auxv_entry)
++{
++ gdbarch->print_auxv_entry = print_auxv_entry;
++}
++
+ int
+ gdbarch_vsyscall_range (struct gdbarch *gdbarch, struct mem_range *range)
+ {
+diff --git gdb/gdbarch.h gdb/gdbarch.h
+index a6366fc..bc0f692 100644
+--- gdb/gdbarch.h
++++ gdb/gdbarch.h
+@@ -1464,6 +1464,13 @@ typedef int (gdbarch_auxv_parse_ftype) (struct gdbarch *gdbarch, gdb_byte **read
+ extern int gdbarch_auxv_parse (struct gdbarch *gdbarch, gdb_byte **readptr, gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp);
+ extern void set_gdbarch_auxv_parse (struct gdbarch *gdbarch, gdbarch_auxv_parse_ftype *auxv_parse);
+
++/* Print the description of a single auxv entry described by TYPE and VAL
++ to FILE. */
++
++typedef void (gdbarch_print_auxv_entry_ftype) (struct gdbarch *gdbarch, struct ui_file *file, CORE_ADDR type, CORE_ADDR val);
++extern void gdbarch_print_auxv_entry (struct gdbarch *gdbarch, struct ui_file *file, CORE_ADDR type, CORE_ADDR val);
++extern void set_gdbarch_print_auxv_entry (struct gdbarch *gdbarch, gdbarch_print_auxv_entry_ftype *print_auxv_entry);
++
+ /* Find the address range of the current inferior's vsyscall/vDSO, and
+ write it to *RANGE. If the vsyscall's length can't be determined, a
+ range with zero length is returned. Returns true if the vsyscall is
+diff --git gdb/gdbarch.sh gdb/gdbarch.sh
+index f170c10..d8e0eeb 100755
+--- gdb/gdbarch.sh
++++ gdb/gdbarch.sh
+@@ -1110,6 +1110,10 @@ m:int:insn_is_jump:CORE_ADDR addr:addr::default_insn_is_jump::0
+ # Return 1 if an entry was read into *TYPEP and *VALP.
+ M:int:auxv_parse:gdb_byte **readptr, gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp:readptr, endptr, typep, valp
+
++# Print the description of a single auxv entry described by TYPE and VAL
++# to FILE.
++m:void:print_auxv_entry:struct ui_file *file, CORE_ADDR type, CORE_ADDR val:file, type, val::default_print_auxv_entry::0
++
+ # Find the address range of the current inferior's vsyscall/vDSO, and
+ # write it to *RANGE. If the vsyscall's length can't be determined, a
+ # range with zero length is returned. Returns true if the vsyscall is
+@@ -1616,6 +1620,7 @@ cat <<EOF
+ #include "observer.h"
+ #include "regcache.h"
+ #include "objfiles.h"
++#include "auxv.h"
+
+ /* Static function declarations */
+
diff --git a/devel/gdb/files/commit-3350c5f b/devel/gdb/files/commit-3350c5f
new file mode 100644
index 000000000000..2e3526305c4b
--- /dev/null
+++ b/devel/gdb/files/commit-3350c5f
@@ -0,0 +1,39 @@
+commit 3350c5f5de3d2e62dd9de2a76cf2d5d8728d2600
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Sun Jun 12 12:34:51 2016 -0700
+
+ Create a pseudo section for the ELF AUXV core dump note on FreeBSD.
+
+ The procstat AUXV core dump note in FreeBSD consists of 32-bit integer
+ followed by an array of auxiliary vector entries.
+
+ bfd/ChangeLog:
+
+ * elf.c (elfcore_grok_freebsd_note): Handle NT_FREEBSD_PROCSTAT_AUXV
+ notes.
+
+diff --git bfd/elf.c bfd/elf.c
+index cfcafaa..cb4de50 100644
+--- bfd/elf.c
++++ bfd/elf.c
+@@ -9663,6 +9663,20 @@ elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note)
+ else
+ return TRUE;
+
++ case NT_FREEBSD_PROCSTAT_AUXV:
++ {
++ asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
++ SEC_HAS_CONTENTS);
++
++ if (sect == NULL)
++ return FALSE;
++ sect->size = note->descsz - 4;
++ sect->filepos = note->descpos + 4;
++ sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
++
++ return TRUE;
++ }
++
+ case NT_X86_XSTATE:
+ if (note->namesz == 8)
+ return elfcore_grok_xstatereg (abfd, note);
diff --git a/devel/gdb/files/commit-5077bff b/devel/gdb/files/commit-5077bff
new file mode 100644
index 000000000000..4b4f59d67cbf
--- /dev/null
+++ b/devel/gdb/files/commit-5077bff
@@ -0,0 +1,49 @@
+commit 5077bfff905136e9d9a8fdf0886f6217887622ad
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Mon Jun 27 17:44:58 2016 -0700
+
+ Set debug registers on all threads belonging to the current inferior.
+
+ gdb/ChangeLog:
+
+ * x86bsd-nat.c: Include 'gdbthread.h'.
+ (x86bsd_dr_set): Set debug registers on all threads belonging to
+ the current inferior.
+
+diff --git gdb/x86bsd-nat.c gdb/x86bsd-nat.c
+index 0c56848..bde25ab 100644
+--- gdb/x86bsd-nat.c
++++ gdb/x86bsd-nat.c
+@@ -19,6 +19,7 @@
+
+ #include "defs.h"
+ #include "inferior.h"
++#include "gdbthread.h"
+
+ /* We include <signal.h> to make sure `struct fxsave64' is defined on
+ NetBSD, since NetBSD's <machine/reg.h> needs it. */
+@@ -71,6 +72,7 @@ x86bsd_dr_get (ptid_t ptid, int regnum)
+ static void
+ x86bsd_dr_set (int regnum, unsigned long value)
+ {
++ struct thread_info *thread;
+ struct dbreg dbregs;
+
+ if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid),
+@@ -84,9 +86,13 @@ x86bsd_dr_set (int regnum, unsigned long value)
+
+ DBREG_DRX ((&dbregs), regnum) = value;
+
+- if (ptrace (PT_SETDBREGS, get_ptrace_pid (inferior_ptid),
+- (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+- perror_with_name (_("Couldn't write debug registers"));
++ ALL_NON_EXITED_THREADS (thread)
++ if (thread->inf == current_inferior ())
++ {
++ if (ptrace (PT_SETDBREGS, get_ptrace_pid (thread->ptid),
++ (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
++ perror_with_name (_("Couldn't write debug registers"));
++ }
+ }
+
+ static void
diff --git a/devel/gdb/files/commit-7697fc9 b/devel/gdb/files/commit-7697fc9
new file mode 100644
index 000000000000..2989d18b0c39
--- /dev/null
+++ b/devel/gdb/files/commit-7697fc9
@@ -0,0 +1,110 @@
+commit 7697fc9ec3a970f05abb836107653c46ada466ad
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Sat Jun 11 15:07:38 2016 -0700
+
+ Fetch the ELF auxiliary vector from live processes on FreeBSD.
+
+ Use the kern.proc.auxv.<pid> sysctl to fetch the ELF auxiliary vector for
+ a live process.
+
+ gdb/ChangeLog:
+
+ * fbsd-nat.c [KERN_PROC_AUXV] New variable super_xfer_partial.
+ (fbsd_xfer_partial): New function.
+ (fbsd_nat_add_target) [KERN_PROC_AUXV] Set "to_xfer_partial" to
+ "fbsd_xfer_partial".
+
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index b582abe..dc65e29 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -206,6 +206,78 @@ fbsd_find_memory_regions (struct target_ops *self,
+ }
+ #endif
+
++#ifdef KERN_PROC_AUXV
++static enum target_xfer_status (*super_xfer_partial) (struct target_ops *ops,
++ enum target_object object,
++ const char *annex,
++ gdb_byte *readbuf,
++ const gdb_byte *writebuf,
++ ULONGEST offset,
++ ULONGEST len,
++ ULONGEST *xfered_len);
++
++/* Implement the "to_xfer_partial target_ops" method. */
++
++static enum target_xfer_status
++fbsd_xfer_partial (struct target_ops *ops, enum target_object object,
++ const char *annex, gdb_byte *readbuf,
++ const gdb_byte *writebuf,
++ ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
++{
++ pid_t pid = ptid_get_pid (inferior_ptid);
++
++ switch (object)
++ {
++ case TARGET_OBJECT_AUXV:
++ {
++ struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
++ unsigned char *buf;
++ size_t buflen;
++ int mib[4];
++
++ if (writebuf != NULL)
++ return TARGET_XFER_E_IO;
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_PROC;
++ mib[2] = KERN_PROC_AUXV;
++ mib[3] = pid;
++ if (offset == 0)
++ {
++ buf = readbuf;
++ buflen = len;
++ }
++ else
++ {
++ buflen = offset + len;
++ buf = XCNEWVEC (unsigned char, buflen);
++ cleanup = make_cleanup (xfree, buf);
++ }
++ if (sysctl (mib, 4, buf, &buflen, NULL, 0) == 0)
++ {
++ if (offset != 0)
++ {
++ if (buflen > offset)
++ {
++ buflen -= offset;
++ memcpy (readbuf, buf + offset, buflen);
++ }
++ else
++ buflen = 0;
++ }
++ do_cleanups (cleanup);
++ *xfered_len = buflen;
++ return (buflen == 0) ? TARGET_XFER_EOF : TARGET_XFER_OK;
++ }
++ do_cleanups (cleanup);
++ return TARGET_XFER_E_IO;
++ }
++ default:
++ return super_xfer_partial (ops, object, annex, readbuf, writebuf, offset,
++ len, xfered_len);
++ }
++}
++#endif
++
+ #ifdef PT_LWPINFO
+ static int debug_fbsd_lwp;
+
+@@ -824,6 +896,10 @@ 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;
++#ifdef KERN_PROC_AUXV
++ super_xfer_partial = t->to_xfer_partial;
++ t->to_xfer_partial = fbsd_xfer_partial;
++#endif
+ #ifdef PT_LWPINFO
+ t->to_thread_alive = fbsd_thread_alive;
+ t->to_pid_to_str = fbsd_pid_to_str;
diff --git a/devel/gdb/files/commit-82372b2 b/devel/gdb/files/commit-82372b2
new file mode 100644
index 000000000000..11b368140c3d
--- /dev/null
+++ b/devel/gdb/files/commit-82372b2
@@ -0,0 +1,74 @@
+commit 82372b2f2747d347e24bb10ddc7bc7e828222a42
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Wed Jun 15 21:33:42 2016 -0700
+
+ Add a gdbarch 'print_auxv_entry' method for FreeBSD ABIs.
+
+ Add a 'print_auxv_entry' method for FreeBSD ABIs that parses
+ FreeBSD-specific auxiliary vector entries and outputs a suitable
+ description using fprint_auxv_entry.
+
+ gdb/ChangeLog:
+
+ * fbsd-tdep.c: Include "auxv.h".
+ (fbsd_print_auxv_entry): New function.
+ (fbsd_init_abi): Install gdbarch "print_auxv_entry" method.
+
+diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c
+index 7310ea0..e8f8605 100644
+--- gdb/fbsd-tdep.c
++++ gdb/fbsd-tdep.c
+@@ -18,6 +18,7 @@
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ #include "defs.h"
++#include "auxv.h"
+ #include "gdbcore.h"
+ #include "inferior.h"
+ #include "regcache.h"
+@@ -283,6 +284,39 @@ fbsd_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
+ return note_data;
+ }
+
++/* Print descriptions of FreeBSD-specific AUXV entries to FILE. */
++
++static void
++fbsd_print_auxv_entry (struct gdbarch *gdbarch, struct ui_file *file,
++ CORE_ADDR type, CORE_ADDR val)
++{
++ const char *name;
++ const char *description;
++ enum auxv_format format;
++
++ switch (type)
++ {
++#define _TAGNAME(tag) #tag
++#define TAGNAME(tag) _TAGNAME(AT_##tag)
++#define TAG(tag, text, kind) \
++ case AT_FREEBSD_##tag: name = TAGNAME(tag); description = text; format = kind; break
++ TAG (EXECPATH, _("Executable path"), AUXV_FORMAT_STR);
++ TAG (CANARY, _("Canary for SSP"), AUXV_FORMAT_HEX);
++ TAG (CANARYLEN, ("Length of the SSP canary"), AUXV_FORMAT_DEC);
++ TAG (OSRELDATE, _("OSRELDATE"), AUXV_FORMAT_DEC);
++ TAG (NCPUS, _("Number of CPUs"), AUXV_FORMAT_DEC);
++ TAG (PAGESIZES, _("Pagesizes"), AUXV_FORMAT_HEX);
++ TAG (PAGESIZESLEN, _("Number of pagesizes"), AUXV_FORMAT_DEC);
++ TAG (TIMEKEEP, _("Pointer to timehands"), AUXV_FORMAT_HEX);
++ TAG (STACKPROT, _("Initial stack protection"), AUXV_FORMAT_HEX);
++ default:
++ default_print_auxv_entry (gdbarch, file, type, val);
++ return;
++ }
++
++ fprint_auxv_entry (file, name, description, format, type, val);
++}
++
+ /* To be called from GDB_OSABI_FREEBSD_ELF handlers. */
+
+ void
+@@ -291,4 +325,5 @@ fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+ set_gdbarch_core_pid_to_str (gdbarch, fbsd_core_pid_to_str);
+ set_gdbarch_core_thread_name (gdbarch, fbsd_core_thread_name);
+ set_gdbarch_make_corefile_notes (gdbarch, fbsd_make_corefile_notes);
++ set_gdbarch_print_auxv_entry (gdbarch, fbsd_print_auxv_entry);
+ }
diff --git a/devel/gdb/files/commit-8607ea6 b/devel/gdb/files/commit-8607ea6
new file mode 100644
index 000000000000..e392208169ad
--- /dev/null
+++ b/devel/gdb/files/commit-8607ea6
@@ -0,0 +1,165 @@
+commit 8607ea632c806235554aa2336cf01bf3758c1264
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Fri Jun 24 21:06:36 2016 -0700
+
+ Move fbsd_resume and related functions below fork following helper code.
+
+ gdb/ChangeLog:
+
+ * fbsd-nat.c (super_resume): Move earlier next to "super_wait".
+ (resume_one_thread_cb): Move below fork following helper code.
+ (resume_all_threads_cb): Likewise.
+ (fbsd_resume): Likewise.
+
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index 0999712..daf4580 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -281,6 +281,10 @@ fbsd_xfer_partial (struct target_ops *ops, enum target_object object,
+ #ifdef PT_LWPINFO
+ static int debug_fbsd_lwp;
+
++static void (*super_resume) (struct target_ops *,
++ ptid_t,
++ int,
++ enum gdb_signal);
+ static ptid_t (*super_wait) (struct target_ops *,
+ ptid_t,
+ struct target_waitstatus *,
+@@ -492,70 +496,6 @@ fbsd_update_thread_list (struct target_ops *ops)
+ #endif
+ }
+
+-static void (*super_resume) (struct target_ops *,
+- ptid_t,
+- int,
+- enum gdb_signal);
+-
+-static int
+-resume_one_thread_cb (struct thread_info *tp, void *data)
+-{
+- ptid_t *ptid = (ptid_t *) data;
+- int request;
+-
+- if (ptid_get_pid (tp->ptid) != ptid_get_pid (*ptid))
+- return 0;
+-
+- if (ptid_get_lwp (tp->ptid) == ptid_get_lwp (*ptid))
+- request = PT_RESUME;
+- else
+- request = PT_SUSPEND;
+-
+- if (ptrace (request, ptid_get_lwp (tp->ptid), NULL, 0) == -1)
+- perror_with_name (("ptrace"));
+- return 0;
+-}
+-
+-static int
+-resume_all_threads_cb (struct thread_info *tp, void *data)
+-{
+- ptid_t *filter = (ptid_t *) data;
+-
+- if (!ptid_match (tp->ptid, *filter))
+- return 0;
+-
+- if (ptrace (PT_RESUME, ptid_get_lwp (tp->ptid), NULL, 0) == -1)
+- perror_with_name (("ptrace"));
+- return 0;
+-}
+-
+-/* Implement the "to_resume" target_ops method. */
+-
+-static void
+-fbsd_resume (struct target_ops *ops,
+- ptid_t ptid, int step, enum gdb_signal signo)
+-{
+-
+- if (debug_fbsd_lwp)
+- fprintf_unfiltered (gdb_stdlog,
+- "FLWP: fbsd_resume for ptid (%d, %ld, %ld)\n",
+- ptid_get_pid (ptid), ptid_get_lwp (ptid),
+- ptid_get_tid (ptid));
+- if (ptid_lwp_p (ptid))
+- {
+- /* If ptid is a specific LWP, suspend all other LWPs in the process. */
+- iterate_over_threads (resume_one_thread_cb, &ptid);
+- }
+- else
+- {
+- /* If ptid is a wildcard, resume all matching threads (they won't run
+- until the process is continued however). */
+- iterate_over_threads (resume_all_threads_cb, &ptid);
+- ptid = inferior_ptid;
+- }
+- super_resume (ops, ptid, step, signo);
+-}
+-
+ #ifdef TDP_RFPPWAIT
+ /*
+ To catch fork events, PT_FOLLOW_FORK is set on every traced process
+@@ -638,6 +578,65 @@ fbsd_is_child_pending (pid_t pid)
+ }
+ #endif
+
++static int
++resume_one_thread_cb (struct thread_info *tp, void *data)
++{
++ ptid_t *ptid = (ptid_t *) data;
++ int request;
++
++ if (ptid_get_pid (tp->ptid) != ptid_get_pid (*ptid))
++ return 0;
++
++ if (ptid_get_lwp (tp->ptid) == ptid_get_lwp (*ptid))
++ request = PT_RESUME;
++ else
++ request = PT_SUSPEND;
++
++ if (ptrace (request, ptid_get_lwp (tp->ptid), NULL, 0) == -1)
++ perror_with_name (("ptrace"));
++ return 0;
++}
++
++static int
++resume_all_threads_cb (struct thread_info *tp, void *data)
++{
++ ptid_t *filter = (ptid_t *) data;
++
++ if (!ptid_match (tp->ptid, *filter))
++ return 0;
++
++ if (ptrace (PT_RESUME, ptid_get_lwp (tp->ptid), NULL, 0) == -1)
++ perror_with_name (("ptrace"));
++ return 0;
++}
++
++/* Implement the "to_resume" target_ops method. */
++
++static void
++fbsd_resume (struct target_ops *ops,
++ ptid_t ptid, int step, enum gdb_signal signo)
++{
++
++ if (debug_fbsd_lwp)
++ fprintf_unfiltered (gdb_stdlog,
++ "FLWP: fbsd_resume for ptid (%d, %ld, %ld)\n",
++ ptid_get_pid (ptid), ptid_get_lwp (ptid),
++ ptid_get_tid (ptid));
++ if (ptid_lwp_p (ptid))
++ {
++ /* If ptid is a specific LWP, suspend all other LWPs in the process. */
++ iterate_over_threads (resume_one_thread_cb, &ptid);
++ }
++ else
++ {
++ /* If ptid is a wildcard, resume all matching threads (they won't run
++ until the process is continued however). */
++ iterate_over_threads (resume_all_threads_cb, &ptid);
++ ptid = inferior_ptid;
++ }
++ super_resume (ops, ptid, step, signo);
++}
++
+ /* 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. */
diff --git a/devel/gdb/files/commit-a3405d1 b/devel/gdb/files/commit-a3405d1
new file mode 100644
index 000000000000..ae966365f8c8
--- /dev/null
+++ b/devel/gdb/files/commit-a3405d1
@@ -0,0 +1,827 @@
+commit a3405d124e1388b613a35af49f19f0cc1b8d959d
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Mon Jun 27 13:19:09 2016 -0700
+
+ Consolidate x86 debug register code for BSD native targets.
+
+ Move the debug register support code from amd64bsd-nat.c and
+ i386bsd-nat.c into a shared x86bsd-nat.c.
+
+ Instead of setting up x86_dr_low in amd64fbsd-nat.c and
+ i386fbsd-nat.c, add a x86bsd_target function that creates a new target
+ that inherits from inf_ptrace and sets up x86 debug registers if
+ supported. In addition to initializing x86_dr_low, the x86bsd target
+ installs a custom mourn_inferior target operation to clean up the
+ x86 debug register state. Previously this was only done on amd64.
+ Now it will be done for both i386 and amd64. The i386bsd_target and
+ amd64bsd_target functions create targets that inherit from x86bsd
+ rather than inf_ptrace.
+
+ gdb/ChangeLog:
+
+ * Makefile.in [HFILES_NO_SRCDIR]: Replace 'amd64bsd-nat.h' with
+ 'x86bsd-nat.h'.
+ * amd64bsd-nat.c: Include 'x86bsd-nat.h' instead of
+ 'amd64bsd-nat.h'.
+ (amd64bsd_xsave_len): Rename and move to x86bsd-nat.c.
+ (amd64bsd_fetch_inferior_registers): Replace 'amd64bsd_xsave_len'
+ with 'x86bsd_xsave_len'.
+ (amd64bsd_store_inferior_registers): Likewise.
+ (amd64bsd_target): Inherit from x86bsd_target.
+ (amd64bsd_dr_get): Rename and move to x86bsd-nat.c.
+ (amd64bsd_dr_set): Likewise.
+ (amd64bsd_dr_set_control): Likewise.
+ (amd64bsd_dr_set_addr): Likewise.
+ (amd64bsd_dr_get_addr): Likewise.
+ (amd64bsd_dr_get_status): Likewise.
+ (amd64bsd_dr_get_control): Likewise.
+ * amd64fbsd-nat.c: Include 'x86bsd-nat.h' instead of
+ 'amd64bsd-nat.h'.
+ (super_mourn_inferior): Move to x86bsd-nat.c.
+ (amd64fbsd_mourn_inferior): Rename and move to x86bsd-nat.c.
+ (amd64fbsd_read_description): Replace 'amd64bsd_xsave_len' with
+ 'x86bsd_xsave_len'.
+ (_initialize_amd64fbsd_nat): Remove x86 watchpoint setup and
+ mourn_inferior' target op.
+ * config/i386/fbsd.mh (NATDEPFILES): Add x86bsd-nat.o.
+ * config/i386/fbsd64.mh: Likewise.
+ * config/i386/nbsd64.mh: Likewise.
+ * config/i386/nbsdelf.mh: Likewise.
+ * config/i386/obsd.mh: Likewise.
+ * config/i386/obsd64.mh: Likewise.
+ * i386bsd-nat.c: Include 'x86bsd-nat.h'.
+ (i386bsd_xsave_len): Rename and move to x86bsd-nat.c.
+ (i386bsd_fetch_inferior_registers): Replace 'i386bsd_xsave_len'
+ with 'x86bsd_xsave_len'.
+ (i386bsd_store_inferior_registers): Likewise.
+ (i386bsd_target): Inherit from x86bsd_target.
+ (i386bsd_dr_get): Rename and move to x86bsd-nat.c.
+ (i386bsd_dr_set): Likewise.
+ (i386bsd_dr_set_control): Likewise.
+ (i386bsd_dr_set_addr): Likewise.
+ (i386bsd_dr_get_addr): Likewise.
+ (i386bsd_dr_get_status): Likewise.
+ (i386bsd_dr_get_control): Likewise.
+ * i386bsd-nat.h (i386bsd_xsave_len): Remove.
+ (i386bsd_dr_set_control): Remove.
+ (i386bsd_dr_set_addr): Remove.
+ (i386bsd_dr_get_addr): Remove.
+ (i386bsd_dr_get_status): Remove.
+ (i386bsd_dr_get_control): Remove.
+ * i386fbsd-nat.c: Include 'x86bsd-nat.h'.
+ (i386fbsd_read_description): Replace 'i386bsd_xsave_len' with
+ 'x86bsd_xsave_len'.
+ (_initialize_i386fbsd_nat): Remove x86 watchpoint setup and
+ mourn_inferior' target op.
+ * x86bsd-nat.c: New file.
+ * x86bsd-nat.h: New file.
+
+diff --git gdb/Makefile.in gdb/Makefile.in
+index 16d5f27..5af6103 100644
+--- gdb/Makefile.in
++++ gdb/Makefile.in
+@@ -912,7 +912,7 @@ common/gdb_signals.h nat/gdb_thread_db.h common/gdb_vecs.h \
+ common/x86-xstate.h nat/linux-ptrace.h nat/mips-linux-watch.h \
+ proc-utils.h aarch64-tdep.h arm-tdep.h ax-gdb.h ppcfbsd-tdep.h \
+ ppcnbsd-tdep.h cli-out.h gdb_expat.h breakpoint.h infcall.h obsd-tdep.h \
+-exec.h m32r-tdep.h osabi.h gdbcore.h amd64bsd-nat.h \
++exec.h m32r-tdep.h osabi.h gdbcore.h x86bsd-nat.h \
+ i386bsd-nat.h xml-support.h xml-tdesc.h alphabsd-tdep.h gdb_obstack.h \
+ ia64-tdep.h ada-lang.h varobj.h varobj-iter.h frv-tdep.h \
+ nto-tdep.h serial.h \
+diff --git gdb/amd64bsd-nat.c gdb/amd64bsd-nat.c
+index e278a91..b87672a 100644
+--- gdb/amd64bsd-nat.c
++++ gdb/amd64bsd-nat.c
+@@ -31,14 +31,10 @@
+
+ #include "amd64-tdep.h"
+ #include "amd64-nat.h"
+-#include "amd64bsd-nat.h"
++#include "x86bsd-nat.h"
+ #include "inf-ptrace.h"
+
+
+-#ifdef PT_GETXSTATE_INFO
+-size_t amd64bsd_xsave_len;
+-#endif
+-
+ /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
+ for all registers (including the floating-point registers). */
+
+@@ -67,9 +63,9 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops,
+ #ifdef PT_GETXSTATE_INFO
+ void *xstateregs;
+
+- if (amd64bsd_xsave_len != 0)
++ if (x86bsd_xsave_len != 0)
+ {
+- xstateregs = alloca (amd64bsd_xsave_len);
++ xstateregs = alloca (x86bsd_xsave_len);
+ if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) xstateregs, 0) == -1)
+ perror_with_name (_("Couldn't get extended state status"));
+@@ -120,9 +116,9 @@ amd64bsd_store_inferior_registers (struct target_ops *ops,
+ #ifdef PT_GETXSTATE_INFO
+ void *xstateregs;
+
+- if (amd64bsd_xsave_len != 0)
++ if (x86bsd_xsave_len != 0)
+ {
+- xstateregs = alloca (amd64bsd_xsave_len);
++ xstateregs = alloca (x86bsd_xsave_len);
+ if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) xstateregs, 0) == -1)
+ perror_with_name (_("Couldn't get extended state status"));
+@@ -130,7 +126,7 @@ amd64bsd_store_inferior_registers (struct target_ops *ops,
+ amd64_collect_xsave (regcache, regnum, xstateregs, 0);
+
+ if (ptrace (PT_SETXSTATE, get_ptrace_pid (inferior_ptid),
+- (PTRACE_TYPE_ARG3) xstateregs, amd64bsd_xsave_len) == -1)
++ (PTRACE_TYPE_ARG3) xstateregs, x86bsd_xsave_len) == -1)
+ perror_with_name (_("Couldn't write extended state status"));
+ return;
+ }
+@@ -156,80 +152,8 @@ amd64bsd_target (void)
+ {
+ struct target_ops *t;
+
+- t = inf_ptrace_target ();
++ t = x86bsd_target ();
+ t->to_fetch_registers = amd64bsd_fetch_inferior_registers;
+ t->to_store_registers = amd64bsd_store_inferior_registers;
+ return t;
+ }
+-
+-
+-/* Support for debug registers. */
+-
+-#ifdef HAVE_PT_GETDBREGS
+-
+-static unsigned long
+-amd64bsd_dr_get (ptid_t ptid, int regnum)
+-{
+- struct dbreg dbregs;
+-
+- if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid),
+- (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+- perror_with_name (_("Couldn't read debug registers"));
+-
+- return DBREG_DRX ((&dbregs), regnum);
+-}
+-
+-static void
+-amd64bsd_dr_set (int regnum, unsigned long value)
+-{
+- struct dbreg dbregs;
+-
+- if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid),
+- (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+- perror_with_name (_("Couldn't get debug registers"));
+-
+- /* For some mysterious reason, some of the reserved bits in the
+- debug control register get set. Mask these off, otherwise the
+- ptrace call below will fail. */
+- DBREG_DRX ((&dbregs), 7) &= ~(0xffffffff0000fc00);
+-
+- DBREG_DRX ((&dbregs), regnum) = value;
+-
+- if (ptrace (PT_SETDBREGS, get_ptrace_pid (inferior_ptid),
+- (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+- perror_with_name (_("Couldn't write debug registers"));
+-}
+-
+-void
+-amd64bsd_dr_set_control (unsigned long control)
+-{
+- amd64bsd_dr_set (7, control);
+-}
+-
+-void
+-amd64bsd_dr_set_addr (int regnum, CORE_ADDR addr)
+-{
+- gdb_assert (regnum >= 0 && regnum <= 4);
+-
+- amd64bsd_dr_set (regnum, addr);
+-}
+-
+-CORE_ADDR
+-amd64bsd_dr_get_addr (int regnum)
+-{
+- return amd64bsd_dr_get (inferior_ptid, regnum);
+-}
+-
+-unsigned long
+-amd64bsd_dr_get_status (void)
+-{
+- return amd64bsd_dr_get (inferior_ptid, 6);
+-}
+-
+-unsigned long
+-amd64bsd_dr_get_control (void)
+-{
+- return amd64bsd_dr_get (inferior_ptid, 7);
+-}
+-
+-#endif /* PT_GETDBREGS */
+diff --git gdb/amd64bsd-nat.h gdb/amd64bsd-nat.h
+deleted file mode 100644
+index f6a4022..0000000
+--- gdb/amd64bsd-nat.h
++++ /dev/null
+@@ -1,38 +0,0 @@
+-/* Native-dependent code for AMD64 BSD's.
+-
+- Copyright (C) 2011-2016 Free Software Foundation, Inc.
+-
+- This file is part of GDB.
+-
+- This program is free software; you can redistribute it and/or modify
+- it under the terms of the GNU General Public License as published by
+- the Free Software Foundation; either version 3 of the License, or
+- (at your option) any later version.
+-
+- This program is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU General Public License for more details.
+-
+- You should have received a copy of the GNU General Public License
+- along with this program. If not, see <http://www.gnu.org/licenses/>. */
+-
+-#ifndef AMD64BSD_NAT_H
+-#define AMD64BSD_NAT_H
+-
+-/* Low level amd64 XSAVE info. */
+-extern size_t amd64bsd_xsave_len;
+-
+-/* Low level amd64 debug register functions. */
+-
+-extern void amd64bsd_dr_set_control (unsigned long control);
+-
+-extern void amd64bsd_dr_set_addr (int regnum, CORE_ADDR addr);
+-
+-extern CORE_ADDR amd64bsd_dr_get_addr (int regnum);
+-
+-extern unsigned long amd64bsd_dr_get_status (void);
+-
+-extern unsigned long amd64bsd_dr_get_control (void);
+-
+-#endif /* amd64bsd-nat.h */
+diff --git gdb/amd64fbsd-nat.c gdb/amd64fbsd-nat.c
+index 63a7197..66c374c 100644
+--- gdb/amd64fbsd-nat.c
++++ gdb/amd64fbsd-nat.c
+@@ -32,7 +32,7 @@
+ #include "fbsd-nat.h"
+ #include "amd64-tdep.h"
+ #include "amd64-nat.h"
+-#include "amd64bsd-nat.h"
++#include "x86bsd-nat.h"
+ #include "x86-nat.h"
+
+
+@@ -140,17 +140,6 @@ amd64fbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
+ }
+
+
+-static void (*super_mourn_inferior) (struct target_ops *ops);
+-
+-static void
+-amd64fbsd_mourn_inferior (struct target_ops *ops)
+-{
+-#ifdef HAVE_PT_GETDBREGS
+- x86_cleanup_dregs ();
+-#endif
+- super_mourn_inferior (ops);
+-}
+-
+ /* Implement the to_read_description method. */
+
+ static const struct target_desc *
+@@ -175,13 +164,13 @@ amd64fbsd_read_description (struct target_ops *ops)
+ if (ptrace (PT_GETXSTATE_INFO, ptid_get_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) &info, sizeof (info)) == 0)
+ {
+- amd64bsd_xsave_len = info.xsave_len;
++ x86bsd_xsave_len = info.xsave_len;
+ xcr0 = info.xsave_mask;
+ }
+ xsave_probed = 1;
+ }
+
+- if (amd64bsd_xsave_len != 0)
++ if (x86bsd_xsave_len != 0)
+ {
+ if (is64)
+ return amd64_target_description (xcr0);
+@@ -209,22 +198,6 @@ _initialize_amd64fbsd_nat (void)
+
+ /* Add some extra features to the common *BSD/i386 target. */
+ t = amd64bsd_target ();
+-
+-#ifdef HAVE_PT_GETDBREGS
+-
+- x86_use_watchpoints (t);
+-
+- x86_dr_low.set_control = amd64bsd_dr_set_control;
+- x86_dr_low.set_addr = amd64bsd_dr_set_addr;
+- x86_dr_low.get_addr = amd64bsd_dr_get_addr;
+- x86_dr_low.get_status = amd64bsd_dr_get_status;
+- x86_dr_low.get_control = amd64bsd_dr_get_control;
+- x86_set_debug_register_length (8);
+-
+-#endif /* HAVE_PT_GETDBREGS */
+-
+- super_mourn_inferior = t->to_mourn_inferior;
+- t->to_mourn_inferior = amd64fbsd_mourn_inferior;
+ t->to_read_description = amd64fbsd_read_description;
+
+ fbsd_nat_add_target (t);
+diff --git gdb/config/i386/fbsd.mh gdb/config/i386/fbsd.mh
+index e5bff3a..1db6660 100644
+--- gdb/config/i386/fbsd.mh
++++ gdb/config/i386/fbsd.mh
+@@ -1,7 +1,7 @@
+ # Host: FreeBSD/i386
+ NATDEPFILES= fork-child.o inf-ptrace.o \
+- fbsd-nat.o x86-nat.o x86-dregs.o i386bsd-nat.o i386fbsd-nat.o \
+- bsd-kvm.o
++ fbsd-nat.o x86-nat.o x86-dregs.o x86bsd-nat.o i386bsd-nat.o \
++ i386fbsd-nat.o bsd-kvm.o
+ NAT_FILE= nm-fbsd.h
+ HAVE_NATIVE_GCORE_HOST = 1
+
+diff --git gdb/config/i386/fbsd64.mh gdb/config/i386/fbsd64.mh
+index 329c526..e196c00 100644
+--- gdb/config/i386/fbsd64.mh
++++ gdb/config/i386/fbsd64.mh
+@@ -1,7 +1,7 @@
+ # Host: FreeBSD/amd64
+ NATDEPFILES= fork-child.o inf-ptrace.o \
+ fbsd-nat.o amd64-nat.o amd64bsd-nat.o amd64fbsd-nat.o \
+- bsd-kvm.o x86-nat.o x86-dregs.o
++ bsd-kvm.o x86-nat.o x86-dregs.o x86bsd-nat.o
+ HAVE_NATIVE_GCORE_HOST = 1
+
+ LOADLIBES= -lkvm
+diff --git gdb/config/i386/nbsd64.mh gdb/config/i386/nbsd64.mh
+index 5de8cf5..5fa369f 100644
+--- gdb/config/i386/nbsd64.mh
++++ gdb/config/i386/nbsd64.mh
+@@ -1,3 +1,3 @@
+ # Host: NetBSD/amd64
+ NATDEPFILES= fork-child.o inf-ptrace.o \
+- nbsd-nat.o amd64-nat.o amd64bsd-nat.o amd64nbsd-nat.o
++ nbsd-nat.o amd64-nat.o x86bsd-nat.o amd64bsd-nat.o amd64nbsd-nat.o
+diff --git gdb/config/i386/nbsdelf.mh gdb/config/i386/nbsdelf.mh
+index d27c842..f8b9d6c 100644
+--- gdb/config/i386/nbsdelf.mh
++++ gdb/config/i386/nbsdelf.mh
+@@ -1,5 +1,5 @@
+ # Host: NetBSD/i386 ELF
+ NATDEPFILES= fork-child.o inf-ptrace.o \
+- nbsd-nat.o i386bsd-nat.o i386nbsd-nat.o bsd-kvm.o
++ nbsd-nat.o x86bsd-nat.o i386bsd-nat.o i386nbsd-nat.o bsd-kvm.o
+
+ LOADLIBES= -lkvm
+diff --git gdb/config/i386/obsd.mh gdb/config/i386/obsd.mh
+index a9041f4..3845d26 100644
+--- gdb/config/i386/obsd.mh
++++ gdb/config/i386/obsd.mh
+@@ -1,5 +1,5 @@
+ # Host: OpenBSD/i386 ELF
+ NATDEPFILES= fork-child.o inf-ptrace.o obsd-nat.o \
+- i386bsd-nat.o i386obsd-nat.o bsd-kvm.o
++ x86bsd-nat.o i386bsd-nat.o i386obsd-nat.o bsd-kvm.o
+
+ LOADLIBES= -lkvm
+diff --git gdb/config/i386/obsd64.mh gdb/config/i386/obsd64.mh
+index 386a582..2a8c42c 100644
+--- gdb/config/i386/obsd64.mh
++++ gdb/config/i386/obsd64.mh
+@@ -1,5 +1,5 @@
+ # Host: OpenBSD/amd64
+ NATDEPFILES= fork-child.o inf-ptrace.o obsd-nat.o \
+- amd64-nat.o amd64bsd-nat.o amd64obsd-nat.o bsd-kvm.o
++ amd64-nat.o x86bsd-nat.o amd64bsd-nat.o amd64obsd-nat.o bsd-kvm.o
+
+ LOADLIBES= -lkvm
+diff --git gdb/i386bsd-nat.c gdb/i386bsd-nat.c
+index f5f4a0f..b6b143b 100644
+--- gdb/i386bsd-nat.c
++++ gdb/i386bsd-nat.c
+@@ -29,6 +29,7 @@
+
+ #include "i386-tdep.h"
+ #include "i387-tdep.h"
++#include "x86bsd-nat.h"
+ #include "i386bsd-nat.h"
+ #include "inf-ptrace.h"
+
+@@ -81,10 +82,6 @@ static int i386bsd_r_reg_offset[] =
+ so that we try PT_GETXMMREGS the first time around. */
+ static int have_ptrace_xmmregs = -1;
+ #endif
+-
+-#ifdef PT_GETXSTATE_INFO
+-size_t i386bsd_xsave_len;
+-#endif
+
+
+ /* Supply the general-purpose registers in GREGS, to REGCACHE. */
+@@ -155,11 +152,11 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops,
+ #endif
+
+ #ifdef PT_GETXSTATE_INFO
+- if (i386bsd_xsave_len != 0)
++ if (x86bsd_xsave_len != 0)
+ {
+ void *xstateregs;
+
+- xstateregs = alloca (i386bsd_xsave_len);
++ xstateregs = alloca (x86bsd_xsave_len);
+ if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) xstateregs, 0) == -1)
+ perror_with_name (_("Couldn't get extended state status"));
+@@ -225,11 +222,11 @@ i386bsd_store_inferior_registers (struct target_ops *ops,
+ #endif
+
+ #ifdef PT_GETXSTATE_INFO
+- if (i386bsd_xsave_len != 0)
++ if (x86bsd_xsave_len != 0)
+ {
+ void *xstateregs;
+
+- xstateregs = alloca (i386bsd_xsave_len);
++ xstateregs = alloca (x86bsd_xsave_len);
+ if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) xstateregs, 0) == -1)
+ perror_with_name (_("Couldn't get extended state status"));
+@@ -237,7 +234,7 @@ i386bsd_store_inferior_registers (struct target_ops *ops,
+ i387_collect_xsave (regcache, -1, xstateregs, 0);
+
+ if (ptrace (PT_SETXSTATE, get_ptrace_pid (inferior_ptid),
+- (PTRACE_TYPE_ARG3) xstateregs, i386bsd_xsave_len) == -1)
++ (PTRACE_TYPE_ARG3) xstateregs, x86bsd_xsave_len) == -1)
+ perror_with_name (_("Couldn't write extended state status"));
+ return;
+ }
+@@ -283,91 +280,13 @@ i386bsd_target (void)
+ {
+ struct target_ops *t;
+
+- t = inf_ptrace_target ();
++ t = x86bsd_target ();
+ t->to_fetch_registers = i386bsd_fetch_inferior_registers;
+ t->to_store_registers = i386bsd_store_inferior_registers;
+ return t;
+ }
+
+
+-/* Support for debug registers. */
+-
+-#ifdef HAVE_PT_GETDBREGS
+-
+-/* Not all versions of FreeBSD/i386 that support the debug registers
+- have this macro. */
+-#ifndef DBREG_DRX
+-#define DBREG_DRX(d, x) ((&d->dr0)[x])
+-#endif
+-
+-static unsigned long
+-i386bsd_dr_get (ptid_t ptid, int regnum)
+-{
+- struct dbreg dbregs;
+-
+- if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid),
+- (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+- perror_with_name (_("Couldn't read debug registers"));
+-
+- return DBREG_DRX ((&dbregs), regnum);
+-}
+-
+-static void
+-i386bsd_dr_set (int regnum, unsigned int value)
+-{
+- struct dbreg dbregs;
+-
+- if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid),
+- (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+- perror_with_name (_("Couldn't get debug registers"));
+-
+- /* For some mysterious reason, some of the reserved bits in the
+- debug control register get set. Mask these off, otherwise the
+- ptrace call below will fail. */
+- DBREG_DRX ((&dbregs), 7) &= ~(0x0000fc00);
+-
+- DBREG_DRX ((&dbregs), regnum) = value;
+-
+- if (ptrace (PT_SETDBREGS, get_ptrace_pid (inferior_ptid),
+- (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
+- perror_with_name (_("Couldn't write debug registers"));
+-}
+-
+-void
+-i386bsd_dr_set_control (unsigned long control)
+-{
+- i386bsd_dr_set (7, control);
+-}
+-
+-void
+-i386bsd_dr_set_addr (int regnum, CORE_ADDR addr)
+-{
+- gdb_assert (regnum >= 0 && regnum <= 4);
+-
+- i386bsd_dr_set (regnum, addr);
+-}
+-
+-CORE_ADDR
+-i386bsd_dr_get_addr (int regnum)
+-{
+- return i386bsd_dr_get (inferior_ptid, regnum);
+-}
+-
+-unsigned long
+-i386bsd_dr_get_status (void)
+-{
+- return i386bsd_dr_get (inferior_ptid, 6);
+-}
+-
+-unsigned long
+-i386bsd_dr_get_control (void)
+-{
+- return i386bsd_dr_get (inferior_ptid, 7);
+-}
+-
+-#endif /* PT_GETDBREGS */
+-
+-
+ /* Provide a prototype to silence -Wmissing-prototypes. */
+ void _initialize_i386bsd_nat (void);
+
+diff --git gdb/i386bsd-nat.h gdb/i386bsd-nat.h
+index 78ea551..1b51d19 100644
+--- gdb/i386bsd-nat.h
++++ gdb/i386bsd-nat.h
+@@ -25,19 +25,4 @@
+
+ extern struct target_ops *i386bsd_target (void);
+
+-/* Low level i386 XSAVE info. */
+-extern size_t i386bsd_xsave_len;
+-
+-/* low level i386 debug register functions used in i386fbsd-nat.c. */
+-
+-extern void i386bsd_dr_set_control (unsigned long control);
+-
+-extern void i386bsd_dr_set_addr (int regnum, CORE_ADDR addr);
+-
+-extern CORE_ADDR i386bsd_dr_get_addr (int regnum);
+-
+-extern unsigned long i386bsd_dr_get_status (void);
+-
+-extern unsigned long i386bsd_dr_get_control (void);
+-
+ #endif /* i386bsd-nat.h */
+diff --git gdb/i386fbsd-nat.c gdb/i386fbsd-nat.c
+index 7d371a6..716b513 100644
+--- gdb/i386fbsd-nat.c
++++ gdb/i386fbsd-nat.c
+@@ -30,6 +30,7 @@
+ #include "fbsd-nat.h"
+ #include "i386-tdep.h"
+ #include "x86-nat.h"
++#include "x86bsd-nat.h"
+ #include "i386bsd-nat.h"
+
+ /* Resume execution of the inferior process. If STEP is nonzero,
+@@ -132,13 +133,13 @@ i386fbsd_read_description (struct target_ops *ops)
+ if (ptrace (PT_GETXSTATE_INFO, ptid_get_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) &info, sizeof (info)) == 0)
+ {
+- i386bsd_xsave_len = info.xsave_len;
++ x86bsd_xsave_len = info.xsave_len;
+ xcr0 = info.xsave_mask;
+ }
+ xsave_probed = 1;
+ }
+
+- if (i386bsd_xsave_len != 0)
++ if (x86bsd_xsave_len != 0)
+ {
+ return i386_target_description (xcr0);
+ }
+@@ -158,19 +159,6 @@ _initialize_i386fbsd_nat (void)
+ /* Add some extra features to the common *BSD/i386 target. */
+ t = i386bsd_target ();
+
+-#ifdef HAVE_PT_GETDBREGS
+-
+- x86_use_watchpoints (t);
+-
+- x86_dr_low.set_control = i386bsd_dr_set_control;
+- x86_dr_low.set_addr = i386bsd_dr_set_addr;
+- x86_dr_low.get_addr = i386bsd_dr_get_addr;
+- x86_dr_low.get_status = i386bsd_dr_get_status;
+- x86_dr_low.get_control = i386bsd_dr_get_control;
+- x86_set_debug_register_length (4);
+-
+-#endif /* HAVE_PT_GETDBREGS */
+-
+ #ifdef PT_GETXSTATE_INFO
+ t->to_read_description = i386fbsd_read_description;
+ #endif
+diff --git gdb/x86bsd-nat.c gdb/x86bsd-nat.c
+new file mode 100644
+index 0000000..0c56848
+--- /dev/null
++++ gdb/x86bsd-nat.c
+@@ -0,0 +1,150 @@
++/* Native-dependent code for X86 BSD's.
++
++ Copyright (C) 2003-2016 Free Software Foundation, Inc.
++
++ This file is part of GDB.
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 3 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program. If not, see <http://www.gnu.org/licenses/>. */
++
++#include "defs.h"
++#include "inferior.h"
++
++/* We include <signal.h> to make sure `struct fxsave64' is defined on
++ NetBSD, since NetBSD's <machine/reg.h> needs it. */
++#include <signal.h>
++#include <sys/types.h>
++#include <sys/ptrace.h>
++#include <machine/reg.h>
++
++#include "x86-nat.h"
++#include "x86bsd-nat.h"
++#include "inf-ptrace.h"
++
++
++#ifdef PT_GETXSTATE_INFO
++size_t x86bsd_xsave_len;
++#endif
++
++/* Support for debug registers. */
++
++#ifdef HAVE_PT_GETDBREGS
++static void (*super_mourn_inferior) (struct target_ops *ops);
++
++/* Implement the "to_mourn_inferior" target_ops method. */
++
++static void
++x86bsd_mourn_inferior (struct target_ops *ops)
++{
++ x86_cleanup_dregs ();
++ super_mourn_inferior (ops);
++}
++
++/* Not all versions of FreeBSD/i386 that support the debug registers
++ have this macro. */
++#ifndef DBREG_DRX
++#define DBREG_DRX(d, x) ((&d->dr0)[x])
++#endif
++
++static unsigned long
++x86bsd_dr_get (ptid_t ptid, int regnum)
++{
++ struct dbreg dbregs;
++
++ if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid),
++ (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
++ perror_with_name (_("Couldn't read debug registers"));
++
++ return DBREG_DRX ((&dbregs), regnum);
++}
++
++static void
++x86bsd_dr_set (int regnum, unsigned long value)
++{
++ struct dbreg dbregs;
++
++ if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid),
++ (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
++ perror_with_name (_("Couldn't get debug registers"));
++
++ /* For some mysterious reason, some of the reserved bits in the
++ debug control register get set. Mask these off, otherwise the
++ ptrace call below will fail. */
++ DBREG_DRX ((&dbregs), 7) &= ~(0xffffffff0000fc00);
++
++ DBREG_DRX ((&dbregs), regnum) = value;
++
++ if (ptrace (PT_SETDBREGS, get_ptrace_pid (inferior_ptid),
++ (PTRACE_TYPE_ARG3) &dbregs, 0) == -1)
++ perror_with_name (_("Couldn't write debug registers"));
++}
++
++static void
++x86bsd_dr_set_control (unsigned long control)
++{
++ x86bsd_dr_set (7, control);
++}
++
++static void
++x86bsd_dr_set_addr (int regnum, CORE_ADDR addr)
++{
++ gdb_assert (regnum >= 0 && regnum <= 4);
++
++ x86bsd_dr_set (regnum, addr);
++}
++
++static CORE_ADDR
++x86bsd_dr_get_addr (int regnum)
++{
++ return x86bsd_dr_get (inferior_ptid, regnum);
++}
++
++static unsigned long
++x86bsd_dr_get_status (void)
++{
++ return x86bsd_dr_get (inferior_ptid, 6);
++}
++
++static unsigned long
++x86bsd_dr_get_control (void)
++{
++ return x86bsd_dr_get (inferior_ptid, 7);
++}
++
++#endif /* PT_GETDBREGS */
++
++/* Create a prototype *BSD/x86 target. The client can override it
++ with local methods. */
++
++struct target_ops *
++x86bsd_target (void)
++{
++ struct target_ops *t;
++
++ t = inf_ptrace_target ();
++
++#ifdef HAVE_PT_GETDBREGS
++ x86_use_watchpoints (t);
++
++ x86_dr_low.set_control = x86bsd_dr_set_control;
++ x86_dr_low.set_addr = x86bsd_dr_set_addr;
++ x86_dr_low.get_addr = x86bsd_dr_get_addr;
++ x86_dr_low.get_status = x86bsd_dr_get_status;
++ x86_dr_low.get_control = x86bsd_dr_get_control;
++ x86_set_debug_register_length (sizeof (void *));
++ super_mourn_inferior = t->to_mourn_inferior;
++ t->to_mourn_inferior = x86bsd_mourn_inferior;
++#endif /* HAVE_PT_GETDBREGS */
++
++ return t;
++}
+diff --git gdb/x86bsd-nat.h gdb/x86bsd-nat.h
+new file mode 100644
+index 0000000..6d39697
+--- /dev/null
++++ gdb/x86bsd-nat.h
+@@ -0,0 +1,31 @@
++/* Native-dependent code for x86 BSD's.
++
++ Copyright (C) 2011-2016 Free Software Foundation, Inc.
++
++ This file is part of GDB.
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 3 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program. If not, see <http://www.gnu.org/licenses/>. */
++
++#ifndef X86BSD_NAT_H
++#define X86BSD_NAT_H
++
++/* Low level x86 XSAVE info. */
++extern size_t x86bsd_xsave_len;
++
++/* Create a prototype *BSD/x86 target. The client can override it
++ with local methods. */
++
++extern struct target_ops *x86bsd_target (void);
++
++#endif /* x86bsd-nat.h */
diff --git a/devel/gdb/files/commit-aa1ed4a b/devel/gdb/files/commit-aa1ed4a
new file mode 100644
index 000000000000..ef845e4a9b51
--- /dev/null
+++ b/devel/gdb/files/commit-aa1ed4a
@@ -0,0 +1,191 @@
+commit aa1ed4a93a2eb0fb90d274c15288f3aad1791f60
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Sun Jun 12 08:56:31 2016 -0700
+
+ Add elfcore_grok_freebsd_note to parse FreeBSD ELF core notes.
+
+ Move parsing of FreeBSD-specific ELF core notes out of elfcore_grok_note
+ into a new elfcore_grok_freebsd_note function. Add core note grok routines
+ for FreeBSD's psinfo and prstatus notes while here rather than depending
+ on the native handling in elfcore_grok_note.
+
+ bfd/ChangeLog:
+
+ * elf.c (elfcore_grok_note): Remove handling of NT_X86_XSTATE for
+ FreeBSD. Remove case for NT_FREEBSD_THRMISC.
+ (elfcore_grok_freebsd_psinfo): New function.
+ (elfcore_grok_freebsd_prstatus): New function.
+ (elfcore_grok_freebsd_note): New function.
+ (elf_parse_notes): Use "elfcore_grok_freebsd_note" for "FreeBSD"
+ notes.
+
+diff --git bfd/elf.c bfd/elf.c
+index aaf2b53..cfcafaa 100644
+--- bfd/elf.c
++++ bfd/elf.c
+@@ -9327,9 +9327,6 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
+ if (note->namesz == 6
+ && strcmp (note->namedata, "LINUX") == 0)
+ return elfcore_grok_xstatereg (abfd, note);
+- else if (note->namesz == 8
+- && strcmp (note->namedata, "FreeBSD") == 0)
+- return elfcore_grok_xstatereg (abfd, note);
+ else
+ return TRUE;
+
+@@ -9485,12 +9482,6 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
+ return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.siginfo",
+ note);
+
+- case NT_FREEBSD_THRMISC:
+- if (note->namesz == 8
+- && strcmp (note->namedata, "FreeBSD") == 0)
+- return elfcore_make_note_pseudosection (abfd, ".thrmisc", note);
+- else
+- return TRUE;
+ }
+ }
+
+@@ -9556,6 +9547,134 @@ elfobj_grok_stapsdt_note (bfd *abfd, Elf_Internal_Note *note)
+ }
+
+ static bfd_boolean
++elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note)
++{
++ size_t offset;
++
++ /* Check for version 1 in pr_version. */
++ if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
++ return FALSE;
++ offset = 4;
++
++ /* Skip over pr_psinfosz. */
++ switch (abfd->arch_info->bits_per_word)
++ {
++ case 32:
++ offset += 4;
++ break;
++
++ case 64:
++ offset += 4; /* Padding before pr_psinfosz. */
++ offset += 8;
++ break;
++
++ default:
++ return FALSE;
++ }
++
++ /* pr_fname is PRFNAMESZ (16) + 1 bytes in size. */
++ elf_tdata (abfd)->core->program
++ = _bfd_elfcore_strndup (abfd, note->descdata + offset, 17);
++ offset += 17;
++
++ /* pr_psargs is PRARGSZ (80) + 1 bytes in size. */
++ elf_tdata (abfd)->core->command
++ = _bfd_elfcore_strndup (abfd, note->descdata + offset, 81);
++
++ return TRUE;
++}
++
++static bfd_boolean
++elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
++{
++ size_t offset;
++ size_t size;
++
++ /* Check for version 1 in pr_version. */
++ if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
++ return FALSE;
++ offset = 4;
++
++ /* Skip over pr_statussz. */
++ switch (abfd->arch_info->bits_per_word)
++ {
++ case 32:
++ offset += 4;
++ break;
++
++ case 64:
++ offset += 4; /* Padding before pr_statussz. */
++ offset += 8;
++ break;
++
++ default:
++ return FALSE;
++ }
++
++ /* Extract size of pr_reg from pr_gregsetsz. */
++ if (abfd->arch_info->bits_per_word == 32)
++ size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
++ else
++ size = bfd_h_get_64 (abfd, (bfd_byte *) note->descdata + offset);
++
++ /* Skip over pr_gregsetsz and pr_fpregsetsz. */
++ offset += (abfd->arch_info->bits_per_word / 8) * 2;
++
++ /* Skip over pr_osreldate. */
++ offset += 4;
++
++ /* Read signal from pr_cursig. */
++ if (elf_tdata (abfd)->core->signal == 0)
++ elf_tdata (abfd)->core->signal
++ = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
++ offset += 4;
++
++ /* Read TID from pr_pid. */
++ elf_tdata (abfd)->core->lwpid
++ = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
++ offset += 4;
++
++ /* Padding before pr_reg. */
++ if (abfd->arch_info->bits_per_word == 64)
++ offset += 4;
++
++ /* Make a ".reg/999" section and a ".reg" section. */
++ return _bfd_elfcore_make_pseudosection (abfd, ".reg",
++ size, note->descpos + offset);
++}
++
++static bfd_boolean
++elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note)
++{
++ switch (note->type)
++ {
++ case NT_PRSTATUS:
++ return elfcore_grok_freebsd_prstatus (abfd, note);
++
++ case NT_FPREGSET:
++ return elfcore_grok_prfpreg (abfd, note);
++
++ case NT_PRPSINFO:
++ return elfcore_grok_freebsd_psinfo (abfd, note);
++
++ case NT_FREEBSD_THRMISC:
++ if (note->namesz == 8)
++ return elfcore_make_note_pseudosection (abfd, ".thrmisc", note);
++ else
++ return TRUE;
++
++ case NT_X86_XSTATE:
++ if (note->namesz == 8)
++ return elfcore_grok_xstatereg (abfd, note);
++ else
++ return TRUE;
++
++ default:
++ return TRUE;
++ }
++}
++
++static bfd_boolean
+ elfcore_netbsd_get_lwpid (Elf_Internal_Note *note, int *lwpidp)
+ {
+ char *cp;
+@@ -10467,6 +10586,7 @@ elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset)
+ grokers[] =
+ {
+ GROKER_ELEMENT ("", elfcore_grok_note),
++ GROKER_ELEMENT ("FreeBSD", elfcore_grok_freebsd_note),
+ GROKER_ELEMENT ("NetBSD-CORE", elfcore_grok_netbsd_note),
+ GROKER_ELEMENT ( "OpenBSD", elfcore_grok_openbsd_note),
+ GROKER_ELEMENT ("QNX", elfcore_grok_nto_note),
diff --git a/devel/gdb/files/commit-b00f86d b/devel/gdb/files/commit-b00f86d
new file mode 100644
index 000000000000..d38125d37423
--- /dev/null
+++ b/devel/gdb/files/commit-b00f86d
@@ -0,0 +1,34 @@
+commit b00f86d0720d2cf44f3edb6101682074da1abe5d
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Wed Jun 15 22:44:11 2016 -0700
+
+ Add constants for FreeBSD-specific auxiliary vector entry types.
+
+ include/ChangeLog:
+
+ * elf/common.h (AT_FREEBSD_EXECPATH, AT_FREEBSD_CANARY)
+ (AT_FREEBSD_CANARYLEN, AT_FREEBSD_OSRELDATE, AT_FREEBSD_NCPUS)
+ (AT_FREEBSD_PAGESIZES, AT_FREEBSD_PAGESIZESLEN)
+ (AT_FREEBSD_TIMEKEEP, AT_FREEBSD_STACKPROT): Define.
+
+diff --git include/elf/common.h include/elf/common.h
+index 087d876..d2da009d 100644
+--- include/elf/common.h
++++ include/elf/common.h
+@@ -1012,6 +1012,16 @@
+ #define AT_L2_CACHESHAPE 36
+ #define AT_L3_CACHESHAPE 37
+
++#define AT_FREEBSD_EXECPATH 15 /* Path to the executable. */
++#define AT_FREEBSD_CANARY 16 /* Canary for SSP. */
++#define AT_FREEBSD_CANARYLEN 17 /* Length of the canary. */
++#define AT_FREEBSD_OSRELDATE 18 /* OSRELDATE. */
++#define AT_FREEBSD_NCPUS 19 /* Number of CPUs. */
++#define AT_FREEBSD_PAGESIZES 20 /* Pagesizes. */
++#define AT_FREEBSD_PAGESIZESLEN 21 /* Number of pagesizes. */
++#define AT_FREEBSD_TIMEKEEP 22 /* Pointer to timehands. */
++#define AT_FREEBSD_STACKPROT 23 /* Initial stack protection. */
++
+ #define AT_SUN_UID 2000 /* Effective user ID. */
+ #define AT_SUN_RUID 2001 /* Real user ID. */
+ #define AT_SUN_GID 2002 /* Effective group ID. */
diff --git a/devel/gdb/files/commit-bb2a62e b/devel/gdb/files/commit-bb2a62e
new file mode 100644
index 000000000000..641d2e22f1bb
--- /dev/null
+++ b/devel/gdb/files/commit-bb2a62e
@@ -0,0 +1,27 @@
+commit bb2a62e694953c099c41d49f59947d3d91cc7c27
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Fri Jun 24 18:24:21 2016 -0700
+
+ Honor detach-on-fork on FreeBSD.
+
+ Only detach from the new child process in the follow fork callback
+ if detach_fork is true.
+
+ gdb/ChangeLog:
+
+ * fbsd-nat.c (fbsd_follow_fork): Only detach child if
+ "detach_fork" is true.
+
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index c9548e9..0999712 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -826,7 +826,7 @@ static int
+ fbsd_follow_fork (struct target_ops *ops, int follow_child,
+ int detach_fork)
+ {
+- if (!follow_child)
++ if (!follow_child && detach_fork)
+ {
+ struct thread_info *tp = inferior_thread ();
+ pid_t child_pid = ptid_get_pid (tp->pending_follow.value.related_pid);
diff --git a/devel/gdb/files/commit-e6cdd38 b/devel/gdb/files/commit-e6cdd38
new file mode 100644
index 000000000000..313f3b37d469
--- /dev/null
+++ b/devel/gdb/files/commit-e6cdd38
@@ -0,0 +1,644 @@
+commit e6cdd38e8f0fead14cd3c528e9a4b666e1871752
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Sun Jun 12 21:24:42 2016 -0700
+
+ Add support for catching system calls to native FreeBSD targets.
+
+ All platforms on FreeBSD use a shared system call table, so use a
+ single XML file to describe the system calls available on each FreeBSD
+ platform.
+
+ Recent versions of FreeBSD include the identifier of the current
+ system call when reporting a system call entry or exit event in the
+ ptrace_lwpinfo structure obtained via PT_LWPINFO in fbsd_wait. As
+ such, FreeBSD native targets do not use the gdbarch method to fetch
+ the system call code. In addition, FreeBSD register sets fetched via
+ ptrace do not include an equivalent of 'orig_rax' (on amd64 for
+ example), so the system call code cannot be extracted from the
+ available registers during a system call exit. However, GDB assumes
+ that system call catch points are not supported if the gdbarch method
+ is not present. As a workaround, FreeBSD ABIs install a dummy gdbarch
+ method that throws an internal_error if it is ever invoked.
+
+ gdb/ChangeLog:
+
+ * configure.ac: Check for support for system call LWP fields on
+ FreeBSD.
+ * config.in, configure: Rebuild.
+ * data-directory/Makefile.in (SYSCALLS_FILES): Add freebsd.xml.
+ * fbsd-nat.c (fbsd_wait) [HAVE_STRUCT_PTRACE_LWPINFO_PL_SYSCALL_CODE]:
+ Report system call events.
+ [HAVE_STRUCT_PTRACE_LWPINFO_PL_SYSCALL_CODE]
+ (fbsd_set_syscall_catchpoint): New function.
+ (fbsd_nat_add_target) [HAVE_STRUCT_PTRACE_LWPINFO_PL_SYSCALL_CODE]:
+ Set "to_set_syscall_catchpoint" to "fbsd_set_syscall_catchpoint".
+ * fbsd-tdep.c: Include xml-syscall.h
+ (fbsd_get_syscall_number): New function.
+ (fbsd_init_abi): Set XML system call file name.
+ Add "get_syscall_number" gdbarch method.
+ * syscalls/freebsd.xml: New file.
+
+diff --git gdb/config.in gdb/config.in
+index 905caf0..c82a5b4 100644
+--- gdb/config.in
++++ gdb/config.in
+@@ -456,6 +456,9 @@
+ /* Define to 1 if `struct ptrace_lwpinfo' is a member of `pl_tdname'. */
+ #undef HAVE_STRUCT_PTRACE_LWPINFO_PL_TDNAME
+
++/* Define to 1 if `struct ptrace_lwpinfo' is a member of `pl_syscall_code'. */
++#undef HAVE_STRUCT_PTRACE_LWPINFO_PL_SYSCALL_CODE
++
+ /* Define to 1 if your system has struct reg in <machine/reg.h>. */
+ #undef HAVE_STRUCT_REG
+
+diff --git gdb/configure gdb/configure
+index 60ea884..ea11b50 100755
+--- gdb/configure
++++ gdb/configure
+@@ -12927,6 +12927,20 @@ _ACEOF
+ fi
+
+
++# See if <sys/ptrace.h> supports syscall fields on FreeBSD. The
++# pl_syscall_code member of `struct ptrace_lwpinfo' was added in
++# FreeBSD 10.3.
++ac_fn_c_check_member "$LINENO" "struct ptrace_lwpinfo" "pl_syscall_code" "ac_cv_member_struct_ptrace_lwpinfo_pl_syscall_code" "#include <sys/ptrace.h>
++"
++if test "x$ac_cv_member_struct_ptrace_lwpinfo_pl_syscall_code" = x""yes; then :
++
++cat >>confdefs.h <<_ACEOF
++#define HAVE_STRUCT_PTRACE_LWPINFO_PL_SYSCALL_CODE 1
++_ACEOF
++
++
++fi
++
+
+ # Detect which type of /proc is in use, such as for Solaris.
+
+diff --git gdb/configure.ac gdb/configure.ac
+index 6a72f72..920c228 100644
+--- gdb/configure.ac
++++ gdb/configure.ac
+@@ -1526,6 +1526,11 @@ fi
+ AC_CHECK_MEMBERS([struct ptrace_lwpinfo.pl_tdname], [], [],
+ [#include <sys/ptrace.h>])
+
++# See if <sys/ptrace.h> supports syscall fields on FreeBSD. The
++# pl_syscall_code member of `struct ptrace_lwpinfo' was added in
++# FreeBSD 10.3.
++AC_CHECK_MEMBERS([struct ptrace_lwpinfo.pl_syscall_code], [], [],
++ [#include <sys/ptrace.h>])
+
+ # Detect which type of /proc is in use, such as for Solaris.
+
+diff --git gdb/data-directory/Makefile.in gdb/data-directory/Makefile.in
+index c05f379..0beca55 100644
+--- gdb/data-directory/Makefile.in
++++ gdb/data-directory/Makefile.in
+@@ -51,7 +51,8 @@ SYSCALLS_FILES = \
+ i386-linux.xml amd64-linux.xml \
+ sparc-linux.xml sparc64-linux.xml \
+ mips-o32-linux.xml mips-n32-linux.xml mips-n64-linux.xml \
+- s390-linux.xml s390x-linux.xml
++ s390-linux.xml s390x-linux.xml \
++ freebsd.xml
+
+ PYTHON_DIR = python
+ PYTHON_INSTALL_DIR = $(DESTDIR)$(GDB_DATADIR)/$(PYTHON_DIR)
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index dc65e29..c9548e9 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -779,6 +779,40 @@ fbsd_wait (struct target_ops *ops,
+ 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
++ call will report this flag as part of their event. Stops
++ explicitly for system call entry and exit always use
++ SIGTRAP, so only treat SIGTRAP events as system call
++ entry/exit events. */
++ if (pl.pl_flags & (PL_FLAG_SCE | PL_FLAG_SCX)
++ && ourstatus->value.sig == SIGTRAP)
++ {
++#ifdef HAVE_STRUCT_PTRACE_LWPINFO_PL_SYSCALL_CODE
++ if (catch_syscall_enabled ())
++ {
++ if (catching_syscall_number (pl.pl_syscall_code))
++ {
++ if (pl.pl_flags & PL_FLAG_SCE)
++ ourstatus->kind = TARGET_WAITKIND_SYSCALL_ENTRY;
++ else
++ ourstatus->kind = TARGET_WAITKIND_SYSCALL_RETURN;
++ ourstatus->value.syscall_number = pl.pl_syscall_code;
++ return wptid;
++ }
++ }
++#endif
++ /* If the core isn't interested in this event, just
++ continue the process explicitly and wait for another
++ event. Note that PT_SYSCALL is "sticky" on FreeBSD
++ and once system call stops are enabled on a process
++ it stops for all system call entries and exits. */
++ if (ptrace (PT_CONTINUE, pid, (caddr_t) 1, 0) == -1)
++ perror_with_name (("ptrace"));
++ continue;
++ }
+ }
+ return wptid;
+ }
+@@ -889,6 +923,19 @@ fbsd_remove_exec_catchpoint (struct target_ops *self, int pid)
+ return 0;
+ }
+ #endif
++
++#ifdef HAVE_STRUCT_PTRACE_LWPINFO_PL_SYSCALL_CODE
++static int
++fbsd_set_syscall_catchpoint (struct target_ops *self, int pid, int needed,
++ int any_count, int table_size, int *table)
++{
++
++ /* Ignore the arguments. inf-ptrace.c will use PT_SYSCALL which
++ will catch all system call entries and exits. The system calls
++ are filtered by GDB rather than the kernel. */
++ return 0;
++}
++#endif
+ #endif
+
+ void
+@@ -925,6 +972,9 @@ fbsd_nat_add_target (struct target_ops *t)
+ t->to_insert_exec_catchpoint = fbsd_insert_exec_catchpoint;
+ t->to_remove_exec_catchpoint = fbsd_remove_exec_catchpoint;
+ #endif
++#ifdef HAVE_STRUCT_PTRACE_LWPINFO_PL_SYSCALL_CODE
++ t->to_set_syscall_catchpoint = fbsd_set_syscall_catchpoint;
++#endif
+ #endif
+ add_target (t);
+ }
+diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c
+index e8f8605..4329f97 100644
+--- gdb/fbsd-tdep.c
++++ gdb/fbsd-tdep.c
+@@ -24,6 +24,7 @@
+ #include "regcache.h"
+ #include "regset.h"
+ #include "gdbthread.h"
++#include "xml-syscall.h"
+
+ #include "elf-bfd.h"
+ #include "fbsd-tdep.h"
+@@ -317,6 +318,22 @@ fbsd_print_auxv_entry (struct gdbarch *gdbarch, struct ui_file *file,
+ fprint_auxv_entry (file, name, description, format, type, val);
+ }
+
++/* Implement the "get_syscall_number" gdbarch method. */
++
++static LONGEST
++fbsd_get_syscall_number (struct gdbarch *gdbarch,
++ ptid_t ptid)
++{
++
++ /* FreeBSD doesn't use gdbarch_get_syscall_number since FreeBSD
++ native targets fetch the system call number from the
++ 'pl_syscall_code' member of struct ptrace_lwpinfo in fbsd_wait.
++ However, system call catching requires this function to be
++ set. */
++
++ internal_error (__FILE__, __LINE__, _("fbsd_get_sycall_number called"));
++}
++
+ /* To be called from GDB_OSABI_FREEBSD_ELF handlers. */
+
+ void
+@@ -326,4 +343,8 @@ fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+ set_gdbarch_core_thread_name (gdbarch, fbsd_core_thread_name);
+ set_gdbarch_make_corefile_notes (gdbarch, fbsd_make_corefile_notes);
+ set_gdbarch_print_auxv_entry (gdbarch, fbsd_print_auxv_entry);
++
++ /* `catch syscall' */
++ set_xml_syscall_file_name (gdbarch, "syscalls/freebsd.xml");
++ set_gdbarch_get_syscall_number (gdbarch, fbsd_get_syscall_number);
+ }
+diff --git gdb/syscalls/freebsd.xml gdb/syscalls/freebsd.xml
+new file mode 100644
+index 0000000..fb7c38b
+--- /dev/null
++++ gdb/syscalls/freebsd.xml
+@@ -0,0 +1,410 @@
++<?xml version="1.0"?>
++<!-- Copyright (C) 2009-2016 Free Software Foundation, Inc.
++
++ Copying and distribution of this file, with or without modification,
++ are permitted in any medium without royalty provided the copyright
++ notice and this notice are preserved. -->
++
++<!DOCTYPE feature SYSTEM "gdb-syscalls.dtd">
++
++<!-- This file was generated using the following file:
++
++ /usr/src/sys/sys/syscall.h
++
++ The file mentioned above belongs to the FreeBSD Kernel. -->
++
++<syscalls_info>
++ <syscall name="syscall" number="0"/>
++ <syscall name="exit" number="1"/>
++ <syscall name="fork" number="2"/>
++ <syscall name="read" number="3"/>
++ <syscall name="write" number="4"/>
++ <syscall name="open" number="5"/>
++ <syscall name="close" number="6"/>
++ <syscall name="wait4" number="7"/>
++ <syscall name="link" number="9"/>
++ <syscall name="unlink" number="10"/>
++ <syscall name="chdir" number="12"/>
++ <syscall name="fchdir" number="13"/>
++ <syscall name="mknod" number="14"/>
++ <syscall name="chmod" number="15"/>
++ <syscall name="chown" number="16"/>
++ <syscall name="break" number="17"/>
++ <syscall name="getpid" number="20"/>
++ <syscall name="mount" number="21"/>
++ <syscall name="unmount" number="22"/>
++ <syscall name="setuid" number="23"/>
++ <syscall name="getuid" number="24"/>
++ <syscall name="geteuid" number="25"/>
++ <syscall name="ptrace" number="26"/>
++ <syscall name="recvmsg" number="27"/>
++ <syscall name="sendmsg" number="28"/>
++ <syscall name="recvfrom" number="29"/>
++ <syscall name="accept" number="30"/>
++ <syscall name="getpeername" number="31"/>
++ <syscall name="getsockname" number="32"/>
++ <syscall name="access" number="33"/>
++ <syscall name="chflags" number="34"/>
++ <syscall name="fchflags" number="35"/>
++ <syscall name="sync" number="36"/>
++ <syscall name="kill" number="37"/>
++ <syscall name="getppid" number="39"/>
++ <syscall name="dup" number="41"/>
++ <syscall name="pipe" number="42"/>
++ <syscall name="getegid" number="43"/>
++ <syscall name="profil" number="44"/>
++ <syscall name="ktrace" number="45"/>
++ <syscall name="getgid" number="47"/>
++ <syscall name="getlogin" number="49"/>
++ <syscall name="setlogin" number="50"/>
++ <syscall name="acct" number="51"/>
++ <syscall name="sigaltstack" number="53"/>
++ <syscall name="ioctl" number="54"/>
++ <syscall name="reboot" number="55"/>
++ <syscall name="revoke" number="56"/>
++ <syscall name="symlink" number="57"/>
++ <syscall name="readlink" number="58"/>
++ <syscall name="execve" number="59"/>
++ <syscall name="umask" number="60"/>
++ <syscall name="chroot" number="61"/>
++ <syscall name="msync" number="65"/>
++ <syscall name="vfork" number="66"/>
++ <syscall name="sbrk" number="69"/>
++ <syscall name="sstk" number="70"/>
++ <syscall name="vadvise" number="72"/>
++ <syscall name="munmap" number="73"/>
++ <syscall name="mprotect" number="74"/>
++ <syscall name="madvise" number="75"/>
++ <syscall name="mincore" number="78"/>
++ <syscall name="getgroups" number="79"/>
++ <syscall name="setgroups" number="80"/>
++ <syscall name="getpgrp" number="81"/>
++ <syscall name="setpgid" number="82"/>
++ <syscall name="setitimer" number="83"/>
++ <syscall name="swapon" number="85"/>
++ <syscall name="getitimer" number="86"/>
++ <syscall name="getdtablesize" number="89"/>
++ <syscall name="dup2" number="90"/>
++ <syscall name="fcntl" number="92"/>
++ <syscall name="select" number="93"/>
++ <syscall name="fsync" number="95"/>
++ <syscall name="setpriority" number="96"/>
++ <syscall name="socket" number="97"/>
++ <syscall name="connect" number="98"/>
++ <syscall name="getpriority" number="100"/>
++ <syscall name="bind" number="104"/>
++ <syscall name="setsockopt" number="105"/>
++ <syscall name="listen" number="106"/>
++ <syscall name="gettimeofday" number="116"/>
++ <syscall name="getrusage" number="117"/>
++ <syscall name="getsockopt" number="118"/>
++ <syscall name="readv" number="120"/>
++ <syscall name="writev" number="121"/>
++ <syscall name="settimeofday" number="122"/>
++ <syscall name="fchown" number="123"/>
++ <syscall name="fchmod" number="124"/>
++ <syscall name="setreuid" number="126"/>
++ <syscall name="setregid" number="127"/>
++ <syscall name="rename" number="128"/>
++ <syscall name="flock" number="131"/>
++ <syscall name="mkfifo" number="132"/>
++ <syscall name="sendto" number="133"/>
++ <syscall name="shutdown" number="134"/>
++ <syscall name="socketpair" number="135"/>
++ <syscall name="mkdir" number="136"/>
++ <syscall name="rmdir" number="137"/>
++ <syscall name="utimes" number="138"/>
++ <syscall name="adjtime" number="140"/>
++ <syscall name="setsid" number="147"/>
++ <syscall name="quotactl" number="148"/>
++ <syscall name="nlm_syscall" number="154"/>
++ <syscall name="nfssvc" number="155"/>
++ <syscall name="lgetfh" number="160"/>
++ <syscall name="getfh" number="161"/>
++ <syscall name="sysarch" number="165"/>
++ <syscall name="rtprio" number="166"/>
++ <syscall name="semsys" number="169"/>
++ <syscall name="msgsys" number="170"/>
++ <syscall name="shmsys" number="171"/>
++ <syscall name="setfib" number="175"/>
++ <syscall name="ntp_adjtime" number="176"/>
++ <syscall name="setgid" number="181"/>
++ <syscall name="setegid" number="182"/>
++ <syscall name="seteuid" number="183"/>
++ <syscall name="stat" number="188"/>
++ <syscall name="fstat" number="189"/>
++ <syscall name="lstat" number="190"/>
++ <syscall name="pathconf" number="191"/>
++ <syscall name="fpathconf" number="192"/>
++ <syscall name="getrlimit" number="194"/>
++ <syscall name="setrlimit" number="195"/>
++ <syscall name="getdirentries" number="196"/>
++ <syscall name="__syscall" number="198"/>
++ <syscall name="__sysctl" number="202"/>
++ <syscall name="mlock" number="203"/>
++ <syscall name="munlock" number="204"/>
++ <syscall name="undelete" number="205"/>
++ <syscall name="futimes" number="206"/>
++ <syscall name="getpgid" number="207"/>
++ <syscall name="poll" number="209"/>
++ <syscall name="freebsd7___semctl" number="220"/>
++ <syscall name="semget" number="221"/>
++ <syscall name="semop" number="222"/>
++ <syscall name="freebsd7_msgctl" number="224"/>
++ <syscall name="msgget" number="225"/>
++ <syscall name="msgsnd" number="226"/>
++ <syscall name="msgrcv" number="227"/>
++ <syscall name="shmat" number="228"/>
++ <syscall name="freebsd7_shmctl" number="229"/>
++ <syscall name="shmdt" number="230"/>
++ <syscall name="shmget" number="231"/>
++ <syscall name="clock_gettime" number="232"/>
++ <syscall name="clock_settime" number="233"/>
++ <syscall name="clock_getres" number="234"/>
++ <syscall name="ktimer_create" number="235"/>
++ <syscall name="ktimer_delete" number="236"/>
++ <syscall name="ktimer_settime" number="237"/>
++ <syscall name="ktimer_gettime" number="238"/>
++ <syscall name="ktimer_getoverrun" number="239"/>
++ <syscall name="nanosleep" number="240"/>
++ <syscall name="ffclock_getcounter" number="241"/>
++ <syscall name="ffclock_setestimate" number="242"/>
++ <syscall name="ffclock_getestimate" number="243"/>
++ <syscall name="clock_getcpuclockid2" number="247"/>
++ <syscall name="ntp_gettime" number="248"/>
++ <syscall name="minherit" number="250"/>
++ <syscall name="rfork" number="251"/>
++ <syscall name="openbsd_poll" number="252"/>
++ <syscall name="issetugid" number="253"/>
++ <syscall name="lchown" number="254"/>
++ <syscall name="aio_read" number="255"/>
++ <syscall name="aio_write" number="256"/>
++ <syscall name="lio_listio" number="257"/>
++ <syscall name="getdents" number="272"/>
++ <syscall name="lchmod" number="274"/>
++ <syscall name="netbsd_lchown" number="275"/>
++ <syscall name="lutimes" number="276"/>
++ <syscall name="netbsd_msync" number="277"/>
++ <syscall name="nstat" number="278"/>
++ <syscall name="nfstat" number="279"/>
++ <syscall name="nlstat" number="280"/>
++ <syscall name="preadv" number="289"/>
++ <syscall name="pwritev" number="290"/>
++ <syscall name="fhopen" number="298"/>
++ <syscall name="fhstat" number="299"/>
++ <syscall name="modnext" number="300"/>
++ <syscall name="modstat" number="301"/>
++ <syscall name="modfnext" number="302"/>
++ <syscall name="modfind" number="303"/>
++ <syscall name="kldload" number="304"/>
++ <syscall name="kldunload" number="305"/>
++ <syscall name="kldfind" number="306"/>
++ <syscall name="kldnext" number="307"/>
++ <syscall name="kldstat" number="308"/>
++ <syscall name="kldfirstmod" number="309"/>
++ <syscall name="getsid" number="310"/>
++ <syscall name="setresuid" number="311"/>
++ <syscall name="setresgid" number="312"/>
++ <syscall name="aio_return" number="314"/>
++ <syscall name="aio_suspend" number="315"/>
++ <syscall name="aio_cancel" number="316"/>
++ <syscall name="aio_error" number="317"/>
++ <syscall name="yield" number="321"/>
++ <syscall name="mlockall" number="324"/>
++ <syscall name="munlockall" number="325"/>
++ <syscall name="__getcwd" number="326"/>
++ <syscall name="sched_setparam" number="327"/>
++ <syscall name="sched_getparam" number="328"/>
++ <syscall name="sched_setscheduler" number="329"/>
++ <syscall name="sched_getscheduler" number="330"/>
++ <syscall name="sched_yield" number="331"/>
++ <syscall name="sched_get_priority_max" number="332"/>
++ <syscall name="sched_get_priority_min" number="333"/>
++ <syscall name="sched_rr_get_interval" number="334"/>
++ <syscall name="utrace" number="335"/>
++ <syscall name="kldsym" number="337"/>
++ <syscall name="jail" number="338"/>
++ <syscall name="nnpfs_syscall" number="339"/>
++ <syscall name="sigprocmask" number="340"/>
++ <syscall name="sigsuspend" number="341"/>
++ <syscall name="sigpending" number="343"/>
++ <syscall name="sigtimedwait" number="345"/>
++ <syscall name="sigwaitinfo" number="346"/>
++ <syscall name="__acl_get_file" number="347"/>
++ <syscall name="__acl_set_file" number="348"/>
++ <syscall name="__acl_get_fd" number="349"/>
++ <syscall name="__acl_set_fd" number="350"/>
++ <syscall name="__acl_delete_file" number="351"/>
++ <syscall name="__acl_delete_fd" number="352"/>
++ <syscall name="__acl_aclcheck_file" number="353"/>
++ <syscall name="__acl_aclcheck_fd" number="354"/>
++ <syscall name="extattrctl" number="355"/>
++ <syscall name="extattr_set_file" number="356"/>
++ <syscall name="extattr_get_file" number="357"/>
++ <syscall name="extattr_delete_file" number="358"/>
++ <syscall name="aio_waitcomplete" number="359"/>
++ <syscall name="getresuid" number="360"/>
++ <syscall name="getresgid" number="361"/>
++ <syscall name="kqueue" number="362"/>
++ <syscall name="kevent" number="363"/>
++ <syscall name="extattr_set_fd" number="371"/>
++ <syscall name="extattr_get_fd" number="372"/>
++ <syscall name="extattr_delete_fd" number="373"/>
++ <syscall name="__setugid" number="374"/>
++ <syscall name="eaccess" number="376"/>
++ <syscall name="afs3_syscall" number="377"/>
++ <syscall name="nmount" number="378"/>
++ <syscall name="__mac_get_proc" number="384"/>
++ <syscall name="__mac_set_proc" number="385"/>
++ <syscall name="__mac_get_fd" number="386"/>
++ <syscall name="__mac_get_file" number="387"/>
++ <syscall name="__mac_set_fd" number="388"/>
++ <syscall name="__mac_set_file" number="389"/>
++ <syscall name="kenv" number="390"/>
++ <syscall name="lchflags" number="391"/>
++ <syscall name="uuidgen" number="392"/>
++ <syscall name="sendfile" number="393"/>
++ <syscall name="mac_syscall" number="394"/>
++ <syscall name="getfsstat" number="395"/>
++ <syscall name="statfs" number="396"/>
++ <syscall name="fstatfs" number="397"/>
++ <syscall name="fhstatfs" number="398"/>
++ <syscall name="ksem_close" number="400"/>
++ <syscall name="ksem_post" number="401"/>
++ <syscall name="ksem_wait" number="402"/>
++ <syscall name="ksem_trywait" number="403"/>
++ <syscall name="ksem_init" number="404"/>
++ <syscall name="ksem_open" number="405"/>
++ <syscall name="ksem_unlink" number="406"/>
++ <syscall name="ksem_getvalue" number="407"/>
++ <syscall name="ksem_destroy" number="408"/>
++ <syscall name="__mac_get_pid" number="409"/>
++ <syscall name="__mac_get_link" number="410"/>
++ <syscall name="__mac_set_link" number="411"/>
++ <syscall name="extattr_set_link" number="412"/>
++ <syscall name="extattr_get_link" number="413"/>
++ <syscall name="extattr_delete_link" number="414"/>
++ <syscall name="__mac_execve" number="415"/>
++ <syscall name="sigaction" number="416"/>
++ <syscall name="sigreturn" number="417"/>
++ <syscall name="getcontext" number="421"/>
++ <syscall name="setcontext" number="422"/>
++ <syscall name="swapcontext" number="423"/>
++ <syscall name="swapoff" number="424"/>
++ <syscall name="__acl_get_link" number="425"/>
++ <syscall name="__acl_set_link" number="426"/>
++ <syscall name="__acl_delete_link" number="427"/>
++ <syscall name="__acl_aclcheck_link" number="428"/>
++ <syscall name="sigwait" number="429"/>
++ <syscall name="thr_create" number="430"/>
++ <syscall name="thr_exit" number="431"/>
++ <syscall name="thr_self" number="432"/>
++ <syscall name="thr_kill" number="433"/>
++ <syscall name="jail_attach" number="436"/>
++ <syscall name="extattr_list_fd" number="437"/>
++ <syscall name="extattr_list_file" number="438"/>
++ <syscall name="extattr_list_link" number="439"/>
++ <syscall name="ksem_timedwait" number="441"/>
++ <syscall name="thr_suspend" number="442"/>
++ <syscall name="thr_wake" number="443"/>
++ <syscall name="kldunloadf" number="444"/>
++ <syscall name="audit" number="445"/>
++ <syscall name="auditon" number="446"/>
++ <syscall name="getauid" number="447"/>
++ <syscall name="setauid" number="448"/>
++ <syscall name="getaudit" number="449"/>
++ <syscall name="setaudit" number="450"/>
++ <syscall name="getaudit_addr" number="451"/>
++ <syscall name="setaudit_addr" number="452"/>
++ <syscall name="auditctl" number="453"/>
++ <syscall name="_umtx_op" number="454"/>
++ <syscall name="thr_new" number="455"/>
++ <syscall name="sigqueue" number="456"/>
++ <syscall name="kmq_open" number="457"/>
++ <syscall name="kmq_setattr" number="458"/>
++ <syscall name="kmq_timedreceive" number="459"/>
++ <syscall name="kmq_timedsend" number="460"/>
++ <syscall name="kmq_notify" number="461"/>
++ <syscall name="kmq_unlink" number="462"/>
++ <syscall name="abort2" number="463"/>
++ <syscall name="thr_set_name" number="464"/>
++ <syscall name="aio_fsync" number="465"/>
++ <syscall name="rtprio_thread" number="466"/>
++ <syscall name="sctp_peeloff" number="471"/>
++ <syscall name="sctp_generic_sendmsg" number="472"/>
++ <syscall name="sctp_generic_sendmsg_iov" number="473"/>
++ <syscall name="sctp_generic_recvmsg" number="474"/>
++ <syscall name="pread" number="475"/>
++ <syscall name="pwrite" number="476"/>
++ <syscall name="mmap" number="477"/>
++ <syscall name="lseek" number="478"/>
++ <syscall name="truncate" number="479"/>
++ <syscall name="ftruncate" number="480"/>
++ <syscall name="thr_kill2" number="481"/>
++ <syscall name="shm_open" number="482"/>
++ <syscall name="shm_unlink" number="483"/>
++ <syscall name="cpuset" number="484"/>
++ <syscall name="cpuset_setid" number="485"/>
++ <syscall name="cpuset_getid" number="486"/>
++ <syscall name="cpuset_getaffinity" number="487"/>
++ <syscall name="cpuset_setaffinity" number="488"/>
++ <syscall name="faccessat" number="489"/>
++ <syscall name="fchmodat" number="490"/>
++ <syscall name="fchownat" number="491"/>
++ <syscall name="fexecve" number="492"/>
++ <syscall name="fstatat" number="493"/>
++ <syscall name="futimesat" number="494"/>
++ <syscall name="linkat" number="495"/>
++ <syscall name="mkdirat" number="496"/>
++ <syscall name="mkfifoat" number="497"/>
++ <syscall name="mknodat" number="498"/>
++ <syscall name="openat" number="499"/>
++ <syscall name="readlinkat" number="500"/>
++ <syscall name="renameat" number="501"/>
++ <syscall name="symlinkat" number="502"/>
++ <syscall name="unlinkat" number="503"/>
++ <syscall name="posix_openpt" number="504"/>
++ <syscall name="gssd_syscall" number="505"/>
++ <syscall name="jail_get" number="506"/>
++ <syscall name="jail_set" number="507"/>
++ <syscall name="jail_remove" number="508"/>
++ <syscall name="closefrom" number="509"/>
++ <syscall name="__semctl" number="510"/>
++ <syscall name="msgctl" number="511"/>
++ <syscall name="shmctl" number="512"/>
++ <syscall name="lpathconf" number="513"/>
++ <syscall name="__cap_rights_get" number="515"/>
++ <syscall name="cap_enter" number="516"/>
++ <syscall name="cap_getmode" number="517"/>
++ <syscall name="pdfork" number="518"/>
++ <syscall name="pdkill" number="519"/>
++ <syscall name="pdgetpid" number="520"/>
++ <syscall name="pselect" number="522"/>
++ <syscall name="getloginclass" number="523"/>
++ <syscall name="setloginclass" number="524"/>
++ <syscall name="rctl_get_racct" number="525"/>
++ <syscall name="rctl_get_rules" number="526"/>
++ <syscall name="rctl_get_limits" number="527"/>
++ <syscall name="rctl_add_rule" number="528"/>
++ <syscall name="rctl_remove_rule" number="529"/>
++ <syscall name="posix_fallocate" number="530"/>
++ <syscall name="posix_fadvise" number="531"/>
++ <syscall name="wait6" number="532"/>
++ <syscall name="cap_rights_limit" number="533"/>
++ <syscall name="cap_ioctls_limit" number="534"/>
++ <syscall name="cap_ioctls_get" number="535"/>
++ <syscall name="cap_fcntls_limit" number="536"/>
++ <syscall name="cap_fcntls_get" number="537"/>
++ <syscall name="bindat" number="538"/>
++ <syscall name="connectat" number="539"/>
++ <syscall name="chflagsat" number="540"/>
++ <syscall name="accept4" number="541"/>
++ <syscall name="pipe2" number="542"/>
++ <syscall name="aio_mlock" number="543"/>
++ <syscall name="procctl" number="544"/>
++ <syscall name="ppoll" number="545"/>
++ <syscall name="futimens" number="546"/>
++ <syscall name="utimensat" number="547"/>
++ <syscall name="numa_getaffinity" number="548"/>
++ <syscall name="numa_setaffinity" number="549"/>
++</syscalls_info>
diff --git a/devel/gdb/files/commit-ee95032 b/devel/gdb/files/commit-ee95032
new file mode 100644
index 000000000000..2eb1f725697c
--- /dev/null
+++ b/devel/gdb/files/commit-ee95032
@@ -0,0 +1,24 @@
+commit ee950322ca2c77494b1742f304632f667ed6ce79
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Fri Jul 1 10:18:50 2016 -0700
+
+ Use 'ptid_t' instead of 'ptid' for fbsd_next_vfork_done's return type.
+
+ 'ptid' compiles in C++, but not C.
+
+ gdb/ChangeLog:
+ * fbsd-nat.c (fbsd_is_vfork_done_pending): Fix return type.
+
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index fcb7ff5..fa9516e 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -609,7 +609,7 @@ fbsd_is_vfork_done_pending (pid_t pid)
+ /* Check for a pending vfork done event. If one is found, remove it
+ from the list and return the PTID. */
+
+-static ptid
++static ptid_t
+ fbsd_next_vfork_done (void)
+ {
+ struct fbsd_fork_info *info;