Index: head/devel/gdb/Makefile =================================================================== --- head/devel/gdb/Makefile +++ head/devel/gdb/Makefile @@ -2,8 +2,7 @@ # $FreeBSD$ PORTNAME= gdb -PORTVERSION= 8.0.1 -PORTREVISION= 2 +PORTVERSION= 8.1 CATEGORIES= devel MASTER_SITES= GNU @@ -39,26 +38,16 @@ CFLAGS+= -DRL_NO_COMPAT -Wno-unused-function -Wno-unused-variable EXCLUDE= dejagnu expect sim texinfo intl EXTRACT_AFTER_ARGS= ${EXCLUDE:S/^/--exclude /} -EXTRA_PATCHES= ${FILESDIR}/commit-45eba0ab7d \ - ${FILESDIR}/commit-3c3ae77e68 \ - ${FILESDIR}/commit-b5430a3ced \ - ${FILESDIR}/commit-762c974a09 \ - ${FILESDIR}/commit-929edea98d \ - ${FILESDIR}/commit-6e5eab33ab \ - ${FILESDIR}/commit-382b69bbb7 \ - ${FILESDIR}/commit-2af9fc4432 \ - ${FILESDIR}/commit-0b9305edf1 \ - ${FILESDIR}/commit-e6f3b9c319 \ - ${FILESDIR}/commit-4b654465bf \ - ${FILESDIR}/commit-b30ff123fb \ - ${FILESDIR}/commit-48aeef91c2 \ - ${FILESDIR}/commit-0aa37b654c \ - ${FILESDIR}/commit-0335ac6d12 \ - ${FILESDIR}/commit-12c4bd7f53 \ - ${FILESDIR}/commit-6d5be5d6b8 \ - ${FILESDIR}/commit-a80a647180 \ - ${FILESDIR}/commit-544c67cda1 \ - ${FILESDIR}/commit-a181c0bf74 +EXTRA_PATCHES= ${FILESDIR}/commit-d2176225dc \ + ${FILESDIR}/commit-b999e2038d \ + ${FILESDIR}/commit-262f62f57d \ + ${FILESDIR}/commit-92fce24de2 \ + ${FILESDIR}/commit-2d97a5d9d3 \ + ${FILESDIR}/commit-906b4aac4c \ + ${FILESDIR}/commit-f169cfdc08 \ + ${FILESDIR}/commit-12279366d7 \ + ${FILESDIR}/commit-386a867618 \ + ${FILESDIR}/commit-7efba073e2 LIB_DEPENDS+= libexpat.so:textproc/expat2 VER= ${PORTVERSION:S/.//g} Index: head/devel/gdb/distinfo =================================================================== --- head/devel/gdb/distinfo +++ head/devel/gdb/distinfo @@ -1,3 +1,3 @@ -TIMESTAMP = 1505207991 -SHA256 (gdb-8.0.1.tar.xz) = 3dbd5f93e36ba2815ad0efab030dcd0c7b211d7b353a40a53f4c02d7d56295e3 -SIZE (gdb-8.0.1.tar.xz) = 19583920 +TIMESTAMP = 1517392551 +SHA256 (gdb-8.1.tar.xz) = af61a0263858e69c5dce51eab26662ff3d2ad9aa68da9583e8143b5426be4b34 +SIZE (gdb-8.1.tar.xz) = 20095080 Index: head/devel/gdb/files/commit-0335ac6d12 =================================================================== --- head/devel/gdb/files/commit-0335ac6d12 +++ head/devel/gdb/files/commit-0335ac6d12 @@ -1,24 +0,0 @@ -commit 0335ac6d12906bfb4b48410d8a7229c21c727cf2 -Author: John Baldwin -Date: Tue Aug 15 08:04:23 2017 -0700 - - Fix compile on big-endian platforms in siginfo_t converter. - - gdb/ChangeLog: - - * fbsd-nat.c (fbsd_convert_siginfo): Fix compile on big-endian - platforms. - -diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c -index c89343a24f..6ba6a01a70 100644 ---- gdb/fbsd-nat.c -+++ gdb/fbsd-nat.c -@@ -314,7 +314,7 @@ fbsd_convert_siginfo (siginfo_t *si) - 32-bits of the pointer value. */ - #if _BYTE_ORDER == _BIG_ENDIAN - if (si->si_value.sival_int == 0) -- si32->si_value.sival_ptr = (uintptr_t) si->si_value.sival_ptr; -+ si32.si_value.sival_ptr = (uintptr_t) si->si_value.sival_ptr; - else - si32.si_value.sival_int = si->si_value.sival_int; - #else Index: head/devel/gdb/files/commit-0aa37b654c =================================================================== --- head/devel/gdb/files/commit-0aa37b654c +++ head/devel/gdb/files/commit-0aa37b654c @@ -1,90 +0,0 @@ -commit 0aa37b654c0f31e446ab47826f0bcbec15d0112f -Author: John Baldwin -Date: Mon Jun 26 18:18:19 2017 -0700 - - Support the fs_base and gs_base registers on FreeBSD/amd64 native processes. - - Use ptrace operations to fetch and store the fs_base and gs_base registers - for FreeBSD/amd64 processes. Note that FreeBSD does not currently store the - value of these registers in core dumps, so these registers are only - available when inspecting a running process. - - gdb/ChangeLog: - - * amd64-bsd-nat.c (amd64bsd_fetch_inferior_registers): Use - PT_GETFSBASE and PT_GETGSBASE. - (amd64bsd_store_inferior_registers): Use PT_SETFSBASE and - PT_SETGSBASE. - -diff --git gdb/amd64-bsd-nat.c gdb/amd64-bsd-nat.c -index ca61a3551b..41dee84269 100644 ---- gdb/amd64-bsd-nat.c -+++ gdb/amd64-bsd-nat.c -@@ -57,6 +57,33 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops, - return; - } - -+#ifdef PT_GETFSBASE -+ if (regnum == -1 || regnum == AMD64_FSBASE_REGNUM) -+ { -+ register_t base; -+ -+ if (ptrace (PT_GETFSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1) -+ perror_with_name (_("Couldn't get segment register fs_base")); -+ -+ regcache_raw_supply (regcache, AMD64_FSBASE_REGNUM, &base); -+ if (regnum != -1) -+ return; -+ } -+#endif -+#ifdef PT_GETGSBASE -+ if (regnum == -1 || regnum == AMD64_GSBASE_REGNUM) -+ { -+ register_t base; -+ -+ if (ptrace (PT_GETGSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1) -+ perror_with_name (_("Couldn't get segment register gs_base")); -+ -+ regcache_raw_supply (regcache, AMD64_GSBASE_REGNUM, &base); -+ if (regnum != -1) -+ return; -+ } -+#endif -+ - if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum)) - { - struct fpreg fpregs; -@@ -108,6 +135,33 @@ amd64bsd_store_inferior_registers (struct target_ops *ops, - return; - } - -+#ifdef PT_SETFSBASE -+ if (regnum == -1 || regnum == AMD64_FSBASE_REGNUM) -+ { -+ register_t base; -+ -+ regcache_raw_collect (regcache, AMD64_FSBASE_REGNUM, &base); -+ -+ if (ptrace (PT_SETFSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1) -+ perror_with_name (_("Couldn't write segment register fs_base")); -+ if (regnum != -1) -+ return; -+ } -+#endif -+#ifdef PT_SETGSBASE -+ if (regnum == -1 || regnum == AMD64_GSBASE_REGNUM) -+ { -+ register_t base; -+ -+ regcache_raw_collect (regcache, AMD64_GSBASE_REGNUM, &base); -+ -+ if (ptrace (PT_SETGSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1) -+ perror_with_name (_("Couldn't write segment register gs_base")); -+ if (regnum != -1) -+ return; -+ } -+#endif -+ - if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum)) - { - struct fpreg fpregs; Index: head/devel/gdb/files/commit-0b9305edf1 =================================================================== --- head/devel/gdb/files/commit-0b9305edf1 +++ head/devel/gdb/files/commit-0b9305edf1 @@ -1,30 +0,0 @@ -commit 0b9305edf1d0b15913643b132dad02d4ca4fbb43 -Author: John Baldwin -Date: Wed Jun 28 11:41:41 2017 -0700 - - Recognize the recently-added FreeBSD core dump note for LWP info. - - This core dump note contains the same information returned by the - ptrace PT_LWPINFO operation for each LWP belonging to a process. - - binutils/ChangeLog: - - * readelf.c (get_freebsd_elfcore_note_type): Handle - NT_FREEBSD_PTLWPINFO. - - include/ChangeLog: - - * elf/common.h (NT_FREEBSD_PTLWPINFO): Define. - -diff --git include/elf/common.h include/elf/common.h -index 2976c06067..3a144f03bc 100644 ---- include/elf/common.h -+++ include/elf/common.h -@@ -641,6 +641,7 @@ - #define NT_FREEBSD_PROCSTAT_OSREL 14 /* Procstat osreldate data. */ - #define NT_FREEBSD_PROCSTAT_PSSTRINGS 15 /* Procstat ps_strings data. */ - #define NT_FREEBSD_PROCSTAT_AUXV 16 /* Procstat auxv data. */ -+#define NT_FREEBSD_PTLWPINFO 17 /* Thread ptrace miscellaneous info. */ - - /* Note segments for core files on NetBSD systems. Note name - must start with "NetBSD-CORE". */ Index: head/devel/gdb/files/commit-12279366d7 =================================================================== --- head/devel/gdb/files/commit-12279366d7 +++ head/devel/gdb/files/commit-12279366d7 @@ -0,0 +1,121 @@ +commit 12279366d71627bfbdd74d1a6675dca825d8feca +Author: John Baldwin +Date: Sat Mar 3 21:25:33 2018 -0800 + + Implement "to_stopped_by_hw_breakpoint" for x86 debug registers. + + Report that a thread is stopped by a hardware breakpoint if a non-data + watchpoint is set in DR6. This change should be a no-op since a target + still needs to implement the "to_supports_stopped_by_hw_breakpoint" + method before this function is used. + + gdb/ChangeLog: + + * nat/x86-dregs.c (x86_dr_stopped_by_hw_breakpoint): New function. + * nat/x86-dregs.h (x86_dr_stopped_by_hw_breakpoint): New + prototype. + * x86-nat.c (x86_stopped_by_hw_breakpoint): New function. + (x86_use_watchpoints): Set "stopped_by_hw_breakpoint" target + method. + +diff --git gdb/nat/x86-dregs.c gdb/nat/x86-dregs.c +index c816473628..f11a708e27 100644 +--- gdb/nat/x86-dregs.c ++++ gdb/nat/x86-dregs.c +@@ -649,3 +649,48 @@ x86_dr_stopped_by_watchpoint (struct x86_debug_reg_state *state) + CORE_ADDR addr = 0; + return x86_dr_stopped_data_address (state, &addr); + } ++ ++/* Return non-zero if the inferior has some hardware breakpoint that ++ triggered. Otherwise return zero. */ ++ ++int ++x86_dr_stopped_by_hw_breakpoint (struct x86_debug_reg_state *state) ++{ ++ CORE_ADDR addr = 0; ++ int i; ++ int rc = 0; ++ /* The current thread's DR_STATUS. We always need to read this to ++ check whether some watchpoint caused the trap. */ ++ unsigned status; ++ /* We need DR_CONTROL as well, but only iff DR_STATUS indicates a ++ breakpoint trap. Only fetch it when necessary, to avoid an ++ unnecessary extra syscall when no watchpoint triggered. */ ++ int control_p = 0; ++ unsigned control = 0; ++ ++ /* As above, always read the current thread's debug registers rather ++ than trusting dr_mirror. */ ++ status = x86_dr_low_get_status (); ++ ++ ALL_DEBUG_ADDRESS_REGISTERS (i) ++ { ++ if (!X86_DR_WATCH_HIT (status, i)) ++ continue; ++ ++ if (!control_p) ++ { ++ control = x86_dr_low_get_control (); ++ control_p = 1; ++ } ++ ++ if (X86_DR_GET_RW_LEN (control, i) == 0) ++ { ++ addr = x86_dr_low_get_addr (i); ++ rc = 1; ++ if (show_debug_regs) ++ x86_show_dr (state, "watchpoint_hit", addr, -1, hw_execute); ++ } ++ } ++ ++ return rc; ++} +diff --git gdb/nat/x86-dregs.h gdb/nat/x86-dregs.h +index dd6242eda9..e86e83aea0 100644 +--- gdb/nat/x86-dregs.h ++++ gdb/nat/x86-dregs.h +@@ -128,4 +128,8 @@ extern int x86_dr_stopped_data_address (struct x86_debug_reg_state *state, + Otherwise return false. */ + extern int x86_dr_stopped_by_watchpoint (struct x86_debug_reg_state *state); + ++/* Return true if the inferior has some hardware breakpoint that ++ triggered. Otherwise return false. */ ++extern int x86_dr_stopped_by_hw_breakpoint (struct x86_debug_reg_state *state); ++ + #endif /* X86_DREGS_H */ +diff --git gdb/x86-nat.c gdb/x86-nat.c +index b126c47c94..bec51373a6 100644 +--- gdb/x86-nat.c ++++ gdb/x86-nat.c +@@ -260,6 +260,18 @@ x86_can_use_hw_breakpoint (struct target_ops *self, + return 1; + } + ++/* Return non-zero if the inferior has some breakpoint that triggered. ++ Otherwise return zero. */ ++ ++static int ++x86_stopped_by_hw_breakpoint (struct target_ops *ops) ++{ ++ struct x86_debug_reg_state *state ++ = x86_debug_reg_state (ptid_get_pid (inferior_ptid)); ++ ++ return x86_dr_stopped_by_hw_breakpoint (state); ++} ++ + static void + add_show_debug_regs_command (void) + { +@@ -297,6 +309,11 @@ x86_use_watchpoints (struct target_ops *t) + t->to_remove_watchpoint = x86_remove_watchpoint; + t->to_insert_hw_breakpoint = x86_insert_hw_breakpoint; + t->to_remove_hw_breakpoint = x86_remove_hw_breakpoint; ++ ++ /* A target must provide an implementation of the ++ "to_supports_stopped_by_hw_breakpoint" target method before this ++ callback will be used. */ ++ t->to_stopped_by_hw_breakpoint = x86_stopped_by_hw_breakpoint; + } + + void Index: head/devel/gdb/files/commit-12c4bd7f53 =================================================================== --- head/devel/gdb/files/commit-12c4bd7f53 +++ head/devel/gdb/files/commit-12c4bd7f53 @@ -1,45 +0,0 @@ -commit 12c4bd7f53e9cefcf7c3a7f8cbf9e552526cb963 -Author: John Baldwin -Date: Thu Oct 5 09:50:01 2017 -0700 - - Handle FreeBSD-specific AT_EHDRFLAGS and AT_HWCAP auxiliary vector types. - - FreeBSD recently added two additional ELF auxiliary vectors. FreeBSD's - AT_HWCAP uses a different number compared to AT_HWCAP on Linux as the - numerical value was already in use for a different vector on FreeBSD. - - include/ChangeLog: - - * elf/common.h (AT_FREEBSD_EHDRFLAGS, AT_FREEBSD_HWCAP): Define. - - gdb/ChangeLog: - - * fbsd-tdep.c (fbsd_print_auxv_entry): Handle AT_EHDRFLAGS and - AT_HWCAP. - -diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c -index 727e28a645..fa4cd912ef 100644 ---- gdb/fbsd-tdep.c -+++ gdb/fbsd-tdep.c -@@ -392,6 +392,8 @@ fbsd_print_auxv_entry (struct gdbarch *gdbarch, struct ui_file *file, - TAG (PAGESIZESLEN, _("Number of pagesizes"), AUXV_FORMAT_DEC); - TAG (TIMEKEEP, _("Pointer to timehands"), AUXV_FORMAT_HEX); - TAG (STACKPROT, _("Initial stack protection"), AUXV_FORMAT_HEX); -+ TAG (EHDRFLAGS, _("ELF header e_flags"), AUXV_FORMAT_HEX); -+ TAG (HWCAP, _("Machine-dependent CPU capability hints"), AUXV_FORMAT_HEX); - default: - default_print_auxv_entry (gdbarch, file, type, val); - return; -diff --git include/elf/common.h include/elf/common.h -index d08731cca1..f89ab32889 100644 ---- include/elf/common.h -+++ include/elf/common.h -@@ -1144,6 +1144,8 @@ - #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_FREEBSD_EHDRFLAGS 24 /* e_flags field from ELF header. */ -+#define AT_FREEBSD_HWCAP 25 /* CPU feature flags. */ - - #define AT_SUN_UID 2000 /* Effective user ID. */ - #define AT_SUN_RUID 2001 /* Real user ID. */ Index: head/devel/gdb/files/commit-262f62f57d =================================================================== --- head/devel/gdb/files/commit-262f62f57d +++ head/devel/gdb/files/commit-262f62f57d @@ -0,0 +1,43 @@ +commit 262f62f57d987269152412a55c458a03adc6ddd6 +Author: John Baldwin +Date: Tue Jan 9 13:35:17 2018 -0800 + + Use gdb::unique_xmalloc_ptr<> instead of a deleter that invokes free(). + + Since xfree() always wraps free(), it is safe to use the xfree deleter + for buffers allocated by library routines such as kinfo_getvmmap() that + must be released via free(). + + gdb/ChangeLog: + + * fbsd-nat.c (struct free_deleter): Remove. + (fbsd_find_memory_regions): Use gdb::unique_xmalloc_ptr<>. + +diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c +index d0aaf89145..81f8e27a2d 100644 +--- gdb/fbsd-nat.c ++++ gdb/fbsd-nat.c +@@ -81,14 +81,6 @@ fbsd_pid_to_exec_file (struct target_ops *self, int pid) + } + + #ifdef HAVE_KINFO_GETVMMAP +-/* Deleter for std::unique_ptr that invokes free. */ +- +-template +-struct free_deleter +-{ +- void operator() (T *ptr) const { free (ptr); } +-}; +- + /* Iterate over all the memory regions in the current inferior, + calling FUNC for each memory region. OBFD is passed as the last + argument to FUNC. */ +@@ -102,7 +94,7 @@ fbsd_find_memory_regions (struct target_ops *self, + uint64_t size; + int i, nitems; + +- std::unique_ptr> ++ gdb::unique_xmalloc_ptr + vmentl (kinfo_getvmmap (pid, &nitems)); + if (vmentl == NULL) + perror_with_name (_("Couldn't fetch VM map entries.")); Index: head/devel/gdb/files/commit-2af9fc4432 =================================================================== --- head/devel/gdb/files/commit-2af9fc4432 +++ head/devel/gdb/files/commit-2af9fc4432 @@ -1,35 +0,0 @@ -commit 2af9fc4432bbda5ebd805bf5b56d81cd80d0cbf5 -Author: John Baldwin -Date: Wed Jun 28 11:21:10 2017 -0700 - - Use the thread_section_name helper class in fbsd_core_thread_name. - - gdb/ChangeLog: - - * fbsd-tdep.c (fbsd_core_thread_name): Use thread_section_name. - -diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c -index 24a3c20dd6..32df104208 100644 ---- gdb/fbsd-tdep.c -+++ gdb/fbsd-tdep.c -@@ -75,7 +75,6 @@ fbsd_core_thread_name (struct gdbarch *gdbarch, struct thread_info *thr) - static char buf[80]; - struct bfd_section *section; - bfd_size_type size; -- char sectionstr[32]; - - if (ptid_get_lwp (thr->ptid) != 0) - { -@@ -86,9 +85,9 @@ fbsd_core_thread_name (struct gdbarch *gdbarch, struct thread_info *thr) - structure. Rather than define the full structure here, just - extract the null-terminated name from the start of the - note. */ -- xsnprintf (sectionstr, sizeof sectionstr, ".thrmisc/%ld", -- ptid_get_lwp (thr->ptid)); -- section = bfd_get_section_by_name (core_bfd, sectionstr); -+ thread_section_name section_name (".thrmisc", thr->ptid); -+ -+ section = bfd_get_section_by_name (core_bfd, section_name.c_str ()); - if (section != NULL && bfd_section_size (core_bfd, section) > 0) - { - /* Truncate the name if it is longer than "buf". */ Index: head/devel/gdb/files/commit-2d97a5d9d3 =================================================================== --- head/devel/gdb/files/commit-2d97a5d9d3 +++ head/devel/gdb/files/commit-2d97a5d9d3 @@ -0,0 +1,169 @@ +commit 2d97a5d9d33aea87c3bd02fd1fa417f5d4e1fa05 +Author: John Baldwin +Date: Tue Jan 9 13:35:17 2018 -0800 + + Document support for 'info proc' on FreeBSD. + + Since the 'info proc' support on FreeBSD does not use /proc, reword + the documentation for 'info proc' to not assume /proc. This includes + renaming the node to 'Process Information' and suggesting that + additional process information can be queried via different + OS-specific interfaces. This is also cleans up the description of + 'info proc' support for core files a bit as /proc is not used for core + file support on any current platform. + + gdb/ChangeLog: + + * NEWS: Document that 'info proc' now works on FreeBSD. + + gdb/doc/ChangeLog: + + * gdb.texinfo (pwd): Update cross-reference for Process Information + node and remove explicit /proc reference. + (Native): Rename subsection from SVR4 Process Information to + Process Information. + (Process Information): Reword introduction to be less /proc + centric. Document support for "info proc" on FreeBSD. + +diff --git gdb/NEWS gdb/NEWS +index 2f834c6ff4..f69173a245 100644 +--- gdb/NEWS ++++ gdb/NEWS +@@ -3,6 +3,9 @@ + + *** Changes since GDB 8.1 + ++* 'info proc' now works on running processes on FreeBSD systems and core ++ files created on FreeBSD systems. ++ + *** Changes in GDB 8.1 + + * GDB now supports dynamically creating arbitrary register groups specified +diff --git gdb/doc/gdb.texinfo gdb/doc/gdb.texinfo +index 8bdafb0ba4..096c82cc82 100644 +--- gdb/doc/gdb.texinfo ++++ gdb/doc/gdb.texinfo +@@ -2523,9 +2523,9 @@ Print the @value{GDBN} working directory. + + It is generally impossible to find the current working directory of + the process being debugged (since a program can change its directory +-during its run). If you work on a system where @value{GDBN} is +-configured with the @file{/proc} support, you can use the @code{info +-proc} command (@pxref{SVR4 Process Information}) to find out the ++during its run). If you work on a system where @value{GDBN} supports ++the @code {info proc} command (@pxref{Process Information}), you can ++use the @code{info proc} command to find out the + current working directory of the debuggee. + + @node Input/Output +@@ -21712,7 +21712,7 @@ configurations. + + @menu + * BSD libkvm Interface:: Debugging BSD kernel memory images +-* SVR4 Process Information:: SVR4 process information ++* Process Information:: Process information + * DJGPP Native:: Features specific to the DJGPP port + * Cygwin Native:: Features specific to the Cygwin port + * Hurd Native:: Features specific to @sc{gnu} Hurd +@@ -21759,24 +21759,32 @@ Set current context from proc address. This command isn't available on + modern FreeBSD systems. + @end table + +-@node SVR4 Process Information +-@subsection SVR4 Process Information ++@node Process Information ++@subsection Process Information + @cindex /proc + @cindex examine process image + @cindex process info via @file{/proc} + +-Many versions of SVR4 and compatible systems provide a facility called +-@samp{/proc} that can be used to examine the image of a running +-process using file-system subroutines. ++Some operating systems provide interfaces to fetch additional ++information about running processes beyond memory and per-thread ++register state. If @value{GDBN} is configured for an operating system ++with a supported interface, the command @code{info proc} is available ++to report information about the process running your program, or about ++any process running on your system. + +-If @value{GDBN} is configured for an operating system with this +-facility, the command @code{info proc} is available to report +-information about the process running your program, or about any +-process running on your system. This includes, as of this writing, +-@sc{gnu}/Linux and Solaris, for example. ++One supported interface is a facility called @samp{/proc} that can be ++used to examine the image of a running process using file-system ++subroutines. This facility is supported on @sc{gnu}/Linux and Solaris ++systems. + +-This command may also work on core files that were created on a system +-that has the @samp{/proc} facility. ++On FreeBSD systems, system control nodes are used to query process ++information. ++ ++In addition, some systems may provide additional process information ++in core files. Note that a core file may include a subset of the ++information available from a live process. Process information is ++currently avaiable from cores created on @sc{gnu}/Linux and FreeBSD ++systems. + + @table @code + @kindex info proc +@@ -21800,36 +21808,40 @@ a process ID rather than a thread ID). + @item info proc cmdline + @cindex info proc cmdline + Show the original command line of the process. This command is +-specific to @sc{gnu}/Linux. ++supported on @sc{gnu}/Linux and FreeBSD. + + @item info proc cwd + @cindex info proc cwd + Show the current working directory of the process. This command is +-specific to @sc{gnu}/Linux. ++supported on @sc{gnu}/Linux and FreeBSD. + + @item info proc exe + @cindex info proc exe +-Show the name of executable of the process. This command is specific +-to @sc{gnu}/Linux. ++Show the name of executable of the process. This command is supported ++on @sc{gnu}/Linux and FreeBSD. + + @item info proc mappings + @cindex memory address space mappings +-Report the memory address space ranges accessible in the program, with +-information on whether the process has read, write, or execute access +-rights to each range. On @sc{gnu}/Linux systems, each memory range +-includes the object file which is mapped to that range, instead of the +-memory access rights to that range. ++Report the memory address space ranges accessible in the program. On ++Solaris and FreeBSD systems, each memory range includes information on ++whether the process has read, write, or execute access rights to each ++range. On @sc{gnu}/Linux and FreeBSD systems, each memory range ++includes the object file which is mapped to that range. + + @item info proc stat + @itemx info proc status + @cindex process detailed status information +-These subcommands are specific to @sc{gnu}/Linux systems. They show +-the process-related information, including the user ID and group ID; +-how many threads are there in the process; its virtual memory usage; +-the signals that are pending, blocked, and ignored; its TTY; its +-consumption of system and user time; its stack size; its @samp{nice} +-value; etc. For more information, see the @samp{proc} man page +-(type @kbd{man 5 proc} from your shell prompt). ++Show additional process-related information, including the user ID and ++group ID; virtual memory usage; the signals that are pending, blocked, ++and ignored; its TTY; its consumption of system and user time; its ++stack size; its @samp{nice} value; etc. These commands are supported ++on @sc{gnu}/Linux and FreeBSD. ++ ++For @sc{gnu}/Linux systems, see the @samp{proc} man page for more ++information (type @kbd{man 5 proc} from your shell prompt). ++ ++For FreeBSD systems, @code{info proc stat} is an alias for @code{info ++proc status}. + + @item info proc all + Show all the information about the process described under all of the Index: head/devel/gdb/files/commit-382b69bbb7 =================================================================== --- head/devel/gdb/files/commit-382b69bbb7 +++ head/devel/gdb/files/commit-382b69bbb7 @@ -1,220 +0,0 @@ -commit 382b69bbb7a4fec5213d2382fe70a68d7a46b3e7 -Author: John Baldwin -Date: Wed Jun 28 11:11:20 2017 -0700 - - Add a new gdbarch method to fetch signal information from core files. - - Previously the core_xfer_partial method used core_get_siginfo to handle - TARGET_OBJECT_SIGNAL_INFO requests. However, core_get_siginfo looked for - Linux-specific sections in the core file. To support fetching siginfo - from cores on other systems, add a new gdbarch method (`core_xfer_siginfo`) - and move the body of the existing core_get_siginfo into a - linux_core_xfer_siginfo implementation of this method in linux-tdep.c. - - gdb/ChangeLog: - - * corelow.c (get_core_siginfo): Remove. - (core_xfer_partial): Use the gdbarch "core_xfer_siginfo" method - instead of get_core_siginfo. - * gdbarch.sh (core_xfer_siginfo): New gdbarch callback. - * gdbarch.h: Re-generate. - * gdbarch.c: Re-generate. - * linux-tdep.c (linux_core_xfer_siginfo): New. - (linux_init_abi): Install gdbarch "core_xfer_siginfo" method. - -diff --git gdb/corelow.c gdb/corelow.c -index 578c910bb5..5dbabc79e6 100644 ---- gdb/corelow.c -+++ gdb/corelow.c -@@ -668,25 +668,6 @@ add_to_spuid_list (bfd *abfd, asection *asect, void *list_p) - list->pos += 4; - } - --/* Read siginfo data from the core, if possible. Returns -1 on -- failure. Otherwise, returns the number of bytes read. ABFD is the -- core file's BFD; READBUF, OFFSET, and LEN are all as specified by -- the to_xfer_partial interface. */ -- --static LONGEST --get_core_siginfo (bfd *abfd, gdb_byte *readbuf, ULONGEST offset, ULONGEST len) --{ -- thread_section_name section_name (".note.linuxcore.siginfo", inferior_ptid); -- asection *section = bfd_get_section_by_name (abfd, section_name.c_str ()); -- if (section == NULL) -- return -1; -- -- if (!bfd_get_section_contents (abfd, section, readbuf, offset, len)) -- return -1; -- -- return len; --} -- - static enum target_xfer_status - core_xfer_partial (struct target_ops *ops, enum target_object object, - const char *annex, gdb_byte *readbuf, -@@ -874,12 +855,20 @@ core_xfer_partial (struct target_ops *ops, enum target_object object, - case TARGET_OBJECT_SIGNAL_INFO: - if (readbuf) - { -- LONGEST l = get_core_siginfo (core_bfd, readbuf, offset, len); -- -- if (l > 0) -+ if (core_gdbarch -+ && gdbarch_core_xfer_siginfo_p (core_gdbarch)) - { -- *xfered_len = len; -- return TARGET_XFER_OK; -+ LONGEST l = gdbarch_core_xfer_siginfo (core_gdbarch, readbuf, -+ offset, len); -+ -+ if (l >= 0) -+ { -+ *xfered_len = l; -+ if (l == 0) -+ return TARGET_XFER_EOF; -+ else -+ return TARGET_XFER_OK; -+ } - } - } - return TARGET_XFER_E_IO; -diff --git gdb/gdbarch.c gdb/gdbarch.c -index e5efdfbb26..24521b5e23 100644 ---- gdb/gdbarch.c -+++ gdb/gdbarch.c -@@ -287,6 +287,7 @@ struct gdbarch - gdbarch_core_xfer_shared_libraries_aix_ftype *core_xfer_shared_libraries_aix; - gdbarch_core_pid_to_str_ftype *core_pid_to_str; - gdbarch_core_thread_name_ftype *core_thread_name; -+ gdbarch_core_xfer_siginfo_ftype *core_xfer_siginfo; - const char * gcore_bfd_target; - int vtable_function_descriptors; - int vbit_in_delta; -@@ -646,6 +647,7 @@ verify_gdbarch (struct gdbarch *gdbarch) - /* Skip verify of core_xfer_shared_libraries_aix, has predicate. */ - /* Skip verify of core_pid_to_str, has predicate. */ - /* Skip verify of core_thread_name, has predicate. */ -+ /* Skip verify of core_xfer_siginfo, has predicate. */ - /* Skip verify of gcore_bfd_target, has predicate. */ - /* Skip verify of vtable_function_descriptors, invalid_p == 0 */ - /* Skip verify of vbit_in_delta, invalid_p == 0 */ -@@ -884,6 +886,12 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) - "gdbarch_dump: core_xfer_shared_libraries_aix = <%s>\n", - host_address_to_string (gdbarch->core_xfer_shared_libraries_aix)); - fprintf_unfiltered (file, -+ "gdbarch_dump: gdbarch_core_xfer_siginfo_p() = %d\n", -+ gdbarch_core_xfer_siginfo_p (gdbarch)); -+ fprintf_unfiltered (file, -+ "gdbarch_dump: core_xfer_siginfo = <%s>\n", -+ host_address_to_string (gdbarch->core_xfer_siginfo)); -+ fprintf_unfiltered (file, - "gdbarch_dump: decr_pc_after_break = %s\n", - core_addr_to_string_nz (gdbarch->decr_pc_after_break)); - fprintf_unfiltered (file, -@@ -3797,6 +3805,30 @@ set_gdbarch_core_thread_name (struct gdbarch *gdbarch, - } - - int -+gdbarch_core_xfer_siginfo_p (struct gdbarch *gdbarch) -+{ -+ gdb_assert (gdbarch != NULL); -+ return gdbarch->core_xfer_siginfo != NULL; -+} -+ -+LONGEST -+gdbarch_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, ULONGEST len) -+{ -+ gdb_assert (gdbarch != NULL); -+ gdb_assert (gdbarch->core_xfer_siginfo != NULL); -+ if (gdbarch_debug >= 2) -+ fprintf_unfiltered (gdb_stdlog, "gdbarch_core_xfer_siginfo called\n"); -+ return gdbarch->core_xfer_siginfo (gdbarch, readbuf, offset, len); -+} -+ -+void -+set_gdbarch_core_xfer_siginfo (struct gdbarch *gdbarch, -+ gdbarch_core_xfer_siginfo_ftype core_xfer_siginfo) -+{ -+ gdbarch->core_xfer_siginfo = core_xfer_siginfo; -+} -+ -+int - gdbarch_gcore_bfd_target_p (struct gdbarch *gdbarch) - { - gdb_assert (gdbarch != NULL); -diff --git gdb/gdbarch.h gdb/gdbarch.h -index ab7561f851..1c95301f6f 100644 ---- gdb/gdbarch.h -+++ gdb/gdbarch.h -@@ -933,6 +933,16 @@ typedef const char * (gdbarch_core_thread_name_ftype) (struct gdbarch *gdbarch, - extern const char * gdbarch_core_thread_name (struct gdbarch *gdbarch, struct thread_info *thr); - extern void set_gdbarch_core_thread_name (struct gdbarch *gdbarch, gdbarch_core_thread_name_ftype *core_thread_name); - -+/* Read offset OFFSET of TARGET_OBJECT_SIGNAL_INFO signal information -+ from core file into buffer READBUF with length LEN. Return the number -+ of bytes read (zero indicates EOF, a negative value indicates failure). */ -+ -+extern int gdbarch_core_xfer_siginfo_p (struct gdbarch *gdbarch); -+ -+typedef LONGEST (gdbarch_core_xfer_siginfo_ftype) (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, ULONGEST len); -+extern LONGEST gdbarch_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, ULONGEST len); -+extern void set_gdbarch_core_xfer_siginfo (struct gdbarch *gdbarch, gdbarch_core_xfer_siginfo_ftype *core_xfer_siginfo); -+ - /* BFD target to use when generating a core file. */ - - extern int gdbarch_gcore_bfd_target_p (struct gdbarch *gdbarch); -diff --git gdb/gdbarch.sh gdb/gdbarch.sh -index 22f5715037..3aab17f958 100755 ---- gdb/gdbarch.sh -+++ gdb/gdbarch.sh -@@ -755,6 +755,11 @@ M;const char *;core_pid_to_str;ptid_t ptid;ptid - # How the core target extracts the name of a thread from a core file. - M;const char *;core_thread_name;struct thread_info *thr;thr - -+# Read offset OFFSET of TARGET_OBJECT_SIGNAL_INFO signal information -+# from core file into buffer READBUF with length LEN. Return the number -+# of bytes read (zero indicates EOF, a negative value indicates failure). -+M;LONGEST;core_xfer_siginfo;gdb_byte *readbuf, ULONGEST offset, ULONGEST len; readbuf, offset, len -+ - # BFD target to use when generating a core file. - V;const char *;gcore_bfd_target;;;0;0;;;pstring (gdbarch->gcore_bfd_target) - -diff --git gdb/linux-tdep.c gdb/linux-tdep.c -index 2792cbd4c8..5c7f8a0758 100644 ---- gdb/linux-tdep.c -+++ gdb/linux-tdep.c -@@ -1127,6 +1127,26 @@ linux_core_info_proc (struct gdbarch *gdbarch, const char *args, - error (_("unable to handle request")); - } - -+/* Read siginfo data from the core, if possible. Returns -1 on -+ failure. Otherwise, returns the number of bytes read. READBUF, -+ OFFSET, and LEN are all as specified by the to_xfer_partial -+ interface. */ -+ -+static LONGEST -+linux_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf, -+ ULONGEST offset, ULONGEST len) -+{ -+ thread_section_name section_name (".note.linuxcore.siginfo", inferior_ptid); -+ asection *section = bfd_get_section_by_name (core_bfd, section_name.c_str ()); -+ if (section == NULL) -+ return -1; -+ -+ if (!bfd_get_section_contents (core_bfd, section, readbuf, offset, len)) -+ return -1; -+ -+ return len; -+} -+ - typedef int linux_find_memory_region_ftype (ULONGEST vaddr, ULONGEST size, - ULONGEST offset, ULONGEST inode, - int read, int write, -@@ -2516,6 +2536,7 @@ linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) - set_gdbarch_core_pid_to_str (gdbarch, linux_core_pid_to_str); - set_gdbarch_info_proc (gdbarch, linux_info_proc); - set_gdbarch_core_info_proc (gdbarch, linux_core_info_proc); -+ set_gdbarch_core_xfer_siginfo (gdbarch, linux_core_xfer_siginfo); - set_gdbarch_find_memory_regions (gdbarch, linux_find_memory_regions); - set_gdbarch_make_corefile_notes (gdbarch, linux_make_corefile_notes); - set_gdbarch_has_shared_address_space (gdbarch, Index: head/devel/gdb/files/commit-386a867618 =================================================================== --- head/devel/gdb/files/commit-386a867618 +++ head/devel/gdb/files/commit-386a867618 @@ -0,0 +1,115 @@ +commit 386a86761838df16c1459275d465ed21a1c35d9f +Author: John Baldwin +Date: Sat Mar 3 21:25:33 2018 -0800 + + Add a new debug knob for the FreeBSD native target. + + For now this just logs information about the state of the current LWP + for each STOPPED event in fbsd_wait(). + + gdb/ChangeLog: + + * NEWS (Changes since GDB 8.1): Add "set/show debug fbsd-nat". + * fbsd-nat.c (debug_fbsd_nat): New variable. + (show_fbsd_nat_debug): New function. + (fbsd_wait): Log LWP info if "debug_fbsd_nat" is enabled. + (_initialize_fbsd_nat): Add "fbsd-nat" debug boolean command. + + gdb/doc/ChangeLog: + + * gdb.texinfo (Debugging Output): Document "set/show debug + fbsd-nat". + +diff --git gdb/NEWS gdb/NEWS +index 1767cef920..867e268a2a 100644 +--- gdb/NEWS ++++ gdb/NEWS +@@ -6,6 +6,12 @@ + * 'info proc' now works on running processes on FreeBSD systems and core + files created on FreeBSD systems. + ++* New commands ++ ++set debug fbsd-nat ++show debug fbsd-nat ++ Control display of debugging info regarding the FreeBSD native target. ++ + *** Changes in GDB 8.1 + + * GDB now supports dynamically creating arbitrary register groups specified +diff --git gdb/doc/gdb.texinfo gdb/doc/gdb.texinfo +index ee7adc8df2..74e0fdb4a4 100644 +--- gdb/doc/gdb.texinfo ++++ gdb/doc/gdb.texinfo +@@ -24554,6 +24554,11 @@ Displays the current state of displaying debugging info about + Turns on or off debugging messages from the FreeBSD LWP debug support. + @item show debug fbsd-lwp + Show the current state of FreeBSD LWP debugging messages. ++@item set debug fbsd-nat ++@cindex FreeBSD native target debug messages ++Turns on or off debugging messages from the FreeBSD native target. ++@item show debug fbsd-nat ++Show the current state of FreeBSD native target debugging messages. + @item set debug frame + @cindex frame debugging info + Turns on or off display of @value{GDBN} frame debugging info. The +diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c +index 3a216abf18..2516ac5552 100644 +--- gdb/fbsd-nat.c ++++ gdb/fbsd-nat.c +@@ -765,6 +765,7 @@ fbsd_xfer_partial (struct target_ops *ops, enum target_object object, + + #ifdef PT_LWPINFO + static int debug_fbsd_lwp; ++static int debug_fbsd_nat; + + static void (*super_resume) (struct target_ops *, + ptid_t, +@@ -782,6 +783,14 @@ show_fbsd_lwp_debug (struct ui_file *file, int from_tty, + fprintf_filtered (file, _("Debugging of FreeBSD lwp module is %s.\n"), value); + } + ++static void ++show_fbsd_nat_debug (struct ui_file *file, int from_tty, ++ struct cmd_list_element *c, const char *value) ++{ ++ fprintf_filtered (file, _("Debugging of FreeBSD native target is %s.\n"), ++ value); ++} ++ + /* + FreeBSD's first thread support was via a "reentrant" version of libc + (libc_r) that first shipped in 2.2.7. This library multiplexed all +@@ -1212,6 +1221,18 @@ fbsd_wait (struct target_ops *ops, + + wptid = ptid_build (pid, pl.pl_lwpid, 0); + ++ if (debug_fbsd_nat) ++ { ++ fprintf_unfiltered (gdb_stdlog, ++ "FNAT: stop for LWP %u event %d flags %#x\n", ++ pl.pl_lwpid, pl.pl_event, pl.pl_flags); ++ if (pl.pl_flags & PL_FLAG_SI) ++ fprintf_unfiltered (gdb_stdlog, ++ "FNAT: si_signo %u si_code %u\n", ++ pl.pl_siginfo.si_signo, ++ pl.pl_siginfo.si_code); ++ } ++ + #ifdef PT_LWP_EVENTS + if (pl.pl_flags & PL_FLAG_EXITED) + { +@@ -1569,5 +1590,13 @@ Enables printf debugging output."), + NULL, + &show_fbsd_lwp_debug, + &setdebuglist, &showdebuglist); ++ add_setshow_boolean_cmd ("fbsd-nat", class_maintenance, ++ &debug_fbsd_nat, _("\ ++Set debugging of FreeBSD native target."), _("\ ++Show debugging of FreeBSD native target."), _("\ ++Enables printf debugging output."), ++ NULL, ++ &show_fbsd_nat_debug, ++ &setdebuglist, &showdebuglist); + #endif + } Index: head/devel/gdb/files/commit-3c3ae77e68 =================================================================== --- head/devel/gdb/files/commit-3c3ae77e68 +++ head/devel/gdb/files/commit-3c3ae77e68 @@ -1,156 +0,0 @@ -commit 3c3ae77e68a9032ef9f174bf6b1cc992b6a4cb35 -Author: Pedro Alves -Date: Thu May 4 15:14:37 2017 +0100 - - Fix get_core_register_section leak, introduce thread_section_name - - This plugs a leak introduced in the previous change to - get_core_register_section, which removed an xfree call that is - actually necessary because the 'section_name' local is static. - - From [1] it looks like the reason the variable was made static to - begin with, was just "laziness" to avoid having to think about freeing - it on every function return path: - - https://sourceware.org/ml/gdb-patches/2005-03/msg00237.html - - The easiest to fix that nowadays is to use a std::string. - - I don't see a need to xstrdup the section name in the single-threaded - case though, and also there's more than one place that computes a - multi-threaded section name in the same way. So put the section name - computation in a wrapper class with state. - - gdb/ChangeLog: - 2017-05-04 Pedro Alves - - * corelow.c (thread_section_name): New class. - (get_core_register_section, get_core_siginfo): Use it. - -diff --git gdb/corelow.c gdb/corelow.c -index 2266f2467a..0aff02d4db 100644 ---- gdb/corelow.c -+++ gdb/corelow.c -@@ -485,6 +485,51 @@ core_detach (struct target_ops *ops, const char *args, int from_tty) - printf_filtered (_("No core file now.\n")); - } - -+/* Build either a single-thread or multi-threaded section name for -+ PTID. -+ -+ If ptid's lwp member is zero, we want to do the single-threaded -+ thing: look for a section named NAME (as passed to the -+ constructor). If ptid's lwp member is non-zero, we'll want do the -+ multi-threaded thing: look for a section named "NAME/LWP", where -+ LWP is the shortest ASCII decimal representation of ptid's lwp -+ member. */ -+ -+class thread_section_name -+{ -+public: -+ /* NAME is the single-threaded section name. If PTID represents an -+ LWP, then the build section name is "NAME/LWP", otherwise it's -+ just "NAME" unmodified. */ -+ thread_section_name (const char *name, ptid_t ptid) -+ { -+ if (ptid.lwp_p ()) -+ { -+ m_storage = string_printf ("%s/%ld", name, ptid.lwp ()); -+ m_section_name = m_storage.c_str (); -+ } -+ else -+ m_section_name = name; -+ } -+ -+ /* Return the computed section name. The result is valid as long as -+ this thread_section_name object is live. */ -+ const char *c_str () const -+ { return m_section_name; } -+ -+ /* Disable copy. */ -+ thread_section_name (const thread_section_name &) = delete; -+ void operator= (const thread_section_name &) = delete; -+ -+private: -+ /* Either a pointer into M_STORAGE, or a pointer to the name passed -+ as parameter to the constructor. */ -+ const char *m_section_name; -+ /* If we need to build a new section name, this is where we store -+ it. */ -+ std::string m_storage; -+}; -+ - /* Try to retrieve registers from a section in core_bfd, and supply - them to core_vec->core_read_registers, as the register set numbered - WHICH. -@@ -511,21 +556,15 @@ get_core_register_section (struct regcache *regcache, - const char *human_name, - int required) - { -- static char *section_name; - struct bfd_section *section; - bfd_size_type size; - char *contents; - bool variable_size_section = (regset != NULL - && regset->flags & REGSET_VARIABLE_SIZE); -- ptid_t ptid = regcache_get_ptid (regcache); - -- if (ptid_get_lwp (ptid)) -- section_name = xstrprintf ("%s/%ld", name, -- ptid_get_lwp (ptid)); -- else -- section_name = xstrdup (name); -+ thread_section_name section_name (name, regcache->ptid ()); - -- section = bfd_get_section_by_name (core_bfd, section_name); -+ section = bfd_get_section_by_name (core_bfd, section_name.c_str ()); - if (! section) - { - if (required) -@@ -537,13 +576,14 @@ get_core_register_section (struct regcache *regcache, - size = bfd_section_size (core_bfd, section); - if (size < min_size) - { -- warning (_("Section `%s' in core file too small."), section_name); -+ warning (_("Section `%s' in core file too small."), -+ section_name.c_str ()); - return; - } - if (size != min_size && !variable_size_section) - { - warning (_("Unexpected size of section `%s' in core file."), -- section_name); -+ section_name.c_str ()); - } - - contents = (char *) alloca (size); -@@ -551,7 +591,7 @@ get_core_register_section (struct regcache *regcache, - (file_ptr) 0, size)) - { - warning (_("Couldn't read %s registers from `%s' section in core file."), -- human_name, name); -+ human_name, section_name.c_str ()); - return; - } - -@@ -681,18 +721,8 @@ add_to_spuid_list (bfd *abfd, asection *asect, void *list_p) - static LONGEST - get_core_siginfo (bfd *abfd, gdb_byte *readbuf, ULONGEST offset, ULONGEST len) - { -- asection *section; -- char *section_name; -- const char *name = ".note.linuxcore.siginfo"; -- -- if (ptid_get_lwp (inferior_ptid)) -- section_name = xstrprintf ("%s/%ld", name, -- ptid_get_lwp (inferior_ptid)); -- else -- section_name = xstrdup (name); -- -- section = bfd_get_section_by_name (abfd, section_name); -- xfree (section_name); -+ thread_section_name section_name (".note.linuxcore.siginfo", inferior_ptid); -+ asection *section = bfd_get_section_by_name (abfd, section_name.c_str ()); - if (section == NULL) - return -1; - Index: head/devel/gdb/files/commit-45eba0ab7d =================================================================== --- head/devel/gdb/files/commit-45eba0ab7d +++ head/devel/gdb/files/commit-45eba0ab7d @@ -1,45 +0,0 @@ -commit 45eba0ab7d26435121facb68847fbd0cd4a313c1 -Author: Andreas Arnez -Date: Thu May 4 11:06:10 2017 +0200 - - Remove some superfluous code in corelow.c - - In corelow.c I stumbled upon an extra semicolon and an xfree of a NULL - pointer. Remove them. - - gdb/ChangeLog: - - * corelow.c (sniff_core_bfd): Remove extra semicolon. - (get_core_register_section): Remove xfree of NULL pointer. - -diff --git gdb/corelow.c gdb/corelow.c -index 3267c37843..2266f2467a 100644 ---- gdb/corelow.c -+++ gdb/corelow.c -@@ -129,7 +129,7 @@ sniff_core_bfd (bfd *abfd) - { - struct core_fns *cf; - struct core_fns *yummy = NULL; -- int matches = 0;; -+ int matches = 0; - - /* Don't sniff if we have support for register sets in - CORE_GDBARCH. */ -@@ -511,7 +511,7 @@ get_core_register_section (struct regcache *regcache, - const char *human_name, - int required) - { -- static char *section_name = NULL; -+ static char *section_name; - struct bfd_section *section; - bfd_size_type size; - char *contents; -@@ -519,8 +519,6 @@ get_core_register_section (struct regcache *regcache, - && regset->flags & REGSET_VARIABLE_SIZE); - ptid_t ptid = regcache_get_ptid (regcache); - -- xfree (section_name); -- - if (ptid_get_lwp (ptid)) - section_name = xstrprintf ("%s/%ld", name, - ptid_get_lwp (ptid)); Index: head/devel/gdb/files/commit-48aeef91c2 =================================================================== --- head/devel/gdb/files/commit-48aeef91c2 +++ head/devel/gdb/files/commit-48aeef91c2 @@ -1,805 +0,0 @@ -commit 48aeef91c248291dd03583798904612426b1f40a -Author: John Baldwin -Date: Mon Jun 26 18:14:43 2017 -0700 - - Include the fs_base and gs_base registers in amd64 target descriptions. - - This permits these registers to be used with non-Linux targets. - - gdb/ChangeLog: - - * features/Makefile (amd64.dat, amd64-avx.dat, amd64-mpx.dat) - (amd64-avx-mpx.dat, amd64-avx-avx512.dat) - (amd64-avx-mpx-avx512-pku.dat): Add i386/64bit-segments.xml in - those rules. - * features/i386/amd64-avx-avx512.xml: Add 64bit-segments.xml. - * features/i386/amd64-avx-mpx-avx512-pku.xml: Add 64bit-segments.xml. - * features/i386/amd64-avx-mpx.xml: Add 64bit-segments.xml. - * features/i386/amd64-avx.xml: Add 64bit-segments.xml. - * features/i386/amd64-mpx.xml: Add 64bit-segments.xml. - * features/i386/amd64.xml: Add 64bit-segments.xml. - * features/i386/amd64-avx-avx512.c: Regenerated. - * features/i386/amd64-avx-mpx-avx512-pku.c: Regenerated. - * features/i386/amd64-avx-mpx.c: Regenerated. - * features/i386/amd64-avx.c: Regenerated. - * features/i386/amd64-mpx.c: Regenerated. - * features/i386/amd64.c: Regenerated. - * regformats/i386/amd64-avx-avx512.dat: Regenerated. - * regformats/i386/amd64-avx-mpx-avx512-pku.dat: Regenerated. - * regformats/i386/amd64-avx-mpx.dat: Regenerated. - * regformats/i386/amd64-avx.dat: Regenerated. - * regformats/i386/amd64-mpx.dat: Regenerated. - * regformats/i386/amd64.dat: Regenerated. - -diff --git gdb/features/Makefile gdb/features/Makefile -index 3bc8b5ae85..75741acbe1 100644 ---- gdb/features/Makefile -+++ gdb/features/Makefile -@@ -263,7 +263,8 @@ $(outdir)/arm/arm-with-iwmmxt.dat: arm/arm-core.xml arm/xscale-iwmmxt.xml - $(outdir)/i386/i386.dat: i386/32bit-core.xml i386/32bit-sse.xml - $(outdir)/i386/i386-linux.dat: i386/32bit-core.xml i386/32bit-sse.xml \ - i386/32bit-linux.xml --$(outdir)/i386/amd64.dat: i386/64bit-core.xml i386/64bit-sse.xml -+$(outdir)/i386/amd64.dat: i386/64bit-core.xml i386/64bit-sse.xml \ -+ i386/64bit-segments.xml - $(outdir)/i386/amd64-linux.dat: i386/64bit-core.xml i386/64bit-sse.xml \ - i386/64bit-linux.xml i386/64bit-segments.xml - $(outdir)/i386/i386-avx.dat: i386/32bit-core.xml i386/32bit-avx.xml -@@ -289,7 +290,8 @@ $(outdir)/i386/i386-avx-mpx-avx512-pku-linux.dat: i386/32bit-core.xml \ - i386/32bit-pkeys.xml i386/32bit-linux.xml - $(outdir)/i386/i386-mmx.dat: i386/32bit-core.xml - $(outdir)/i386/i386-mmx-linux.dat: i386/32bit-core.xml i386/32bit-linux.xml --$(outdir)/i386/amd64-avx.dat: i386/64bit-core.xml i386/64bit-avx.xml -+$(outdir)/i386/amd64-avx.dat: i386/64bit-core.xml i386/64bit-avx.xml \ -+ i386/64bit-segments.xml - $(outdir)/i386/amd64-avx-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \ - i386/64bit-linux.xml i386/64bit-segments.xml - $(outdir)/i386/amd64-mpx-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \ -@@ -297,16 +299,16 @@ $(outdir)/i386/amd64-mpx-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \ - $(outdir)/i386/amd64-avx-mpx-linux.dat: i386/64bit-core.xml \ - i386/64bit-linux.xml i386/64bit-segments.xml i386/64bit-mpx.xml - $(outdir)/i386/amd64-mpx.dat: i386/64bit-core.xml i386/64bit-avx.xml \ -- i386/64bit-mpx.xml -+ i386/64bit-segments.xml i386/64bit-mpx.xml - $(outdir)/i386/amd64-avx-mpx.dat: i386/64bit-core.xml \ -- i386/64bit-mpx.xml -+ i386/64bit-segments.xml i386/64bit-mpx.xml - $(outdir)/i386/amd64-avx-avx512.dat: i386/64bit-core.xml i386/64bit-avx.xml \ -- i386/64bit-avx512.xml -+ i386/64bit-avx512.xml i386/64bit-segments.xml - $(outdir)/i386/amd64-avx-avx512-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \ - i386/64bit-avx512.xml i386/64bit-linux.xml - $(outdir)/i386/amd64-avx-mpx-avx512-pku.dat: i386/64bit-core.xml \ - i386/64bit-avx.xml i386/64bit-mpx.xml i386/64bit-avx512.xml \ -- i386/64bit-pkeys.xml -+ i386/64bit-pkeys.xml i386/64bit-segments.xml - $(outdir)/i386/amd64-avx-mpx-avx512-pku-linux.dat: i386/64bit-core.xml \ - i386/64bit-avx.xml i386/64bit-mpx.xml i386/64bit-avx512.xml \ - i386/64bit-linux.xml i386/64bit-segments.xml \ -diff --git gdb/features/i386/amd64-avx-avx512.c gdb/features/i386/amd64-avx-avx512.c -index 8a185c108d..f1ebde1071 100644 ---- gdb/features/i386/amd64-avx-avx512.c -+++ gdb/features/i386/amd64-avx-avx512.c -@@ -146,23 +146,27 @@ initialize_tdesc_amd64_avx_avx512 (void) - tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr"); - -+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments"); -+ tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int"); -+ tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int"); -+ - feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx"); -- tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm0h", 59, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm1h", 60, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm2h", 61, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm3h", 62, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm4h", 63, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm5h", 64, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm6h", 65, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm7h", 66, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm8h", 67, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm9h", 68, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm10h", 69, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm11h", 70, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm12h", 71, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm13h", 72, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm14h", 73, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm15h", 74, 1, NULL, 128, "uint128"); - - feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512"); - field_type = tdesc_named_type (feature, "ieee_single"); -@@ -202,78 +206,78 @@ initialize_tdesc_amd64_avx_avx512 (void) - field_type = tdesc_named_type (feature, "uint128"); - tdesc_create_vector (feature, "v2ui128", field_type, 2); - -- tdesc_create_reg (feature, "xmm16", 73, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm17", 74, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm18", 75, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm19", 76, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm20", 77, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm21", 78, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm22", 79, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm23", 80, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm24", 81, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm25", 82, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm26", 83, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm27", 84, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm28", 85, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm29", 86, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm30", 87, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm31", 88, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "ymm16h", 89, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm17h", 90, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm18h", 91, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm19h", 92, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm20h", 93, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm21h", 94, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm22h", 95, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm23h", 96, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm24h", 97, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm25h", 98, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm26h", 99, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm27h", 100, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm28h", 101, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm29h", 102, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm30h", 103, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm31h", 104, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "k0", 105, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k1", 106, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k2", 107, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k3", 108, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k4", 109, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k5", 110, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k6", 111, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k7", 112, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "zmm0h", 113, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm1h", 114, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm2h", 115, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm3h", 116, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm4h", 117, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm5h", 118, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm6h", 119, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm7h", 120, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm8h", 121, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm9h", 122, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm10h", 123, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm11h", 124, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm12h", 125, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm13h", 126, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm14h", 127, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm15h", 128, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm16h", 129, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm17h", 130, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm18h", 131, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm19h", 132, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm20h", 133, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm21h", 134, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm22h", 135, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm23h", 136, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm24h", 137, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm25h", 138, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm26h", 139, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm27h", 140, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm28h", 141, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm29h", 142, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm30h", 143, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm31h", 144, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "xmm16", 75, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm17", 76, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm18", 77, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm19", 78, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm20", 79, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm21", 80, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm22", 81, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm23", 82, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm24", 83, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm25", 84, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm26", 85, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm27", 86, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm28", 87, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm29", 88, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm30", 89, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm31", 90, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "ymm16h", 91, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm17h", 92, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm18h", 93, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm19h", 94, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm20h", 95, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm21h", 96, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm22h", 97, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm23h", 98, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm24h", 99, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm25h", 100, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm26h", 101, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm27h", 102, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm28h", 103, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm29h", 104, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm30h", 105, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm31h", 106, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "k0", 107, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k1", 108, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k2", 109, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k3", 110, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k4", 111, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k5", 112, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k6", 113, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k7", 114, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "zmm0h", 115, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm1h", 116, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm2h", 117, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm3h", 118, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm4h", 119, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm5h", 120, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm6h", 121, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm7h", 122, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm8h", 123, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm9h", 124, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm10h", 125, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm11h", 126, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm12h", 127, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm13h", 128, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm14h", 129, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm15h", 130, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm16h", 131, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm17h", 132, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm18h", 133, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm19h", 134, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm20h", 135, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm21h", 136, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm22h", 137, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm23h", 138, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm24h", 139, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm25h", 140, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm26h", 141, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm27h", 142, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm28h", 143, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm29h", 144, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm30h", 145, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm31h", 146, 1, NULL, 256, "v2ui128"); - - tdesc_amd64_avx_avx512 = result; - } -diff --git gdb/features/i386/amd64-avx-avx512.xml gdb/features/i386/amd64-avx-avx512.xml -index a4587433c8..fdf8136f74 100644 ---- gdb/features/i386/amd64-avx-avx512.xml -+++ gdb/features/i386/amd64-avx-avx512.xml -@@ -12,6 +12,7 @@ - i386:x86-64 - - -+ - - - -diff --git gdb/features/i386/amd64-avx-mpx-avx512-pku.c gdb/features/i386/amd64-avx-mpx-avx512-pku.c -index dfe7d7778a..f119e52f5d 100644 ---- gdb/features/i386/amd64-avx-mpx-avx512-pku.c -+++ gdb/features/i386/amd64-avx-mpx-avx512-pku.c -@@ -146,23 +146,27 @@ initialize_tdesc_amd64_avx_mpx_avx512_pku (void) - tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr"); - -+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments"); -+ tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int"); -+ tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int"); -+ - feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx"); -- tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm0h", 59, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm1h", 60, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm2h", 61, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm3h", 62, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm4h", 63, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm5h", 64, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm6h", 65, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm7h", 66, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm8h", 67, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm9h", 68, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm10h", 69, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm11h", 70, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm12h", 71, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm13h", 72, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm14h", 73, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm15h", 74, 1, NULL, 128, "uint128"); - - feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx"); - type = tdesc_create_struct (feature, "br128"); -@@ -195,12 +199,12 @@ initialize_tdesc_amd64_avx_mpx_avx512_pku (void) - field_type = tdesc_named_type (feature, "_bndcfgu"); - tdesc_add_field (type, "config", field_type); - -- tdesc_create_reg (feature, "bnd0raw", 73, 1, NULL, 128, "br128"); -- tdesc_create_reg (feature, "bnd1raw", 74, 1, NULL, 128, "br128"); -- tdesc_create_reg (feature, "bnd2raw", 75, 1, NULL, 128, "br128"); -- tdesc_create_reg (feature, "bnd3raw", 76, 1, NULL, 128, "br128"); -- tdesc_create_reg (feature, "bndcfgu", 77, 1, NULL, 64, "cfgu"); -- tdesc_create_reg (feature, "bndstatus", 78, 1, NULL, 64, "status"); -+ tdesc_create_reg (feature, "bnd0raw", 75, 1, NULL, 128, "br128"); -+ tdesc_create_reg (feature, "bnd1raw", 76, 1, NULL, 128, "br128"); -+ tdesc_create_reg (feature, "bnd2raw", 77, 1, NULL, 128, "br128"); -+ tdesc_create_reg (feature, "bnd3raw", 78, 1, NULL, 128, "br128"); -+ tdesc_create_reg (feature, "bndcfgu", 79, 1, NULL, 64, "cfgu"); -+ tdesc_create_reg (feature, "bndstatus", 80, 1, NULL, 64, "status"); - - feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512"); - field_type = tdesc_named_type (feature, "ieee_single"); -@@ -240,81 +244,81 @@ initialize_tdesc_amd64_avx_mpx_avx512_pku (void) - field_type = tdesc_named_type (feature, "uint128"); - tdesc_create_vector (feature, "v2ui128", field_type, 2); - -- tdesc_create_reg (feature, "xmm16", 79, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm17", 80, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm18", 81, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm19", 82, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm20", 83, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm21", 84, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm22", 85, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm23", 86, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm24", 87, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm25", 88, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm26", 89, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm27", 90, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm28", 91, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm29", 92, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm30", 93, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "xmm31", 94, 1, NULL, 128, "vec128"); -- tdesc_create_reg (feature, "ymm16h", 95, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm17h", 96, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm18h", 97, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm19h", 98, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm20h", 99, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm21h", 100, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm22h", 101, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm23h", 102, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm24h", 103, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm25h", 104, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm26h", 105, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm27h", 106, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm28h", 107, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm29h", 108, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm30h", 109, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm31h", 110, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "k0", 111, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k1", 112, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k2", 113, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k3", 114, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k4", 115, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k5", 116, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k6", 117, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "k7", 118, 1, NULL, 64, "uint64"); -- tdesc_create_reg (feature, "zmm0h", 119, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm1h", 120, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm2h", 121, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm3h", 122, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm4h", 123, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm5h", 124, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm6h", 125, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm7h", 126, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm8h", 127, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm9h", 128, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm10h", 129, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm11h", 130, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm12h", 131, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm13h", 132, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm14h", 133, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm15h", 134, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm16h", 135, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm17h", 136, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm18h", 137, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm19h", 138, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm20h", 139, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm21h", 140, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm22h", 141, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm23h", 142, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm24h", 143, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm25h", 144, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm26h", 145, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm27h", 146, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm28h", 147, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm29h", 148, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm30h", 149, 1, NULL, 256, "v2ui128"); -- tdesc_create_reg (feature, "zmm31h", 150, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "xmm16", 81, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm17", 82, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm18", 83, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm19", 84, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm20", 85, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm21", 86, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm22", 87, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm23", 88, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm24", 89, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm25", 90, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm26", 91, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm27", 92, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm28", 93, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm29", 94, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm30", 95, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "xmm31", 96, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "ymm16h", 97, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm17h", 98, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm18h", 99, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm19h", 100, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm20h", 101, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm21h", 102, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm22h", 103, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm23h", 104, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm24h", 105, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm25h", 106, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm26h", 107, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm27h", 108, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm28h", 109, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm29h", 110, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm30h", 111, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm31h", 112, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "k0", 113, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k1", 114, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k2", 115, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k3", 116, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k4", 117, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k5", 118, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k6", 119, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "k7", 120, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "zmm0h", 121, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm1h", 122, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm2h", 123, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm3h", 124, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm4h", 125, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm5h", 126, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm6h", 127, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm7h", 128, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm8h", 129, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm9h", 130, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm10h", 131, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm11h", 132, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm12h", 133, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm13h", 134, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm14h", 135, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm15h", 136, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm16h", 137, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm17h", 138, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm18h", 139, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm19h", 140, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm20h", 141, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm21h", 142, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm22h", 143, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm23h", 144, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm24h", 145, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm25h", 146, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm26h", 147, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm27h", 148, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm28h", 149, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm29h", 150, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm30h", 151, 1, NULL, 256, "v2ui128"); -+ tdesc_create_reg (feature, "zmm31h", 152, 1, NULL, 256, "v2ui128"); - - feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys"); -- tdesc_create_reg (feature, "pkru", 151, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "pkru", 153, 1, NULL, 32, "uint32"); - - tdesc_amd64_avx_mpx_avx512_pku = result; - } -diff --git gdb/features/i386/amd64-avx-mpx-avx512-pku.xml gdb/features/i386/amd64-avx-mpx-avx512-pku.xml -index e769108873..d8203e3400 100644 ---- gdb/features/i386/amd64-avx-mpx-avx512-pku.xml -+++ gdb/features/i386/amd64-avx-mpx-avx512-pku.xml -@@ -12,6 +12,7 @@ - i386:x86-64 - - -+ - - - -diff --git gdb/features/i386/amd64-avx-mpx.c gdb/features/i386/amd64-avx-mpx.c -index ab56f42f13..0c5161fe8d 100644 ---- gdb/features/i386/amd64-avx-mpx.c -+++ gdb/features/i386/amd64-avx-mpx.c -@@ -146,23 +146,27 @@ initialize_tdesc_amd64_avx_mpx (void) - tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr"); - -+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments"); -+ tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int"); -+ tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int"); -+ - feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx"); -- tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm0h", 59, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm1h", 60, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm2h", 61, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm3h", 62, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm4h", 63, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm5h", 64, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm6h", 65, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm7h", 66, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm8h", 67, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm9h", 68, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm10h", 69, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm11h", 70, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm12h", 71, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm13h", 72, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm14h", 73, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm15h", 74, 1, NULL, 128, "uint128"); - - feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx"); - type = tdesc_create_struct (feature, "br128"); -@@ -195,12 +199,12 @@ initialize_tdesc_amd64_avx_mpx (void) - field_type = tdesc_named_type (feature, "_bndcfgu"); - tdesc_add_field (type, "config", field_type); - -- tdesc_create_reg (feature, "bnd0raw", 73, 1, NULL, 128, "br128"); -- tdesc_create_reg (feature, "bnd1raw", 74, 1, NULL, 128, "br128"); -- tdesc_create_reg (feature, "bnd2raw", 75, 1, NULL, 128, "br128"); -- tdesc_create_reg (feature, "bnd3raw", 76, 1, NULL, 128, "br128"); -- tdesc_create_reg (feature, "bndcfgu", 77, 1, NULL, 64, "cfgu"); -- tdesc_create_reg (feature, "bndstatus", 78, 1, NULL, 64, "status"); -+ tdesc_create_reg (feature, "bnd0raw", 75, 1, NULL, 128, "br128"); -+ tdesc_create_reg (feature, "bnd1raw", 76, 1, NULL, 128, "br128"); -+ tdesc_create_reg (feature, "bnd2raw", 77, 1, NULL, 128, "br128"); -+ tdesc_create_reg (feature, "bnd3raw", 78, 1, NULL, 128, "br128"); -+ tdesc_create_reg (feature, "bndcfgu", 79, 1, NULL, 64, "cfgu"); -+ tdesc_create_reg (feature, "bndstatus", 80, 1, NULL, 64, "status"); - - tdesc_amd64_avx_mpx = result; - } -diff --git gdb/features/i386/amd64-avx-mpx.xml gdb/features/i386/amd64-avx-mpx.xml -index 0001dc8413..001cc58fa6 100644 ---- gdb/features/i386/amd64-avx-mpx.xml -+++ gdb/features/i386/amd64-avx-mpx.xml -@@ -12,6 +12,7 @@ - i386:x86-64 - - -+ - - - -diff --git gdb/features/i386/amd64-avx.c gdb/features/i386/amd64-avx.c -index 42bd69ab97..61d3ff56a4 100644 ---- gdb/features/i386/amd64-avx.c -+++ gdb/features/i386/amd64-avx.c -@@ -146,23 +146,27 @@ initialize_tdesc_amd64_avx (void) - tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr"); - -+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments"); -+ tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int"); -+ tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int"); -+ - feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx"); -- tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128"); -- tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm0h", 59, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm1h", 60, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm2h", 61, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm3h", 62, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm4h", 63, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm5h", 64, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm6h", 65, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm7h", 66, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm8h", 67, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm9h", 68, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm10h", 69, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm11h", 70, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm12h", 71, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm13h", 72, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm14h", 73, 1, NULL, 128, "uint128"); -+ tdesc_create_reg (feature, "ymm15h", 74, 1, NULL, 128, "uint128"); - - tdesc_amd64_avx = result; - } -diff --git gdb/features/i386/amd64-avx.xml gdb/features/i386/amd64-avx.xml -index d3b63b8132..a0fec551d9 100644 ---- gdb/features/i386/amd64-avx.xml -+++ gdb/features/i386/amd64-avx.xml -@@ -12,5 +12,6 @@ - i386:x86-64 - - -+ - - -diff --git gdb/features/i386/amd64-mpx.c gdb/features/i386/amd64-mpx.c -index 41f0e7834b..026fdb8625 100644 ---- gdb/features/i386/amd64-mpx.c -+++ gdb/features/i386/amd64-mpx.c -@@ -146,6 +146,10 @@ initialize_tdesc_amd64_mpx (void) - tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr"); - -+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments"); -+ tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int"); -+ tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int"); -+ - feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx"); - type = tdesc_create_struct (feature, "br128"); - field_type = tdesc_named_type (feature, "uint64"); -@@ -177,12 +181,12 @@ initialize_tdesc_amd64_mpx (void) - field_type = tdesc_named_type (feature, "_bndcfgu"); - tdesc_add_field (type, "config", field_type); - -- tdesc_create_reg (feature, "bnd0raw", 57, 1, NULL, 128, "br128"); -- tdesc_create_reg (feature, "bnd1raw", 58, 1, NULL, 128, "br128"); -- tdesc_create_reg (feature, "bnd2raw", 59, 1, NULL, 128, "br128"); -- tdesc_create_reg (feature, "bnd3raw", 60, 1, NULL, 128, "br128"); -- tdesc_create_reg (feature, "bndcfgu", 61, 1, NULL, 64, "cfgu"); -- tdesc_create_reg (feature, "bndstatus", 62, 1, NULL, 64, "status"); -+ tdesc_create_reg (feature, "bnd0raw", 59, 1, NULL, 128, "br128"); -+ tdesc_create_reg (feature, "bnd1raw", 60, 1, NULL, 128, "br128"); -+ tdesc_create_reg (feature, "bnd2raw", 61, 1, NULL, 128, "br128"); -+ tdesc_create_reg (feature, "bnd3raw", 62, 1, NULL, 128, "br128"); -+ tdesc_create_reg (feature, "bndcfgu", 63, 1, NULL, 64, "cfgu"); -+ tdesc_create_reg (feature, "bndstatus", 64, 1, NULL, 64, "status"); - - tdesc_amd64_mpx = result; - } -diff --git gdb/features/i386/amd64-mpx.xml gdb/features/i386/amd64-mpx.xml -index 7692006e9c..7e0253d661 100644 ---- gdb/features/i386/amd64-mpx.xml -+++ gdb/features/i386/amd64-mpx.xml -@@ -12,5 +12,6 @@ - i386:x86-64 - - -+ - - -diff --git gdb/features/i386/amd64.c gdb/features/i386/amd64.c -index b875a9b322..31ab6ccfba 100644 ---- gdb/features/i386/amd64.c -+++ gdb/features/i386/amd64.c -@@ -146,5 +146,9 @@ initialize_tdesc_amd64 (void) - tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr"); - -+ feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments"); -+ tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int"); -+ tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int"); -+ - tdesc_amd64 = result; - } -diff --git gdb/features/i386/amd64.xml gdb/features/i386/amd64.xml -index d11c07e234..1962a2af37 100644 ---- gdb/features/i386/amd64.xml -+++ gdb/features/i386/amd64.xml -@@ -12,4 +12,5 @@ - i386:x86-64 - - -+ - -diff --git gdb/regformats/i386/amd64-avx-avx512.dat gdb/regformats/i386/amd64-avx-avx512.dat -index b7938e6919..1fbe4733f5 100644 ---- gdb/regformats/i386/amd64-avx-avx512.dat -+++ gdb/regformats/i386/amd64-avx-avx512.dat -@@ -60,6 +60,8 @@ expedite:rbp,rsp,rip - 128:xmm14 - 128:xmm15 - 32:mxcsr -+64:fs_base -+64:gs_base - 128:ymm0h - 128:ymm1h - 128:ymm2h -diff --git gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat -index b3340d3276..23c3a4062e 100644 ---- gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat -+++ gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat -@@ -60,6 +60,8 @@ expedite:rbp,rsp,rip - 128:xmm14 - 128:xmm15 - 32:mxcsr -+64:fs_base -+64:gs_base - 128:ymm0h - 128:ymm1h - 128:ymm2h -diff --git gdb/regformats/i386/amd64-avx-mpx.dat gdb/regformats/i386/amd64-avx-mpx.dat -index d985641b01..655775b0f9 100644 ---- gdb/regformats/i386/amd64-avx-mpx.dat -+++ gdb/regformats/i386/amd64-avx-mpx.dat -@@ -60,6 +60,8 @@ expedite:rbp,rsp,rip - 128:xmm14 - 128:xmm15 - 32:mxcsr -+64:fs_base -+64:gs_base - 128:ymm0h - 128:ymm1h - 128:ymm2h -diff --git gdb/regformats/i386/amd64-avx.dat gdb/regformats/i386/amd64-avx.dat -index 223233667a..8b9d81e743 100644 ---- gdb/regformats/i386/amd64-avx.dat -+++ gdb/regformats/i386/amd64-avx.dat -@@ -60,6 +60,8 @@ expedite:rbp,rsp,rip - 128:xmm14 - 128:xmm15 - 32:mxcsr -+64:fs_base -+64:gs_base - 128:ymm0h - 128:ymm1h - 128:ymm2h -diff --git gdb/regformats/i386/amd64-mpx.dat gdb/regformats/i386/amd64-mpx.dat -index 43b87769c2..d5e60babd8 100644 ---- gdb/regformats/i386/amd64-mpx.dat -+++ gdb/regformats/i386/amd64-mpx.dat -@@ -60,6 +60,8 @@ expedite:rbp,rsp,rip - 128:xmm14 - 128:xmm15 - 32:mxcsr -+64:fs_base -+64:gs_base - 128:bnd0raw - 128:bnd1raw - 128:bnd2raw -diff --git gdb/regformats/i386/amd64.dat gdb/regformats/i386/amd64.dat -index 0ff917019d..66f26ad094 100644 ---- gdb/regformats/i386/amd64.dat -+++ gdb/regformats/i386/amd64.dat -@@ -60,3 +60,5 @@ expedite:rbp,rsp,rip - 128:xmm14 - 128:xmm15 - 32:mxcsr -+64:fs_base -+64:gs_base Index: head/devel/gdb/files/commit-4b654465bf =================================================================== --- head/devel/gdb/files/commit-4b654465bf +++ head/devel/gdb/files/commit-4b654465bf @@ -1,118 +0,0 @@ -commit 4b654465bfc3034c969d2d942c14b2cedfd3e3b6 -Author: John Baldwin -Date: Wed Jun 28 12:50:56 2017 -0700 - - Read signal information from FreeBSD core dumps. - - FreeBSD recently added a new ELF core note which dumps the entire LWP - info structure (the same structure returned by the ptrace PT_LWPINFO - operation) for each thread. The plan is for this note to eventually - supplant the older "thrmisc" ELF core note as it contains more - information and it permits new information to be exported via both - ptrace() and core dumps using the same structure. - - For signal information, the implementation is similar to the native - implementation for FreeBSD processes. The PL_FLAG_SI flag must be - checked to determine if the embedded siginfo_t structure is valid, and - if so it is transferred into the caller's buffer. - - gdb/ChangeLog: - - * fbsd-tdep.c (LWPINFO_OFFSET, LWPINFO_PL_FLAGS) - (LWPINFO64_PL_SIGINFO, LWPINFO32_PL_SIGINFO, PL_FLAG_SI) - (SIZE64_SIGINFO_T, SIZE32_SIGINFO_T, fbsd_core_xfer_siginfo): New. - (fbsd_init_abi): Install gdbarch "core_xfer_siginfo" method. - -diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c -index 32df104208..6f30197a83 100644 ---- gdb/fbsd-tdep.c -+++ gdb/fbsd-tdep.c -@@ -30,6 +30,28 @@ - #include "fbsd-tdep.h" - - -+/* FreeBSD kernels 12.0 and later include a copy of the -+ 'ptrace_lwpinfo' structure returned by the PT_LWPINFO ptrace -+ operation in an ELF core note (NT_FREEBSD_PTLWPINFO) for each LWP. -+ The constants below define the offset of field members and flags in -+ this structure used by methods in this file. Note that the -+ 'ptrace_lwpinfo' struct in the note is preceded by a 4 byte integer -+ containing the size of the structure. */ -+ -+#define LWPINFO_OFFSET 0x4 -+ -+/* Offsets in ptrace_lwpinfo. */ -+#define LWPINFO_PL_FLAGS 0x8 -+#define LWPINFO64_PL_SIGINFO 0x30 -+#define LWPINFO32_PL_SIGINFO 0x2c -+ -+/* Flags in pl_flags. */ -+#define PL_FLAG_SI 0x20 /* siginfo is valid */ -+ -+/* Sizes of siginfo_t. */ -+#define SIZE64_SIGINFO_T 80 -+#define SIZE32_SIGINFO_T 64 -+ - static struct gdbarch_data *fbsd_gdbarch_data_handle; - - struct fbsd_gdbarch_data -@@ -113,6 +135,51 @@ fbsd_core_thread_name (struct gdbarch *gdbarch, struct thread_info *thr) - return NULL; - } - -+/* Implement the "core_xfer_siginfo" gdbarch method. */ -+ -+static LONGEST -+fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf, -+ ULONGEST offset, ULONGEST len) -+{ -+ size_t siginfo_size; -+ -+ if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32) -+ siginfo_size = SIZE32_SIGINFO_T; -+ else -+ siginfo_size = SIZE64_SIGINFO_T; -+ if (offset > siginfo_size) -+ return -1; -+ -+ thread_section_name section_name (".note.freebsdcore.lwpinfo", inferior_ptid); -+ asection *section = bfd_get_section_by_name (core_bfd, section_name.c_str ()); -+ if (section == NULL) -+ return -1; -+ -+ gdb_byte buf[4]; -+ if (!bfd_get_section_contents (core_bfd, section, buf, -+ LWPINFO_OFFSET + LWPINFO_PL_FLAGS, 4)) -+ return -1; -+ -+ int pl_flags = extract_signed_integer (buf, 4, gdbarch_byte_order (gdbarch)); -+ if (!(pl_flags & PL_FLAG_SI)) -+ return -1; -+ -+ if (offset + len > siginfo_size) -+ len = siginfo_size - offset; -+ -+ ULONGEST siginfo_offset; -+ if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32) -+ siginfo_offset = LWPINFO_OFFSET + LWPINFO32_PL_SIGINFO; -+ else -+ siginfo_offset = LWPINFO_OFFSET + LWPINFO64_PL_SIGINFO; -+ -+ if (!bfd_get_section_contents (core_bfd, section, readbuf, -+ siginfo_offset + offset, len)) -+ return -1; -+ -+ return len; -+} -+ - static int - find_signalled_thread (struct thread_info *info, void *data) - { -@@ -447,6 +514,7 @@ 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_core_xfer_siginfo (gdbarch, fbsd_core_xfer_siginfo); - set_gdbarch_make_corefile_notes (gdbarch, fbsd_make_corefile_notes); - set_gdbarch_print_auxv_entry (gdbarch, fbsd_print_auxv_entry); - set_gdbarch_get_siginfo_type (gdbarch, fbsd_get_siginfo_type); Index: head/devel/gdb/files/commit-544c67cda1 =================================================================== --- head/devel/gdb/files/commit-544c67cda1 +++ head/devel/gdb/files/commit-544c67cda1 @@ -1,159 +0,0 @@ -commit 544c67cda1686c1b204cb96c0d7885b08d37b8d6 -Author: John Baldwin -Date: Fri Oct 6 11:41:45 2017 -0700 - - Account for padding in FreeBSD/mipsn32 NT_PRSTATUS notes. - - Add a new ELF backend method to grok FreeBSD NT_PRSTATUS core dump - notes. Define a method for MIPS N32 to override the default - elfcore_grok_freebsd_prstatus that accounts for additional padding - between pr_pid and pr_reg that is not present in other 32-bit FreeBSD - platforms. - - * elf-bfd.h (struct elf_backend_data): Add - `elf_backend_grok_freebsd_prstatus'. - * elf.c (elfcore_grok_freebsd_note): Call - `elf_backend_grok_freebsd_prstatus' to handle NT_PRSTATUS if - present. - * elfn32-mips.c (elf_n32_mips_grok_freebsd_prstatus): New - function. - (elf_backend_grok_freebsd_prstatus): Define. - * elfxx-target.h (elf_backend_grok_freebsd_prstatus): Define. - (elfNN_bed): Initialize `elf_backend_grok_freebsd_prstatus'. - -diff --git bfd/elf-bfd.h bfd/elf-bfd.h -index fd08748ae2..399e298a8d 100644 ---- bfd/elf-bfd.h -+++ bfd/elf-bfd.h -@@ -1270,6 +1270,11 @@ struct elf_backend_data - bfd_boolean (*elf_backend_grok_psinfo) - (bfd *, Elf_Internal_Note *); - -+ /* This function, if defined, is called when a "FreeBSD" NT_PRSTATUS -+ note is found in a core file. */ -+ bfd_boolean (*elf_backend_grok_freebsd_prstatus) -+ (bfd *, Elf_Internal_Note *); -+ - /* This function, if defined, is called to write a note to a corefile. */ - char *(*elf_backend_write_core_note) - (bfd *abfd, char *buf, int *bufsiz, int note_type, ...); -diff --git bfd/elf.c bfd/elf.c -index 02deceaf4c..c6de70d6b5 100644 ---- bfd/elf.c -+++ bfd/elf.c -@@ -9981,9 +9981,14 @@ elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note) - static bfd_boolean - elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note) - { -+ const struct elf_backend_data *bed = get_elf_backend_data (abfd); -+ - switch (note->type) - { - case NT_PRSTATUS: -+ if (bed->elf_backend_grok_freebsd_prstatus) -+ if ((*bed->elf_backend_grok_freebsd_prstatus) (abfd, note)) -+ return TRUE; - return elfcore_grok_freebsd_prstatus (abfd, note); - - case NT_FPREGSET: -diff --git bfd/elfn32-mips.c bfd/elfn32-mips.c -index dce7ba1c7a..fdae18365e 100644 ---- bfd/elfn32-mips.c -+++ bfd/elfn32-mips.c -@@ -80,6 +80,8 @@ static bfd_boolean elf32_mips_grok_prstatus - (bfd *, Elf_Internal_Note *); - static bfd_boolean elf32_mips_grok_psinfo - (bfd *, Elf_Internal_Note *); -+static bfd_boolean elf_n32_mips_grok_freebsd_prstatus -+ (bfd *, Elf_Internal_Note *); - static irix_compat_t elf_n32_mips_irix_compat - (bfd *); - -@@ -3578,6 +3580,56 @@ elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) - - return TRUE; - } -+ -+static bfd_boolean -+elf_n32_mips_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note) -+{ -+ size_t offset; -+ size_t size; -+ size_t min_size; -+ -+ /* Compute offset of pr_getregsz, skipping over pr_statussz. -+ Also compute minimum size of this note. */ -+ offset = 4 + 4; -+ min_size = offset + 4 * 2 + 4 + 4 + 4; -+ -+ if (note->descsz < min_size) -+ return FALSE; -+ -+ /* Check for version 1 in pr_version. */ -+ if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1) -+ return FALSE; -+ -+ /* Extract size of pr_reg from pr_gregsetsz. */ -+ /* Skip over pr_gregsetsz and pr_fpregsetsz. */ -+ size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset); -+ offset += 4 * 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. */ -+ offset += 4; -+ -+ /* Make sure that there is enough data remaining in the note. */ -+ if (note->descsz - offset < size) -+ return FALSE; -+ -+ /* Make a ".reg/999" section and a ".reg" section. */ -+ return _bfd_elfcore_make_pseudosection (abfd, ".reg", -+ size, note->descpos + offset); -+} - - /* Depending on the target vector we generate some version of Irix - executables or "normal" MIPS ELF ABI executables. */ -@@ -3684,6 +3736,8 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { - _bfd_mips_elf_copy_indirect_symbol - #define elf_backend_grok_prstatus elf32_mips_grok_prstatus - #define elf_backend_grok_psinfo elf32_mips_grok_psinfo -+#define elf_backend_grok_freebsd_prstatus \ -+ elf_n32_mips_grok_freebsd_prstatus - #define elf_backend_ecoff_debug_swap &mips_elf32_ecoff_debug_swap - - #define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO) -diff --git bfd/elfxx-target.h bfd/elfxx-target.h -index 551883fa09..6efca84e4e 100644 ---- bfd/elfxx-target.h -+++ bfd/elfxx-target.h -@@ -597,6 +597,9 @@ - #ifndef elf_backend_grok_psinfo - #define elf_backend_grok_psinfo NULL - #endif -+#ifndef elf_backend_grok_freebsd_prstatus -+#define elf_backend_grok_freebsd_prstatus NULL -+#endif - #ifndef elf_backend_write_core_note - #define elf_backend_write_core_note NULL - #endif -@@ -820,6 +823,7 @@ static struct elf_backend_data elfNN_bed = - elf_backend_sort_relocs_p, - elf_backend_grok_prstatus, - elf_backend_grok_psinfo, -+ elf_backend_grok_freebsd_prstatus, - elf_backend_write_core_note, - elf_backend_lookup_section_flags_hook, - elf_backend_reloc_type_class, Index: head/devel/gdb/files/commit-6d5be5d6b8 =================================================================== --- head/devel/gdb/files/commit-6d5be5d6b8 +++ head/devel/gdb/files/commit-6d5be5d6b8 @@ -1,24 +0,0 @@ -commit 6d5be5d6b8b4412e65bc037472aa2e727c25ccf5 -Author: John Baldwin -Date: Thu Oct 5 09:50:01 2017 -0700 - - Handle the NT_ARM_VFP core dump note on FreeBSD. - - bfd/ChangeLog: - - * elf.c (elfcore_grok_freebsd_note): Handle NT_ARM_VFP. - -diff --git bfd/elf.c bfd/elf.c -index fd7f773730..02deceaf4c 100644 ---- bfd/elf.c -+++ bfd/elf.c -@@ -10022,6 +10022,9 @@ elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note) - return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.lwpinfo", - note); - -+ case NT_ARM_VFP: -+ return elfcore_grok_arm_vfp (abfd, note); -+ - default: - return TRUE; - } Index: head/devel/gdb/files/commit-6e5eab33ab =================================================================== --- head/devel/gdb/files/commit-6e5eab33ab +++ head/devel/gdb/files/commit-6e5eab33ab @@ -1,120 +0,0 @@ -commit 6e5eab33abe09041b29e0ce484f684ad0ffe80a5 -Author: John Baldwin -Date: Wed Jun 28 10:41:57 2017 -0700 - - Move the thread_section_name class to gdbcore.h. - - This allows it to be used outside of corelow.c. - -diff --git gdb/corelow.c gdb/corelow.c -index 0aff02d4db..578c910bb5 100644 ---- gdb/corelow.c -+++ gdb/corelow.c -@@ -485,51 +485,6 @@ core_detach (struct target_ops *ops, const char *args, int from_tty) - printf_filtered (_("No core file now.\n")); - } - --/* Build either a single-thread or multi-threaded section name for -- PTID. -- -- If ptid's lwp member is zero, we want to do the single-threaded -- thing: look for a section named NAME (as passed to the -- constructor). If ptid's lwp member is non-zero, we'll want do the -- multi-threaded thing: look for a section named "NAME/LWP", where -- LWP is the shortest ASCII decimal representation of ptid's lwp -- member. */ -- --class thread_section_name --{ --public: -- /* NAME is the single-threaded section name. If PTID represents an -- LWP, then the build section name is "NAME/LWP", otherwise it's -- just "NAME" unmodified. */ -- thread_section_name (const char *name, ptid_t ptid) -- { -- if (ptid.lwp_p ()) -- { -- m_storage = string_printf ("%s/%ld", name, ptid.lwp ()); -- m_section_name = m_storage.c_str (); -- } -- else -- m_section_name = name; -- } -- -- /* Return the computed section name. The result is valid as long as -- this thread_section_name object is live. */ -- const char *c_str () const -- { return m_section_name; } -- -- /* Disable copy. */ -- thread_section_name (const thread_section_name &) = delete; -- void operator= (const thread_section_name &) = delete; -- --private: -- /* Either a pointer into M_STORAGE, or a pointer to the name passed -- as parameter to the constructor. */ -- const char *m_section_name; -- /* If we need to build a new section name, this is where we store -- it. */ -- std::string m_storage; --}; -- - /* Try to retrieve registers from a section in core_bfd, and supply - them to core_vec->core_read_registers, as the register set numbered - WHICH. -diff --git gdb/gdbcore.h gdb/gdbcore.h -index e3eed0395d..87f3dcd64d 100644 ---- gdb/gdbcore.h -+++ gdb/gdbcore.h -@@ -226,6 +226,51 @@ struct core_fns - - }; - -+/* Build either a single-thread or multi-threaded section name for -+ PTID. -+ -+ If ptid's lwp member is zero, we want to do the single-threaded -+ thing: look for a section named NAME (as passed to the -+ constructor). If ptid's lwp member is non-zero, we'll want do the -+ multi-threaded thing: look for a section named "NAME/LWP", where -+ LWP is the shortest ASCII decimal representation of ptid's lwp -+ member. */ -+ -+class thread_section_name -+{ -+public: -+ /* NAME is the single-threaded section name. If PTID represents an -+ LWP, then the build section name is "NAME/LWP", otherwise it's -+ just "NAME" unmodified. */ -+ thread_section_name (const char *name, ptid_t ptid) -+ { -+ if (ptid.lwp_p ()) -+ { -+ m_storage = string_printf ("%s/%ld", name, ptid.lwp ()); -+ m_section_name = m_storage.c_str (); -+ } -+ else -+ m_section_name = name; -+ } -+ -+ /* Return the computed section name. The result is valid as long as -+ this thread_section_name object is live. */ -+ const char *c_str () const -+ { return m_section_name; } -+ -+ /* Disable copy. */ -+ thread_section_name (const thread_section_name &) = delete; -+ void operator= (const thread_section_name &) = delete; -+ -+private: -+ /* Either a pointer into M_STORAGE, or a pointer to the name passed -+ as parameter to the constructor. */ -+ const char *m_section_name; -+ /* If we need to build a new section name, this is where we store -+ it. */ -+ std::string m_storage; -+}; -+ - /* NOTE: cagney/2004-04-05: Replaced by "regset.h" and - regset_from_core_section(). */ - extern void deprecated_add_core_fns (struct core_fns *cf); Index: head/devel/gdb/files/commit-762c974a09 =================================================================== --- head/devel/gdb/files/commit-762c974a09 +++ head/devel/gdb/files/commit-762c974a09 @@ -1,167 +0,0 @@ -commit 762c974a09746bda8a5d64ed3ee887adeae742b9 -Author: John Baldwin -Date: Wed Jun 28 08:14:06 2017 -0700 - - Implement the "get_siginfo_type" gdbarch method for FreeBSD architectures. - - As with Linux architectures, cache the created type in the gdbarch when it - is first created. Currently FreeBSD uses an identical siginfo type on - all architectures, so there is no support for architecture-specific fields. - - gdb/ChangeLog: - - * fbsd-tdep.c (fbsd_gdbarch_data_handle, struct fbsd_gdbarch_data) - (init_fbsd_gdbarch_data, get_fbsd_gdbarch_data) - (fbsd_get_siginfo_type): New. - (fbsd_init_abi): Install gdbarch "get_siginfo_type" method. - (_initialize_fbsd_tdep): New. - -diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c -index b834ce38b4..24a3c20dd6 100644 ---- gdb/fbsd-tdep.c -+++ gdb/fbsd-tdep.c -@@ -30,6 +30,26 @@ - #include "fbsd-tdep.h" - - -+static struct gdbarch_data *fbsd_gdbarch_data_handle; -+ -+struct fbsd_gdbarch_data -+ { -+ struct type *siginfo_type; -+ }; -+ -+static void * -+init_fbsd_gdbarch_data (struct gdbarch *gdbarch) -+{ -+ return GDBARCH_OBSTACK_ZALLOC (gdbarch, struct fbsd_gdbarch_data); -+} -+ -+static struct fbsd_gdbarch_data * -+get_fbsd_gdbarch_data (struct gdbarch *gdbarch) -+{ -+ return ((struct fbsd_gdbarch_data *) -+ gdbarch_data (gdbarch, fbsd_gdbarch_data_handle)); -+} -+ - /* This is how we want PTIDs from core files to be printed. */ - - static const char * -@@ -314,6 +334,97 @@ fbsd_print_auxv_entry (struct gdbarch *gdbarch, struct ui_file *file, - fprint_auxv_entry (file, name, description, format, type, val); - } - -+/* Implement the "get_siginfo_type" gdbarch method. */ -+ -+static struct type * -+fbsd_get_siginfo_type (struct gdbarch *gdbarch) -+{ -+ struct fbsd_gdbarch_data *fbsd_gdbarch_data; -+ struct type *int_type, *int32_type, *uint32_type, *long_type, *void_ptr_type; -+ struct type *uid_type, *pid_type; -+ struct type *sigval_type, *reason_type; -+ struct type *siginfo_type; -+ struct type *type; -+ -+ fbsd_gdbarch_data = get_fbsd_gdbarch_data (gdbarch); -+ if (fbsd_gdbarch_data->siginfo_type != NULL) -+ return fbsd_gdbarch_data->siginfo_type; -+ -+ int_type = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), -+ 0, "int"); -+ int32_type = arch_integer_type (gdbarch, 32, 0, "int32_t"); -+ uint32_type = arch_integer_type (gdbarch, 32, 1, "uint32_t"); -+ long_type = arch_integer_type (gdbarch, gdbarch_long_bit (gdbarch), -+ 0, "long"); -+ void_ptr_type = lookup_pointer_type (builtin_type (gdbarch)->builtin_void); -+ -+ /* union sigval */ -+ sigval_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_UNION); -+ TYPE_NAME (sigval_type) = xstrdup ("sigval"); -+ append_composite_type_field (sigval_type, "sival_int", int_type); -+ append_composite_type_field (sigval_type, "sival_ptr", void_ptr_type); -+ -+ /* __pid_t */ -+ pid_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF, -+ TYPE_LENGTH (int32_type), "__pid_t"); -+ TYPE_TARGET_TYPE (pid_type) = int32_type; -+ TYPE_TARGET_STUB (pid_type) = 1; -+ -+ /* __uid_t */ -+ uid_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF, -+ TYPE_LENGTH (uint32_type), "__uid_t"); -+ TYPE_TARGET_TYPE (uid_type) = uint32_type; -+ TYPE_TARGET_STUB (uid_type) = 1; -+ -+ /* _reason */ -+ reason_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_UNION); -+ -+ /* _fault */ -+ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); -+ append_composite_type_field (type, "si_trapno", int_type); -+ append_composite_type_field (reason_type, "_fault", type); -+ -+ /* _timer */ -+ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); -+ append_composite_type_field (type, "si_timerid", int_type); -+ append_composite_type_field (type, "si_overrun", int_type); -+ append_composite_type_field (reason_type, "_timer", type); -+ -+ /* _mesgq */ -+ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); -+ append_composite_type_field (type, "si_mqd", int_type); -+ append_composite_type_field (reason_type, "_mesgq", type); -+ -+ /* _poll */ -+ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); -+ append_composite_type_field (type, "si_band", long_type); -+ append_composite_type_field (reason_type, "_poll", type); -+ -+ /* __spare__ */ -+ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); -+ append_composite_type_field (type, "__spare1__", long_type); -+ append_composite_type_field (type, "__spare2__", -+ init_vector_type (int_type, 7)); -+ append_composite_type_field (reason_type, "__spare__", type); -+ -+ /* struct siginfo */ -+ siginfo_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); -+ TYPE_NAME (siginfo_type) = xstrdup ("siginfo"); -+ append_composite_type_field (siginfo_type, "si_signo", int_type); -+ append_composite_type_field (siginfo_type, "si_errno", int_type); -+ append_composite_type_field (siginfo_type, "si_code", int_type); -+ append_composite_type_field (siginfo_type, "si_pid", pid_type); -+ append_composite_type_field (siginfo_type, "si_uid", uid_type); -+ append_composite_type_field (siginfo_type, "si_status", int_type); -+ append_composite_type_field (siginfo_type, "si_addr", void_ptr_type); -+ append_composite_type_field (siginfo_type, "si_value", sigval_type); -+ append_composite_type_field (siginfo_type, "_reason", reason_type); -+ -+ fbsd_gdbarch_data->siginfo_type = siginfo_type; -+ -+ return siginfo_type; -+} -+ - /* Implement the "get_syscall_number" gdbarch method. */ - - static LONGEST -@@ -339,8 +450,19 @@ 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); -+ set_gdbarch_get_siginfo_type (gdbarch, fbsd_get_siginfo_type); - - /* `catch syscall' */ - set_xml_syscall_file_name (gdbarch, "syscalls/freebsd.xml"); - set_gdbarch_get_syscall_number (gdbarch, fbsd_get_syscall_number); - } -+ -+/* Provide a prototype to silence -Wmissing-prototypes. */ -+extern initialize_file_ftype _initialize_fbsd_tdep; -+ -+void -+_initialize_fbsd_tdep (void) -+{ -+ fbsd_gdbarch_data_handle = -+ gdbarch_data_register_post_init (init_fbsd_gdbarch_data); -+} Index: head/devel/gdb/files/commit-7efba073e2 =================================================================== --- head/devel/gdb/files/commit-7efba073e2 +++ head/devel/gdb/files/commit-7efba073e2 @@ -0,0 +1,184 @@ +commit 7efba073e2b83803a47fd89e701fe60b98f2debc +Author: John Baldwin +Date: Sat Mar 3 21:25:33 2018 -0800 + + Use signal information to determine SIGTRAP type for FreeBSD. + + Use the signal code from siginfo_t to distinguish SIGTRAP events due + to trace traps (TRAP_TRACE) and software breakpoints (TRAP_BRKPT). + For software breakpoints, adjust the PC when the event is reported as + part of the API when supplying "stopped_by_sw_breakpoint". Currently + FreeBSD only supports hardware watchpoints and breakpoints on x86 + which are reported as trace traps. Signal information is not used on + MIPS and sparc64 kernels which do not reliably report TRAP_BRKPT for + software breakpoints. + + gdb/ChangeLog: + + * fbsd-nat.c: Include "inf-ptrace.h". + (USE_SIGTRAP_SIGINFO): Conditionally define. + [USE_SIGTRAP_SIGINFO] (fbsd_handle_debug_trap): New function. + (fbsd_wait) [USE_SIGTRAP_SIGINFO]: Call "fbsd_handle_debug_trap". + [USE_SIGTRAP_SIGINFO] (fbsd_stopped_by_sw_breakpoint): New + function. + [USE_SIGTRAP_SIGINFO] (fbsd_supports_stopped_by_sw_breakpoint): + Likewise. + [USE_SIGTRAP_SIGINFO] (fbsd_supports_stopped_by_hw_breakpoint): + Likewise. + (fbsd_nat_add_target) [USE_SIGTRAP_SIGINFO]: Set + "stopped_by_sw_breakpoint", "supports_stopped_by_sw_breakpoint", + "supports_stopped_by_hw_breakpoint" target methods. + +diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c +index 2516ac5552..bea7f42c7e 100644 +--- gdb/fbsd-nat.c ++++ gdb/fbsd-nat.c +@@ -26,6 +26,7 @@ + #include "gdbcmd.h" + #include "gdbthread.h" + #include "gdb_wait.h" ++#include "inf-ptrace.h" + #include + #include + #include +@@ -45,6 +46,14 @@ + + #include + ++#ifdef TRAP_BRKPT ++/* MIPS does not set si_code for SIGTRAP. sparc64 reports ++ non-standard values in si_code for SIGTRAP. */ ++# if !defined(__mips__) && !defined(__sparc64__) ++# define USE_SIGTRAP_SIGINFO ++# endif ++#endif ++ + /* Return the name of a file that can be opened to get the symbols for + the child process identified by PID. */ + +@@ -1187,6 +1196,56 @@ fbsd_resume (struct target_ops *ops, + super_resume (ops, ptid, step, signo); + } + ++#ifdef USE_SIGTRAP_SIGINFO ++/* Handle breakpoint and trace traps reported via SIGTRAP. If the ++ trap was a breakpoint or trace trap that should be reported to the ++ core, return true. */ ++ ++static bool ++fbsd_handle_debug_trap (struct target_ops *ops, ptid_t ptid, ++ const struct ptrace_lwpinfo &pl) ++{ ++ ++ /* Ignore traps without valid siginfo or for signals other than ++ SIGTRAP. */ ++ if (! (pl.pl_flags & PL_FLAG_SI) || pl.pl_siginfo.si_signo != SIGTRAP) ++ return false; ++ ++ /* Trace traps are either a single step or a hardware watchpoint or ++ breakpoint. */ ++ if (pl.pl_siginfo.si_code == TRAP_TRACE) ++ { ++ if (debug_fbsd_nat) ++ fprintf_unfiltered (gdb_stdlog, ++ "FNAT: trace trap for LWP %ld\n", ptid.lwp ()); ++ return true; ++ } ++ ++ if (pl.pl_siginfo.si_code == TRAP_BRKPT) ++ { ++ /* Fixup PC for the software breakpoint. */ ++ struct regcache *regcache = get_thread_regcache (ptid); ++ struct gdbarch *gdbarch = regcache->arch (); ++ int decr_pc = gdbarch_decr_pc_after_break (gdbarch); ++ ++ if (debug_fbsd_nat) ++ fprintf_unfiltered (gdb_stdlog, ++ "FNAT: sw breakpoint trap for LWP %ld\n", ++ ptid.lwp ()); ++ if (decr_pc != 0) ++ { ++ CORE_ADDR pc; ++ ++ pc = regcache_read_pc (regcache); ++ regcache_write_pc (regcache, pc - decr_pc); ++ } ++ return true; ++ } ++ ++ return false; ++} ++#endif ++ + /* Wait for the child specified by PTID to do something. Return the + process ID of the child, or MINUS_ONE_PTID in case of error; store + the status in *OURSTATUS. */ +@@ -1372,6 +1431,11 @@ fbsd_wait (struct target_ops *ops, + } + #endif + ++#ifdef USE_SIGTRAP_SIGINFO ++ if (fbsd_handle_debug_trap (ops, wptid, pl)) ++ return wptid; ++#endif ++ + /* Note that PL_FLAG_SCE is set for any event reported while + a thread is executing a system call in the kernel. In + particular, signals that interrupt a sleep in a system +@@ -1410,6 +1474,42 @@ fbsd_wait (struct target_ops *ops, + } + } + ++#ifdef USE_SIGTRAP_SIGINFO ++/* Implement the "to_stopped_by_sw_breakpoint" target_ops method. */ ++ ++static int ++fbsd_stopped_by_sw_breakpoint (struct target_ops *ops) ++{ ++ struct ptrace_lwpinfo pl; ++ ++ if (ptrace (PT_LWPINFO, get_ptrace_pid (inferior_ptid), (caddr_t) &pl, ++ sizeof pl) == -1) ++ return 0; ++ ++ return ((pl.pl_flags & PL_FLAG_SI) ++ && pl.pl_siginfo.si_signo == SIGTRAP ++ && pl.pl_siginfo.si_code == TRAP_BRKPT); ++} ++ ++/* Implement the "to_supports_stopped_by_sw_breakpoint" target_ops ++ method. */ ++ ++static int ++fbsd_supports_stopped_by_sw_breakpoint (struct target_ops *ops) ++{ ++ return 1; ++} ++ ++/* Implement the "to_supports_stopped_by_hw_breakpoint" target_ops ++ method. */ ++ ++static int ++fbsd_supports_stopped_by_hw_breakpoint (struct target_ops *ops) ++{ ++ return ops->to_stopped_by_hw_breakpoint != NULL; ++} ++#endif ++ + #ifdef TDP_RFPPWAIT + /* Target hook for follow_fork. On entry and at return inferior_ptid is + the ptid of the followed inferior. */ +@@ -1560,6 +1660,13 @@ fbsd_nat_add_target (struct target_ops *t) + t->to_wait = fbsd_wait; + t->to_post_startup_inferior = fbsd_post_startup_inferior; + t->to_post_attach = fbsd_post_attach; ++#ifdef USE_SIGTRAP_SIGINFO ++ t->to_stopped_by_sw_breakpoint = fbsd_stopped_by_sw_breakpoint; ++ t->to_supports_stopped_by_sw_breakpoint ++ = fbsd_supports_stopped_by_sw_breakpoint; ++ t->to_supports_stopped_by_hw_breakpoint ++ = fbsd_supports_stopped_by_hw_breakpoint; ++#endif + #ifdef TDP_RFPPWAIT + t->to_follow_fork = fbsd_follow_fork; + t->to_insert_fork_catchpoint = fbsd_insert_fork_catchpoint; Index: head/devel/gdb/files/commit-906b4aac4c =================================================================== --- head/devel/gdb/files/commit-906b4aac4c +++ head/devel/gdb/files/commit-906b4aac4c @@ -0,0 +1,29 @@ +commit 906b4aac4c1d3cdb2b1ea7105133cfbe25e04e14 +Author: John Baldwin +Date: Fri Jan 12 12:05:50 2018 -0800 + + Use the correct value for the offset of 'kve_protection'. + + I had forgotten to convert the decimal output of 'ptype /o' to hex + (but still used a 0x prefix) for the KVE_PROTECTION constant defining + the offset of the 'kve_protection' field in the 'kinfo_vmentry' + structure. This resulted in garbage permissions for entries in 'info + proc mappings' for FreeBSD core dumps. + + gdb/ChangeLog: + + * fbsd-tdep.c (KVE_PROTECTION): Correct value. + +diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c +index 8aa0243d54..e49a9aff09 100644 +--- gdb/fbsd-tdep.c ++++ gdb/fbsd-tdep.c +@@ -62,7 +62,7 @@ + #define KVE_END 0x10 + #define KVE_OFFSET 0x18 + #define KVE_FLAGS 0x2c +-#define KVE_PROTECTION 0x56 ++#define KVE_PROTECTION 0x38 + #define KVE_PATH 0x88 + + /* Flags in the 'kve_protection' field in struct kinfo_vmentry. These Index: head/devel/gdb/files/commit-929edea98d =================================================================== --- head/devel/gdb/files/commit-929edea98d +++ head/devel/gdb/files/commit-929edea98d @@ -1,211 +0,0 @@ -commit 929edea98d27cf9d72305c1584ee77627da7fa96 -Author: John Baldwin -Date: Wed Jun 28 09:53:06 2017 -0700 - - Fetch signal information for native FreeBSD processes. - - Use the `pl_siginfo' field in the `struct ptrace_lwpinfo' object returned - by the PT_LWPINFO ptrace() request to supply the current contents of - $_siginfo for each thread. Note that FreeBSD does not supply a way to - modify the signal information for a thread, so $_siginfo is read-only for - FreeBSD. - - To handle 32-bit processes on a 64-bit host, define types for 32-bit - compatible siginfo_t and convert the 64-bit siginfo_t to the 32-bit - equivalent when supplying information for a 32-bit process. - - gdb/ChangeLog: - - * fbsd-nat.c [PT_LWPINFO && __LP64__] (union sigval32) - (struct siginfo32): New. - [PT_LWPINFO] (fbsd_siginfo_size, fbsd_convert_siginfo): New. - (fbsd_xfer_partial) [PT_LWPINFO]: Handle TARGET_OBJECT_SIGNAL_INFO - via ptrace(PT_LWPINFO). - -diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c -index ef5ad1ec92..85f56059bd 100644 ---- gdb/fbsd-nat.c -+++ gdb/fbsd-nat.c -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include - #include - #ifdef HAVE_KINFO_GETVMMAP - #include -@@ -216,6 +217,135 @@ static enum target_xfer_status (*super_xfer_partial) (struct target_ops *ops, - ULONGEST len, - ULONGEST *xfered_len); - -+#ifdef PT_LWPINFO -+/* Return the size of siginfo for the current inferior. */ -+ -+#ifdef __LP64__ -+union sigval32 { -+ int sival_int; -+ uint32_t sival_ptr; -+}; -+ -+/* This structure matches the naming and layout of `siginfo_t' in -+ . In particular, the `si_foo' macros defined in that -+ header can be used with both types to copy fields in the `_reason' -+ union. */ -+ -+struct siginfo32 -+{ -+ int si_signo; -+ int si_errno; -+ int si_code; -+ __pid_t si_pid; -+ __uid_t si_uid; -+ int si_status; -+ uint32_t si_addr; -+ union sigval32 si_value; -+ union -+ { -+ struct -+ { -+ int _trapno; -+ } _fault; -+ struct -+ { -+ int _timerid; -+ int _overrun; -+ } _timer; -+ struct -+ { -+ int _mqd; -+ } _mesgq; -+ struct -+ { -+ int32_t _band; -+ } _poll; -+ struct -+ { -+ int32_t __spare1__; -+ int __spare2__[7]; -+ } __spare__; -+ } _reason; -+}; -+#endif -+ -+static size_t -+fbsd_siginfo_size () -+{ -+#ifdef __LP64__ -+ struct gdbarch *gdbarch = get_frame_arch (get_current_frame ()); -+ -+ /* Is the inferior 32-bit? If so, use the 32-bit siginfo size. */ -+ if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32) -+ return sizeof (struct siginfo32); -+#endif -+ return sizeof (siginfo_t); -+} -+ -+/* Convert a native 64-bit siginfo object to a 32-bit object. Note -+ that FreeBSD doesn't support writing to $_siginfo, so this only -+ needs to convert one way. */ -+ -+static void -+fbsd_convert_siginfo (siginfo_t *si) -+{ -+#ifdef __LP64__ -+ struct gdbarch *gdbarch = get_frame_arch (get_current_frame ()); -+ -+ /* Is the inferior 32-bit? If not, nothing to do. */ -+ if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word != 32) -+ return; -+ -+ struct siginfo32 si32; -+ -+ si32.si_signo = si->si_signo; -+ si32.si_errno = si->si_errno; -+ si32.si_code = si->si_code; -+ si32.si_pid = si->si_pid; -+ si32.si_uid = si->si_uid; -+ si32.si_status = si->si_status; -+ si32.si_addr = (uintptr_t) si->si_addr; -+ -+ /* If sival_ptr is being used instead of sival_int on a big-endian -+ platform, then sival_int will be zero since it holds the upper -+ 32-bits of the pointer value. */ -+#if _BYTE_ORDER == _BIG_ENDIAN -+ if (si->si_value.sival_int == 0) -+ si32->si_value.sival_ptr = (uintptr_t) si->si_value.sival_ptr; -+ else -+ si32.si_value.sival_int = si->si_value.sival_int; -+#else -+ si32.si_value.sival_int = si->si_value.sival_int; -+#endif -+ -+ /* Always copy the spare fields and then possibly overwrite them for -+ signal-specific or code-specific fields. */ -+ si32._reason.__spare__.__spare1__ = si->_reason.__spare__.__spare1__; -+ for (int i = 0; i < 7; i++) -+ si32._reason.__spare__.__spare2__[i] = si->_reason.__spare__.__spare2__[i]; -+ switch (si->si_signo) { -+ case SIGILL: -+ case SIGFPE: -+ case SIGSEGV: -+ case SIGBUS: -+ si32.si_trapno = si->si_trapno; -+ break; -+ } -+ switch (si->si_code) { -+ case SI_TIMER: -+ si32.si_timerid = si->si_timerid; -+ si32.si_overrun = si->si_overrun; -+ break; -+ case SI_MESGQ: -+ si32.si_mqd = si->si_mqd; -+ break; -+ } -+ -+ memcpy(si, &si32, sizeof (si32)); -+#endif -+} -+#endif -+ - /* Implement the "to_xfer_partial target_ops" method. */ - - static enum target_xfer_status -@@ -228,6 +358,38 @@ fbsd_xfer_partial (struct target_ops *ops, enum target_object object, - - switch (object) - { -+#ifdef PT_LWPINFO -+ case TARGET_OBJECT_SIGNAL_INFO: -+ { -+ struct ptrace_lwpinfo pl; -+ size_t siginfo_size; -+ -+ /* FreeBSD doesn't support writing to $_siginfo. */ -+ if (writebuf != NULL) -+ return TARGET_XFER_E_IO; -+ -+ if (inferior_ptid.lwp_p ()) -+ pid = inferior_ptid.lwp (); -+ -+ siginfo_size = fbsd_siginfo_size (); -+ if (offset > siginfo_size) -+ return TARGET_XFER_E_IO; -+ -+ if (ptrace (PT_LWPINFO, pid, (PTRACE_TYPE_ARG3) &pl, sizeof (pl)) == -1) -+ return TARGET_XFER_E_IO; -+ -+ if (!(pl.pl_flags & PL_FLAG_SI)) -+ return TARGET_XFER_E_IO; -+ -+ fbsd_convert_siginfo (&pl.pl_siginfo); -+ if (offset + len > siginfo_size) -+ len = siginfo_size - offset; -+ -+ memcpy (readbuf, ((gdb_byte *) &pl.pl_siginfo) + offset, len); -+ *xfered_len = len; -+ return TARGET_XFER_OK; -+ } -+#endif - case TARGET_OBJECT_AUXV: - { - struct cleanup *cleanup = make_cleanup (null_cleanup, NULL); Index: head/devel/gdb/files/commit-92fce24de2 =================================================================== --- head/devel/gdb/files/commit-92fce24de2 +++ head/devel/gdb/files/commit-92fce24de2 @@ -0,0 +1,548 @@ +commit 92fce24de299a8b9a9a1c0c6b98e0e9c1656f99c +Author: John Baldwin +Date: Tue Jan 9 13:35:17 2018 -0800 + + Support 'info proc' for native FreeBSD processes. + + - Command line arguments are fetched via the kern.proc.args. + sysctl. + - The 'cwd' and 'exe' values are obtained from the per-process + file descriptor table returned by kinfo_getfile() from libutil. + - 'mappings' is implemented by walking the array of VM map entries + returned by kinfo_getvmmap() from libutil. + - 'status' output is generated by outputting fields from the structure + returned by the kern.proc.pid. sysctl. + - 'stat' is aliased to 'status'. + + gdb/ChangeLog: + + * configure.ac: Check for kinfo_getfile in libutil. + * configure: Regenerate. + * config.in: Regenerate. + * fbsd-nat.c: Include "fbsd-tdep.h". + (fbsd_fetch_cmdline): New. + (fbsd_fetch_kinfo_proc): Move earlier and change to return a bool + rather than calling error. + (fbsd_info_proc): New. + (fbsd_thread_name): Report error if fbsd_fetch_kinfo_proc fails. + (fbsd_wait): Report warning if fbsd_fetch_kinfo_proc fails. + (fbsd_nat_add_target): Set "to_info_proc" to "fbsd_info_proc". + +diff --git gdb/config.in gdb/config.in +index 1d11a97080..ad2cc1754e 100644 +--- gdb/config.in ++++ gdb/config.in +@@ -219,6 +219,9 @@ + /* Define to 1 if you have the header file. */ + #undef HAVE_INTTYPES_H + ++/* Define to 1 if your system has the kinfo_getfile function. */ ++#undef HAVE_KINFO_GETFILE ++ + /* Define to 1 if your system has the kinfo_getvmmap function. */ + #undef HAVE_KINFO_GETVMMAP + +diff --git gdb/configure gdb/configure +index db610f32fc..68b9aad02d 100755 +--- gdb/configure ++++ gdb/configure +@@ -7927,6 +7927,66 @@ $as_echo "#define HAVE_KINFO_GETVMMAP 1" >>confdefs.h + fi + + ++# fbsd-nat.c can also use kinfo_getfile. ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing kinfo_getfile" >&5 ++$as_echo_n "checking for library containing kinfo_getfile... " >&6; } ++if test "${ac_cv_search_kinfo_getfile+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_func_search_save_LIBS=$LIBS ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char kinfo_getfile (); ++int ++main () ++{ ++return kinfo_getfile (); ++ ; ++ return 0; ++} ++_ACEOF ++for ac_lib in '' util util-freebsd; do ++ if test -z "$ac_lib"; then ++ ac_res="none required" ++ else ++ ac_res=-l$ac_lib ++ LIBS="-l$ac_lib $ac_func_search_save_LIBS" ++ fi ++ if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_search_kinfo_getfile=$ac_res ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext ++ if test "${ac_cv_search_kinfo_getfile+set}" = set; then : ++ break ++fi ++done ++if test "${ac_cv_search_kinfo_getfile+set}" = set; then : ++ ++else ++ ac_cv_search_kinfo_getfile=no ++fi ++rm conftest.$ac_ext ++LIBS=$ac_func_search_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_kinfo_getfile" >&5 ++$as_echo "$ac_cv_search_kinfo_getfile" >&6; } ++ac_res=$ac_cv_search_kinfo_getfile ++if test "$ac_res" != no; then : ++ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ++ ++$as_echo "#define HAVE_KINFO_GETFILE 1" >>confdefs.h ++ ++fi ++ ++ + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" +diff --git gdb/configure.ac gdb/configure.ac +index 3db44ae758..551afc727e 100644 +--- gdb/configure.ac ++++ gdb/configure.ac +@@ -523,6 +523,11 @@ AC_SEARCH_LIBS(kinfo_getvmmap, util util-freebsd, + [AC_DEFINE(HAVE_KINFO_GETVMMAP, 1, + [Define to 1 if your system has the kinfo_getvmmap function. ])]) + ++# fbsd-nat.c can also use kinfo_getfile. ++AC_SEARCH_LIBS(kinfo_getfile, util util-freebsd, ++ [AC_DEFINE(HAVE_KINFO_GETFILE, 1, ++ [Define to 1 if your system has the kinfo_getfile function. ])]) ++ + AM_ICONV + + # GDB may fork/exec the iconv program to get the list of supported character +diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c +index 81f8e27a2d..b352418813 100644 +--- gdb/fbsd-nat.c ++++ gdb/fbsd-nat.c +@@ -32,14 +32,16 @@ + #include + #include + #include +-#ifdef HAVE_KINFO_GETVMMAP ++#if defined(HAVE_KINFO_GETFILE) || defined(HAVE_KINFO_GETVMMAP) + #include +-#else ++#endif ++#if !defined(HAVE_KINFO_GETVMMAP) + #include "filestuff.h" + #endif + + #include "elf-bfd.h" + #include "fbsd-nat.h" ++#include "fbsd-tdep.h" + + #include + +@@ -205,6 +207,331 @@ fbsd_find_memory_regions (struct target_ops *self, + } + #endif + ++/* Fetch the command line for a running process. */ ++ ++static gdb::unique_xmalloc_ptr ++fbsd_fetch_cmdline (pid_t pid) ++{ ++ size_t len; ++ int mib[4]; ++ ++ len = 0; ++ mib[0] = CTL_KERN; ++ mib[1] = KERN_PROC; ++ mib[2] = KERN_PROC_ARGS; ++ mib[3] = pid; ++ if (sysctl (mib, 4, NULL, &len, NULL, 0) == -1) ++ return nullptr; ++ ++ if (len == 0) ++ return nullptr; ++ ++ gdb::unique_xmalloc_ptr cmdline ((char *) xmalloc (len)); ++ if (sysctl (mib, 4, cmdline.get (), &len, NULL, 0) == -1) ++ return nullptr; ++ ++ return cmdline; ++} ++ ++/* Fetch the external variant of the kernel's internal process ++ structure for the process PID into KP. */ ++ ++static bool ++fbsd_fetch_kinfo_proc (pid_t pid, struct kinfo_proc *kp) ++{ ++ size_t len; ++ int mib[4]; ++ ++ len = sizeof *kp; ++ mib[0] = CTL_KERN; ++ mib[1] = KERN_PROC; ++ mib[2] = KERN_PROC_PID; ++ mib[3] = pid; ++ return (sysctl (mib, 4, kp, &len, NULL, 0) == 0); ++} ++ ++/* Implement the "to_info_proc target_ops" method. */ ++ ++static void ++fbsd_info_proc (struct target_ops *ops, const char *args, ++ enum info_proc_what what) ++{ ++#ifdef HAVE_KINFO_GETFILE ++ gdb::unique_xmalloc_ptr fdtbl; ++ int nfd = 0; ++#endif ++ struct kinfo_proc kp; ++ char *tmp; ++ pid_t pid; ++ bool do_cmdline = false; ++ bool do_cwd = false; ++ bool do_exe = false; ++#ifdef HAVE_KINFO_GETVMMAP ++ bool do_mappings = false; ++#endif ++ bool do_status = false; ++ ++ switch (what) ++ { ++ case IP_MINIMAL: ++ do_cmdline = true; ++ do_cwd = true; ++ do_exe = true; ++ break; ++#ifdef HAVE_KINFO_GETVMMAP ++ case IP_MAPPINGS: ++ do_mappings = true; ++ break; ++#endif ++ case IP_STATUS: ++ case IP_STAT: ++ do_status = true; ++ break; ++ case IP_CMDLINE: ++ do_cmdline = true; ++ break; ++ case IP_EXE: ++ do_exe = true; ++ break; ++ case IP_CWD: ++ do_cwd = true; ++ break; ++ case IP_ALL: ++ do_cmdline = true; ++ do_cwd = true; ++ do_exe = true; ++#ifdef HAVE_KINFO_GETVMMAP ++ do_mappings = true; ++#endif ++ do_status = true; ++ break; ++ default: ++ error (_("Not supported on this target.")); ++ } ++ ++ gdb_argv built_argv (args); ++ if (built_argv.count () == 0) ++ { ++ pid = ptid_get_pid (inferior_ptid); ++ if (pid == 0) ++ error (_("No current process: you must name one.")); ++ } ++ else if (built_argv.count () == 1 && isdigit (built_argv[0][0])) ++ pid = strtol (built_argv[0], NULL, 10); ++ else ++ error (_("Invalid arguments.")); ++ ++ printf_filtered (_("process %d\n"), pid); ++#ifdef HAVE_KINFO_GETFILE ++ if (do_cwd || do_exe) ++ fdtbl.reset (kinfo_getfile (pid, &nfd)); ++#endif ++ ++ if (do_cmdline) ++ { ++ gdb::unique_xmalloc_ptr cmdline = fbsd_fetch_cmdline (pid); ++ if (cmdline != nullptr) ++ printf_filtered ("cmdline = '%s'\n", cmdline.get ()); ++ else ++ warning (_("unable to fetch command line")); ++ } ++ if (do_cwd) ++ { ++ const char *cwd = NULL; ++#ifdef HAVE_KINFO_GETFILE ++ struct kinfo_file *kf = fdtbl.get (); ++ for (int i = 0; i < nfd; i++, kf++) ++ { ++ if (kf->kf_type == KF_TYPE_VNODE && kf->kf_fd == KF_FD_TYPE_CWD) ++ { ++ cwd = kf->kf_path; ++ break; ++ } ++ } ++#endif ++ if (cwd != NULL) ++ printf_filtered ("cwd = '%s'\n", cwd); ++ else ++ warning (_("unable to fetch current working directory")); ++ } ++ if (do_exe) ++ { ++ const char *exe = NULL; ++#ifdef HAVE_KINFO_GETFILE ++ struct kinfo_file *kf = fdtbl.get (); ++ for (int i = 0; i < nfd; i++, kf++) ++ { ++ if (kf->kf_type == KF_TYPE_VNODE && kf->kf_fd == KF_FD_TYPE_TEXT) ++ { ++ exe = kf->kf_path; ++ break; ++ } ++ } ++#endif ++ if (exe == NULL) ++ exe = fbsd_pid_to_exec_file (ops, pid); ++ if (exe != NULL) ++ printf_filtered ("exe = '%s'\n", exe); ++ else ++ warning (_("unable to fetch executable path name")); ++ } ++#ifdef HAVE_KINFO_GETVMMAP ++ if (do_mappings) ++ { ++ int nvment; ++ gdb::unique_xmalloc_ptr ++ vmentl (kinfo_getvmmap (pid, &nvment)); ++ ++ if (vmentl != nullptr) ++ { ++ printf_filtered (_("Mapped address spaces:\n\n")); ++#ifdef __LP64__ ++ printf_filtered (" %18s %18s %10s %10s %9s %s\n", ++ "Start Addr", ++ " End Addr", ++ " Size", " Offset", "Flags ", "File"); ++#else ++ printf_filtered ("\t%10s %10s %10s %10s %9s %s\n", ++ "Start Addr", ++ " End Addr", ++ " Size", " Offset", "Flags ", "File"); ++#endif ++ ++ struct kinfo_vmentry *kve = vmentl.get (); ++ for (int i = 0; i < nvment; i++, kve++) ++ { ++ ULONGEST start, end; ++ ++ start = kve->kve_start; ++ end = kve->kve_end; ++#ifdef __LP64__ ++ printf_filtered (" %18s %18s %10s %10s %9s %s\n", ++ hex_string (start), ++ hex_string (end), ++ hex_string (end - start), ++ hex_string (kve->kve_offset), ++ fbsd_vm_map_entry_flags (kve->kve_flags, ++ kve->kve_protection), ++ kve->kve_path); ++#else ++ printf_filtered ("\t%10s %10s %10s %10s %9s %s\n", ++ hex_string (start), ++ hex_string (end), ++ hex_string (end - start), ++ hex_string (kve->kve_offset), ++ fbsd_vm_map_entry_flags (kve->kve_flags, ++ kve->kve_protection), ++ kve->kve_path); ++#endif ++ } ++ } ++ else ++ warning (_("unable to fetch virtual memory map")); ++ } ++#endif ++ if (do_status) ++ { ++ if (!fbsd_fetch_kinfo_proc (pid, &kp)) ++ warning (_("Failed to fetch process information")); ++ else ++ { ++ const char *state; ++ int pgtok; ++ ++ printf_filtered ("Name: %s\n", kp.ki_comm); ++ switch (kp.ki_stat) ++ { ++ case SIDL: ++ state = "I (idle)"; ++ break; ++ case SRUN: ++ state = "R (running)"; ++ break; ++ case SSTOP: ++ state = "T (stopped)"; ++ break; ++ case SZOMB: ++ state = "Z (zombie)"; ++ break; ++ case SSLEEP: ++ state = "S (sleeping)"; ++ break; ++ case SWAIT: ++ state = "W (interrupt wait)"; ++ break; ++ case SLOCK: ++ state = "L (blocked on lock)"; ++ break; ++ default: ++ state = "? (unknown)"; ++ break; ++ } ++ printf_filtered ("State: %s\n", state); ++ printf_filtered ("Parent process: %d\n", kp.ki_ppid); ++ printf_filtered ("Process group: %d\n", kp.ki_pgid); ++ printf_filtered ("Session id: %d\n", kp.ki_sid); ++ printf_filtered ("TTY: %ju\n", (uintmax_t) kp.ki_tdev); ++ printf_filtered ("TTY owner process group: %d\n", kp.ki_tpgid); ++ printf_filtered ("User IDs (real, effective, saved): %d %d %d\n", ++ kp.ki_ruid, kp.ki_uid, kp.ki_svuid); ++ printf_filtered ("Group IDs (real, effective, saved): %d %d %d\n", ++ kp.ki_rgid, kp.ki_groups[0], kp.ki_svgid); ++ printf_filtered ("Groups: "); ++ for (int i = 0; i < kp.ki_ngroups; i++) ++ printf_filtered ("%d ", kp.ki_groups[i]); ++ printf_filtered ("\n"); ++ printf_filtered ("Minor faults (no memory page): %ld\n", ++ kp.ki_rusage.ru_minflt); ++ printf_filtered ("Minor faults, children: %ld\n", ++ kp.ki_rusage_ch.ru_minflt); ++ printf_filtered ("Major faults (memory page faults): %ld\n", ++ kp.ki_rusage.ru_majflt); ++ printf_filtered ("Major faults, children: %ld\n", ++ kp.ki_rusage_ch.ru_majflt); ++ printf_filtered ("utime: %jd.%06ld\n", ++ (intmax_t) kp.ki_rusage.ru_utime.tv_sec, ++ kp.ki_rusage.ru_utime.tv_usec); ++ printf_filtered ("stime: %jd.%06ld\n", ++ (intmax_t) kp.ki_rusage.ru_stime.tv_sec, ++ kp.ki_rusage.ru_stime.tv_usec); ++ printf_filtered ("utime, children: %jd.%06ld\n", ++ (intmax_t) kp.ki_rusage_ch.ru_utime.tv_sec, ++ kp.ki_rusage_ch.ru_utime.tv_usec); ++ printf_filtered ("stime, children: %jd.%06ld\n", ++ (intmax_t) kp.ki_rusage_ch.ru_stime.tv_sec, ++ kp.ki_rusage_ch.ru_stime.tv_usec); ++ printf_filtered ("'nice' value: %d\n", kp.ki_nice); ++ printf_filtered ("Start time: %jd.%06ld\n", kp.ki_start.tv_sec, ++ kp.ki_start.tv_usec); ++ pgtok = getpagesize () / 1024; ++ printf_filtered ("Virtual memory size: %ju kB\n", ++ (uintmax_t) kp.ki_size / 1024); ++ printf_filtered ("Data size: %ju kB\n", ++ (uintmax_t) kp.ki_dsize * pgtok); ++ printf_filtered ("Stack size: %ju kB\n", ++ (uintmax_t) kp.ki_ssize * pgtok); ++ printf_filtered ("Text size: %ju kB\n", ++ (uintmax_t) kp.ki_tsize * pgtok); ++ printf_filtered ("Resident set size: %ju kB\n", ++ (uintmax_t) kp.ki_rssize * pgtok); ++ printf_filtered ("Maximum RSS: %ju kB\n", ++ (uintmax_t) kp.ki_rusage.ru_maxrss); ++ printf_filtered ("Pending Signals: "); ++ for (int i = 0; i < _SIG_WORDS; i++) ++ printf_filtered ("%08x ", kp.ki_siglist.__bits[i]); ++ printf_filtered ("\n"); ++ printf_filtered ("Ignored Signals: "); ++ for (int i = 0; i < _SIG_WORDS; i++) ++ printf_filtered ("%08x ", kp.ki_sigignore.__bits[i]); ++ printf_filtered ("\n"); ++ printf_filtered ("Caught Signals: "); ++ for (int i = 0; i < _SIG_WORDS; i++) ++ printf_filtered ("%08x ", kp.ki_sigcatch.__bits[i]); ++ printf_filtered ("\n"); ++ } ++ } ++} ++ + #ifdef KERN_PROC_AUXV + static enum target_xfer_status (*super_xfer_partial) (struct target_ops *ops, + enum target_object object, +@@ -455,26 +782,6 @@ show_fbsd_lwp_debug (struct ui_file *file, int from_tty, + fprintf_filtered (file, _("Debugging of FreeBSD lwp module is %s.\n"), value); + } + +-#if defined(TDP_RFPPWAIT) || defined(HAVE_STRUCT_PTRACE_LWPINFO_PL_TDNAME) +-/* Fetch the external variant of the kernel's internal process +- structure for the process PID into KP. */ +- +-static void +-fbsd_fetch_kinfo_proc (pid_t pid, struct kinfo_proc *kp) +-{ +- size_t len; +- int mib[4]; +- +- len = sizeof *kp; +- mib[0] = CTL_KERN; +- mib[1] = KERN_PROC; +- mib[2] = KERN_PROC_PID; +- mib[3] = pid; +- if (sysctl (mib, 4, kp, &len, NULL, 0) == -1) +- perror_with_name (("sysctl")); +-} +-#endif +- + /* + FreeBSD's first thread support was via a "reentrant" version of libc + (libc_r) that first shipped in 2.2.7. This library multiplexed all +@@ -560,7 +867,8 @@ fbsd_thread_name (struct target_ops *self, struct thread_info *thr) + /* Note that ptrace_lwpinfo returns the process command in pl_tdname + if a name has not been set explicitly. Return a NULL name in + that case. */ +- fbsd_fetch_kinfo_proc (pid, &kp); ++ if (!fbsd_fetch_kinfo_proc (pid, &kp)) ++ perror_with_name (_("Failed to fetch process information")); + if (ptrace (PT_LWPINFO, lwp, (caddr_t) &pl, sizeof pl) == -1) + perror_with_name (("ptrace")); + if (strcmp (kp.ki_comm, pl.pl_tdname) == 0) +@@ -970,9 +1278,13 @@ fbsd_wait (struct target_ops *ops, + #ifndef PTRACE_VFORK + /* For vfork, the child process will have the P_PPWAIT + flag set. */ +- fbsd_fetch_kinfo_proc (child, &kp); +- if (kp.ki_flag & P_PPWAIT) +- ourstatus->kind = TARGET_WAITKIND_VFORKED; ++ if (fbsd_fetch_kinfo_proc (child, &kp)) ++ { ++ if (kp.ki_flag & P_PPWAIT) ++ ourstatus->kind = TARGET_WAITKIND_VFORKED; ++ } ++ else ++ warning (_("Failed to fetch process information")); + #endif + ourstatus->value.related_pid = child_ptid; + +@@ -1176,6 +1488,7 @@ fbsd_nat_add_target (struct target_ops *t) + { + t->to_pid_to_exec_file = fbsd_pid_to_exec_file; + t->to_find_memory_regions = fbsd_find_memory_regions; ++ t->to_info_proc = fbsd_info_proc; + #ifdef KERN_PROC_AUXV + super_xfer_partial = t->to_xfer_partial; + t->to_xfer_partial = fbsd_xfer_partial; Index: head/devel/gdb/files/commit-a181c0bf74 =================================================================== --- head/devel/gdb/files/commit-a181c0bf74 +++ head/devel/gdb/files/commit-a181c0bf74 @@ -1,79 +0,0 @@ -commit a181c0bf74 -Author: John Baldwin -Date: Mon Oct 9 09:54:42 2017 -0700 - - Use gdbarch_long_bit to determine layout of FreeBSD siginfo_t. - - FreeBSD architectures are either ILP32 or LP64 resulting in two - different layouts for siginfo_t. Previously, the 'bits_per_word' - member of bfd_arch_info was used to determine the layout to use for a - given FreeBSD architecture. However, mipsn32 architectures inherit - from a 64-bit mips architecture where bits_per_word is 64. As a - result, $_siginfo was not properly extracted from FreeBSD/mipsn32 core - dumps. Fix this by using gdbarch_long_bit instead of 'bits_per_word' - to determine if a FreeBSD architecture is ILP32 or LP64. - - gdb/ChangeLog: - - * fbsd-nat.c (fbsd_siginfo_size): Use gdbarch_long_bit. - (fbsd_convert_siginfo): Likewise. - * fbsd-tdep.c (fbsd_core_xfer_siginfo): Likewise. - -diff --git gdb/ChangeLog gdb/ChangeLog -index 7c8c6e4fe5..b04da8bd44 100644 ---- gdb/ChangeLog -+++ gdb/ChangeLog -@@ -1,3 +1,9 @@ -+2017-10-09 John Baldwin -+ -+ * fbsd-nat.c (fbsd_siginfo_size): Use gdbarch_long_bit. -+ (fbsd_convert_siginfo): Likewise. -+ * fbsd-tdep.c (fbsd_core_xfer_siginfo): Likewise. -+ - 2017-10-09 Simon Marchi - - * configure.ac (try_guile_versions): Remove guile-2.2. -diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c -index 5ad0dda5b4..265175a769 100644 ---- gdb/fbsd-nat.c -+++ gdb/fbsd-nat.c -@@ -279,7 +279,7 @@ fbsd_siginfo_size () - struct gdbarch *gdbarch = get_frame_arch (get_current_frame ()); - - /* Is the inferior 32-bit? If so, use the 32-bit siginfo size. */ -- if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32) -+ if (gdbarch_long_bit (gdbarch) == 32) - return sizeof (struct siginfo32); - #endif - return sizeof (siginfo_t); -@@ -296,7 +296,7 @@ fbsd_convert_siginfo (siginfo_t *si) - struct gdbarch *gdbarch = get_frame_arch (get_current_frame ()); - - /* Is the inferior 32-bit? If not, nothing to do. */ -- if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word != 32) -+ if (gdbarch_long_bit (gdbarch) != 32) - return; - - struct siginfo32 si32; -diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c -index fa4cd912ef..fa70f7c20b 100644 ---- gdb/fbsd-tdep.c -+++ gdb/fbsd-tdep.c -@@ -143,7 +143,7 @@ fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf, - { - size_t siginfo_size; - -- if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32) -+ if (gdbarch_long_bit (gdbarch) == 32) - siginfo_size = SIZE32_SIGINFO_T; - else - siginfo_size = SIZE64_SIGINFO_T; -@@ -168,7 +168,7 @@ fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf, - len = siginfo_size - offset; - - ULONGEST siginfo_offset; -- if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32) -+ if (gdbarch_long_bit (gdbarch) == 32) - siginfo_offset = LWPINFO_OFFSET + LWPINFO32_PL_SIGINFO; - else - siginfo_offset = LWPINFO_OFFSET + LWPINFO64_PL_SIGINFO; Index: head/devel/gdb/files/commit-a80a647180 =================================================================== --- head/devel/gdb/files/commit-a80a647180 +++ head/devel/gdb/files/commit-a80a647180 @@ -1,53 +0,0 @@ -commit a80a647180bf92692e0f01efe7b323afe7d317c9 -Author: John Baldwin -Date: Thu Oct 5 09:50:01 2017 -0700 - - Add a signal frame unwinder for FreeBSD/mipsn32. - - The N32 signal frame uses an identical layout to N64, so reuse the N64 - handler. The N32 signal trampoline does use one different instruction - relative to N64, so a separate tramp_frame is required. - - gdb/ChangeLog: - - * mips-fbsd-tdep.c (MIPS_INST_ADDIU_A0_SP_N32): Define. - (mipsn32_fbsd_sigframe): Define. - (mips_fbsd_init_abi): Install mipsn32_fbsd_sigframe unwinder - for FreeBSD/mipsn32. - -diff --git gdb/mips-fbsd-tdep.c gdb/mips-fbsd-tdep.c -index 05545e37d8..b1578d0cbb 100644 ---- gdb/mips-fbsd-tdep.c -+++ gdb/mips-fbsd-tdep.c -@@ -426,6 +426,23 @@ mips64_fbsd_sigframe_init (const struct tramp_frame *self, - trad_frame_set_id (cache, frame_id_build (sp, func)); - } - -+#define MIPS_INST_ADDIU_A0_SP_N32 (0x27a40000 \ -+ + N64_SIGFRAME_UCONTEXT_OFFSET) -+ -+static const struct tramp_frame mipsn32_fbsd_sigframe = -+{ -+ SIGTRAMP_FRAME, -+ MIPS_INSN32_SIZE, -+ { -+ { MIPS_INST_ADDIU_A0_SP_N32, -1 }, /* addiu a0, sp, SIGF_UC */ -+ { MIPS_INST_LI_V0_SIGRETURN, -1 }, /* li v0, SYS_sigreturn */ -+ { MIPS_INST_SYSCALL, -1 }, /* syscall */ -+ { MIPS_INST_BREAK, -1 }, /* break */ -+ { TRAMP_SENTINEL_INSN, -1 } -+ }, -+ mips64_fbsd_sigframe_init -+}; -+ - #define MIPS_INST_DADDIU_A0_SP_N64 (0x67a40000 \ - + N64_SIGFRAME_UCONTEXT_OFFSET) - -@@ -519,6 +536,7 @@ mips_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) - tramp_frame_prepend_unwinder (gdbarch, &mips_fbsd_sigframe); - break; - case MIPS_ABI_N32: -+ tramp_frame_prepend_unwinder (gdbarch, &mipsn32_fbsd_sigframe); - break; - case MIPS_ABI_N64: - tramp_frame_prepend_unwinder (gdbarch, &mips64_fbsd_sigframe); Index: head/devel/gdb/files/commit-b30ff123fb =================================================================== --- head/devel/gdb/files/commit-b30ff123fb +++ head/devel/gdb/files/commit-b30ff123fb @@ -1,40 +0,0 @@ -commit b30ff123fbff63d6c8be1115320efd0158e49a7f -Author: Yao Qi -Date: Thu Jun 22 13:41:27 2017 +0100 - - Regenerate two regformats/i386/.dat files - - The self tests which compare pre-generated target descriptions and - dynamically created target descriptions fail, and it turns out that two - pre-generated target descriptions are wrong, so regenerate them. - - gdb: - - 2017-06-22 Yao Qi - - * regformats/i386/amd64-avx-mpx-avx512-pku-linux.dat: Regenerated. - * regformats/i386/amd64-avx-mpx-avx512-pku.dat: Regenerated. - -diff --git gdb/regformats/i386/amd64-avx-mpx-avx512-pku-linux.dat gdb/regformats/i386/amd64-avx-mpx-avx512-pku-linux.dat -index 3ae6b0e472..9cd0fae820 100644 ---- gdb/regformats/i386/amd64-avx-mpx-avx512-pku-linux.dat -+++ gdb/regformats/i386/amd64-avx-mpx-avx512-pku-linux.dat -@@ -157,3 +157,4 @@ expedite:rbp,rsp,rip - 256:zmm29h - 256:zmm30h - 256:zmm31h -+32:pkru -diff --git gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat -index 88185fd8c3..b3340d3276 100644 ---- gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat -+++ gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat -@@ -60,9 +60,6 @@ expedite:rbp,rsp,rip - 128:xmm14 - 128:xmm15 - 32:mxcsr --64:orig_rax --64:fs_base --64:gs_base - 128:ymm0h - 128:ymm1h - 128:ymm2h Index: head/devel/gdb/files/commit-b5430a3ced =================================================================== --- head/devel/gdb/files/commit-b5430a3ced +++ head/devel/gdb/files/commit-b5430a3ced @@ -1,117 +0,0 @@ -commit b5430a3ced5fe5ba484bd9b3215b9ae19ced0160 -Author: John Baldwin -Date: Thu Jun 1 09:40:46 2017 -0700 - - Use the ELF class to determine the word size for FreeBSD core notes. - - FreeBSD ELF cores contain data structures with that have two different - layouts: one for ILP32 platforms and a second for LP64 platforms. - Previously, the code used 'bits_per_word' from 'arch_info', but this - field is not a reliable indicator of the format for FreeBSD MIPS cores - in particular. - - I had originally posted this patch back in November because process - cores for FreeBSD MIPS contained an e_flags value of 0 in the header - which resulted in a bfd_arch which always had 'bits_per_word' set to - 32. This permitted reading o32 cores, but not n64 cores. The feedback - I received then was to try to change n64 cores to use a different - default bfd_arch that had a 64-bit 'bits_per_word' when e_flags was zero. - I submitted a patch to that effect but it was never approved. Instead, - I changed FreeBSD's kernel and gcore commands to preserve the e_flags - field from an executable when generating process cores. With a proper - e_flags field in process cores, n64 cores now use a 64-bit bfd_arch and - now work fine. However, the change to include e_flags in the process - cores had the unintended side effect of breaking handling of o32 - process cores. Specifically, FreeBSD MIPS builds o32 with a default - MIPS architecture of 'mips3', thus FreeBSD process cores with a non-zero - e_flags match the 'mips3' bfd_arch which has 64 'bits_per_word'. - - From this, it seems that 'bits_per_word' for FreeBSD MIPS is not likely - to ever be completely correct. However, FreeBSD core dumps do - reliably set the ELF class to ELFCLASS32 for cores using ILP32 and - ELFCLASS64 for cores using LP64. As such, I think my original patch of - using the ELF class instead of 'bits_per_word' is probably the simplest - and most reliable approach for detecting the note structure layout. - - bfd/ChangeLog: - - * elf.c (elfcore_grok_freebsd_psinfo): Use ELF header class to - determine structure sizes. - (elfcore_grok_freebsd_prstatus): Likewise. - -diff --git bfd/elf.c bfd/elf.c -index 863bd61c5f..34d39c547b 100644 ---- bfd/elf.c -+++ bfd/elf.c -@@ -9814,14 +9814,14 @@ elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note) - { - size_t offset; - -- switch (abfd->arch_info->bits_per_word) -+ switch (elf_elfheader (abfd)->e_ident[EI_CLASS]) - { -- case 32: -+ case ELFCLASS32: - if (note->descsz < 108) - return FALSE; - break; - -- case 64: -+ case ELFCLASS64: - if (note->descsz < 120) - return FALSE; - break; -@@ -9836,7 +9836,7 @@ elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note) - offset = 4; - - /* Skip over pr_psinfosz. */ -- if (abfd->arch_info->bits_per_word == 32) -+ if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS32) - offset += 4; - else - { -@@ -9879,13 +9879,13 @@ elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note) - offset = 4; - - /* Skip over pr_statussz. */ -- switch (abfd->arch_info->bits_per_word) -+ switch (elf_elfheader (abfd)->e_ident[EI_CLASS]) - { -- case 32: -+ case ELFCLASS32: - offset += 4; - break; - -- case 64: -+ case ELFCLASS64: - offset += 4; /* Padding before pr_statussz. */ - offset += 8; - break; -@@ -9895,13 +9895,16 @@ elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note) - } - - /* Extract size of pr_reg from pr_gregsetsz. */ -- if (abfd->arch_info->bits_per_word == 32) -+ if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS32) - 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; -+ if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS32) -+ offset += 4 * 2; -+ else -+ offset += 8 * 2; - - /* Skip over pr_osreldate. */ - offset += 4; -@@ -9918,7 +9921,7 @@ elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note) - offset += 4; - - /* Padding before pr_reg. */ -- if (abfd->arch_info->bits_per_word == 64) -+ if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64) - offset += 4; - - /* Make a ".reg/999" section and a ".reg" section. */ Index: head/devel/gdb/files/commit-b999e2038d =================================================================== --- head/devel/gdb/files/commit-b999e2038d +++ head/devel/gdb/files/commit-b999e2038d @@ -0,0 +1,32 @@ +commit b999e2038dbc54e2c8b1c390f8b8fe50d0f1d10a +Author: John Baldwin +Date: Tue Jan 9 13:35:17 2018 -0800 + + Don't return stale data from fbsd_pid_to_exec_file for kernel processes. + + For processes without an associated executable (such as kernel processes), + the kern.proc.pathname. system control node returns a length of zero + without modifying the user's buffer. Detect this case and return NULL + rather than the previous contents of the static buffer 'buf'. + + gdb/ChangeLog: + + * fbsd-nat.c (fbsd_pid_to_exec_file) [KERN_PROC_PATHNAME]: Return + NULL for an empty pathname. + +diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c +index ec4eed9abe..d0aaf89145 100644 +--- gdb/fbsd-nat.c ++++ gdb/fbsd-nat.c +@@ -63,7 +63,10 @@ fbsd_pid_to_exec_file (struct target_ops *self, int pid) + mib[3] = pid; + buflen = sizeof buf; + if (sysctl (mib, 4, buf, &buflen, NULL, 0) == 0) +- return buf; ++ /* The kern.proc.pathname. sysctl returns a length of zero ++ for processes without an associated executable such as kernel ++ processes. */ ++ return buflen == 0 ? NULL : buf; + #endif + + xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid); Index: head/devel/gdb/files/commit-d2176225dc =================================================================== --- head/devel/gdb/files/commit-d2176225dc +++ head/devel/gdb/files/commit-d2176225dc @@ -0,0 +1,725 @@ +commit d2176225dc982c22640215a0e611e997e8eeb030 +Author: John Baldwin +Date: Tue Jan 9 13:35:17 2018 -0800 + + Support 'info proc' for FreeBSD process core dumps. + + - Command line arguments are obtained from the pr_psargs[] array + saved in the NT_PRPSINFO note. + - The 'cwd' and 'exe' values are obtained from the per-process file + descriptor table stored in the NT_PROCSTAT_FILES core note. + - 'mappings' is implemented by walking the array of VM map entries + stored in the NT_PROCSTAT_VMMAP core note. + - 'status' output is generated by outputting fields from + the first structure stored in the NT_PROCSTAT_PROC core note. + - 'stat' is aliased to 'status'. + + gdb/ChangeLog: + + * fbsd-tdep.c (KVE_STRUCTSIZE, KVE_START, KVE_END, KVE_OFFSET) + (KVE_FLAGS, KVE_PROTECTION, KVE_PATH, KINFO_VME_PROT_READ) + (KINFO_VME_PROT_WRITE, KINFO_VME_PROT_EXEC, KINFO_VME_FLAG_COW) + (KINFO_VME_FLAG_NEEDS_COPY, KINFO_VME_FLAG_NOCOREDUMP) + (KINFO_VME_FLAG_SUPER, KINFO_VME_FLAG_GROWS_UP) + (KINFO_VME_FLAG_GROWS_DOWN, KF_STRUCTSIZE, KF_TYPE, KF_FD) + (KF_PATH, KINFO_FILE_TYPE_VNODE, KINFO_FILE_FD_TYPE_CWD) + (KINFO_FILE_FD_TYPE_TEXT, SIG_WORDS, struct kinfo_proc_layout) + (kinfo_proc_layout_32, kinfo_proc_layout_i386) + (kinfo_proc_layout_64, fbsd_vm_map_entry_flags) + (fbsd_core_info_proc_mappings, fbsd_core_vnode_path) + (fbsd_core_fetch_timeval, fbsd_print_sigset) + (fbsd_core_info_proc_status, fbsd_core_info_proc): New. + (fbsd_init_abi): Install gdbarch "core_info_proc" method. + * fbsd-tdep.h (fbsd_vm_map_entry_flags): New. + +diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c +index ce17c672d9..8aa0243d54 100644 +--- gdb/fbsd-tdep.c ++++ gdb/fbsd-tdep.c +@@ -52,6 +52,228 @@ + #define SIZE64_SIGINFO_T 80 + #define SIZE32_SIGINFO_T 64 + ++/* Offsets in data structure used in NT_FREEBSD_PROCSTAT_VMMAP core ++ dump notes. See for the definition of struct ++ kinfo_vmentry. This data structure should have the same layout on ++ all architectures. */ ++ ++#define KVE_STRUCTSIZE 0x0 ++#define KVE_START 0x8 ++#define KVE_END 0x10 ++#define KVE_OFFSET 0x18 ++#define KVE_FLAGS 0x2c ++#define KVE_PROTECTION 0x56 ++#define KVE_PATH 0x88 ++ ++/* Flags in the 'kve_protection' field in struct kinfo_vmentry. These ++ match the KVME_PROT_* constants in . */ ++ ++#define KINFO_VME_PROT_READ 0x00000001 ++#define KINFO_VME_PROT_WRITE 0x00000002 ++#define KINFO_VME_PROT_EXEC 0x00000004 ++ ++/* Flags in the 'kve_flags' field in struct kinfo_vmentry. These ++ match the KVME_FLAG_* constants in . */ ++ ++#define KINFO_VME_FLAG_COW 0x00000001 ++#define KINFO_VME_FLAG_NEEDS_COPY 0x00000002 ++#define KINFO_VME_FLAG_NOCOREDUMP 0x00000004 ++#define KINFO_VME_FLAG_SUPER 0x00000008 ++#define KINFO_VME_FLAG_GROWS_UP 0x00000010 ++#define KINFO_VME_FLAG_GROWS_DOWN 0x00000020 ++ ++/* Offsets in data structure used in NT_FREEBSD_PROCSTAT_FILES core ++ dump notes. See for the definition of struct ++ kinfo_file. This data structure should have the same layout on all ++ architectures. */ ++ ++#define KF_STRUCTSIZE 0x0 ++#define KF_TYPE 0x4 ++#define KF_FD 0x8 ++#define KF_PATH 0x170 ++ ++/* Constants for the 'kf_type' field in struct kinfo_file. These ++ match the KF_TYPE_* constants in . */ ++ ++#define KINFO_FILE_TYPE_VNODE 1 ++ ++/* Special values for the 'kf_fd' field in struct kinfo_file. These ++ match the KF_FD_TYPE_* constants in . */ ++ ++#define KINFO_FILE_FD_TYPE_CWD -1 ++#define KINFO_FILE_FD_TYPE_TEXT -5 ++ ++/* Number of 32-bit words in a signal set. This matches _SIG_WORDS in ++ and is the same value on all architectures. */ ++ ++#define SIG_WORDS 4 ++ ++/* Offsets in data structure used in NT_FREEBSD_PROCSTAT_PROC core ++ dump notes. See for the definition of struct ++ kinfo_proc. This data structure has different layouts on different ++ architectures mostly due to ILP32 vs LP64. However, FreeBSD/i386 ++ uses a 32-bit time_t while all other architectures use a 64-bit ++ time_t. ++ ++ The core dump note actually contains one kinfo_proc structure for ++ each thread, but all of the process-wide data can be obtained from ++ the first structure. One result of this note's format is that some ++ of the process-wide status available in the native target method ++ from the kern.proc.pid. sysctl such as ki_stat and ki_siglist ++ is not available from a core dump. Instead, the per-thread data ++ structures contain the value of these fields for individual ++ threads. */ ++ ++struct kinfo_proc_layout ++{ ++ /* Offsets of struct kinfo_proc members. */ ++ int ki_layout; ++ int ki_pid; ++ int ki_ppid; ++ int ki_pgid; ++ int ki_tpgid; ++ int ki_sid; ++ int ki_tdev_freebsd11; ++ int ki_sigignore; ++ int ki_sigcatch; ++ int ki_uid; ++ int ki_ruid; ++ int ki_svuid; ++ int ki_rgid; ++ int ki_svgid; ++ int ki_ngroups; ++ int ki_groups; ++ int ki_size; ++ int ki_rssize; ++ int ki_tsize; ++ int ki_dsize; ++ int ki_ssize; ++ int ki_start; ++ int ki_nice; ++ int ki_comm; ++ int ki_tdev; ++ int ki_rusage; ++ int ki_rusage_ch; ++ ++ /* Offsets of struct rusage members. */ ++ int ru_utime; ++ int ru_stime; ++ int ru_maxrss; ++ int ru_minflt; ++ int ru_majflt; ++}; ++ ++const struct kinfo_proc_layout kinfo_proc_layout_32 = ++ { ++ .ki_layout = 0x4, ++ .ki_pid = 0x28, ++ .ki_ppid = 0x2c, ++ .ki_pgid = 0x30, ++ .ki_tpgid = 0x34, ++ .ki_sid = 0x38, ++ .ki_tdev_freebsd11 = 0x44, ++ .ki_sigignore = 0x68, ++ .ki_sigcatch = 0x78, ++ .ki_uid = 0x88, ++ .ki_ruid = 0x8c, ++ .ki_svuid = 0x90, ++ .ki_rgid = 0x94, ++ .ki_svgid = 0x98, ++ .ki_ngroups = 0x9c, ++ .ki_groups = 0xa0, ++ .ki_size = 0xe0, ++ .ki_rssize = 0xe4, ++ .ki_tsize = 0xec, ++ .ki_dsize = 0xf0, ++ .ki_ssize = 0xf4, ++ .ki_start = 0x118, ++ .ki_nice = 0x145, ++ .ki_comm = 0x17f, ++ .ki_tdev = 0x1f0, ++ .ki_rusage = 0x220, ++ .ki_rusage_ch = 0x278, ++ ++ .ru_utime = 0x0, ++ .ru_stime = 0x10, ++ .ru_maxrss = 0x20, ++ .ru_minflt = 0x30, ++ .ru_majflt = 0x34, ++ }; ++ ++const struct kinfo_proc_layout kinfo_proc_layout_i386 = ++ { ++ .ki_layout = 0x4, ++ .ki_pid = 0x28, ++ .ki_ppid = 0x2c, ++ .ki_pgid = 0x30, ++ .ki_tpgid = 0x34, ++ .ki_sid = 0x38, ++ .ki_tdev_freebsd11 = 0x44, ++ .ki_sigignore = 0x68, ++ .ki_sigcatch = 0x78, ++ .ki_uid = 0x88, ++ .ki_ruid = 0x8c, ++ .ki_svuid = 0x90, ++ .ki_rgid = 0x94, ++ .ki_svgid = 0x98, ++ .ki_ngroups = 0x9c, ++ .ki_groups = 0xa0, ++ .ki_size = 0xe0, ++ .ki_rssize = 0xe4, ++ .ki_tsize = 0xec, ++ .ki_dsize = 0xf0, ++ .ki_ssize = 0xf4, ++ .ki_start = 0x118, ++ .ki_nice = 0x135, ++ .ki_comm = 0x16f, ++ .ki_tdev = 0x1e0, ++ .ki_rusage = 0x210, ++ .ki_rusage_ch = 0x258, ++ ++ .ru_utime = 0x0, ++ .ru_stime = 0x8, ++ .ru_maxrss = 0x10, ++ .ru_minflt = 0x20, ++ .ru_majflt = 0x24, ++ }; ++ ++const struct kinfo_proc_layout kinfo_proc_layout_64 = ++ { ++ .ki_layout = 0x4, ++ .ki_pid = 0x48, ++ .ki_ppid = 0x4c, ++ .ki_pgid = 0x50, ++ .ki_tpgid = 0x54, ++ .ki_sid = 0x58, ++ .ki_tdev_freebsd11 = 0x64, ++ .ki_sigignore = 0x88, ++ .ki_sigcatch = 0x98, ++ .ki_uid = 0xa8, ++ .ki_ruid = 0xac, ++ .ki_svuid = 0xb0, ++ .ki_rgid = 0xb4, ++ .ki_svgid = 0xb8, ++ .ki_ngroups = 0xbc, ++ .ki_groups = 0xc0, ++ .ki_size = 0x100, ++ .ki_rssize = 0x108, ++ .ki_tsize = 0x118, ++ .ki_dsize = 0x120, ++ .ki_ssize = 0x128, ++ .ki_start = 0x150, ++ .ki_nice = 0x185, ++ .ki_comm = 0x1bf, ++ .ki_tdev = 0x230, ++ .ki_rusage = 0x260, ++ .ki_rusage_ch = 0x2f0, ++ ++ .ru_utime = 0x0, ++ .ru_stime = 0x10, ++ .ru_maxrss = 0x20, ++ .ru_minflt = 0x40, ++ .ru_majflt = 0x48, ++ }; ++ + static struct gdbarch_data *fbsd_gdbarch_data_handle; + + struct fbsd_gdbarch_data +@@ -367,6 +589,433 @@ fbsd_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size) + return note_data; + } + ++/* Helper function to generate mappings flags for a single VM map ++ entry in 'info proc mappings'. */ ++ ++const char * ++fbsd_vm_map_entry_flags (int kve_flags, int kve_protection) ++{ ++ static char vm_flags[9]; ++ ++ vm_flags[0] = (kve_protection & KINFO_VME_PROT_READ) ? 'r' : '-'; ++ vm_flags[1] = (kve_protection & KINFO_VME_PROT_WRITE) ? 'w' : '-'; ++ vm_flags[2] = (kve_protection & KINFO_VME_PROT_EXEC) ? 'x' : '-'; ++ vm_flags[3] = ' '; ++ vm_flags[4] = (kve_flags & KINFO_VME_FLAG_COW) ? 'C' : '-'; ++ vm_flags[5] = (kve_flags & KINFO_VME_FLAG_NEEDS_COPY) ? 'N' : '-'; ++ vm_flags[6] = (kve_flags & KINFO_VME_FLAG_SUPER) ? 'S' : '-'; ++ vm_flags[7] = (kve_flags & KINFO_VME_FLAG_GROWS_UP) ? 'U' ++ : (kve_flags & KINFO_VME_FLAG_GROWS_DOWN) ? 'D' : '-'; ++ vm_flags[8] = '\0'; ++ ++ return vm_flags; ++} ++ ++/* Implement "info proc mappings" for a corefile. */ ++ ++static void ++fbsd_core_info_proc_mappings (struct gdbarch *gdbarch) ++{ ++ asection *section; ++ unsigned char *descdata, *descend; ++ size_t note_size; ++ ++ section = bfd_get_section_by_name (core_bfd, ".note.freebsdcore.vmmap"); ++ if (section == NULL) ++ { ++ warning (_("unable to find mappings in core file")); ++ return; ++ } ++ ++ note_size = bfd_get_section_size (section); ++ if (note_size < 4) ++ error (_("malformed core note - too short for header")); ++ ++ gdb::def_vector contents (note_size); ++ if (!bfd_get_section_contents (core_bfd, section, contents.data (), ++ 0, note_size)) ++ error (_("could not get core note contents")); ++ ++ descdata = contents.data (); ++ descend = descdata + note_size; ++ ++ /* Skip over the structure size. */ ++ descdata += 4; ++ ++ printf_filtered (_("Mapped address spaces:\n\n")); ++ if (gdbarch_addr_bit (gdbarch) == 64) ++ { ++ printf_filtered (" %18s %18s %10s %10s %9s %s\n", ++ "Start Addr", ++ " End Addr", ++ " Size", " Offset", "Flags ", "File"); ++ } ++ else ++ { ++ printf_filtered ("\t%10s %10s %10s %10s %9s %s\n", ++ "Start Addr", ++ " End Addr", ++ " Size", " Offset", "Flags ", "File"); ++ } ++ ++ while (descdata + KVE_PATH < descend) ++ { ++ ULONGEST start, end, offset, flags, prot, structsize; ++ ++ structsize = bfd_get_32 (core_bfd, descdata + KVE_STRUCTSIZE); ++ if (structsize < KVE_PATH) ++ error (_("malformed core note - vmmap entry too small")); ++ ++ start = bfd_get_64 (core_bfd, descdata + KVE_START); ++ end = bfd_get_64 (core_bfd, descdata + KVE_END); ++ offset = bfd_get_64 (core_bfd, descdata + KVE_OFFSET); ++ flags = bfd_get_32 (core_bfd, descdata + KVE_FLAGS); ++ prot = bfd_get_32 (core_bfd, descdata + KVE_PROTECTION); ++ if (gdbarch_addr_bit (gdbarch) == 64) ++ { ++ printf_filtered (" %18s %18s %10s %10s %9s %s\n", ++ paddress (gdbarch, start), ++ paddress (gdbarch, end), ++ hex_string (end - start), ++ hex_string (offset), ++ fbsd_vm_map_entry_flags (flags, prot), ++ descdata + KVE_PATH); ++ } ++ else ++ { ++ printf_filtered ("\t%10s %10s %10s %10s %9s %s\n", ++ paddress (gdbarch, start), ++ paddress (gdbarch, end), ++ hex_string (end - start), ++ hex_string (offset), ++ fbsd_vm_map_entry_flags (flags, prot), ++ descdata + KVE_PATH); ++ } ++ ++ descdata += structsize; ++ } ++} ++ ++/* Fetch the pathname of a vnode for a single file descriptor from the ++ file table core note. */ ++ ++static gdb::unique_xmalloc_ptr ++fbsd_core_vnode_path (struct gdbarch *gdbarch, int fd) ++{ ++ asection *section; ++ unsigned char *descdata, *descend; ++ size_t note_size; ++ ++ section = bfd_get_section_by_name (core_bfd, ".note.freebsdcore.files"); ++ if (section == NULL) ++ return nullptr; ++ ++ note_size = bfd_get_section_size (section); ++ if (note_size < 4) ++ error (_("malformed core note - too short for header")); ++ ++ gdb::def_vector contents (note_size); ++ if (!bfd_get_section_contents (core_bfd, section, contents.data (), ++ 0, note_size)) ++ error (_("could not get core note contents")); ++ ++ descdata = contents.data (); ++ descend = descdata + note_size; ++ ++ /* Skip over the structure size. */ ++ descdata += 4; ++ ++ while (descdata + KVE_PATH < descend) ++ { ++ ULONGEST structsize; ++ ++ structsize = bfd_get_32 (core_bfd, descdata + KF_STRUCTSIZE); ++ if (structsize < KVE_PATH) ++ error (_("malformed core note - vmmap entry too small")); ++ ++ if (bfd_get_32 (core_bfd, descdata + KF_TYPE) == KINFO_FILE_TYPE_VNODE ++ && bfd_get_signed_32 (core_bfd, descdata + KF_FD) == fd) ++ { ++ char *path = (char *) descdata + KF_PATH; ++ return gdb::unique_xmalloc_ptr (xstrdup (path)); ++ } ++ ++ descdata += structsize; ++ } ++ return nullptr; ++} ++ ++/* Helper function to read a struct timeval. */ ++ ++static void ++fbsd_core_fetch_timeval (struct gdbarch *gdbarch, unsigned char *data, ++ LONGEST &sec, ULONGEST &usec) ++{ ++ if (gdbarch_addr_bit (gdbarch) == 64) ++ { ++ sec = bfd_get_signed_64 (core_bfd, data); ++ usec = bfd_get_64 (core_bfd, data + 8); ++ } ++ else if (bfd_get_arch (core_bfd) == bfd_arch_i386) ++ { ++ sec = bfd_get_signed_32 (core_bfd, data); ++ usec = bfd_get_32 (core_bfd, data + 4); ++ } ++ else ++ { ++ sec = bfd_get_signed_64 (core_bfd, data); ++ usec = bfd_get_32 (core_bfd, data + 8); ++ } ++} ++ ++/* Print out the contents of a signal set. */ ++ ++static void ++fbsd_print_sigset (const char *descr, unsigned char *sigset) ++{ ++ printf_filtered ("%s: ", descr); ++ for (int i = 0; i < SIG_WORDS; i++) ++ printf_filtered ("%08x ", ++ (unsigned int) bfd_get_32 (core_bfd, sigset + i * 4)); ++ printf_filtered ("\n"); ++} ++ ++/* Implement "info proc status" for a corefile. */ ++ ++static void ++fbsd_core_info_proc_status (struct gdbarch *gdbarch) ++{ ++ const struct kinfo_proc_layout *kp; ++ asection *section; ++ const char *state; ++ unsigned char *descdata; ++ int addr_bit, long_bit; ++ size_t note_size; ++ ULONGEST value; ++ LONGEST sec; ++ ++ section = bfd_get_section_by_name (core_bfd, ".note.freebsdcore.proc"); ++ if (section == NULL) ++ { ++ warning (_("unable to find process info in core file")); ++ return; ++ } ++ ++ addr_bit = gdbarch_addr_bit (gdbarch); ++ if (addr_bit == 64) ++ kp = &kinfo_proc_layout_64; ++ else if (bfd_get_arch (core_bfd) == bfd_arch_i386) ++ kp = &kinfo_proc_layout_i386; ++ else ++ kp = &kinfo_proc_layout_32; ++ long_bit = gdbarch_long_bit (gdbarch); ++ ++ /* ++ * Ensure that the note is large enough for all of the fields fetched ++ * by this function. In particular, the note must contain the 32-bit ++ * structure size, then it must be long enough to access the last ++ * field used (ki_rusage_ch.ru_majflt) which is the size of a long. ++ */ ++ note_size = bfd_get_section_size (section); ++ if (note_size < (4 + kp->ki_rusage_ch + kp->ru_majflt ++ + long_bit / TARGET_CHAR_BIT)) ++ error (_("malformed core note - too short")); ++ ++ gdb::def_vector contents (note_size); ++ if (!bfd_get_section_contents (core_bfd, section, contents.data (), ++ 0, note_size)) ++ error (_("could not get core note contents")); ++ ++ descdata = contents.data (); ++ ++ /* Skip over the structure size. */ ++ descdata += 4; ++ ++ /* Verify 'ki_layout' is 0. */ ++ if (bfd_get_32 (core_bfd, descdata + kp->ki_layout) != 0) ++ { ++ warning (_("unsupported process information in core file")); ++ return; ++ } ++ ++ printf_filtered ("Name: %.19s\n", descdata + kp->ki_comm); ++ printf_filtered ("Process ID: %s\n", ++ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_pid))); ++ printf_filtered ("Parent process: %s\n", ++ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_ppid))); ++ printf_filtered ("Process group: %s\n", ++ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_pgid))); ++ printf_filtered ("Session id: %s\n", ++ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_sid))); ++ ++ /* FreeBSD 12.0 and later store a 64-bit dev_t at 'ki_tdev'. Older ++ kernels store a 32-bit dev_t at 'ki_tdev_freebsd11'. In older ++ kernels the 64-bit 'ki_tdev' field is in a reserved section of ++ the structure that is cleared to zero. Assume that a zero value ++ in ki_tdev indicates a core dump from an older kernel and use the ++ value in 'ki_tdev_freebsd11' instead. */ ++ value = bfd_get_64 (core_bfd, descdata + kp->ki_tdev); ++ if (value == 0) ++ value = bfd_get_32 (core_bfd, descdata + kp->ki_tdev_freebsd11); ++ printf_filtered ("TTY: %s\n", pulongest (value)); ++ printf_filtered ("TTY owner process group: %s\n", ++ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_tpgid))); ++ printf_filtered ("User IDs (real, effective, saved): %s %s %s\n", ++ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_ruid)), ++ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_uid)), ++ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_svuid))); ++ printf_filtered ("Group IDs (real, effective, saved): %s %s %s\n", ++ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_rgid)), ++ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_groups)), ++ pulongest (bfd_get_32 (core_bfd, descdata + kp->ki_svgid))); ++ printf_filtered ("Groups: "); ++ uint16_t ngroups = bfd_get_16 (core_bfd, descdata + kp->ki_ngroups); ++ for (int i = 0; i < ngroups; i++) ++ printf_filtered ("%s ", ++ pulongest (bfd_get_32 (core_bfd, ++ descdata + kp->ki_groups + i * 4))); ++ printf_filtered ("\n"); ++ value = bfd_get (long_bit, core_bfd, ++ descdata + kp->ki_rusage + kp->ru_minflt); ++ printf_filtered ("Minor faults (no memory page): %s\n", pulongest (value)); ++ value = bfd_get (long_bit, core_bfd, ++ descdata + kp->ki_rusage_ch + kp->ru_minflt); ++ printf_filtered ("Minor faults, children: %s\n", pulongest (value)); ++ value = bfd_get (long_bit, core_bfd, ++ descdata + kp->ki_rusage + kp->ru_majflt); ++ printf_filtered ("Major faults (memory page faults): %s\n", ++ pulongest (value)); ++ value = bfd_get (long_bit, core_bfd, ++ descdata + kp->ki_rusage_ch + kp->ru_majflt); ++ printf_filtered ("Major faults, children: %s\n", pulongest (value)); ++ fbsd_core_fetch_timeval (gdbarch, ++ descdata + kp->ki_rusage + kp->ru_utime, ++ sec, value); ++ printf_filtered ("utime: %s.%06d\n", plongest (sec), (int) value); ++ fbsd_core_fetch_timeval (gdbarch, ++ descdata + kp->ki_rusage + kp->ru_stime, ++ sec, value); ++ printf_filtered ("stime: %s.%06d\n", plongest (sec), (int) value); ++ fbsd_core_fetch_timeval (gdbarch, ++ descdata + kp->ki_rusage_ch + kp->ru_utime, ++ sec, value); ++ printf_filtered ("utime, children: %s.%06d\n", plongest (sec), (int) value); ++ fbsd_core_fetch_timeval (gdbarch, ++ descdata + kp->ki_rusage_ch + kp->ru_stime, ++ sec, value); ++ printf_filtered ("stime, children: %s.%06d\n", plongest (sec), (int) value); ++ printf_filtered ("'nice' value: %d\n", ++ bfd_get_signed_8 (core_bfd, descdata + kp->ki_nice)); ++ fbsd_core_fetch_timeval (gdbarch, descdata + kp->ki_start, sec, value); ++ printf_filtered ("Start time: %s.%06d\n", plongest (sec), (int) value); ++ printf_filtered ("Virtual memory size: %s kB\n", ++ pulongest (bfd_get (addr_bit, core_bfd, ++ descdata + kp->ki_size) / 1024)); ++ printf_filtered ("Data size: %s pages\n", ++ pulongest (bfd_get (addr_bit, core_bfd, ++ descdata + kp->ki_dsize))); ++ printf_filtered ("Stack size: %s pages\n", ++ pulongest (bfd_get (addr_bit, core_bfd, ++ descdata + kp->ki_ssize))); ++ printf_filtered ("Text size: %s pages\n", ++ pulongest (bfd_get (addr_bit, core_bfd, ++ descdata + kp->ki_tsize))); ++ printf_filtered ("Resident set size: %s pages\n", ++ pulongest (bfd_get (addr_bit, core_bfd, ++ descdata + kp->ki_rssize))); ++ printf_filtered ("Maximum RSS: %s pages\n", ++ pulongest (bfd_get (long_bit, core_bfd, ++ descdata + kp->ki_rusage ++ + kp->ru_maxrss))); ++ fbsd_print_sigset ("Ignored Signals", descdata + kp->ki_sigignore); ++ fbsd_print_sigset ("Caught Signals", descdata + kp->ki_sigcatch); ++} ++ ++/* Implement the "core_info_proc" gdbarch method. */ ++ ++static void ++fbsd_core_info_proc (struct gdbarch *gdbarch, const char *args, ++ enum info_proc_what what) ++{ ++ bool do_cmdline = false; ++ bool do_cwd = false; ++ bool do_exe = false; ++ bool do_mappings = false; ++ bool do_status = false; ++ int pid; ++ ++ switch (what) ++ { ++ case IP_MINIMAL: ++ do_cmdline = true; ++ do_cwd = true; ++ do_exe = true; ++ break; ++ case IP_MAPPINGS: ++ do_mappings = true; ++ break; ++ case IP_STATUS: ++ case IP_STAT: ++ do_status = true; ++ break; ++ case IP_CMDLINE: ++ do_cmdline = true; ++ break; ++ case IP_EXE: ++ do_exe = true; ++ break; ++ case IP_CWD: ++ do_cwd = true; ++ break; ++ case IP_ALL: ++ do_cmdline = true; ++ do_cwd = true; ++ do_exe = true; ++ do_mappings = true; ++ do_status = true; ++ break; ++ default: ++ return; ++ } ++ ++ pid = bfd_core_file_pid (core_bfd); ++ if (pid != 0) ++ printf_filtered (_("process %d\n"), pid); ++ ++ if (do_cmdline) ++ { ++ const char *cmdline; ++ ++ cmdline = bfd_core_file_failing_command (core_bfd); ++ if (cmdline) ++ printf_filtered ("cmdline = '%s'\n", cmdline); ++ else ++ warning (_("Command line unavailable")); ++ } ++ if (do_cwd) ++ { ++ gdb::unique_xmalloc_ptr cwd = ++ fbsd_core_vnode_path (gdbarch, KINFO_FILE_FD_TYPE_CWD); ++ if (cwd) ++ printf_filtered ("cwd = '%s'\n", cwd.get ()); ++ else ++ warning (_("unable to read current working directory")); ++ } ++ if (do_exe) ++ { ++ gdb::unique_xmalloc_ptr exe = ++ fbsd_core_vnode_path (gdbarch, KINFO_FILE_FD_TYPE_TEXT); ++ if (exe) ++ printf_filtered ("exe = '%s'\n", exe.get ()); ++ else ++ warning (_("unable to read executable path name")); ++ } ++ if (do_mappings) ++ fbsd_core_info_proc_mappings (gdbarch); ++ if (do_status) ++ fbsd_core_info_proc_status (gdbarch); ++} ++ + /* Print descriptions of FreeBSD-specific AUXV entries to FILE. */ + + static void +@@ -519,6 +1168,7 @@ fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) + set_gdbarch_core_thread_name (gdbarch, fbsd_core_thread_name); + set_gdbarch_core_xfer_siginfo (gdbarch, fbsd_core_xfer_siginfo); + set_gdbarch_make_corefile_notes (gdbarch, fbsd_make_corefile_notes); ++ set_gdbarch_core_info_proc (gdbarch, fbsd_core_info_proc); + set_gdbarch_print_auxv_entry (gdbarch, fbsd_print_auxv_entry); + set_gdbarch_get_siginfo_type (gdbarch, fbsd_get_siginfo_type); + +diff --git gdb/fbsd-tdep.h gdb/fbsd-tdep.h +index 9769903dec..0b293e5a25 100644 +--- gdb/fbsd-tdep.h ++++ gdb/fbsd-tdep.h +@@ -22,4 +22,11 @@ + + extern void fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch); + ++/* Helper function to generate mappings flags for a single VM map ++ entry in 'info proc mappings'. The KVE_FLAGS and KVE_PROTECTION ++ parameters should contain the values of the corresponding fields in ++ a 'struct kinfo_vmentry'. */ ++ ++extern const char *fbsd_vm_map_entry_flags (int kve_flags, int kve_protection); ++ + #endif /* fbsd-tdep.h */ Index: head/devel/gdb/files/commit-e6f3b9c319 =================================================================== --- head/devel/gdb/files/commit-e6f3b9c319 +++ head/devel/gdb/files/commit-e6f3b9c319 @@ -1,25 +0,0 @@ -commit e6f3b9c3194c0d89efffd6e5b59471950f979e5a -Author: John Baldwin -Date: Wed Jun 28 12:47:14 2017 -0700 - - Create pseudo sections for FreeBSD NT_PTLWPINFO core notes. - - bfd/ChangeLog: - - * elf.c (elfcore_grok_freebsd_note): Handle NT_FREEBSD_PTLWPINFO. - -diff --git bfd/elf.c bfd/elf.c -index 063a6e4bb3..dcb06383d9 100644 ---- bfd/elf.c -+++ bfd/elf.c -@@ -9980,6 +9980,10 @@ elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note) - else - return TRUE; - -+ case NT_FREEBSD_PTLWPINFO: -+ return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.lwpinfo", -+ note); -+ - default: - return TRUE; - } Index: head/devel/gdb/files/commit-f169cfdc08 =================================================================== --- head/devel/gdb/files/commit-f169cfdc08 +++ head/devel/gdb/files/commit-f169cfdc08 @@ -0,0 +1,84 @@ +commit f169cfdc08761a3d9fcd587ad8661102672403ec +Author: John Baldwin +Date: Tue Oct 24 21:06:00 2017 -0700 + + Workaround a FreeBSD ptrace() bug with clearing thread events. + + When multiple threads within a process wish to report STOPPED events + from wait(), the kernel picks one thread event as the thread event to + report. The chosen thread event is retrieved via PT_LWPINFO by + passing the process ID as the request pid. If multiple events are + pending, then the subsequent wait() after resuming a process will + report another STOPPED event after resuming the process to handle the + next thread event and so on. + + A single thread event is cleared as a side effect of resuming the + process with PT_CONTINUE, PT_STEP, etc. In older kernels, however, + the request pid was used to select which thread's event was cleared + rather than always clearing the event that was just reported. To + avoid clearing the event of the wrong LWP, always pass the process ID + instead of an LWP ID to PT_CONTINUE or PT_SYSCALL. + + In the case of stepping, the process ID cannot be used with PT_STEP + since it would step the thread that reported an event which may not be + the thread indicated by PTID. For stepping, use PT_SETSTEP to enable + stepping on the desired thread before resuming the process via + PT_CONTINUE instead of using PT_STEP. + + This manifested as a failure in the + gdb.threads/continue-pending-status.exp test. Specifically, if thread + 2 reported a breakpoint and the test thus switched to thread 3 before + continuing, thread 3's event (if any) was discarded and thread 2's + breakpoint remained pending and was reported a second time as a + duplicate event. As a result, the PC was decremented twice for the + same breakpoint resulting in an illegal instruction fault on x86. + + gdb/ChangeLog: + + * fbsd-nat.c (fbsd_resume): Use PT_SETSTEP for stepping and a + wildcard process pid for super_resume for kernels with a + specific bug. + +diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c +index b352418813..3a216abf18 100644 +--- gdb/fbsd-nat.c ++++ gdb/fbsd-nat.c +@@ -1143,6 +1143,38 @@ fbsd_resume (struct target_ops *ops, + } + ptid = inferior_ptid; + } ++ ++#if __FreeBSD_version < 1200052 ++ /* When multiple threads within a process wish to report STOPPED ++ events from wait(), the kernel picks one thread event as the ++ thread event to report. The chosen thread event is retrieved via ++ PT_LWPINFO by passing the process ID as the request pid. If ++ multiple events are pending, then the subsequent wait() after ++ resuming a process will report another STOPPED event after ++ resuming the process to handle the next thread event and so on. ++ ++ A single thread event is cleared as a side effect of resuming the ++ process with PT_CONTINUE, PT_STEP, etc. In older kernels, ++ however, the request pid was used to select which thread's event ++ was cleared rather than always clearing the event that was just ++ reported. To avoid clearing the event of the wrong LWP, always ++ pass the process ID instead of an LWP ID to PT_CONTINUE or ++ PT_SYSCALL. ++ ++ In the case of stepping, the process ID cannot be used with ++ PT_STEP since it would step the thread that reported an event ++ which may not be the thread indicated by PTID. For stepping, use ++ PT_SETSTEP to enable stepping on the desired thread before ++ resuming the process via PT_CONTINUE instead of using ++ PT_STEP. */ ++ if (step) ++ { ++ if (ptrace (PT_SETSTEP, get_ptrace_pid (ptid), NULL, 0) == -1) ++ perror_with_name (("ptrace")); ++ step = 0; ++ } ++ ptid = ptid_t (ptid.pid ()); ++#endif + super_resume (ops, ptid, step, signo); + } + Index: head/devel/gdb/files/extrapatch-kgdb =================================================================== --- head/devel/gdb/files/extrapatch-kgdb +++ head/devel/gdb/files/extrapatch-kgdb @@ -1,8 +1,8 @@ diff --git gdb/Makefile.in gdb/Makefile.in -index cf59ae7143..0dd72d35d1 100644 +index 17b71c6e7c..282522187b 100644 --- gdb/Makefile.in +++ gdb/Makefile.in -@@ -227,7 +227,8 @@ INCGNU = -I$(srcdir)/gnulib/import -I$(GNULIB_BUILDDIR)/import +@@ -230,7 +230,8 @@ INCGNU = -I$(srcdir)/gnulib/import -I$(GNULIB_BUILDDIR)/import # Generated headers in the gnulib directory. These must be listed # so that they are generated before other files are compiled. @@ -12,15 +12,15 @@ # # CLI sub directory definitons -@@ -745,6 +746,7 @@ TARGET_OBS = @TARGET_OBS@ +@@ -629,6 +630,7 @@ TARGET_OBS = @TARGET_OBS@ # All target-dependent objects files that require 64-bit CORE_ADDR # (used with --enable-targets=all --enable-64-bit-bfd). ALL_64_TARGET_OBS = \ + aarch64-fbsd-kern.o \ aarch64-fbsd-tdep.o \ - aarch64-insn.o \ aarch64-linux-tdep.o \ -@@ -759,6 +761,7 @@ ALL_64_TARGET_OBS = \ + aarch64-newlib-tdep.o \ +@@ -642,6 +644,7 @@ ALL_64_TARGET_OBS = \ amd64-darwin-tdep.o \ amd64-dicos-tdep.o \ amd64-fbsd-tdep.o \ @@ -28,7 +28,7 @@ amd64-linux-tdep.o \ amd64-nbsd-tdep.o \ amd64-obsd-tdep.o \ -@@ -770,6 +773,7 @@ ALL_64_TARGET_OBS = \ +@@ -656,6 +659,7 @@ ALL_64_TARGET_OBS = \ ia64-vms-tdep.o \ mips64-obsd-tdep.o \ sparc64-fbsd-tdep.o \ @@ -36,17 +36,16 @@ sparc64-linux-tdep.o \ sparc64-nbsd-tdep.o \ sparc64-obsd-tdep.o \ -@@ -797,6 +801,9 @@ ALL_TARGET_OBS = \ +@@ -684,6 +688,8 @@ ALL_TARGET_OBS = \ cris-linux-tdep.o \ cris-tdep.o \ dicos-tdep.o \ + fbsd-kld.o \ + fbsd-kthr.o \ -+ fbsd-kvm.o \ fbsd-tdep.o \ frv-linux-tdep.o \ frv-tdep.o \ -@@ -813,6 +820,7 @@ ALL_TARGET_OBS = \ +@@ -700,6 +706,7 @@ ALL_TARGET_OBS = \ i386-darwin-tdep.o \ i386-dicos-tdep.o \ i386-fbsd-tdep.o \ @@ -54,7 +53,7 @@ i386-gnu-tdep.o \ i386-go32-tdep.o \ i386-linux-tdep.o \ -@@ -837,6 +845,7 @@ ALL_TARGET_OBS = \ +@@ -724,6 +731,7 @@ ALL_TARGET_OBS = \ mep-tdep.o \ microblaze-linux-tdep.o \ microblaze-tdep.o \ @@ -62,7 +61,7 @@ mips-fbsd-tdep.o \ mips-linux-tdep.o \ mips-nbsd-tdep.o \ -@@ -854,6 +863,7 @@ ALL_TARGET_OBS = \ +@@ -741,6 +749,7 @@ ALL_TARGET_OBS = \ nto-tdep.o \ obsd-tdep.o \ ppc-fbsd-tdep.o \ @@ -70,7 +69,7 @@ ppc-linux-tdep.o \ ppc-nbsd-tdep.o \ ppc-obsd-tdep.o \ -@@ -1871,7 +1881,7 @@ generated_files = \ +@@ -1610,7 +1619,7 @@ generated_files = \ # Flags needed to compile Python code PYTHON_CFLAGS = @PYTHON_CFLAGS@ @@ -79,7 +78,7 @@ @$(MAKE) $(FLAGS_TO_PASS) DO=all "DODIRS=`echo $(SUBDIRS) | sed 's/testsuite//'`" subdir_do # Rule for compiling .c files in the top-level gdb directory. -@@ -2210,6 +2220,12 @@ gdb$(EXEEXT): gdb.o $(LIBGDB_OBS) $(ADD_DEPS) $(CDEPS) $(TDEPLIBS) +@@ -1920,6 +1929,12 @@ gdb$(EXEEXT): gdb.o $(LIBGDB_OBS) $(ADD_DEPS) $(CDEPS) $(TDEPLIBS) -o gdb$(EXEEXT) gdb.o $(LIBGDB_OBS) \ $(TDEPLIBS) $(TUI_LIBRARY) $(CLIBS) $(LOADLIBES) @@ -92,7 +91,7 @@ # Convenience rule to handle recursion. $(LIBGNU) $(GNULIB_H): all-lib all-lib: $(GNULIB_BUILDDIR)/Makefile -@@ -2254,7 +2270,7 @@ clean mostlyclean: $(CONFIG_CLEAN) +@@ -1964,7 +1979,7 @@ clean mostlyclean: $(CONFIG_CLEAN) @$(MAKE) $(FLAGS_TO_PASS) DO=clean "DODIRS=$(CLEANDIRS)" subdir_do rm -f *.o *.a $(ADD_FILES) *~ init.c-tmp init.l-tmp version.c-tmp rm -f init.c version.c observer.h observer.inc @@ -101,7 +100,7 @@ rm -f gdb[0-9]$(EXEEXT) rm -f test-cp-name-parser$(EXEEXT) rm -f xml-builtin.c stamp-xml -@@ -2461,6 +2477,7 @@ MAKEOVERRIDES = +@@ -2178,6 +2193,7 @@ MAKEOVERRIDES = ALLDEPFILES = \ aarch64-fbsd-nat.c \ @@ -109,7 +108,7 @@ aarch64-fbsd-tdep.c \ aarch64-linux-nat.c \ aarch64-linux-tdep.c \ -@@ -2478,6 +2495,7 @@ ALLDEPFILES = \ +@@ -2195,6 +2211,7 @@ ALLDEPFILES = \ amd64-bsd-nat.c \ amd64-darwin-tdep.c \ amd64-dicos-tdep.c \ @@ -117,8 +116,8 @@ amd64-fbsd-nat.c \ amd64-fbsd-tdep.c \ amd64-linux-nat.c \ -@@ -2513,6 +2531,9 @@ ALLDEPFILES = \ - dcache.c \ +@@ -2228,6 +2245,9 @@ ALLDEPFILES = \ + darwin-nat.c \ dicos-tdep.c \ exec.c \ + fbsd-kld.c \ @@ -127,7 +126,7 @@ fbsd-nat.c \ fbsd-tdep.c \ fork-child.c \ -@@ -2534,6 +2555,7 @@ ALLDEPFILES = \ +@@ -2249,6 +2269,7 @@ ALLDEPFILES = \ i386-darwin-nat.c \ i386-darwin-tdep.c \ i386-dicos-tdep.c \ @@ -135,7 +134,7 @@ i386-fbsd-nat.c \ i386-fbsd-tdep.c \ i386-gnu-nat.c \ -@@ -2575,6 +2597,7 @@ ALLDEPFILES = \ +@@ -2290,6 +2311,7 @@ ALLDEPFILES = \ mingw-hdep.c \ mips-fbsd-nat.c \ mips-fbsd-tdep.c \ @@ -143,7 +142,7 @@ mips-linux-nat.c \ mips-linux-tdep.c \ mips-nbsd-nat.c \ -@@ -2592,6 +2615,7 @@ ALLDEPFILES = \ +@@ -2307,6 +2329,7 @@ ALLDEPFILES = \ obsd-nat.c \ obsd-tdep.c \ posix-hdep.c \ @@ -151,7 +150,7 @@ ppc-fbsd-nat.c \ ppc-fbsd-tdep.c \ ppc-linux-nat.c \ -@@ -2636,6 +2660,7 @@ ALLDEPFILES = \ +@@ -2351,6 +2374,7 @@ ALLDEPFILES = \ sparc-sol2-nat.c \ sparc-sol2-tdep.c \ sparc-tdep.c \ @@ -159,30 +158,17 @@ sparc64-fbsd-nat.c \ sparc64-fbsd-tdep.c \ sparc64-linux-nat.c \ -@@ -2667,6 +2692,12 @@ ALLDEPFILES = \ - xtensa-linux-tdep.c \ - xtensa-tdep.c \ - xtensa-xtregs.c \ -+ kgdb/kld.c \ -+ kgdb/kthr.c \ -+ kgdb/trgt.c \ -+ kgdb/trgt_amd64.c \ -+ kgdb/trgt_i386.c \ -+ kgdb/trgt_sparc64.c \ - common/mingw-strerror.c \ - common/posix-strerror.c +@@ -2638,7 +2662,7 @@ endif -@@ -2928,7 +2959,7 @@ endif - # A list of all the objects we might care about in this build, for # dependency tracking. -all_object_files = gdb.o $(LIBGDB_OBS) gdbtk-main.o \ +all_object_files = kgdb-main.o gdb.o $(LIBGDB_OBS) gdbtk-main.o \ test-cp-name-parser.o - # Ensure that generated files are created early. Use order-only + # All the .deps files to include. diff --git gdb/config.in gdb/config.in -index 3f8a72326b..bb1e8c23bf 100644 +index 1d11a97080..50a5a5b322 100644 --- gdb/config.in +++ gdb/config.in @@ -222,6 +222,9 @@ @@ -195,21 +181,11 @@ /* Define if you have and nl_langinfo(CODESET). */ #undef HAVE_LANGINFO_CODESET -diff --git gdb/config/mips/fbsd.mh gdb/config/mips/fbsd.mh -index f433347a20..5470795612 100644 ---- gdb/config/mips/fbsd.mh -+++ gdb/config/mips/fbsd.mh -@@ -1,3 +1,5 @@ - # Host: FreeBSD/mips - NATDEPFILES= fork-child.o inf-ptrace.o fbsd-nat.o mips-fbsd-nat.o - HAVE_NATIVE_GCORE_HOST = 1 -+ -+LOADLIBES= -lkvm diff --git gdb/configure gdb/configure -index e14886b67d..5682ce42d6 100755 +index 84a0790c0d..f4c323d4ab 100755 --- gdb/configure +++ gdb/configure -@@ -7968,6 +7968,66 @@ $as_echo "#define HAVE_KINFO_GETVMMAP 1" >>confdefs.h +@@ -7927,6 +7927,66 @@ $as_echo "#define HAVE_KINFO_GETVMMAP 1" >>confdefs.h fi @@ -277,10 +253,10 @@ if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" diff --git gdb/configure.ac gdb/configure.ac -index 50f6f592ba..89cdc9cc8e 100644 +index d4133ea71e..bac85c53e0 100644 --- gdb/configure.ac +++ gdb/configure.ac -@@ -530,6 +530,11 @@ AC_SEARCH_LIBS(kinfo_getvmmap, util util-freebsd, +@@ -523,6 +523,11 @@ AC_SEARCH_LIBS(kinfo_getvmmap, util util-freebsd, [AC_DEFINE(HAVE_KINFO_GETVMMAP, 1, [Define to 1 if your system has the kinfo_getvmmap function. ])]) @@ -292,71 +268,88 @@ AM_ICONV # GDB may fork/exec the iconv program to get the list of supported character +diff --git gdb/configure.nat gdb/configure.nat +index 8e14892722..ada205f34d 100644 +--- gdb/configure.nat ++++ gdb/configure.nat +@@ -62,7 +62,8 @@ case ${gdb_host} in + LOADLIBES='-ldl $(RDYNAMIC)' + ;; + fbsd*) +- NATDEPFILES='fork-child.o fork-inferior.o inf-ptrace.o fbsd-nat.o' ++ NATDEPFILES='fork-child.o fork-inferior.o inf-ptrace.o fbsd-nat.o \ ++ fbsd-kvm.o' + HAVE_NATIVE_GCORE_HOST=1 + LOADLIBES='-lkvm' + ;; diff --git gdb/configure.tgt gdb/configure.tgt -index f72a0dbbc1..2d73300961 100644 +index fb8014a8e8..1a86608840 100644 --- gdb/configure.tgt +++ gdb/configure.tgt -@@ -203,7 +203,13 @@ i[34567]86-*-dicos*) +@@ -92,7 +92,7 @@ esac + + case "${targ}" in + *-*-freebsd* | *-*-kfreebsd*-gnu) +- os_obs="fbsd-tdep.o solib-svr4.o";; ++ os_obs="fbsd-tdep.o solib-svr4.o fbsd-kld.o fbsd-kthr.o";; + *-*-netbsd* | *-*-knetbsd*-gnu) + os_obs="nbsd-tdep.o solib-svr4.o";; + *-*-openbsd*) +@@ -249,7 +249,11 @@ i[34567]86-*-dicos*) + ;; i[34567]86-*-freebsd* | i[34567]86-*-kfreebsd*-gnu) # Target: FreeBSD/i386 - gdb_target_obs="i386-tdep.o i387-tdep.o i386-bsd-tdep.o i386-fbsd-tdep.o \ -- fbsd-tdep.o solib-svr4.o" -+ fbsd-tdep.o solib-svr4.o \ -+ fbsd-kld.o fbsd-kthr.o fbsd-kvm.o i386fbsd-kern.o" +- gdb_target_obs="i386-bsd-tdep.o i386-fbsd-tdep.o " ++ gdb_target_obs="i386-bsd-tdep.o i386-fbsd-tdep.o i386fbsd-kern.o" + if test "x$enable_64_bit_bfd" = "xyes"; then + # Target: FreeBSD amd64 -+ gdb_target_obs="amd64-tdep.o amd64fbsd-tdep.o amd64fbsd-kern.o \ -+ ${gdb_target_obs}" ++ gdb_target_obs="amd64fbsd-tdep.o amd64fbsd-kern.o ${gdb_target_obs}" + fi ;; i[34567]86-*-netbsd* | i[34567]86-*-knetbsd*-gnu) # Target: NetBSD/i386 -@@ -377,7 +383,8 @@ mips*-*-netbsd* | mips*-*-knetbsd*-gnu) +@@ -408,7 +412,7 @@ mips*-*-netbsd* | mips*-*-knetbsd*-gnu) ;; mips*-*-freebsd*) # Target: MIPS running FreeBSD -- gdb_target_obs="mips-tdep.o mips-fbsd-tdep.o solib-svr4.o fbsd-tdep.o" -+ gdb_target_obs="mips-tdep.o mips-fbsd-tdep.o solib-svr4.o fbsd-tdep.o \ -+ fbsd-kld.o fbsd-kthr.o fbsd-kvm.o mipsfbsd-kern.o" +- gdb_target_obs="mips-tdep.o mips-fbsd-tdep.o" ++ gdb_target_obs="mips-tdep.o mips-fbsd-tdep.o mipsfbsd-kern.o" gdb_sim=../sim/mips/libsim.a ;; mips64*-*-openbsd*) -@@ -436,7 +443,8 @@ powerpc*-*-freebsd*) +@@ -472,7 +476,7 @@ or1k-*-* | or1knd-*-*) + powerpc*-*-freebsd*) # Target: FreeBSD/powerpc gdb_target_obs="rs6000-tdep.o ppc-sysv-tdep.o ppc64-tdep.o \ - ppc-fbsd-tdep.o fbsd-tdep.o solib-svr4.o \ -- ravenscar-thread.o ppc-ravenscar-thread.o" -+ ravenscar-thread.o ppc-ravenscar-thread.o \ -+ fbsd-kld.o fbsd-kthr.o fbsd-kvm.o ppcfbsd-kern.o" +- ppc-fbsd-tdep.o \ ++ ppc-fbsd-tdep.o ppcfbsd-kern.o \ + ravenscar-thread.o ppc-ravenscar-thread.o" ;; - powerpc-*-netbsd* | powerpc-*-knetbsd*-gnu) -@@ -560,7 +568,8 @@ sparc*-*-freebsd* | sparc*-*-kfreebsd*-gnu) +@@ -594,6 +598,7 @@ sparc64-*-linux*) + sparc*-*-freebsd* | sparc*-*-kfreebsd*-gnu) # Target: FreeBSD/sparc64 gdb_target_obs="sparc-tdep.o sparc64-tdep.o sparc64-fbsd-tdep.o \ - fbsd-tdep.o solib-svr4.o \ -- ravenscar-thread.o sparc-ravenscar-thread.o" -+ ravenscar-thread.o sparc-ravenscar-thread.o \ -+ fbsd-kld.o fbsd-kthr.o fbsd-kvm.o sparc64fbsd-kern.o" ++ sparc64fbsd-kern.o \ + ravenscar-thread.o sparc-ravenscar-thread.o" ;; sparc-*-netbsd* | sparc-*-knetbsd*-gnu) - # Target: NetBSD/sparc -@@ -691,7 +700,9 @@ x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu) +@@ -716,8 +721,8 @@ x86_64-*-linux*) + ;; + x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu) # Target: FreeBSD/amd64 - gdb_target_obs="amd64-tdep.o amd64-fbsd-tdep.o i386-tdep.o \ - i387-tdep.o i386-bsd-tdep.o i386-fbsd-tdep.o \ -- fbsd-tdep.o solib-svr4.o" -+ fbsd-tdep.o solib-svr4.o \ -+ fbsd-kld.o fbsd-kthr.o fbsd-kvm.o amd64fbsd-kern.o \ -+ i386fbsd-kern.o" +- gdb_target_obs="amd64-fbsd-tdep.o ${i386_tobjs} \ +- i386-bsd-tdep.o i386-fbsd-tdep.o" ++ gdb_target_obs="amd64-fbsd-tdep.o amd64fbsd-kern.o ${i386_tobjs} \ ++ i386-bsd-tdep.o i386-fbsd-tdep.o i386fbsd-kern.o" ;; x86_64-*-mingw* | x86_64-*-cygwin*) # Target: MingW/amd64 diff --git gdb/defs.h gdb/defs.h -index a0b586f401..44d3d112ed 100644 +index 4fb2129b30..0cb0bad5c5 100644 --- gdb/defs.h +++ gdb/defs.h -@@ -590,6 +590,7 @@ enum gdb_osabi +@@ -516,6 +516,7 @@ enum gdb_osabi GDB_OSABI_SOLARIS, GDB_OSABI_LINUX, GDB_OSABI_FREEBSD, @@ -364,8 +357,20 @@ GDB_OSABI_NETBSD, GDB_OSABI_OPENBSD, GDB_OSABI_WINCE, +diff --git gdb/gnulib/configure gdb/gnulib/configure +index 37efd06b67..a23fc0a81c 100644 +--- gdb/gnulib/configure ++++ gdb/gnulib/configure +@@ -16790,6 +16790,7 @@ else + case "$host_os" in + # Guess all is fine on glibc systems. + *-gnu*) gl_cv_func_gettimeofday_clobber="guessing no" ;; ++ freebsd*) gl_cv_func_gettimeofday_clobber="guessing no" ;; + # If we don't know, assume the worst. + *) gl_cv_func_gettimeofday_clobber="guessing yes" ;; + esac diff --git gdb/osabi.c gdb/osabi.c -index 84fa9c0273..5c49e22657 100644 +index 129164f51e..4eacc074a3 100644 --- gdb/osabi.c +++ gdb/osabi.c @@ -65,6 +65,7 @@ static const struct osabi_names gdb_osabi_names[] = @@ -377,40 +382,43 @@ { "OpenBSD", NULL }, { "WindowsCE", NULL }, diff --git gdb/regcache.c gdb/regcache.c -index 37bc2f0046..9da3aaa514 100644 +index fb6a904dec..f9b7105b8f 100644 --- gdb/regcache.c +++ gdb/regcache.c -@@ -1105,6 +1105,20 @@ regcache_raw_supply (struct regcache *regcache, int regnum, const void *buf) - } +@@ -1079,6 +1079,23 @@ regcache::raw_supply_zeroed (int regnum) + m_register_status[regnum] = REG_VALID; } +void -+regcache_raw_supply_unsigned (struct regcache *regcache, int regnum, -+ ULONGEST val) ++regcache::raw_supply_unsigned (int regnum, ULONGEST val) +{ -+ gdb_byte *buf; ++ enum bfd_endian byte_order = gdbarch_byte_order (m_descr->gdbarch); ++ gdb_byte *regbuf; ++ size_t regsize; + -+ gdb_assert (regcache != NULL); -+ gdb_assert (regnum >=0 && regnum < regcache->descr->nr_raw_registers); -+ buf = (gdb_byte *)alloca (regcache->descr->sizeof_register[regnum]); -+ store_unsigned_integer (buf, regcache->descr->sizeof_register[regnum], -+ gdbarch_byte_order (regcache->descr->gdbarch), val); -+ regcache_raw_supply (regcache, regnum, buf); ++ assert_regnum (regnum); ++ gdb_assert (!m_readonly_p); ++ ++ regbuf = register_buffer (regnum); ++ regsize = m_descr->sizeof_register[regnum]; ++ ++ store_unsigned_integer (regbuf, regsize, byte_order, val); ++ m_register_status[regnum] = REG_VALID; +} + /* Collect register REGNUM from REGCACHE and store its contents in BUF. */ void diff --git gdb/regcache.h gdb/regcache.h -index 1d60fa7616..9b8a4723a3 100644 +index 9e3da8c3fc..5c65a9be1e 100644 --- gdb/regcache.h +++ gdb/regcache.h -@@ -149,6 +149,8 @@ extern void regcache_write_pc (struct regcache *regcache, CORE_ADDR pc); +@@ -294,6 +294,8 @@ public: + void raw_supply_integer (int regnum, const gdb_byte *addr, int addr_len, + bool is_signed); - extern void regcache_raw_supply (struct regcache *regcache, - int regnum, const void *buf); -+extern void regcache_raw_supply_unsigned (struct regcache *regcache, -+ int regnum, ULONGEST val); - extern void regcache_raw_collect (const struct regcache *regcache, - int regnum, void *buf); ++ void raw_supply_unsigned (int regnum, ULONGEST val); ++ + void raw_supply_zeroed (int regnum); + enum register_status get_register_status (int regnum) const; Index: head/devel/gdb/files/kgdb/amd64fbsd-kern.c =================================================================== --- head/devel/gdb/files/kgdb/amd64fbsd-kern.c +++ head/devel/gdb/files/kgdb/amd64fbsd-kern.c @@ -27,24 +27,23 @@ #include __FBSDID("$FreeBSD$"); -#include -#ifdef __amd64__ -#include -#include -#endif -#include - -#include -#include +#include "defs.h" +#include "frame-unwind.h" #include "gdbcore.h" #include "osabi.h" -#include +#include "regcache.h" #include "solib.h" #include "stack.h" #include "symtab.h" #include "trad-frame.h" -#include +#include "amd64-tdep.h" +#include "x86-xstate.h" +#ifdef __amd64__ +#include +#include +#endif + #include "kgdb.h" static const int amd64fbsd_pcb_offset[] = { @@ -88,11 +87,11 @@ if (target_read_memory(pcb_addr + amd64fbsd_pcb_offset[i], buf, sizeof buf) != 0) continue; - regcache_raw_supply(regcache, i, buf); + regcache->raw_supply(i, buf); } - regcache_raw_supply_unsigned(regcache, AMD64_CS_REGNUM, CODE_SEL); - regcache_raw_supply_unsigned(regcache, AMD64_SS_REGNUM, DATA_SEL); + regcache->raw_supply_unsigned(AMD64_CS_REGNUM, CODE_SEL); + regcache->raw_supply_unsigned(AMD64_SS_REGNUM, DATA_SEL); } static const int amd64fbsd_trapframe_offset[] = { @@ -204,6 +203,7 @@ find_pc_partial_function (get_frame_func (this_frame), &name, NULL, NULL); return (name && ((strcmp (name, "calltrap") == 0) + || (strcmp (name, "fast_syscall_common") == 0) || (strcmp (name, "fork_trampoline") == 0) || (strcmp (name, "mchk_calltrap") == 0) || (strcmp (name, "nmi_calltrap") == 0) @@ -223,7 +223,8 @@ amd64fbsd_kernel_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch) { - amd64_init_abi(info, gdbarch); + amd64_init_abi(info, gdbarch, + amd64_target_description (X86_XSTATE_SSE_MASK)); frame_unwind_prepend_unwinder(gdbarch, &amd64fbsd_trapframe_unwind); @@ -232,8 +233,6 @@ fbsd_vmcore_set_supply_pcb(gdbarch, amd64fbsd_supply_pcb); fbsd_vmcore_set_cpu_pcb_addr(gdbarch, kgdb_trgt_stop_pcb); } - -void _initialize_amd64_kgdb_tdep(void); void _initialize_amd64_kgdb_tdep(void) Index: head/devel/gdb/files/kgdb/fbsd-kld.c =================================================================== --- head/devel/gdb/files/kgdb/fbsd-kld.c +++ head/devel/gdb/files/kgdb/fbsd-kld.c @@ -27,25 +27,22 @@ #include __FBSDID("$FreeBSD$"); -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "defs.h" +#include "command.h" +#include "completer.h" +#include "environ.h" +#include "exec.h" +#include "frame-unwind.h" +#include "inferior.h" +#include "objfiles.h" +#include "gdbcore.h" +#include "language.h" #include "solib.h" -#include +#include "solist.h" #include "kgdb.h" -struct lm_info { +struct lm_info_kld : public lm_info_base { CORE_ADDR base_address; }; @@ -199,7 +196,7 @@ * Try to find this kld in the kernel linker's list of linker files. */ static int -find_kld_address (char *arg, CORE_ADDR *address) +find_kld_address (const char *arg, CORE_ADDR *address) { struct kld_info *info; CORE_ADDR kld; @@ -314,7 +311,7 @@ } static void -kgdb_add_kld_cmd (char *arg, int from_tty) +kgdb_add_kld_cmd (const char *arg, int from_tty) { char path[PATH_MAX]; CORE_ADDR base_addr; @@ -349,26 +346,30 @@ static void kld_relocate_section_addresses (struct so_list *so, struct target_section *sec) { - static CORE_ADDR curr_addr; + lm_info_kld *li = (lm_info_kld *) so->lm_info; + static CORE_ADDR curr_addr; - if (sec == so->sections) - curr_addr = so->lm_info->base_address; + if (sec == so->sections) + curr_addr = li->base_address; - adjust_section_address(sec, &curr_addr); + adjust_section_address(sec, &curr_addr); } static void kld_free_so (struct so_list *so) { + lm_info_kld *li = (lm_info_kld *) so->lm_info; - xfree(so->lm_info); + delete li; } static void kld_clear_so (struct so_list *so) { - if (so->lm_info != NULL) - so->lm_info->base_address = 0; + lm_info_kld *li = (lm_info_kld *) so->lm_info; + + if (li != NULL) + li->base_address = 0; } static void @@ -460,9 +461,11 @@ newobj = XCNEW (struct so_list); - newobj->lm_info = XNEW (struct lm_info); - newobj->lm_info->base_address = 0; + lm_info_kld *li = new lm_info_kld; + li->base_address = 0; + newobj->lm_info = li; + /* Read the base filename and store it in so_original_name. */ target_read_string(read_pointer(kld + info->off_filename), &path, sizeof(newobj->so_original_name), &error); @@ -504,9 +507,8 @@ sizeof(newobj->so_name)); /* Read this kld's base address. */ - newobj->lm_info->base_address = read_pointer(kld + - info->off_address); - if (newobj->lm_info->base_address == 0) { + li->base_address = read_pointer(kld + info->off_address); + if (li->base_address == 0) { warning( "kld_current_sos: Invalid address for kld \"%s\"", newobj->so_original_name); @@ -523,7 +525,7 @@ } static int -kld_open_symbol_file_object (void *from_ttyp) +kld_open_symbol_file_object (int from_tty) { return (0); @@ -553,8 +555,6 @@ *temp_pathname = xstrdup(path); return (fd); } - -void _initialize_kld_target(void); void _initialize_kld_target(void) Index: head/devel/gdb/files/kgdb/fbsd-kvm.c =================================================================== --- head/devel/gdb/files/kgdb/fbsd-kvm.c +++ head/devel/gdb/files/kgdb/fbsd-kvm.c @@ -27,35 +27,25 @@ #include __FBSDID("$FreeBSD$"); -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include +#include "defs.h" +#include "command.h" #include "elf-bfd.h" -#include #include "filenames.h" -#include -#include -#include -#include +#include "gdbcore.h" +#include "gdbthread.h" #include "gdb_obstack.h" -#include -#include +#include "inferior.h" #include "objfiles.h" #include "osabi.h" -#include -#include -#include -#include +#include "solib.h" +#include "target.h" +#include "value.h" +#include "readline/tilde.h" +#include +#include +#include + #include "kgdb.h" static CORE_ADDR stoppcbs; @@ -503,20 +493,18 @@ } static void -kgdb_switch_to_thread(int tid) +kgdb_switch_to_thread(const char *arg, int tid) { - char buf[16]; - int thread_id; + struct thread_info *tp; - thread_id = ptid_to_global_thread_id(fbsd_vmcore_ptid(tid)); - if (thread_id == 0) - error ("invalid tid"); - snprintf(buf, sizeof(buf), "%d", thread_id); - gdb_thread_select(current_uiout, buf, NULL); + tp = find_thread_ptid (fbsd_vmcore_ptid (tid)); + if (tp == NULL) + error ("invalid tid"); + thread_select (arg, tp); } static void -kgdb_set_proc_cmd (char *arg, int from_tty) +kgdb_set_proc_cmd (const char *arg, int from_tty) { CORE_ADDR addr; struct kthr *thr; @@ -538,11 +526,11 @@ if (thr == NULL) error("invalid proc address"); } - kgdb_switch_to_thread(thr->tid); + kgdb_switch_to_thread(arg, thr->tid); } static void -kgdb_set_tid_cmd (char *arg, int from_tty) +kgdb_set_tid_cmd (const char *arg, int from_tty) { CORE_ADDR addr; struct kthr *thr; @@ -558,7 +546,7 @@ error("invalid thread address"); addr = thr->tid; } - kgdb_switch_to_thread(addr); + kgdb_switch_to_thread(arg, addr); } static int @@ -567,8 +555,6 @@ return 1; } - -void _initialize_kgdb_target(void); void _initialize_kgdb_target(void) Index: head/devel/gdb/files/kgdb/i386fbsd-kern.c =================================================================== --- head/devel/gdb/files/kgdb/i386fbsd-kern.c +++ head/devel/gdb/files/kgdb/i386fbsd-kern.c @@ -27,27 +27,25 @@ #include __FBSDID("$FreeBSD$"); -#include -#include +#include "defs.h" +#include "frame-unwind.h" +#include "gdbcore.h" +#include "inferior.h" +#include "osabi.h" +#include "regcache.h" +#include "progspace.h" +#include "solib.h" +#include "trad-frame.h" +#include "i386-tdep.h" + #ifdef __i386__ +#include #include #include #include #include #endif -#include -#include -#include -#include "gdbcore.h" -#include -#include "osabi.h" -#include -#include "progspace.h" -#include "solib.h" -#include "trad-frame.h" -#include - #include "kgdb.h" struct i386fbsd_info { @@ -135,14 +133,14 @@ if (target_read_memory(pcb_addr + i386fbsd_pcb_offset[i], buf, sizeof buf) != 0) continue; - regcache_raw_supply(regcache, i, buf); + regcache->raw_supply(i, buf); } - regcache_raw_supply_unsigned(regcache, I386_CS_REGNUM, CODE_SEL); - regcache_raw_supply_unsigned(regcache, I386_DS_REGNUM, DATA_SEL); - regcache_raw_supply_unsigned(regcache, I386_ES_REGNUM, DATA_SEL); - regcache_raw_supply_unsigned(regcache, I386_FS_REGNUM, PRIV_SEL); - regcache_raw_supply_unsigned(regcache, I386_GS_REGNUM, DATA_SEL); - regcache_raw_supply_unsigned(regcache, I386_SS_REGNUM, DATA_SEL); + regcache->raw_supply_unsigned(I386_CS_REGNUM, CODE_SEL); + regcache->raw_supply_unsigned(I386_DS_REGNUM, DATA_SEL); + regcache->raw_supply_unsigned(I386_ES_REGNUM, DATA_SEL); + regcache->raw_supply_unsigned(I386_FS_REGNUM, PRIV_SEL); + regcache->raw_supply_unsigned(I386_GS_REGNUM, DATA_SEL); + regcache->raw_supply_unsigned(I386_SS_REGNUM, DATA_SEL); } #ifdef __i386__ @@ -461,8 +459,6 @@ fbsd_vmcore_set_supply_pcb(gdbarch, i386fbsd_supply_pcb); fbsd_vmcore_set_cpu_pcb_addr(gdbarch, kgdb_trgt_stop_pcb); } - -void _initialize_i386_kgdb_tdep(void); void _initialize_i386_kgdb_tdep(void) Index: head/devel/gdb/files/kgdb/kgdb-main.c =================================================================== --- head/devel/gdb/files/kgdb/kgdb-main.c +++ head/devel/gdb/files/kgdb/kgdb-main.c @@ -379,6 +379,10 @@ add_arg(&args, "-iex"); add_arg(&args, "set prompt (kgdb) "); + /* Change osabi to assume a FreeBSD kernel. */ + add_arg(&args, "-iex"); + add_arg(&args, "set osabi FreeBSD/kernel"); + /* Open the vmcore if requested. */ if (vmcore != NULL) { add_arg(&args, "-ex"); Index: head/devel/gdb/files/kgdb/mipsfbsd-kern.c =================================================================== --- head/devel/gdb/files/kgdb/mipsfbsd-kern.c +++ head/devel/gdb/files/kgdb/mipsfbsd-kern.c @@ -30,25 +30,20 @@ #include __FBSDID("$FreeBSD: head/gnu/usr.bin/gdb/kgdb/trgt_mips.c 249878 2013-04-25 04:53:01Z imp $"); -#include +#include "defs.h" +#include "frame-unwind.h" +#include "osabi.h" +#include "regcache.h" +#include "solib.h" +#include "trad-frame.h" +#include "mips-tdep.h" + #ifdef __mips__ #include #include #include #endif -#include -#include -#include -//#include -//#include -//#include -#include "osabi.h" -#include -#include "solib.h" -#include "trad-frame.h" -#include - #include "kgdb.h" /* Size of struct trapframe in registers. */ @@ -92,7 +87,7 @@ static void mipsfbsd_supply_pcb(struct regcache *regcache, CORE_ADDR pcb_addr) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); size_t regsize = mips_isa_regsize (gdbarch); gdb_byte buf[regsize * (FBSD_PCB_REG_PC + 1)]; @@ -102,35 +97,35 @@ sizeof(buf)) != 0) return; - regcache_raw_supply_unsigned (regcache, MIPS_ZERO_REGNUM, 0); - regcache_raw_supply (regcache, MIPS_S2_REGNUM - 2, - buf + (regsize * FBSD_PCB_REG_S0)); - regcache_raw_supply (regcache, MIPS_S2_REGNUM - 1, - buf + (regsize * FBSD_PCB_REG_S1)); - regcache_raw_supply (regcache, MIPS_S2_REGNUM, - buf + (regsize * FBSD_PCB_REG_S2)); - regcache_raw_supply (regcache, MIPS_S2_REGNUM + 1, - buf + (regsize * FBSD_PCB_REG_S3)); - regcache_raw_supply (regcache, MIPS_S2_REGNUM + 2, - buf + (regsize * FBSD_PCB_REG_S4)); - regcache_raw_supply (regcache, MIPS_S2_REGNUM + 3, - buf + (regsize * FBSD_PCB_REG_S5)); - regcache_raw_supply (regcache, MIPS_S2_REGNUM + 4, - buf + (regsize * FBSD_PCB_REG_S6)); - regcache_raw_supply (regcache, MIPS_S2_REGNUM + 5, - buf + (regsize * FBSD_PCB_REG_S7)); - regcache_raw_supply (regcache, MIPS_SP_REGNUM, - buf + (regsize * FBSD_PCB_REG_SP)); - regcache_raw_supply (regcache, MIPS_S2_REGNUM + 6, - buf + (regsize * FBSD_PCB_REG_S8)); - regcache_raw_supply (regcache, MIPS_RA_REGNUM, - buf + (regsize * FBSD_PCB_REG_RA)); - regcache_raw_supply (regcache, MIPS_PS_REGNUM, - buf + (regsize * FBSD_PCB_REG_SR)); - regcache_raw_supply (regcache, MIPS_GP_REGNUM, - buf + (regsize * FBSD_PCB_REG_GP)); - regcache_raw_supply (regcache, MIPS_EMBED_PC_REGNUM, - buf + (regsize * FBSD_PCB_REG_PC)); + regcache->raw_supply_unsigned (MIPS_ZERO_REGNUM, 0); + regcache->raw_supply (MIPS_S2_REGNUM - 2, + buf + (regsize * FBSD_PCB_REG_S0)); + regcache->raw_supply (MIPS_S2_REGNUM - 1, + buf + (regsize * FBSD_PCB_REG_S1)); + regcache->raw_supply (MIPS_S2_REGNUM, + buf + (regsize * FBSD_PCB_REG_S2)); + regcache->raw_supply (MIPS_S2_REGNUM + 1, + buf + (regsize * FBSD_PCB_REG_S3)); + regcache->raw_supply (MIPS_S2_REGNUM + 2, + buf + (regsize * FBSD_PCB_REG_S4)); + regcache->raw_supply (MIPS_S2_REGNUM + 3, + buf + (regsize * FBSD_PCB_REG_S5)); + regcache->raw_supply (MIPS_S2_REGNUM + 4, + buf + (regsize * FBSD_PCB_REG_S6)); + regcache->raw_supply (MIPS_S2_REGNUM + 5, + buf + (regsize * FBSD_PCB_REG_S7)); + regcache->raw_supply (MIPS_SP_REGNUM, + buf + (regsize * FBSD_PCB_REG_SP)); + regcache->raw_supply (MIPS_S2_REGNUM + 6, + buf + (regsize * FBSD_PCB_REG_S8)); + regcache->raw_supply (MIPS_RA_REGNUM, + buf + (regsize * FBSD_PCB_REG_RA)); + regcache->raw_supply (MIPS_PS_REGNUM, + buf + (regsize * FBSD_PCB_REG_SR)); + regcache->raw_supply (MIPS_GP_REGNUM, + buf + (regsize * FBSD_PCB_REG_GP)); + regcache->raw_supply (MIPS_EMBED_PC_REGNUM, + buf + (regsize * FBSD_PCB_REG_PC)); } static struct trad_frame_cache * @@ -291,8 +286,6 @@ fbsd_vmcore_set_supply_pcb (gdbarch, mipsfbsd_supply_pcb); fbsd_vmcore_set_cpu_pcb_addr (gdbarch, kgdb_trgt_stop_pcb); } - -void _initialize_mips_kgdb_tdep (void); void _initialize_mips_kgdb_tdep (void) Index: head/devel/gdb/files/kgdb/ppcfbsd-kern.c =================================================================== --- head/devel/gdb/files/kgdb/ppcfbsd-kern.c +++ head/devel/gdb/files/kgdb/ppcfbsd-kern.c @@ -27,25 +27,22 @@ #include __FBSDID("$FreeBSD$"); -#include -#ifdef __powerpc__ -#include -#include -#endif -#include - -#include -#include +#include "defs.h" +#include "frame-unwind.h" #include "gdbcore.h" #include "osabi.h" #include "regcache.h" #include "solib.h" #include "symtab.h" #include "trad-frame.h" - -#include +#include "ppc-tdep.h" #include "ppc64-tdep.h" +#ifdef __powerpc__ +#include +#include +#endif + #include "kgdb.h" #ifdef __powerpc__ @@ -56,7 +53,7 @@ struct gdbarch_tdep *tdep; int i; - tdep = gdbarch_tdep (target_gdbarch()); + tdep = gdbarch_tdep (regcache->arch ()); if (target_read_memory(pcb_addr, (gdb_byte *)&pcb, sizeof(pcb)) != 0) memset(&pcb, 0, sizeof(pcb)); @@ -65,20 +62,20 @@ * r14-r31 are saved in the pcb */ for (i = 14; i <= 31; i++) { - regcache_raw_supply(regcache, tdep->ppc_gp0_regnum + i, + regcache->raw_supply(tdep->ppc_gp0_regnum + i, (char *)&pcb.pcb_context[i]); } /* r1 is saved in the sp field */ - regcache_raw_supply(regcache, tdep->ppc_gp0_regnum + 1, + regcache->raw_supply(tdep->ppc_gp0_regnum + 1, (char *)&pcb.pcb_sp); if (tdep->wordsize == 8) /* r2 is saved in the toc field */ - regcache_raw_supply(regcache, tdep->ppc_gp0_regnum + 2, + regcache->raw_supply(tdep->ppc_gp0_regnum + 2, (char *)&pcb.pcb_toc); - regcache_raw_supply(regcache, tdep->ppc_lr_regnum, (char *)&pcb.pcb_lr); - regcache_raw_supply(regcache, tdep->ppc_cr_regnum, (char *)&pcb.pcb_cr); + regcache->raw_supply(tdep->ppc_lr_regnum, (char *)&pcb.pcb_lr); + regcache->raw_supply(tdep->ppc_cr_regnum, (char *)&pcb.pcb_cr); } #endif @@ -231,8 +228,6 @@ ppc64_elf_make_msymbol_special); } } - -void _initialize_ppc_kgdb_tdep(void); void _initialize_ppc_kgdb_tdep(void) Index: head/devel/gdb/files/kgdb/sparc64fbsd-kern.c =================================================================== --- head/devel/gdb/files/kgdb/sparc64fbsd-kern.c +++ head/devel/gdb/files/kgdb/sparc64fbsd-kern.c @@ -27,25 +27,22 @@ #include __FBSDID("$FreeBSD$"); -#include -#ifdef __sparc64__ -#include -#include -#include -#endif -#include - -#include +#include "defs.h" #include "gdbcore.h" #include "osabi.h" #include "regcache.h" -#include -#include +#include "target.h" +#include "frame-unwind.h" #include "solib.h" #include "trad-frame.h" +#include "sparc-tdep.h" +#include "sparc64-tdep.h" -#include -#include +#ifdef __sparc64__ +#include +#include +#include +#endif #include "kgdb.h" @@ -304,8 +301,6 @@ fbsd_vmcore_set_cpu_pcb_addr(gdbarch, kgdb_trgt_stop_pcb); #endif } - -void _initialize_sparc64_kgdb_tdep(void); void _initialize_sparc64_kgdb_tdep(void) Index: head/devel/gdb/files/patch-aarch64-fbsd =================================================================== --- head/devel/gdb/files/patch-aarch64-fbsd +++ head/devel/gdb/files/patch-aarch64-fbsd @@ -1,468 +0,0 @@ ---- gdb/Makefile.in.orig 2017-09-14 09:28:17 UTC -+++ gdb/Makefile.in -@@ -745,6 +745,7 @@ TARGET_OBS = @TARGET_OBS@ - # All target-dependent objects files that require 64-bit CORE_ADDR - # (used with --enable-targets=all --enable-64-bit-bfd). - ALL_64_TARGET_OBS = \ -+ aarch64-fbsd-tdep.o \ - aarch64-insn.o \ - aarch64-linux-tdep.o \ - aarch64-newlib-tdep.o \ -@@ -2458,6 +2459,8 @@ force_update: - MAKEOVERRIDES = - - ALLDEPFILES = \ -+ aarch64-fbsd-nat.c \ -+ aarch64-fbsd-tdep.c \ - aarch64-linux-nat.c \ - aarch64-linux-tdep.c \ - aarch64-newlib-tdep.c \ -diff --git gdb/aarch64-fbsd-nat.c gdb/aarch64-fbsd-nat.c -new file mode 100644 -index 0000000000..f7855b9c0b ---- /dev/null -+++ gdb/aarch64-fbsd-nat.c -@@ -0,0 +1,133 @@ -+/* Native-dependent code for FreeBSD/aarch64. -+ -+ Copyright (C) 2017 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 . */ -+ -+#include "defs.h" -+#include "target.h" -+ -+#include -+#include -+#include -+ -+#include "fbsd-nat.h" -+#include "aarch64-tdep.h" -+#include "aarch64-fbsd-tdep.h" -+#include "inf-ptrace.h" -+ -+/* Determine if PT_GETREGS fetches REGNUM. */ -+ -+static bool -+getregs_supplies (struct gdbarch *gdbarch, int regnum) -+{ -+ return (regnum >= AARCH64_X0_REGNUM && regnum <= AARCH64_CPSR_REGNUM); -+} -+ -+/* Determine if PT_GETFPREGS fetches REGNUM. */ -+ -+static bool -+getfpregs_supplies (struct gdbarch *gdbarch, int regnum) -+{ -+ return (regnum >= AARCH64_V0_REGNUM && regnum <= AARCH64_FPCR_REGNUM); -+} -+ -+/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this -+ for all registers. */ -+ -+static void -+aarch64_fbsd_fetch_inferior_registers (struct target_ops *ops, -+ struct regcache *regcache, int regnum) -+{ -+ pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache)); -+ -+ struct gdbarch *gdbarch = get_regcache_arch (regcache); -+ if (regnum == -1 || getregs_supplies (gdbarch, regnum)) -+ { -+ struct reg regs; -+ -+ if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) -+ perror_with_name (_("Couldn't get registers")); -+ -+ regcache_supply_regset (&aarch64_fbsd_gregset, regcache, regnum, ®s, -+ sizeof (regs)); -+ } -+ -+ if (regnum == -1 || getfpregs_supplies (gdbarch, regnum)) -+ { -+ struct fpreg fpregs; -+ -+ if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) -+ perror_with_name (_("Couldn't get floating point status")); -+ -+ regcache_supply_regset (&aarch64_fbsd_fpregset, regcache, regnum, &fpregs, -+ sizeof (fpregs)); -+ } -+} -+ -+/* Store register REGNUM back into the inferior. If REGNUM is -1, do -+ this for all registers. */ -+ -+static void -+aarch64_fbsd_store_inferior_registers (struct target_ops *ops, -+ struct regcache *regcache, int regnum) -+{ -+ pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache)); -+ -+ struct gdbarch *gdbarch = get_regcache_arch (regcache); -+ if (regnum == -1 || getregs_supplies (gdbarch, regnum)) -+ { -+ struct reg regs; -+ -+ if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) -+ perror_with_name (_("Couldn't get registers")); -+ -+ regcache_collect_regset (&aarch64_fbsd_gregset, regcache, regnum, ®s, -+ sizeof (regs)); -+ -+ if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) -+ perror_with_name (_("Couldn't write registers")); -+ } -+ -+ if (regnum == -1 || getfpregs_supplies (gdbarch, regnum)) -+ { -+ struct fpreg fpregs; -+ -+ if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) -+ perror_with_name (_("Couldn't get floating point status")); -+ -+ regcache_collect_regset (&aarch64_fbsd_fpregset, regcache, regnum, &fpregs, -+ sizeof (fpregs)); -+ -+ if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) -+ perror_with_name (_("Couldn't write floating point status")); -+ } -+} -+ -+ -+/* Provide a prototype to silence -Wmissing-prototypes. */ -+void _initialize_aarch64_fbsd_nat (void); -+ -+void -+_initialize_aarch64_fbsd_nat (void) -+{ -+ struct target_ops *t; -+ -+ t = inf_ptrace_target (); -+ t->to_fetch_registers = aarch64_fbsd_fetch_inferior_registers; -+ t->to_store_registers = aarch64_fbsd_store_inferior_registers; -+ fbsd_nat_add_target (t); -+} -diff --git gdb/aarch64-fbsd-tdep.c gdb/aarch64-fbsd-tdep.c -new file mode 100644 -index 0000000000..f8ce627282 ---- /dev/null -+++ gdb/aarch64-fbsd-tdep.c -@@ -0,0 +1,208 @@ -+/* Target-dependent code for FreeBSD/aarch64. -+ -+ Copyright (C) 2017 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 . */ -+ -+#include "defs.h" -+ -+#include "gdbarch.h" -+#include "fbsd-tdep.h" -+#include "aarch64-tdep.h" -+#include "aarch64-fbsd-tdep.h" -+#include "osabi.h" -+#include "solib-svr4.h" -+#include "target.h" -+#include "tramp-frame.h" -+#include "trad-frame.h" -+ -+/* In a signal frame, sp points to a 'struct sigframe' which is -+ defined as: -+ -+ struct sigframe { -+ siginfo_t sf_si; -+ ucontext_t sf_uc; -+ }; -+ -+ ucontext_t is defined as: -+ -+ struct __ucontext { -+ sigset_t uc_sigmask; -+ mcontext_t uc_mcontext; -+ ... -+ }; -+ -+ The mcontext_t contains the general purpose register set followed -+ by the floating point register set. The floating point register -+ set is only valid if the _MC_FP_VALID flag is set in mc_flags. */ -+ -+#define AARCH64_MCONTEXT_REG_SIZE 8 -+#define AARCH64_MCONTEXT_FPREG_SIZE 16 -+#define AARCH64_SIGFRAME_UCONTEXT_OFFSET 80 -+#define AARCH64_UCONTEXT_MCONTEXT_OFFSET 16 -+#define AARCH64_MCONTEXT_FPREGS_OFFSET 272 -+#define AARCH64_MCONTEXT_FLAGS_OFFSET 800 -+#define AARCH64_MCONTEXT_FLAG_FP_VALID 0x1 -+ -+/* Implement the "init" method of struct tramp_frame. */ -+ -+static void -+aarch64_fbsd_sigframe_init (const struct tramp_frame *self, -+ struct frame_info *this_frame, -+ struct trad_frame_cache *this_cache, -+ CORE_ADDR func) -+{ -+ struct gdbarch *gdbarch = get_frame_arch (this_frame); -+ enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); -+ CORE_ADDR sp = get_frame_register_unsigned (this_frame, AARCH64_SP_REGNUM); -+ CORE_ADDR mcontext_addr = -+ sp -+ + AARCH64_SIGFRAME_UCONTEXT_OFFSET -+ + AARCH64_UCONTEXT_MCONTEXT_OFFSET; -+ gdb_byte buf[4]; -+ int i; -+ -+ for (i = 0; i < 30; i++) -+ { -+ trad_frame_set_reg_addr (this_cache, -+ AARCH64_X0_REGNUM + i, -+ mcontext_addr + i * AARCH64_MCONTEXT_REG_SIZE); -+ } -+ trad_frame_set_reg_addr (this_cache, AARCH64_LR_REGNUM, -+ mcontext_addr + 30 * AARCH64_MCONTEXT_REG_SIZE); -+ trad_frame_set_reg_addr (this_cache, AARCH64_SP_REGNUM, -+ mcontext_addr + 31 * AARCH64_MCONTEXT_REG_SIZE); -+ trad_frame_set_reg_addr (this_cache, AARCH64_PC_REGNUM, -+ mcontext_addr + 32 * AARCH64_MCONTEXT_REG_SIZE); -+ trad_frame_set_reg_addr (this_cache, AARCH64_CPSR_REGNUM, -+ mcontext_addr + 33 * AARCH64_MCONTEXT_REG_SIZE); -+ -+ if (target_read_memory (mcontext_addr + AARCH64_MCONTEXT_FLAGS_OFFSET, buf, -+ 4) == 0 -+ && (extract_unsigned_integer (buf, 4, byte_order) -+ & AARCH64_MCONTEXT_FLAG_FP_VALID)) -+ { -+ for (i = 0; i < 32; i++) -+ { -+ trad_frame_set_reg_addr (this_cache, AARCH64_V0_REGNUM + i, -+ mcontext_addr -+ + AARCH64_MCONTEXT_FPREGS_OFFSET -+ + i * AARCH64_MCONTEXT_FPREG_SIZE); -+ } -+ trad_frame_set_reg_addr (this_cache, AARCH64_FPSR_REGNUM, -+ mcontext_addr + AARCH64_MCONTEXT_FPREGS_OFFSET -+ + 32 * AARCH64_MCONTEXT_FPREG_SIZE); -+ trad_frame_set_reg_addr (this_cache, AARCH64_FPCR_REGNUM, -+ mcontext_addr + AARCH64_MCONTEXT_FPREGS_OFFSET -+ + 32 * AARCH64_MCONTEXT_FPREG_SIZE + 4); -+ } -+ -+ trad_frame_set_id (this_cache, frame_id_build (sp, func)); -+} -+ -+static const struct tramp_frame aarch64_fbsd_sigframe = -+{ -+ SIGTRAMP_FRAME, -+ 4, -+ { -+ {0x910003e0, -1}, /* mov x0, sp */ -+ {0x91014000, -1}, /* add x0, x0, #SF_UC */ -+ {0xd2803428, -1}, /* mov x8, #SYS_sigreturn */ -+ {0xd4000001, -1}, /* svc 0x0 */ -+ {TRAMP_SENTINEL_INSN, -1} -+ }, -+ aarch64_fbsd_sigframe_init -+}; -+ -+/* Register maps. */ -+ -+static const struct regcache_map_entry aarch64_fbsd_gregmap[] = -+ { -+ { 30, AARCH64_X0_REGNUM, 8 }, /* x0 ... x29 */ -+ { 1, AARCH64_LR_REGNUM, 8 }, -+ { 1, AARCH64_SP_REGNUM, 8 }, -+ { 1, AARCH64_PC_REGNUM, 8 }, -+ { 1, AARCH64_CPSR_REGNUM, 4 }, -+ { 0 } -+ }; -+ -+static const struct regcache_map_entry aarch64_fbsd_fpregmap[] = -+ { -+ { 32, AARCH64_V0_REGNUM, 16 }, /* v0 ... v31 */ -+ { 1, AARCH64_FPSR_REGNUM, 4 }, -+ { 1, AARCH64_FPCR_REGNUM, 4 }, -+ { 0 } -+ }; -+ -+/* Register set definitions. */ -+ -+const struct regset aarch64_fbsd_gregset = -+ { -+ aarch64_fbsd_gregmap, -+ regcache_supply_regset, regcache_collect_regset -+ }; -+ -+const struct regset aarch64_fbsd_fpregset = -+ { -+ aarch64_fbsd_fpregmap, -+ regcache_supply_regset, regcache_collect_regset -+ }; -+ -+/* Implement the "regset_from_core_section" gdbarch method. */ -+ -+static void -+aarch64_fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch, -+ iterate_over_regset_sections_cb *cb, -+ void *cb_data, -+ const struct regcache *regcache) -+{ -+ cb (".reg", AARCH64_FBSD_SIZEOF_GREGSET, &aarch64_fbsd_gregset, -+ NULL, cb_data); -+ cb (".reg2", AARCH64_FBSD_SIZEOF_FPREGSET, &aarch64_fbsd_fpregset, -+ NULL, cb_data); -+} -+ -+/* Implement the 'init_osabi' method of struct gdb_osabi_handler. */ -+ -+static void -+aarch64_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) -+{ -+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -+ -+ /* Generic FreeBSD support. */ -+ fbsd_init_abi (info, gdbarch); -+ -+ set_solib_svr4_fetch_link_map_offsets (gdbarch, -+ svr4_lp64_fetch_link_map_offsets); -+ -+ tramp_frame_prepend_unwinder (gdbarch, &aarch64_fbsd_sigframe); -+ -+ /* Enable longjmp. */ -+ tdep->jb_pc = 13; -+ -+ set_gdbarch_iterate_over_regset_sections -+ (gdbarch, aarch64_fbsd_iterate_over_regset_sections); -+} -+ -+/* Provide a prototype to silence -Wmissing-prototypes. */ -+extern initialize_file_ftype _initialize_aarch64_fbsd_tdep; -+ -+void -+_initialize_aarch64_fbsd_tdep (void) -+{ -+ gdbarch_register_osabi (bfd_arch_aarch64, 0, GDB_OSABI_FREEBSD, -+ aarch64_fbsd_init_abi); -+} -diff --git gdb/aarch64-fbsd-tdep.h gdb/aarch64-fbsd-tdep.h -new file mode 100644 -index 0000000000..0f66dd3925 ---- /dev/null -+++ gdb/aarch64-fbsd-tdep.h -@@ -0,0 +1,33 @@ -+/* FreeBSD/aarch64 target support, prototypes. -+ -+ Copyright (C) 2017 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 . */ -+ -+#include "regset.h" -+ -+/* The general-purpose regset consists of 30 X registers, plus LR, SP, -+ ELR, and SPSR registers. SPSR is 32 bits but the structure is -+ passed to 64 bit alignment. */ -+#define AARCH64_FBSD_SIZEOF_GREGSET (34 * X_REGISTER_SIZE) -+ -+/* The fp regset consists of 32 V registers, plus FPSR and FPCR which -+ are 4 bytes wide each, and the whole structure is padded to 128 bit -+ alignment. */ -+#define AARCH64_FBSD_SIZEOF_FPREGSET (33 * V_REGISTER_SIZE) -+ -+extern const struct regset aarch64_fbsd_gregset; -+extern const struct regset aarch64_fbsd_fpregset; -diff --git gdb/config/aarch64/fbsd.mh gdb/config/aarch64/fbsd.mh -new file mode 100644 -index 0000000000..4171987bc9 ---- /dev/null -+++ gdb/config/aarch64/fbsd.mh -@@ -0,0 +1,23 @@ -+# Host: Freebsd/aarch64 -+# -+# Copyright (C) 2017 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 . -+ -+NATDEPFILES= inf-ptrace.o fork-child.o aarch64-fbsd-nat.o fbsd-nat.o -+HAVE_NATIVE_GCORE_HOST = 1 -+ -+LOADLIBES= -lkvm -diff --git gdb/configure.host gdb/configure.host -index d74fd04934..304675f137 100644 ---- gdb/configure.host -+++ gdb/configure.host -@@ -84,6 +84,7 @@ case "${host}" in - *-*-darwin*) gdb_host=darwin ;; - - aarch64*-*-linux*) gdb_host=linux ;; -+aarch64*-*-freebsd*) gdb_host=fbsd ;; - - alpha*-*-linux*) gdb_host=alpha-linux ;; - alpha*-*-netbsd* | alpha*-*-knetbsd*-gnu) -diff --git gdb/configure.tgt gdb/configure.tgt -index fdcb7b1d69..f72a0dbbc1 100644 ---- gdb/configure.tgt -+++ gdb/configure.tgt -@@ -44,6 +44,11 @@ aarch64*-*-elf | aarch64*-*-rtems*) - gdb_target_obs="aarch64-tdep.o aarch64-newlib-tdep.o aarch64-insn.o" - ;; - -+aarch64*-*-freebsd*) -+ # Target: FreeBSD/aarch64 -+ gdb_target_obs="aarch64-tdep.o aarch64-fbsd-tdep.o aarch64-insn.o" -+ ;; -+ - aarch64*-*-linux*) - # Target: AArch64 linux - gdb_target_obs="aarch64-tdep.o aarch64-linux-tdep.o aarch64-insn.o \ Index: head/devel/gdb/files/patch-armfbsd =================================================================== --- head/devel/gdb/files/patch-armfbsd +++ head/devel/gdb/files/patch-armfbsd @@ -1,512 +0,0 @@ -diff --git gdb/arm-fbsd-nat.c gdb/arm-fbsd-nat.c -new file mode 100644 -index 0000000000..b1c5c360f8 ---- /dev/null -+++ gdb/arm-fbsd-nat.c -@@ -0,0 +1,151 @@ -+/* Native-dependent code for FreeBSD/arm. -+ -+ Copyright (C) 2017 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 . */ -+ -+#include "defs.h" -+#include "target.h" -+ -+#include -+#include -+#include -+ -+#include "fbsd-nat.h" -+#include "arm-tdep.h" -+#include "arm-fbsd-tdep.h" -+#include "inf-ptrace.h" -+ -+/* Determine if PT_GETREGS fetches REGNUM. */ -+ -+static bool -+getregs_supplies (struct gdbarch *gdbarch, int regnum) -+{ -+ return ((regnum >= ARM_A1_REGNUM && regnum <= ARM_PC_REGNUM) -+ || regnum == ARM_PS_REGNUM); -+} -+ -+#ifdef PT_GETVFPREGS -+/* Determine if PT_GETVFPREGS fetches REGNUM. */ -+ -+static bool -+getvfpregs_supplies (struct gdbarch *gdbarch, int regnum) -+{ -+ return ((regnum >= ARM_D0_REGNUM && regnum <= ARM_D31_REGNUM) -+ || regnum == ARM_FPSCR_REGNUM); -+} -+#endif -+ -+/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this -+ for all registers. */ -+ -+static void -+arm_fbsd_fetch_inferior_registers (struct target_ops *ops, -+ struct regcache *regcache, int regnum) -+{ -+ pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache)); -+ -+ struct gdbarch *gdbarch = get_regcache_arch (regcache); -+ if (regnum == -1 || getregs_supplies (gdbarch, regnum)) -+ { -+ struct reg regs; -+ -+ if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) -+ perror_with_name (_("Couldn't get registers")); -+ -+ regcache_supply_regset (&arm_fbsd_gregset, regcache, regnum, ®s, -+ sizeof (regs)); -+ } -+ -+#ifdef PT_GETVFPREGS -+ if (regnum == -1 || getvfpregs_supplies (gdbarch, regnum)) -+ { -+ struct vfpreg vfpregs; -+ -+ if (ptrace (PT_GETVFPREGS, pid, (PTRACE_TYPE_ARG3) &vfpregs, 0) == -1) -+ perror_with_name (_("Couldn't get floating point status")); -+ -+ regcache_supply_regset (&arm_fbsd_vfpregset, regcache, regnum, &vfpregs, -+ sizeof (vfpregs)); -+ } -+#endif -+} -+ -+/* Store register REGNUM back into the inferior. If REGNUM is -1, do -+ this for all registers. */ -+ -+static void -+arm_fbsd_store_inferior_registers (struct target_ops *ops, -+ struct regcache *regcache, int regnum) -+{ -+ pid_t pid = get_ptrace_pid (regcache_get_ptid (regcache)); -+ -+ struct gdbarch *gdbarch = get_regcache_arch (regcache); -+ if (regnum == -1 || getregs_supplies (gdbarch, regnum)) -+ { -+ struct reg regs; -+ -+ if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) -+ perror_with_name (_("Couldn't get registers")); -+ -+ regcache_collect_regset (&arm_fbsd_gregset, regcache, regnum, ®s, -+ sizeof (regs)); -+ -+ if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) -+ perror_with_name (_("Couldn't write registers")); -+ } -+ -+#ifdef PT_GETVFPREGS -+ if (regnum == -1 || getvfpregs_supplies (gdbarch, regnum)) -+ { -+ struct vfpreg vfpregs; -+ -+ if (ptrace (PT_GETVFPREGS, pid, (PTRACE_TYPE_ARG3) &vfpregs, 0) == -1) -+ perror_with_name (_("Couldn't get floating point status")); -+ -+ regcache_collect_regset (&arm_fbsd_vfpregset, regcache, regnum, &vfpregs, -+ sizeof (vfpregs)); -+ -+ if (ptrace (PT_SETVFPREGS, pid, (PTRACE_TYPE_ARG3) &vfpregs, 0) == -1) -+ perror_with_name (_("Couldn't write floating point status")); -+ } -+#endif -+} -+ -+/* Implement the to_read_description method. */ -+ -+static const struct target_desc * -+arm_fbsd_read_description (struct target_ops *ops) -+{ -+ const struct target_desc *desc; -+ -+ desc = arm_fbsd_read_description_auxv (ops); -+ if (desc == NULL) -+ desc = ops->beneath->to_read_description (ops->beneath); -+ return desc; -+} -+ -+void -+_initialize_arm_fbsd_nat (void) -+{ -+ struct target_ops *t; -+ -+ t = inf_ptrace_target (); -+ t->to_fetch_registers = arm_fbsd_fetch_inferior_registers; -+ t->to_store_registers = arm_fbsd_store_inferior_registers; -+ t->to_read_description = arm_fbsd_read_description; -+ fbsd_nat_add_target (t); -+} -diff --git gdb/arm-fbsd-tdep.c gdb/arm-fbsd-tdep.c -new file mode 100644 -index 0000000000..02697b3de8 ---- /dev/null -+++ gdb/arm-fbsd-tdep.c -@@ -0,0 +1,260 @@ -+/* Target-dependent code for FreeBSD/arm. -+ -+ Copyright (C) 2017 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 . */ -+ -+#include "defs.h" -+ -+#include "elf/common.h" -+#include "arm-tdep.h" -+#include "arm-fbsd-tdep.h" -+#include "auxv.h" -+#include "fbsd-tdep.h" -+#include "osabi.h" -+#include "solib-svr4.h" -+#include "target.h" -+#include "trad-frame.h" -+#include "tramp-frame.h" -+ -+/* In a signal frame, sp points to a 'struct sigframe' which is -+ defined as: -+ -+ struct sigframe { -+ siginfo_t sf_si; -+ ucontext_t sf_uc; -+ mcontext_vfp_t sf_vfp; -+ }; -+ -+ ucontext_t is defined as: -+ -+ struct __ucontext { -+ sigset_t uc_sigmask; -+ mcontext_t uc_mcontext; -+ ... -+ }; -+ -+ mcontext_t is defined as: -+ -+ struct { -+ unsigned int __gregs[17]; -+ size_t mc_vfp_size; -+ void *mc_vfp_ptr; -+ ... -+ }; -+ -+ mcontext_vfp_t is defined as: -+ -+ struct { -+ uint64_t mcv_reg[32]; -+ uint32_t mcv_fpscr; -+ }; -+ -+ If the VFP state is valid, then mc_vfp_ptr will point to sf_vfp in -+ the sigframe, otherwise it is NULL. There is no non-VFP floating -+ point register state saved in the signal frame. */ -+ -+#define ARM_MCONTEXT_REG_SIZE 4 -+#define ARM_MCONTEXT_VFP_REG_SIZE 8 -+#define ARM_SIGFRAME_UCONTEXT_OFFSET 64 -+#define ARM_UCONTEXT_MCONTEXT_OFFSET 16 -+#define ARM_MCONTEXT_VFP_PTR_OFFSET 72 -+ -+/* Implement the "init" method of struct tramp_frame. */ -+ -+static void -+arm_fbsd_sigframe_init (const struct tramp_frame *self, -+ struct frame_info *this_frame, -+ struct trad_frame_cache *this_cache, -+ CORE_ADDR func) -+{ -+ struct gdbarch *gdbarch = get_frame_arch (this_frame); -+ enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); -+ CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM); -+ CORE_ADDR mcontext_addr = -+ sp -+ + ARM_SIGFRAME_UCONTEXT_OFFSET -+ + ARM_UCONTEXT_MCONTEXT_OFFSET; -+ CORE_ADDR mcontext_vfp_addr; -+ gdb_byte buf[4]; -+ int i; -+ -+ for (i = 0; i < 16; i++) -+ { -+ trad_frame_set_reg_addr (this_cache, -+ ARM_A1_REGNUM + i, -+ mcontext_addr + i * ARM_MCONTEXT_REG_SIZE); -+ } -+ trad_frame_set_reg_addr (this_cache, ARM_PS_REGNUM, -+ mcontext_addr + 16 * ARM_MCONTEXT_REG_SIZE); -+ -+ mcontext_vfp_addr = 0; -+ if (target_read_memory (mcontext_addr + ARM_MCONTEXT_VFP_PTR_OFFSET, buf, -+ 4) == 0) -+ mcontext_vfp_addr = extract_unsigned_integer (buf, 4, byte_order); -+ if (mcontext_vfp_addr != 0) -+ { -+ for (i = 0; i < 32; i++) -+ { -+ trad_frame_set_reg_addr (this_cache, ARM_D0_REGNUM + i, -+ mcontext_vfp_addr -+ + i * ARM_MCONTEXT_VFP_REG_SIZE); -+ } -+ trad_frame_set_reg_addr (this_cache, ARM_FPSCR_REGNUM, -+ mcontext_vfp_addr -+ + 32 * ARM_MCONTEXT_VFP_REG_SIZE); -+ } -+ -+ trad_frame_set_id (this_cache, frame_id_build (sp, func)); -+} -+ -+static const struct tramp_frame arm_fbsd_sigframe = -+{ -+ SIGTRAMP_FRAME, -+ 4, -+ { -+ {0xe1a0000d, -1}, /* mov r0, sp */ -+ {0xe2800040, -1}, /* add r0, r0, #SIGF_UC */ -+ {0xe59f700c, -1}, /* ldr r7, [pc, #12] */ -+ {0xef0001a1, -1}, /* swi SYS_sigreturn */ -+ {TRAMP_SENTINEL_INSN, -1} -+ }, -+ arm_fbsd_sigframe_init -+}; -+ -+/* Register maps. */ -+ -+static const struct regcache_map_entry arm_fbsd_gregmap[] = -+ { -+ { 13, ARM_A1_REGNUM, 4 }, /* r0 ... r12 */ -+ { 1, ARM_SP_REGNUM, 4 }, -+ { 1, ARM_LR_REGNUM, 4 }, -+ { 1, ARM_PC_REGNUM, 4 }, -+ { 1, ARM_PS_REGNUM, 4 }, -+ { 0 } -+ }; -+ -+static const struct regcache_map_entry arm_fbsd_vfpregmap[] = -+ { -+ { 32, ARM_D0_REGNUM, 8 }, /* d0 ... d31 */ -+ { 1, ARM_FPSCR_REGNUM, 4 }, -+ { 0 } -+ }; -+ -+/* Register set definitions. */ -+ -+const struct regset arm_fbsd_gregset = -+ { -+ arm_fbsd_gregmap, -+ regcache_supply_regset, regcache_collect_regset -+ }; -+ -+const struct regset arm_fbsd_vfpregset = -+ { -+ arm_fbsd_vfpregmap, -+ regcache_supply_regset, regcache_collect_regset -+ }; -+ -+/* Implement the "regset_from_core_section" gdbarch method. */ -+ -+static void -+arm_fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch, -+ iterate_over_regset_sections_cb *cb, -+ void *cb_data, -+ const struct regcache *regcache) -+{ -+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -+ -+ cb (".reg", ARM_FBSD_SIZEOF_GREGSET, &arm_fbsd_gregset, NULL, cb_data); -+ -+ /* While FreeBSD/arm cores do contain a NT_FPREGSET / ".reg2" -+ register set, it is not populated with register values by the -+ kernel but just contains all zeroes. */ -+ if (tdep->vfp_register_count > 0) -+ cb (".reg-arm-vfp", ARM_FBSD_SIZEOF_VFPREGSET, &arm_fbsd_vfpregset, -+ "VFP floating-point", cb_data); -+} -+ -+/* Lookup a target description from a target's AT_HWCAP auxiliary -+ vector. */ -+ -+const struct target_desc * -+arm_fbsd_read_description_auxv (struct target_ops *target) -+{ -+ CORE_ADDR arm_hwcap = 0; -+ -+ if (target_auxv_search (target, AT_FREEBSD_HWCAP, &arm_hwcap) != 1) -+ return NULL; -+ -+ if (arm_hwcap & HWCAP_VFP) -+ { -+ if (arm_hwcap & HWCAP_NEON) -+ return tdesc_arm_with_neon; -+ else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPD32)) -+ == (HWCAP_VFPv3 | HWCAP_VFPD32)) -+ return tdesc_arm_with_vfpv3; -+ else -+ return tdesc_arm_with_vfpv2; -+ } -+ -+ return NULL; -+} -+ -+/* Implement the "core_read_description" gdbarch method. */ -+ -+static const struct target_desc * -+arm_fbsd_core_read_description (struct gdbarch *gdbarch, -+ struct target_ops *target, -+ bfd *abfd) -+{ -+ return arm_fbsd_read_description_auxv (target); -+} -+ -+/* Implement the 'init_osabi' method of struct gdb_osabi_handler. */ -+ -+static void -+arm_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) -+{ -+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -+ -+ /* Generic FreeBSD support. */ -+ fbsd_init_abi (info, gdbarch); -+ -+ if (tdep->fp_model == ARM_FLOAT_AUTO) -+ tdep->fp_model = ARM_FLOAT_SOFT_VFP; -+ -+ tramp_frame_prepend_unwinder (gdbarch, &arm_fbsd_sigframe); -+ -+ set_solib_svr4_fetch_link_map_offsets -+ (gdbarch, svr4_ilp32_fetch_link_map_offsets); -+ -+ tdep->jb_pc = 24; -+ tdep->jb_elt_size = 4; -+ -+ set_gdbarch_iterate_over_regset_sections -+ (gdbarch, arm_fbsd_iterate_over_regset_sections); -+ set_gdbarch_core_read_description (gdbarch, arm_fbsd_core_read_description); -+ -+ /* Single stepping. */ -+ set_gdbarch_software_single_step (gdbarch, arm_software_single_step); -+} -+ -+void -+_initialize_arm_fbsd_tdep (void) -+{ -+ gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_FREEBSD, -+ arm_fbsd_init_abi); -+} -diff --git gdb/arm-fbsd-tdep.h gdb/arm-fbsd-tdep.h -new file mode 100644 -index 0000000000..8717b804af ---- /dev/null -+++ gdb/arm-fbsd-tdep.h -@@ -0,0 +1,40 @@ -+/* FreeBSD/arm target support, prototypes. -+ -+ Copyright (C) 2017 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 . */ -+ -+#include "regset.h" -+ -+/* The general-purpose regset consists of 13 R registers, plus SP, LR, -+ PC, and CPSR registers. */ -+#define ARM_FBSD_SIZEOF_GREGSET (17 * 4) -+ -+/* The VFP regset consists of 32 D registers plus FPSCR, and the whole -+ structure is padded to 64-bit alignment. */ -+#define ARM_FBSD_SIZEOF_VFPREGSET (33 * 8) -+ -+extern const struct regset arm_fbsd_gregset; -+extern const struct regset arm_fbsd_vfpregset; -+ -+/* Flags passed in AT_HWCAP. */ -+#define HWCAP_VFP 0x00000040 -+#define HWCAP_NEON 0x00001000 -+#define HWCAP_VFPv3 0x00002000 -+#define HWCAP_VFPD32 0x00080000 -+ -+extern const struct target_desc * -+arm_fbsd_read_description_auxv (struct target_ops *target); ---- /dev/null -+++ gdb/config/arm/fbsd.mh -@@ -0,0 +1,3 @@ -+# Host: FreeBSD/arm -+NATDEPFILES= arm-fbsd-nat.o fbsd-nat.o fork-child.o inf-ptrace.o -+HAVE_NATIVE_GCORE_HOST = 1 -diff --git gdb/configure.tgt gdb/configure.tgt -index 122a72608f..06957c111d 100644 ---- gdb/configure.tgt -+++ gdb/configure.tgt -@@ -110,6 +110,11 @@ arm*-*-linux*) - solib-svr4.o symfile-mem.o linux-tdep.o linux-record.o" - build_gdbserver=yes - ;; -+arm*-*-freebsd*) -+ # Target: FreeBSD/arm -+ gdb_target_obs="arm.o arm-get-next-pcs.o arm-tdep.o arm-fbsd-tdep.o \ -+ fbsd-tdep.o solib-svr4.o" -+ ;; - arm*-*-netbsd* | arm*-*-knetbsd*-gnu) - # Target: NetBSD/arm - gdb_target_obs="arm.o arm-get-next-pcs.o arm-tdep.o arm-nbsd-tdep.o \ -diff --git gdb/Makefile.in gdb/Makefile.in -index 9454e3a62f..c9bd60a2d8 100644 ---- gdb/Makefile.in -+++ gdb/Makefile.in -@@ -794,6 +794,7 @@ ALL_TARGET_OBS = \ - arc-tdep.o \ - arm.o \ - arm-bsd-tdep.o \ -+ arm-fbsd-tdep.o \ - arm-get-next-pcs.o \ - arm-linux.o \ - arm-linux-tdep.o \ -@@ -2537,6 +2538,8 @@ ALLDEPFILES = \ - arc-tdep.c \ - arm.c \ - arm-bsd-tdep.c \ -+ arm-fbsd-nat.c \ -+ arm-fbsd-tdep.c \ - arm-get-next-pcs.c \ - arm-linux.c \ - arm-linux-nat.c \ Index: head/devel/gdb/files/patch-gdb_configure =================================================================== --- head/devel/gdb/files/patch-gdb_configure +++ head/devel/gdb/files/patch-gdb_configure @@ -1,6 +1,6 @@ --- gdb/configure.orig 2017-09-14 09:28:17 UTC +++ gdb/configure -@@ -15103,12 +15103,10 @@ if test "${ERROR_ON_WARNING}" = yes ; then +@@ -15292,13 +15292,10 @@ if test "${ERROR_ON_WARNING}" = yes ; then WERROR_CFLAGS="-Werror" fi @@ -10,9 +10,10 @@ --Wno-unused -Wunused-value -Wunused-function \ --Wno-switch -Wno-char-subscripts \ --Wempty-body -Wunused-but-set-parameter -Wunused-but-set-variable \ ---Wno-sign-compare -Wno-narrowing" +--Wno-sign-compare -Wno-narrowing -Wno-error=maybe-uninitialized \ +--Wno-mismatched-tags" +-Wno-unused -Wno-switch -Wno-char-subscripts \ +-Wempty-body -Wno-sign-compare -Wno-narrowing -Wno-mismatched-tags" - # Enable -Wno-format by default when using gcc on mingw since many - # GCC versions complain about %I64. + case "${host}" in + *-*-mingw32*) Index: head/devel/gdb/files/patch-gdb_configure.host =================================================================== --- head/devel/gdb/files/patch-gdb_configure.host +++ head/devel/gdb/files/patch-gdb_configure.host @@ -1,10 +0,0 @@ ---- gdb/configure.host.orig 2017-09-14 09:28:17 UTC -+++ gdb/configure.host -@@ -90,6 +90,7 @@ alpha*-*-netbsd* | alpha*-*-knetbsd*-gnu) - gdb_host=nbsd ;; - alpha*-*-openbsd*) gdb_host=nbsd ;; - -+arm*-*-freebsd*) gdb_host=fbsd ;; - arm*-*-linux*) gdb_host=linux ;; - arm*-*-netbsdelf* | arm*-*-knetbsd*-gnu) - gdb_host=nbsdelf ;; Index: head/devel/gdb/files/patch-nowarning =================================================================== --- head/devel/gdb/files/patch-nowarning +++ head/devel/gdb/files/patch-nowarning @@ -1,65 +0,0 @@ ---- gdb/arm-tdep.c.orig 2016-07-08 15:42:17 UTC -+++ gdb/arm-tdep.c -@@ -9880,7 +9880,7 @@ - && !INSN_RECORDED(arm_insn_r)) - { - /* Handle MLA(S) and MUL(S). */ -- if (0 <= insn_op1 && 3 >= insn_op1) -+ if (3 >= insn_op1) - { - record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15); - record_buf[1] = ARM_PS_REGNUM; ---- gdb/cris-tdep.c.orig 2016-07-08 15:45:26.575379589 +0200 -+++ gdb/cris-tdep.c 2016-07-08 15:47:07.849372792 +0200 -@@ -1441,7 +1441,7 @@ - /* Indeterminate/obsolete. */ - return 0; - case cris_ver_v0_3: -- return (version >= 0 && version <= 3); -+ return (version <= 3); - case cris_ver_v3p: - return (version >= 3); - case cris_ver_v8: -@@ -1449,7 +1449,7 @@ - case cris_ver_v8p: - return (version >= 8); - case cris_ver_v0_10: -- return (version >= 0 && version <= 10); -+ return (version <= 10); - case cris_ver_v3_10: - return (version >= 3 && version <= 10); - case cris_ver_v8_10: ---- gdb/main.c.orig 2016-08-03 17:55:42.243017327 +0200 -+++ gdb/main.c 2016-08-03 17:56:04.478015630 +0200 -@@ -226,7 +226,7 @@ - { - /* Append the part of SYSTEM_GDBINIT that follows GDB_DATADIR - to gdb_datadir. */ -- char *tmp_sys_gdbinit = xstrdup (SYSTEM_GDBINIT + datadir_len); -+ char *tmp_sys_gdbinit = xstrdup (&(SYSTEM_GDBINIT[datadir_len])); - char *p; - - for (p = tmp_sys_gdbinit; IS_DIR_SEPARATOR (*p); ++p) ---- gdb/dtrace-probe.c.orig 2016-08-03 17:57:18.454010903 +0200 -+++ gdb/dtrace-probe.c 2016-08-03 17:58:01.001007519 +0200 -@@ -421,7 +421,8 @@ - arg.type_str = xstrdup (p); - - /* Use strtab_size as a sentinel. */ -- while (*p++ != '\0' && p - strtab < strtab_size); -+ while (*p++ != '\0' && p - strtab < strtab_size) -+ ; - - /* Try to parse a type expression from the type string. If - this does not work then we set the type to `long ---- libiberty/stack-limit.c.orig 2016-08-05 14:12:21.942893014 +0200 -+++ libiberty/stack-limit.c 2016-08-05 14:12:58.794890125 +0200 -@@ -51,7 +51,7 @@ - struct rlimit rlim; - if (getrlimit (RLIMIT_STACK, &rlim) == 0 - && rlim.rlim_cur != RLIM_INFINITY -- && rlim.rlim_cur < pref -+ && rlim.rlim_cur < (rlim_t)pref - && (rlim.rlim_max == RLIM_INFINITY || rlim.rlim_cur < rlim.rlim_max)) - { - rlim.rlim_cur = pref;