Page MenuHomeFreeBSD

D38759.diff
No OneTemporary

D38759.diff

diff --git a/devel/gdb/Makefile b/devel/gdb/Makefile
--- a/devel/gdb/Makefile
+++ b/devel/gdb/Makefile
@@ -1,6 +1,5 @@
PORTNAME= gdb
-DISTVERSION= 12.1
-PORTREVISION= 3
+DISTVERSION= 13.1
CATEGORIES= devel
MASTER_SITES= GNU
@@ -12,7 +11,8 @@
LICENSE_FILE= ${WRKSRC}/COPYING3
LIB_DEPENDS= libgmp.so:math/gmp \
- libmpfr.so:math/mpfr
+ libmpfr.so:math/mpfr \
+ libzstd.so:archivers/zstd
TEST_DEPENDS= runtest:misc/dejagnu
USES= compiler:c++11-lang cpe gmake libtool makeinfo pkgconfig tar:xz
@@ -33,35 +33,7 @@
CFLAGS+= -DRL_NO_COMPAT
EXCLUDE= dejagnu expect sim texinfo intl
EXTRACT_AFTER_ARGS= ${EXCLUDE:S/^/--exclude /}
-EXTRA_PATCHES= ${FILESDIR}/commit-711b0b6698f \
- ${FILESDIR}/commit-922c2fc18e4 \
- ${FILESDIR}/commit-b1babce7c31 \
- ${FILESDIR}/commit-a49ce729c80 \
- ${FILESDIR}/commit-c77282d8ba9 \
- ${FILESDIR}/commit-041a4212d37 \
- ${FILESDIR}/commit-4bd817e71ee \
- ${FILESDIR}/commit-1570c37c340 \
- ${FILESDIR}/commit-6719bc690e2 \
- ${FILESDIR}/commit-983b1119bc3 \
- ${FILESDIR}/commit-a3627b54280 \
- ${FILESDIR}/commit-065a00b3a46 \
- ${FILESDIR}/commit-e330d4c033e \
- ${FILESDIR}/commit-a171378aa47 \
- ${FILESDIR}/commit-b5c2367c3ac \
- ${FILESDIR}/commit-f3215e1526d \
- ${FILESDIR}/commit-c13566fdd57 \
- ${FILESDIR}/commit-3181aed81c9 \
- ${FILESDIR}/commit-8e6afe4013f \
- ${FILESDIR}/commit-40c23d88038 \
- ${FILESDIR}/commit-92d48a1e4ea \
- ${FILESDIR}/commit-099fbce0acc \
- ${FILESDIR}/commit-2e686a74dc4 \
- ${FILESDIR}/commit-684943d213b \
- ${FILESDIR}/commit-414d5848bb2 \
- ${FILESDIR}/commit-0a765c1a8e9 \
- ${FILESDIR}/commit-f9fbb7636a5 \
- ${FILESDIR}/commit-b7fe5463cf0 \
- ${FILESDIR}/commit-b2fdd31b03e
+EXTRA_PATCHES= ${FILESDIR}/commit-a980a7d24b9
VER= ${DISTVERSION:S/.//g}
PLIST_SUB= VER=${VER}
diff --git a/devel/gdb/distinfo b/devel/gdb/distinfo
--- a/devel/gdb/distinfo
+++ b/devel/gdb/distinfo
@@ -1,5 +1,5 @@
-TIMESTAMP = 1651512279
-SHA256 (gdb-12.1.tar.xz) = 0e1793bf8f2b54d53f46dea84ccfd446f48f81b297b28c4f7fc017b818d69fed
-SIZE (gdb-12.1.tar.xz) = 22470332
+TIMESTAMP = 1677188925
+SHA256 (gdb-13.1.tar.xz) = 115ad5c18d69a6be2ab15882d365dda2a2211c14f480b3502c6eba576e2e95a0
+SIZE (gdb-13.1.tar.xz) = 23665472
SHA256 (bsdjhb-libcxx-gdbpy-03d0d9b_GH0.tar.gz) = 2c1563f361d4fb59b54b1b39bff5cdf609d73962758eb05a8cdfe2c22551b259
SIZE (bsdjhb-libcxx-gdbpy-03d0d9b_GH0.tar.gz) = 6052
diff --git a/devel/gdb/files/commit-041a4212d37 b/devel/gdb/files/commit-041a4212d37
deleted file mode 100644
--- a/devel/gdb/files/commit-041a4212d37
+++ /dev/null
@@ -1,97 +0,0 @@
-commit 7d06796cbc1e5f5a9ca03a5214934a849bd519b1
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Mar 22 12:05:43 2022 -0700
-
- x86-fbsd-nat: Copy debug register state on fork.
-
- Use the FreeBSD native target low_new_fork hook to copy the
- per-process debug state from the parent to the child on fork.
-
- (cherry picked from commit 041a4212d37de6172b3428613c9f9f52ab950c6c)
-
-diff --git a/gdb/configure.nat b/gdb/configure.nat
-index b45519fd116..92ad4a6522b 100644
---- gdb/configure.nat
-+++ gdb/configure.nat
-@@ -165,7 +165,7 @@ case ${gdb_host} in
- i386)
- # Host: FreeBSD/i386
- NATDEPFILES="${NATDEPFILES} x86-nat.o nat/x86-dregs.o \
-- x86-bsd-nat.o i386-fbsd-nat.o bsd-kvm.o"
-+ x86-bsd-nat.o x86-fbsd-nat.o i386-fbsd-nat.o bsd-kvm.o"
- ;;
- mips)
- # Host: FreeBSD/mips
-@@ -194,7 +194,7 @@ case ${gdb_host} in
- # Host: FreeBSD/amd64
- NATDEPFILES="${NATDEPFILES} amd64-nat.o \
- amd64-fbsd-nat.o bsd-kvm.o x86-nat.o nat/x86-dregs.o \
-- x86-bsd-nat.o"
-+ x86-bsd-nat.o x86-fbsd-nat.o"
- ;;
- esac
- ;;
-diff --git a/gdb/x86-fbsd-nat.c b/gdb/x86-fbsd-nat.c
-new file mode 100644
-index 00000000000..ad8c693b68e
---- /dev/null
-+++ gdb/x86-fbsd-nat.c
-@@ -0,0 +1,45 @@
-+/* Native-dependent code for FreeBSD x86.
-+
-+ Copyright (C) 2022 Free Software Foundation, Inc.
-+
-+ This file is part of GDB.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 3 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
-+
-+#include "defs.h"
-+#include "x86-fbsd-nat.h"
-+
-+/* Implement the virtual fbsd_nat_target::low_new_fork method. */
-+
-+void
-+x86_fbsd_nat_target::low_new_fork (ptid_t parent, pid_t child)
-+{
-+ struct x86_debug_reg_state *parent_state, *child_state;
-+
-+ /* If there is no parent state, no watchpoints nor breakpoints have
-+ been set, so there is nothing to do. */
-+ parent_state = x86_lookup_debug_reg_state (parent.pid ());
-+ if (parent_state == nullptr)
-+ return;
-+
-+ /* The kernel clears debug registers in the new child process after
-+ fork, but GDB core assumes the child inherits the watchpoints/hw
-+ breakpoints of the parent, and will remove them all from the
-+ forked off process. Copy the debug registers mirrors into the
-+ new process so that all breakpoints and watchpoints can be
-+ removed together. */
-+
-+ child_state = x86_debug_reg_state (child);
-+ *child_state = *parent_state;
-+}
-diff --git a/gdb/x86-fbsd-nat.h b/gdb/x86-fbsd-nat.h
-index f9d3514aab4..cdb8cd36a4c 100644
---- gdb/x86-fbsd-nat.h
-+++ gdb/x86-fbsd-nat.h
-@@ -29,6 +29,8 @@ class x86_fbsd_nat_target : public x86bsd_nat_target<fbsd_nat_target>
- {
- bool supports_stopped_by_hw_breakpoint () override
- { return true; }
-+
-+ void low_new_fork (ptid_t parent, pid_t child) override;
- };
-
- #endif /* x86-bsd-nat.h */
diff --git a/devel/gdb/files/commit-065a00b3a46 b/devel/gdb/files/commit-065a00b3a46
deleted file mode 100644
--- a/devel/gdb/files/commit-065a00b3a46
+++ /dev/null
@@ -1,338 +0,0 @@
-commit 194342a42538301d9ef47d4be6efd74ddfb8fac2
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Mar 22 12:05:43 2022 -0700
-
- Add support for hardware breakpoints/watchpoints on FreeBSD/Aarch64.
-
- This shares aarch64-nat.c and nat/aarch64-hw-point.c with the Linux
- native target. Since FreeBSD writes all of the debug registers in one
- ptrace op, use an unordered_set<> to track the "dirty" state for
- threads rather than bitmasks of modified registers.
-
- (cherry picked from commit 065a00b3a461463cca766ac6bb33e3be436397bd)
-
-diff --git a/gdb/NEWS b/gdb/NEWS
-index 501ace1872e..0320bf8ea1e 100644
---- gdb/NEWS
-+++ gdb/NEWS
-@@ -3,6 +3,8 @@
-
- *** Changes in GDB 12
-
-+* GDB now supports hardware watchpoints on FreeBSD/Aarch64.
-+
- * DBX mode is deprecated, and will be removed in GDB 13
-
- * GDB 12 is the last release of GDB that will support building against
-diff --git a/gdb/aarch64-fbsd-nat.c b/gdb/aarch64-fbsd-nat.c
-index e6ca1196139..99e2bf35276 100644
---- gdb/aarch64-fbsd-nat.c
-+++ gdb/aarch64-fbsd-nat.c
-@@ -18,24 +18,60 @@
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
-
- #include "defs.h"
-+#include "arch-utils.h"
-+#include "inferior.h"
- #include "regcache.h"
- #include "target.h"
-+#include "nat/aarch64-hw-point.h"
-
--#include <sys/types.h>
-+#include <sys/param.h>
- #include <sys/ptrace.h>
-+#include <machine/armreg.h>
- #include <machine/reg.h>
-
- #include "fbsd-nat.h"
- #include "aarch64-fbsd-tdep.h"
-+#include "aarch64-nat.h"
- #include "inf-ptrace.h"
-
-+#if __FreeBSD_version >= 1400005
-+#define HAVE_DBREG
-+
-+#include <unordered_set>
-+#endif
-+
-+#ifdef HAVE_DBREG
-+struct aarch64_fbsd_nat_target final
-+ : public aarch64_nat_target<fbsd_nat_target>
-+#else
- struct aarch64_fbsd_nat_target final : public fbsd_nat_target
-+#endif
- {
- void fetch_registers (struct regcache *, int) override;
- void store_registers (struct regcache *, int) override;
-+
-+#ifdef HAVE_DBREG
-+ /* Hardware breakpoints and watchpoints. */
-+ bool stopped_by_watchpoint () override;
-+ bool stopped_data_address (CORE_ADDR *) override;
-+ bool stopped_by_hw_breakpoint () override;
-+ bool supports_stopped_by_hw_breakpoint () override;
-+
-+ void post_startup_inferior (ptid_t) override;
-+ void post_attach (int pid) override;
-+
-+ void low_new_fork (ptid_t parent, pid_t child) override;
-+ void low_delete_thread (thread_info *) override;
-+ void low_prepare_to_resume (thread_info *) override;
-+
-+private:
-+ void probe_debug_regs (int pid);
-+ static bool debug_regs_probed;
-+#endif
- };
-
- static aarch64_fbsd_nat_target the_aarch64_fbsd_nat_target;
-+bool aarch64_fbsd_nat_target::debug_regs_probed;
-
- /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
- for all registers. */
-@@ -63,9 +99,231 @@ aarch64_fbsd_nat_target::store_registers (struct regcache *regcache,
- PT_SETFPREGS, &aarch64_fbsd_fpregset);
- }
-
-+#ifdef HAVE_DBREG
-+/* Set of threads which need to update debug registers on next resume. */
-+
-+static std::unordered_set<lwpid_t> aarch64_debug_pending_threads;
-+
-+/* Implement the "stopped_data_address" target_ops method. */
-+
-+bool
-+aarch64_fbsd_nat_target::stopped_data_address (CORE_ADDR *addr_p)
-+{
-+ siginfo_t siginfo;
-+ struct aarch64_debug_reg_state *state;
-+
-+ if (!fbsd_nat_get_siginfo (inferior_ptid, &siginfo))
-+ return false;
-+
-+ /* This must be a hardware breakpoint. */
-+ if (siginfo.si_signo != SIGTRAP
-+ || siginfo.si_code != TRAP_TRACE
-+ || siginfo.si_trapno != EXCP_WATCHPT_EL0)
-+ return false;
-+
-+ const CORE_ADDR addr_trap = (CORE_ADDR) siginfo.si_addr;
-+
-+ /* Check if the address matches any watched address. */
-+ state = aarch64_get_debug_reg_state (inferior_ptid.pid ());
-+ return aarch64_stopped_data_address (state, addr_trap, addr_p);
-+}
-+
-+/* Implement the "stopped_by_watchpoint" target_ops method. */
-+
-+bool
-+aarch64_fbsd_nat_target::stopped_by_watchpoint ()
-+{
-+ CORE_ADDR addr;
-+
-+ return stopped_data_address (&addr);
-+}
-+
-+/* Implement the "stopped_by_hw_breakpoint" target_ops method. */
-+
-+bool
-+aarch64_fbsd_nat_target::stopped_by_hw_breakpoint ()
-+{
-+ siginfo_t siginfo;
-+ struct aarch64_debug_reg_state *state;
-+
-+ if (!fbsd_nat_get_siginfo (inferior_ptid, &siginfo))
-+ return false;
-+
-+ /* This must be a hardware breakpoint. */
-+ if (siginfo.si_signo != SIGTRAP
-+ || siginfo.si_code != TRAP_TRACE
-+ || siginfo.si_trapno != EXCP_WATCHPT_EL0)
-+ return false;
-+
-+ return !stopped_by_watchpoint();
-+}
-+
-+/* Implement the "supports_stopped_by_hw_breakpoint" target_ops method. */
-+
-+bool
-+aarch64_fbsd_nat_target::supports_stopped_by_hw_breakpoint ()
-+{
-+ return true;
-+}
-+
-+/* Fetch the hardware debug register capability information. */
-+
-+void
-+aarch64_fbsd_nat_target::probe_debug_regs (int pid)
-+{
-+ if (!debug_regs_probed)
-+ {
-+ struct dbreg reg;
-+
-+ debug_regs_probed = true;
-+ aarch64_num_bp_regs = 0;
-+ aarch64_num_wp_regs = 0;
-+
-+ if (ptrace(PT_GETDBREGS, pid, (PTRACE_TYPE_ARG3) &reg, 0) == 0)
-+ {
-+ switch (reg.db_debug_ver)
-+ {
-+ case AARCH64_DEBUG_ARCH_V8:
-+ case AARCH64_DEBUG_ARCH_V8_1:
-+ case AARCH64_DEBUG_ARCH_V8_2:
-+ case AARCH64_DEBUG_ARCH_V8_4:
-+ break;
-+ default:
-+ return;
-+ }
-+
-+ aarch64_num_bp_regs = reg.db_nbkpts;
-+ if (aarch64_num_bp_regs > AARCH64_HBP_MAX_NUM)
-+ {
-+ warning (_("Unexpected number of hardware breakpoint registers"
-+ " reported by ptrace, got %d, expected %d."),
-+ aarch64_num_bp_regs, AARCH64_HBP_MAX_NUM);
-+ aarch64_num_bp_regs = AARCH64_HBP_MAX_NUM;
-+ }
-+ aarch64_num_wp_regs = reg.db_nwtpts;
-+ if (aarch64_num_wp_regs > AARCH64_HWP_MAX_NUM)
-+ {
-+ warning (_("Unexpected number of hardware watchpoint registers"
-+ " reported by ptrace, got %d, expected %d."),
-+ aarch64_num_wp_regs, AARCH64_HWP_MAX_NUM);
-+ aarch64_num_wp_regs = AARCH64_HWP_MAX_NUM;
-+ }
-+ }
-+ }
-+}
-+
-+/* Implement the virtual inf_ptrace_target::post_startup_inferior method. */
-+
-+void
-+aarch64_fbsd_nat_target::post_startup_inferior (ptid_t ptid)
-+{
-+ aarch64_remove_debug_reg_state (ptid.pid ());
-+ probe_debug_regs (ptid.pid ());
-+ fbsd_nat_target::post_startup_inferior (ptid);
-+}
-+
-+/* Implement the "post_attach" target_ops method. */
-+
-+void
-+aarch64_fbsd_nat_target::post_attach (int pid)
-+{
-+ aarch64_remove_debug_reg_state (pid);
-+ probe_debug_regs (pid);
-+ fbsd_nat_target::post_attach (pid);
-+}
-+
-+/* Implement the virtual fbsd_nat_target::low_new_fork method. */
-+
-+void
-+aarch64_fbsd_nat_target::low_new_fork (ptid_t parent, pid_t child)
-+{
-+ struct aarch64_debug_reg_state *parent_state, *child_state;
-+
-+ /* If there is no parent state, no watchpoints nor breakpoints have
-+ been set, so there is nothing to do. */
-+ parent_state = aarch64_lookup_debug_reg_state (parent.pid ());
-+ if (parent_state == nullptr)
-+ return;
-+
-+ /* The kernel clears debug registers in the new child process after
-+ fork, but GDB core assumes the child inherits the watchpoints/hw
-+ breakpoints of the parent, and will remove them all from the
-+ forked off process. Copy the debug registers mirrors into the
-+ new process so that all breakpoints and watchpoints can be
-+ removed together. */
-+
-+ child_state = aarch64_get_debug_reg_state (child);
-+ *child_state = *parent_state;
-+}
-+
-+/* Mark debug register state "dirty" for all threads belonging to the
-+ current inferior. */
-+
-+void
-+aarch64_notify_debug_reg_change (ptid_t ptid,
-+ int is_watchpoint, unsigned int idx)
-+{
-+ for (thread_info *tp : current_inferior ()->non_exited_threads ())
-+ {
-+ if (tp->ptid.lwp_p ())
-+ aarch64_debug_pending_threads.emplace (tp->ptid.lwp ());
-+ }
-+}
-+
-+/* Implement the virtual fbsd_nat_target::low_delete_thread method. */
-+
-+void
-+aarch64_fbsd_nat_target::low_delete_thread (thread_info *tp)
-+{
-+ gdb_assert(tp->ptid.lwp_p ());
-+ aarch64_debug_pending_threads.erase (tp->ptid.lwp ());
-+}
-+
-+/* Implement the virtual fbsd_nat_target::low_prepare_to_resume method. */
-+
-+void
-+aarch64_fbsd_nat_target::low_prepare_to_resume (thread_info *tp)
-+{
-+ gdb_assert(tp->ptid.lwp_p ());
-+
-+ if (aarch64_debug_pending_threads.erase (tp->ptid.lwp ()) == 0)
-+ return;
-+
-+ struct aarch64_debug_reg_state *state =
-+ aarch64_lookup_debug_reg_state (tp->ptid.pid ());
-+ gdb_assert(state != nullptr);
-+
-+ struct dbreg reg;
-+ memset (&reg, 0, sizeof(reg));
-+ for (int i = 0; i < aarch64_num_bp_regs; i++)
-+ {
-+ reg.db_breakregs[i].dbr_addr = state->dr_addr_bp[i];
-+ reg.db_breakregs[i].dbr_ctrl = state->dr_ctrl_bp[i];
-+ }
-+ for (int i = 0; i < aarch64_num_wp_regs; i++)
-+ {
-+ reg.db_watchregs[i].dbw_addr = state->dr_addr_wp[i];
-+ reg.db_watchregs[i].dbw_ctrl = state->dr_ctrl_wp[i];
-+ }
-+ if (ptrace(PT_SETDBREGS, tp->ptid.lwp (), (PTRACE_TYPE_ARG3) &reg, 0) != 0)
-+ error (_("Failed to set hardware debug registers"));
-+}
-+#else
-+/* A stub that should never be called. */
-+void
-+aarch64_notify_debug_reg_change (ptid_t ptid,
-+ int is_watchpoint, unsigned int idx)
-+{
-+ gdb_assert (true);
-+}
-+#endif
-+
- void _initialize_aarch64_fbsd_nat ();
- void
- _initialize_aarch64_fbsd_nat ()
- {
-+#ifdef HAVE_DBREG
-+ aarch64_initialize_hw_point ();
-+#endif
- add_inf_child_target (&the_aarch64_fbsd_nat_target);
- }
-diff --git a/gdb/configure.nat b/gdb/configure.nat
-index 4f5850dd595..d219d6a960c 100644
---- gdb/configure.nat
-+++ gdb/configure.nat
-@@ -154,7 +154,8 @@ case ${gdb_host} in
- case ${gdb_host_cpu} in
- aarch64)
- # Host: FreeBSD/aarch64
-- NATDEPFILES="${NATDEPFILES} aarch64-fbsd-nat.o"
-+ NATDEPFILES="${NATDEPFILES} aarch64-nat.o \
-+ nat/aarch64-hw-point.o aarch64-fbsd-nat.o"
- LOADLIBES=
- ;;
- arm)
diff --git a/devel/gdb/files/commit-099fbce0acc b/devel/gdb/files/commit-099fbce0acc
deleted file mode 100644
--- a/devel/gdb/files/commit-099fbce0acc
+++ /dev/null
@@ -1,114 +0,0 @@
-commit 82d5c31c4fe5bb67386dc568893dc23c899ff303
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue May 3 16:05:10 2022 -0700
-
- Read the tpidruro register from NT_ARM_TLS core dump notes on FreeBSD/arm.
-
- (cherry picked from commit 099fbce0accf209677e041fd9dc10bcb4a5eb578)
-
-diff --git gdb/arm-fbsd-nat.c gdb/arm-fbsd-nat.c
-index 3106d73cc3a..c32924de735 100644
---- gdb/arm-fbsd-nat.c
-+++ gdb/arm-fbsd-nat.c
-@@ -72,7 +72,7 @@ arm_fbsd_nat_target::read_description ()
- {
- const struct target_desc *desc;
-
-- desc = arm_fbsd_read_description_auxv (this);
-+ desc = arm_fbsd_read_description_auxv (this, false);
- if (desc == NULL)
- desc = this->beneath ()->read_description ();
- return desc;
-diff --git gdb/arm-fbsd-tdep.c gdb/arm-fbsd-tdep.c
-index 06745a36186..a27dfb2fb4a 100644
---- gdb/arm-fbsd-tdep.c
-+++ gdb/arm-fbsd-tdep.c
-@@ -163,6 +163,24 @@ arm_fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
- cb (".reg", ARM_FBSD_SIZEOF_GREGSET, ARM_FBSD_SIZEOF_GREGSET,
- &arm_fbsd_gregset, NULL, cb_data);
-
-+ if (tdep->tls_regnum > 0)
-+ {
-+ const struct regcache_map_entry arm_fbsd_tlsregmap[] =
-+ {
-+ { 1, tdep->tls_regnum, 4 },
-+ { 0 }
-+ };
-+
-+ const struct regset arm_fbsd_tlsregset =
-+ {
-+ arm_fbsd_tlsregmap,
-+ regcache_supply_regset, regcache_collect_regset
-+ };
-+
-+ cb (".reg-aarch-tls", ARM_FBSD_SIZEOF_TLSREGSET, ARM_FBSD_SIZEOF_TLSREGSET,
-+ &arm_fbsd_tlsregset, 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. */
-@@ -175,12 +193,12 @@ arm_fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
- vector. */
-
- const struct target_desc *
--arm_fbsd_read_description_auxv (struct target_ops *target)
-+arm_fbsd_read_description_auxv (struct target_ops *target, bool tls)
- {
- CORE_ADDR arm_hwcap = 0;
-
- if (target_auxv_search (target, AT_FREEBSD_HWCAP, &arm_hwcap) != 1)
-- return nullptr;
-+ return arm_read_description (ARM_FP_TYPE_NONE, tls);
-
- if (arm_hwcap & HWCAP_VFP)
- {
-@@ -188,12 +206,12 @@ arm_fbsd_read_description_auxv (struct target_ops *target)
- return aarch32_read_description ();
- else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPD32))
- == (HWCAP_VFPv3 | HWCAP_VFPD32))
-- return arm_read_description (ARM_FP_TYPE_VFPV3, false);
-+ return arm_read_description (ARM_FP_TYPE_VFPV3, tls);
- else
-- return arm_read_description (ARM_FP_TYPE_VFPV2, false);
-+ return arm_read_description (ARM_FP_TYPE_VFPV2, tls);
- }
-
-- return nullptr;
-+ return arm_read_description (ARM_FP_TYPE_NONE, tls);
- }
-
- /* Implement the "core_read_description" gdbarch method. */
-@@ -203,7 +221,9 @@ arm_fbsd_core_read_description (struct gdbarch *gdbarch,
- struct target_ops *target,
- bfd *abfd)
- {
-- return arm_fbsd_read_description_auxv (target);
-+ asection *tls = bfd_get_section_by_name (abfd, ".reg-aarch-tls");
-+
-+ return arm_fbsd_read_description_auxv (target, tls != nullptr);
- }
-
- /* Implement the 'init_osabi' method of struct gdb_osabi_handler. */
-diff --git gdb/arm-fbsd-tdep.h gdb/arm-fbsd-tdep.h
-index 633dafad75d..193eb76df3c 100644
---- gdb/arm-fbsd-tdep.h
-+++ gdb/arm-fbsd-tdep.h
-@@ -26,6 +26,9 @@
- PC, and CPSR registers. */
- #define ARM_FBSD_SIZEOF_GREGSET (17 * 4)
-
-+/* The TLS regset consists of a single register. */
-+#define ARM_FBSD_SIZEOF_TLSREGSET (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)
-@@ -40,6 +43,6 @@ extern const struct regset arm_fbsd_vfpregset;
- #define HWCAP_VFPD32 0x00080000
-
- extern const struct target_desc *
--arm_fbsd_read_description_auxv (struct target_ops *target);
-+arm_fbsd_read_description_auxv (struct target_ops *target, bool tls);
-
- #endif /* ARM_FBSD_TDEP_H */
diff --git a/devel/gdb/files/commit-0a765c1a8e9 b/devel/gdb/files/commit-0a765c1a8e9
deleted file mode 100644
--- a/devel/gdb/files/commit-0a765c1a8e9
+++ /dev/null
@@ -1,78 +0,0 @@
-commit 25dc6de9343ae320e37a6b9daaf5c5fc398debae
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue May 3 16:05:10 2022 -0700
-
- Read the tpidr register from NT_ARM_TLS core dump notes on FreeBSD/Aarch64.
-
- (cherry picked from commit 0a765c1a8e9c59f4cd0cdaf986291f957fe6ee90)
-
-diff --git gdb/aarch64-fbsd-tdep.c gdb/aarch64-fbsd-tdep.c
-index 32f441892a8..ed1b84387f0 100644
---- gdb/aarch64-fbsd-tdep.c
-+++ gdb/aarch64-fbsd-tdep.c
-@@ -142,10 +142,42 @@ aarch64_fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
- void *cb_data,
- const struct regcache *regcache)
- {
-+ aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
-+
- cb (".reg", AARCH64_FBSD_SIZEOF_GREGSET, AARCH64_FBSD_SIZEOF_GREGSET,
- &aarch64_fbsd_gregset, NULL, cb_data);
- cb (".reg2", AARCH64_FBSD_SIZEOF_FPREGSET, AARCH64_FBSD_SIZEOF_FPREGSET,
- &aarch64_fbsd_fpregset, NULL, cb_data);
-+
-+ if (tdep->has_tls ())
-+ {
-+ const struct regcache_map_entry aarch64_fbsd_tls_regmap[] =
-+ {
-+ { 1, tdep->tls_regnum, 8 },
-+ { 0 }
-+ };
-+
-+ const struct regset aarch64_fbsd_tls_regset =
-+ {
-+ aarch64_fbsd_tls_regmap,
-+ regcache_supply_regset, regcache_collect_regset
-+ };
-+
-+ cb (".reg-aarch-tls", AARCH64_FBSD_SIZEOF_TLSREGSET,
-+ AARCH64_FBSD_SIZEOF_TLSREGSET, &aarch64_fbsd_tls_regset,
-+ "TLS register", cb_data);
-+ }
-+}
-+
-+/* Implement the "core_read_description" gdbarch method. */
-+
-+static const struct target_desc *
-+aarch64_fbsd_core_read_description (struct gdbarch *gdbarch,
-+ struct target_ops *target, bfd *abfd)
-+{
-+ asection *tls = bfd_get_section_by_name (abfd, ".reg-aarch-tls");
-+
-+ return aarch64_read_description (0, false, false, tls != nullptr);
- }
-
- /* Implement the 'init_osabi' method of struct gdb_osabi_handler. */
-@@ -168,6 +200,8 @@ aarch64_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
-
- set_gdbarch_iterate_over_regset_sections
- (gdbarch, aarch64_fbsd_iterate_over_regset_sections);
-+ set_gdbarch_core_read_description (gdbarch,
-+ aarch64_fbsd_core_read_description);
- }
-
- void _initialize_aarch64_fbsd_tdep ();
-diff --git gdb/aarch64-fbsd-tdep.h gdb/aarch64-fbsd-tdep.h
-index fc8fbee8843..7419ea6be03 100644
---- gdb/aarch64-fbsd-tdep.h
-+++ gdb/aarch64-fbsd-tdep.h
-@@ -32,6 +32,9 @@
- alignment. */
- #define AARCH64_FBSD_SIZEOF_FPREGSET (33 * V_REGISTER_SIZE)
-
-+/* The TLS regset consists of a single register. */
-+#define AARCH64_FBSD_SIZEOF_TLSREGSET (X_REGISTER_SIZE)
-+
- extern const struct regset aarch64_fbsd_gregset;
- extern const struct regset aarch64_fbsd_fpregset;
-
diff --git a/devel/gdb/files/commit-1570c37c340 b/devel/gdb/files/commit-1570c37c340
deleted file mode 100644
--- a/devel/gdb/files/commit-1570c37c340
+++ /dev/null
@@ -1,892 +0,0 @@
-commit ae520e967e0ccde249b47b7cea1c557299afd7ab
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Mar 22 12:05:43 2022 -0700
-
- aarch64: Add an aarch64_nat_target mixin class.
-
- This class includes platform-independent target methods for hardware
- breakpoints and watchpoints using routines from
- nat/aarch64-hw-point.c.
-
- stopped_data_address is not platform-independent since the FAR
- register holding the address for a breakpoint hit must be fetched in a
- platform-specific manner. However, aarch64_stopped_data_address is
- provided as a helper routine which performs platform-independent
- validation given the value of the FAR register.
-
- For tracking the per-process debug register mirror state, use an
- unordered_map indexed by pid as recently adopted in x86-nat.c rather
- than a manual linked-list.
-
- (cherry picked from commit 1570c37c340bb9df2db2c30b437d6c30e1d75459)
-
-diff --git gdb/aarch64-linux-nat.c gdb/aarch64-linux-nat.c
-index dd072d9315e..7bb82d17cc8 100644
---- gdb/aarch64-linux-nat.c
-+++ gdb/aarch64-linux-nat.c
-@@ -27,6 +27,7 @@
- #include "target-descriptions.h"
- #include "auxv.h"
- #include "gdbcmd.h"
-+#include "aarch64-nat.h"
- #include "aarch64-tdep.h"
- #include "aarch64-linux-tdep.h"
- #include "aarch32-linux-nat.h"
-@@ -58,7 +59,8 @@
- #define TRAP_HWBKPT 0x0004
- #endif
-
--class aarch64_linux_nat_target final : public linux_nat_target
-+class aarch64_linux_nat_target final
-+ : public aarch64_nat_target<linux_nat_target>
- {
- public:
- /* Add our register access methods. */
-@@ -68,17 +70,8 @@ class aarch64_linux_nat_target final : public linux_nat_target
- const struct target_desc *read_description () override;
-
- /* Add our hardware breakpoint and watchpoint implementation. */
-- int can_use_hw_breakpoint (enum bptype, int, int) override;
-- int insert_hw_breakpoint (struct gdbarch *, struct bp_target_info *) override;
-- int remove_hw_breakpoint (struct gdbarch *, struct bp_target_info *) override;
-- int region_ok_for_hw_watchpoint (CORE_ADDR, int) override;
-- int insert_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
-- struct expression *) override;
-- int remove_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
-- struct expression *) override;
- bool stopped_by_watchpoint () override;
- bool stopped_data_address (CORE_ADDR *) override;
-- bool watchpoint_addr_within_range (CORE_ADDR, CORE_ADDR, int) override;
-
- int can_do_single_step () override;
-
-@@ -118,103 +111,13 @@ class aarch64_linux_nat_target final : public linux_nat_target
-
- static aarch64_linux_nat_target the_aarch64_linux_nat_target;
-
--/* Per-process data. We don't bind this to a per-inferior registry
-- because of targets like x86 GNU/Linux that need to keep track of
-- processes that aren't bound to any inferior (e.g., fork children,
-- checkpoints). */
--
--struct aarch64_process_info
--{
-- /* Linked list. */
-- struct aarch64_process_info *next;
--
-- /* The process identifier. */
-- pid_t pid;
--
-- /* Copy of aarch64 hardware debug registers. */
-- struct aarch64_debug_reg_state state;
--};
--
--static struct aarch64_process_info *aarch64_process_list = NULL;
--
--/* Find process data for process PID. */
--
--static struct aarch64_process_info *
--aarch64_find_process_pid (pid_t pid)
--{
-- struct aarch64_process_info *proc;
--
-- for (proc = aarch64_process_list; proc; proc = proc->next)
-- if (proc->pid == pid)
-- return proc;
--
-- return NULL;
--}
--
--/* Add process data for process PID. Returns newly allocated info
-- object. */
--
--static struct aarch64_process_info *
--aarch64_add_process (pid_t pid)
--{
-- struct aarch64_process_info *proc;
--
-- proc = XCNEW (struct aarch64_process_info);
-- proc->pid = pid;
--
-- proc->next = aarch64_process_list;
-- aarch64_process_list = proc;
--
-- return proc;
--}
--
--/* Get data specific info for process PID, creating it if necessary.
-- Never returns NULL. */
--
--static struct aarch64_process_info *
--aarch64_process_info_get (pid_t pid)
--{
-- struct aarch64_process_info *proc;
--
-- proc = aarch64_find_process_pid (pid);
-- if (proc == NULL)
-- proc = aarch64_add_process (pid);
--
-- return proc;
--}
--
- /* Called whenever GDB is no longer debugging process PID. It deletes
- data structures that keep track of debug register state. */
-
- void
- aarch64_linux_nat_target::low_forget_process (pid_t pid)
- {
-- struct aarch64_process_info *proc, **proc_link;
--
-- proc = aarch64_process_list;
-- proc_link = &aarch64_process_list;
--
-- while (proc != NULL)
-- {
-- if (proc->pid == pid)
-- {
-- *proc_link = proc->next;
--
-- xfree (proc);
-- return;
-- }
--
-- proc_link = &proc->next;
-- proc = *proc_link;
-- }
--}
--
--/* Get debug registers state for process PID. */
--
--struct aarch64_debug_reg_state *
--aarch64_get_debug_reg_state (pid_t pid)
--{
-- return &aarch64_process_info_get (pid)->state;
-+ aarch64_remove_debug_reg_state (pid);
- }
-
- /* Fill GDB's register array with the general-purpose register values
-@@ -775,192 +678,12 @@ aarch64_linux_nat_target::low_siginfo_fixup (siginfo_t *native, gdb_byte *inf,
- return false;
- }
-
--/* Returns the number of hardware watchpoints of type TYPE that we can
-- set. Value is positive if we can set CNT watchpoints, zero if
-- setting watchpoints of type TYPE is not supported, and negative if
-- CNT is more than the maximum number of watchpoints of type TYPE
-- that we can support. TYPE is one of bp_hardware_watchpoint,
-- bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint.
-- CNT is the number of such watchpoints used so far (including this
-- one). OTHERTYPE is non-zero if other types of watchpoints are
-- currently enabled. */
--
--int
--aarch64_linux_nat_target::can_use_hw_breakpoint (enum bptype type,
-- int cnt, int othertype)
--{
-- if (type == bp_hardware_watchpoint || type == bp_read_watchpoint
-- || type == bp_access_watchpoint || type == bp_watchpoint)
-- {
-- if (aarch64_num_wp_regs == 0)
-- return 0;
-- }
-- else if (type == bp_hardware_breakpoint)
-- {
-- if (aarch64_num_bp_regs == 0)
-- return 0;
-- }
-- else
-- gdb_assert_not_reached ("unexpected breakpoint type");
--
-- /* We always return 1 here because we don't have enough information
-- about possible overlap of addresses that they want to watch. As an
-- extreme example, consider the case where all the watchpoints watch
-- the same address and the same region length: then we can handle a
-- virtually unlimited number of watchpoints, due to debug register
-- sharing implemented via reference counts. */
-- return 1;
--}
--
--/* Insert a hardware-assisted breakpoint at BP_TGT->reqstd_address.
-- Return 0 on success, -1 on failure. */
--
--int
--aarch64_linux_nat_target::insert_hw_breakpoint (struct gdbarch *gdbarch,
-- struct bp_target_info *bp_tgt)
--{
-- int ret;
-- CORE_ADDR addr = bp_tgt->placed_address = bp_tgt->reqstd_address;
-- int len;
-- const enum target_hw_bp_type type = hw_execute;
-- struct aarch64_debug_reg_state *state
-- = aarch64_get_debug_reg_state (inferior_ptid.pid ());
--
-- gdbarch_breakpoint_from_pc (gdbarch, &addr, &len);
--
-- if (show_debug_regs)
-- fprintf_unfiltered
-- (gdb_stdlog,
-- "insert_hw_breakpoint on entry (addr=0x%08lx, len=%d))\n",
-- (unsigned long) addr, len);
--
-- ret = aarch64_handle_breakpoint (type, addr, len, 1 /* is_insert */,
-- inferior_ptid, state);
--
-- if (show_debug_regs)
-- {
-- aarch64_show_debug_reg_state (state,
-- "insert_hw_breakpoint", addr, len, type);
-- }
--
-- return ret;
--}
--
--/* Remove a hardware-assisted breakpoint at BP_TGT->placed_address.
-- Return 0 on success, -1 on failure. */
--
--int
--aarch64_linux_nat_target::remove_hw_breakpoint (struct gdbarch *gdbarch,
-- struct bp_target_info *bp_tgt)
--{
-- int ret;
-- CORE_ADDR addr = bp_tgt->placed_address;
-- int len = 4;
-- const enum target_hw_bp_type type = hw_execute;
-- struct aarch64_debug_reg_state *state
-- = aarch64_get_debug_reg_state (inferior_ptid.pid ());
--
-- gdbarch_breakpoint_from_pc (gdbarch, &addr, &len);
--
-- if (show_debug_regs)
-- fprintf_unfiltered
-- (gdb_stdlog, "remove_hw_breakpoint on entry (addr=0x%08lx, len=%d))\n",
-- (unsigned long) addr, len);
--
-- ret = aarch64_handle_breakpoint (type, addr, len, 0 /* is_insert */,
-- inferior_ptid, state);
--
-- if (show_debug_regs)
-- {
-- aarch64_show_debug_reg_state (state,
-- "remove_hw_watchpoint", addr, len, type);
-- }
--
-- return ret;
--}
--
--/* Implement the "insert_watchpoint" target_ops method.
--
-- Insert a watchpoint to watch a memory region which starts at
-- address ADDR and whose length is LEN bytes. Watch memory accesses
-- of the type TYPE. Return 0 on success, -1 on failure. */
--
--int
--aarch64_linux_nat_target::insert_watchpoint (CORE_ADDR addr, int len,
-- enum target_hw_bp_type type,
-- struct expression *cond)
--{
-- int ret;
-- struct aarch64_debug_reg_state *state
-- = aarch64_get_debug_reg_state (inferior_ptid.pid ());
--
-- if (show_debug_regs)
-- fprintf_unfiltered (gdb_stdlog,
-- "insert_watchpoint on entry (addr=0x%08lx, len=%d)\n",
-- (unsigned long) addr, len);
--
-- gdb_assert (type != hw_execute);
--
-- ret = aarch64_handle_watchpoint (type, addr, len, 1 /* is_insert */,
-- inferior_ptid, state);
--
-- if (show_debug_regs)
-- {
-- aarch64_show_debug_reg_state (state,
-- "insert_watchpoint", addr, len, type);
-- }
--
-- return ret;
--}
--
--/* Implement the "remove_watchpoint" target_ops method.
-- Remove a watchpoint that watched the memory region which starts at
-- address ADDR, whose length is LEN bytes, and for accesses of the
-- type TYPE. Return 0 on success, -1 on failure. */
--
--int
--aarch64_linux_nat_target::remove_watchpoint (CORE_ADDR addr, int len,
-- enum target_hw_bp_type type,
-- struct expression *cond)
--{
-- int ret;
-- struct aarch64_debug_reg_state *state
-- = aarch64_get_debug_reg_state (inferior_ptid.pid ());
--
-- if (show_debug_regs)
-- fprintf_unfiltered (gdb_stdlog,
-- "remove_watchpoint on entry (addr=0x%08lx, len=%d)\n",
-- (unsigned long) addr, len);
--
-- gdb_assert (type != hw_execute);
--
-- ret = aarch64_handle_watchpoint (type, addr, len, 0 /* is_insert */,
-- inferior_ptid, state);
--
-- if (show_debug_regs)
-- {
-- aarch64_show_debug_reg_state (state,
-- "remove_watchpoint", addr, len, type);
-- }
--
-- return ret;
--}
--
--/* Implement the "region_ok_for_hw_watchpoint" target_ops method. */
--
--int
--aarch64_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
--{
-- return aarch64_region_ok_for_watchpoint (addr, len);
--}
--
- /* Implement the "stopped_data_address" target_ops method. */
-
- bool
- aarch64_linux_nat_target::stopped_data_address (CORE_ADDR *addr_p)
- {
- siginfo_t siginfo;
-- int i;
- struct aarch64_debug_reg_state *state;
-
- if (!linux_nat_get_siginfo (inferior_ptid, &siginfo))
-@@ -980,44 +703,7 @@ aarch64_linux_nat_target::stopped_data_address (CORE_ADDR *addr_p)
-
- /* Check if the address matches any watched address. */
- state = aarch64_get_debug_reg_state (inferior_ptid.pid ());
-- for (i = aarch64_num_wp_regs - 1; i >= 0; --i)
-- {
-- const unsigned int offset
-- = aarch64_watchpoint_offset (state->dr_ctrl_wp[i]);
-- const unsigned int len = aarch64_watchpoint_length (state->dr_ctrl_wp[i]);
-- const CORE_ADDR addr_watch = state->dr_addr_wp[i] + offset;
-- const CORE_ADDR addr_watch_aligned = align_down (state->dr_addr_wp[i], 8);
-- const CORE_ADDR addr_orig = state->dr_addr_orig_wp[i];
--
-- if (state->dr_ref_count_wp[i]
-- && DR_CONTROL_ENABLED (state->dr_ctrl_wp[i])
-- && addr_trap >= addr_watch_aligned
-- && addr_trap < addr_watch + len)
-- {
-- /* ADDR_TRAP reports the first address of the memory range
-- accessed by the CPU, regardless of what was the memory
-- range watched. Thus, a large CPU access that straddles
-- the ADDR_WATCH..ADDR_WATCH+LEN range may result in an
-- ADDR_TRAP that is lower than the
-- ADDR_WATCH..ADDR_WATCH+LEN range. E.g.:
--
-- addr: | 4 | 5 | 6 | 7 | 8 |
-- |---- range watched ----|
-- |----------- range accessed ------------|
--
-- In this case, ADDR_TRAP will be 4.
--
-- To match a watchpoint known to GDB core, we must never
-- report *ADDR_P outside of any ADDR_WATCH..ADDR_WATCH+LEN
-- range. ADDR_WATCH <= ADDR_TRAP < ADDR_ORIG is a false
-- positive on kernels older than 4.10. See PR
-- external/20207. */
-- *addr_p = addr_orig;
-- return true;
-- }
-- }
--
-- return false;
-+ return aarch64_stopped_data_address (state, addr_trap, addr_p);
- }
-
- /* Implement the "stopped_by_watchpoint" target_ops method. */
-@@ -1030,15 +716,6 @@ aarch64_linux_nat_target::stopped_by_watchpoint ()
- return stopped_data_address (&addr);
- }
-
--/* Implement the "watchpoint_addr_within_range" target_ops method. */
--
--bool
--aarch64_linux_nat_target::watchpoint_addr_within_range (CORE_ADDR addr,
-- CORE_ADDR start, int length)
--{
-- return start <= addr && start + length - 1 >= addr;
--}
--
- /* Implement the "can_do_single_step" target_ops method. */
-
- int
-@@ -1114,32 +791,11 @@ aarch64_linux_nat_target::store_memtags (CORE_ADDR address, size_t len,
- return false;
- }
-
--/* Define AArch64 maintenance commands. */
--
--static void
--add_show_debug_regs_command (void)
--{
-- /* A maintenance command to enable printing the internal DRi mirror
-- variables. */
-- add_setshow_boolean_cmd ("show-debug-regs", class_maintenance,
-- &show_debug_regs, _("\
--Set whether to show variables that mirror the AArch64 debug registers."), _("\
--Show whether to show variables that mirror the AArch64 debug registers."), _("\
--Use \"on\" to enable, \"off\" to disable.\n\
--If enabled, the debug registers values are shown when GDB inserts\n\
--or removes a hardware breakpoint or watchpoint, and when the inferior\n\
--triggers a breakpoint or watchpoint."),
-- NULL,
-- NULL,
-- &maintenance_set_cmdlist,
-- &maintenance_show_cmdlist);
--}
--
- void _initialize_aarch64_linux_nat ();
- void
- _initialize_aarch64_linux_nat ()
- {
-- add_show_debug_regs_command ();
-+ aarch64_initialize_hw_point ();
-
- /* Register the target. */
- linux_target = &the_aarch64_linux_nat_target;
-diff --git gdb/aarch64-nat.c gdb/aarch64-nat.c
-new file mode 100644
-index 00000000000..85cf7f2011a
---- /dev/null
-+++ gdb/aarch64-nat.c
-@@ -0,0 +1,302 @@
-+/* Native-dependent code for AArch64.
-+
-+ Copyright (C) 2011-2022 Free Software Foundation, Inc.
-+
-+ This file is part of GDB.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 3 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
-+
-+#include "defs.h"
-+#include "gdbarch.h"
-+#include "inferior.h"
-+#include "cli/cli-cmds.h"
-+#include "aarch64-nat.h"
-+
-+#include <unordered_map>
-+
-+/* Hash table storing per-process data. We don't bind this to a
-+ per-inferior registry because of targets like x86 GNU/Linux that
-+ need to keep track of processes that aren't bound to any inferior
-+ (e.g., fork children, checkpoints). */
-+
-+static std::unordered_map<pid_t, aarch64_debug_reg_state>
-+aarch64_debug_process_state;
-+
-+/* See aarch64-nat.h. */
-+
-+struct aarch64_debug_reg_state *
-+aarch64_lookup_debug_reg_state (pid_t pid)
-+{
-+ auto it = aarch64_debug_process_state.find (pid);
-+ if (it != aarch64_debug_process_state.end ())
-+ return &it->second;
-+
-+ return nullptr;
-+}
-+
-+/* See aarch64-nat.h. */
-+
-+struct aarch64_debug_reg_state *
-+aarch64_get_debug_reg_state (pid_t pid)
-+{
-+ return &aarch64_debug_process_state[pid];
-+}
-+
-+/* See aarch64-nat.h. */
-+
-+void
-+aarch64_remove_debug_reg_state (pid_t pid)
-+{
-+ aarch64_debug_process_state.erase (pid);
-+}
-+
-+/* Returns the number of hardware watchpoints of type TYPE that we can
-+ set. Value is positive if we can set CNT watchpoints, zero if
-+ setting watchpoints of type TYPE is not supported, and negative if
-+ CNT is more than the maximum number of watchpoints of type TYPE
-+ that we can support. TYPE is one of bp_hardware_watchpoint,
-+ bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint.
-+ CNT is the number of such watchpoints used so far (including this
-+ one). OTHERTYPE is non-zero if other types of watchpoints are
-+ currently enabled. */
-+
-+int
-+aarch64_can_use_hw_breakpoint (enum bptype type, int cnt, int othertype)
-+{
-+ if (type == bp_hardware_watchpoint || type == bp_read_watchpoint
-+ || type == bp_access_watchpoint || type == bp_watchpoint)
-+ {
-+ if (aarch64_num_wp_regs == 0)
-+ return 0;
-+ }
-+ else if (type == bp_hardware_breakpoint)
-+ {
-+ if (aarch64_num_bp_regs == 0)
-+ return 0;
-+ }
-+ else
-+ gdb_assert_not_reached ("unexpected breakpoint type");
-+
-+ /* We always return 1 here because we don't have enough information
-+ about possible overlap of addresses that they want to watch. As an
-+ extreme example, consider the case where all the watchpoints watch
-+ the same address and the same region length: then we can handle a
-+ virtually unlimited number of watchpoints, due to debug register
-+ sharing implemented via reference counts. */
-+ return 1;
-+}
-+
-+/* Insert a hardware-assisted breakpoint at BP_TGT->reqstd_address.
-+ Return 0 on success, -1 on failure. */
-+
-+int
-+aarch64_insert_hw_breakpoint (struct gdbarch *gdbarch,
-+ struct bp_target_info *bp_tgt)
-+{
-+ int ret;
-+ CORE_ADDR addr = bp_tgt->placed_address = bp_tgt->reqstd_address;
-+ int len;
-+ const enum target_hw_bp_type type = hw_execute;
-+ struct aarch64_debug_reg_state *state
-+ = aarch64_get_debug_reg_state (inferior_ptid.pid ());
-+
-+ gdbarch_breakpoint_from_pc (gdbarch, &addr, &len);
-+
-+ if (show_debug_regs)
-+ fprintf_unfiltered
-+ (gdb_stdlog,
-+ "insert_hw_breakpoint on entry (addr=0x%08lx, len=%d))\n",
-+ (unsigned long) addr, len);
-+
-+ ret = aarch64_handle_breakpoint (type, addr, len, 1 /* is_insert */,
-+ inferior_ptid, state);
-+
-+ if (show_debug_regs)
-+ {
-+ aarch64_show_debug_reg_state (state,
-+ "insert_hw_breakpoint", addr, len, type);
-+ }
-+
-+ return ret;
-+}
-+
-+/* Remove a hardware-assisted breakpoint at BP_TGT->placed_address.
-+ Return 0 on success, -1 on failure. */
-+
-+int
-+aarch64_remove_hw_breakpoint (struct gdbarch *gdbarch,
-+ struct bp_target_info *bp_tgt)
-+{
-+ int ret;
-+ CORE_ADDR addr = bp_tgt->placed_address;
-+ int len = 4;
-+ const enum target_hw_bp_type type = hw_execute;
-+ struct aarch64_debug_reg_state *state
-+ = aarch64_get_debug_reg_state (inferior_ptid.pid ());
-+
-+ gdbarch_breakpoint_from_pc (gdbarch, &addr, &len);
-+
-+ if (show_debug_regs)
-+ fprintf_unfiltered
-+ (gdb_stdlog, "remove_hw_breakpoint on entry (addr=0x%08lx, len=%d))\n",
-+ (unsigned long) addr, len);
-+
-+ ret = aarch64_handle_breakpoint (type, addr, len, 0 /* is_insert */,
-+ inferior_ptid, state);
-+
-+ if (show_debug_regs)
-+ {
-+ aarch64_show_debug_reg_state (state,
-+ "remove_hw_watchpoint", addr, len, type);
-+ }
-+
-+ return ret;
-+}
-+
-+/* Insert a watchpoint to watch a memory region which starts at
-+ address ADDR and whose length is LEN bytes. Watch memory accesses
-+ of the type TYPE. Return 0 on success, -1 on failure. */
-+
-+int
-+aarch64_insert_watchpoint (CORE_ADDR addr, int len, enum target_hw_bp_type type,
-+ struct expression *cond)
-+{
-+ int ret;
-+ struct aarch64_debug_reg_state *state
-+ = aarch64_get_debug_reg_state (inferior_ptid.pid ());
-+
-+ if (show_debug_regs)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "insert_watchpoint on entry (addr=0x%08lx, len=%d)\n",
-+ (unsigned long) addr, len);
-+
-+ gdb_assert (type != hw_execute);
-+
-+ ret = aarch64_handle_watchpoint (type, addr, len, 1 /* is_insert */,
-+ inferior_ptid, state);
-+
-+ if (show_debug_regs)
-+ {
-+ aarch64_show_debug_reg_state (state,
-+ "insert_watchpoint", addr, len, type);
-+ }
-+
-+ return ret;
-+}
-+
-+/* Remove a watchpoint that watched the memory region which starts at
-+ address ADDR, whose length is LEN bytes, and for accesses of the
-+ type TYPE. Return 0 on success, -1 on failure. */
-+
-+int
-+aarch64_remove_watchpoint (CORE_ADDR addr, int len, enum target_hw_bp_type type,
-+ struct expression *cond)
-+{
-+ int ret;
-+ struct aarch64_debug_reg_state *state
-+ = aarch64_get_debug_reg_state (inferior_ptid.pid ());
-+
-+ if (show_debug_regs)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "remove_watchpoint on entry (addr=0x%08lx, len=%d)\n",
-+ (unsigned long) addr, len);
-+
-+ gdb_assert (type != hw_execute);
-+
-+ ret = aarch64_handle_watchpoint (type, addr, len, 0 /* is_insert */,
-+ inferior_ptid, state);
-+
-+ if (show_debug_regs)
-+ {
-+ aarch64_show_debug_reg_state (state,
-+ "remove_watchpoint", addr, len, type);
-+ }
-+
-+ return ret;
-+}
-+
-+/* See aarch64-nat.h. */
-+
-+bool
-+aarch64_stopped_data_address (const struct aarch64_debug_reg_state *state,
-+ CORE_ADDR addr_trap, CORE_ADDR *addr_p)
-+{
-+ int i;
-+
-+ for (i = aarch64_num_wp_regs - 1; i >= 0; --i)
-+ {
-+ const unsigned int offset
-+ = aarch64_watchpoint_offset (state->dr_ctrl_wp[i]);
-+ const unsigned int len = aarch64_watchpoint_length (state->dr_ctrl_wp[i]);
-+ const CORE_ADDR addr_watch = state->dr_addr_wp[i] + offset;
-+ const CORE_ADDR addr_watch_aligned = align_down (state->dr_addr_wp[i], 8);
-+ const CORE_ADDR addr_orig = state->dr_addr_orig_wp[i];
-+
-+ if (state->dr_ref_count_wp[i]
-+ && DR_CONTROL_ENABLED (state->dr_ctrl_wp[i])
-+ && addr_trap >= addr_watch_aligned
-+ && addr_trap < addr_watch + len)
-+ {
-+ /* ADDR_TRAP reports the first address of the memory range
-+ accessed by the CPU, regardless of what was the memory
-+ range watched. Thus, a large CPU access that straddles
-+ the ADDR_WATCH..ADDR_WATCH+LEN range may result in an
-+ ADDR_TRAP that is lower than the
-+ ADDR_WATCH..ADDR_WATCH+LEN range. E.g.:
-+
-+ addr: | 4 | 5 | 6 | 7 | 8 |
-+ |---- range watched ----|
-+ |----------- range accessed ------------|
-+
-+ In this case, ADDR_TRAP will be 4.
-+
-+ To match a watchpoint known to GDB core, we must never
-+ report *ADDR_P outside of any ADDR_WATCH..ADDR_WATCH+LEN
-+ range. ADDR_WATCH <= ADDR_TRAP < ADDR_ORIG is a false
-+ positive on kernels older than 4.10. See PR
-+ external/20207. */
-+ *addr_p = addr_orig;
-+ return true;
-+ }
-+ }
-+
-+ return false;
-+}
-+
-+/* Define AArch64 maintenance commands. */
-+
-+static void
-+add_show_debug_regs_command (void)
-+{
-+ /* A maintenance command to enable printing the internal DRi mirror
-+ variables. */
-+ add_setshow_boolean_cmd ("show-debug-regs", class_maintenance,
-+ &show_debug_regs, _("\
-+Set whether to show variables that mirror the AArch64 debug registers."), _("\
-+Show whether to show variables that mirror the AArch64 debug registers."), _("\
-+Use \"on\" to enable, \"off\" to disable.\n\
-+If enabled, the debug registers values are shown when GDB inserts\n\
-+or removes a hardware breakpoint or watchpoint, and when the inferior\n\
-+triggers a breakpoint or watchpoint."),
-+ NULL,
-+ NULL,
-+ &maintenance_set_cmdlist,
-+ &maintenance_show_cmdlist);
-+}
-+
-+void
-+aarch64_initialize_hw_point ()
-+{
-+ add_show_debug_regs_command ();
-+}
-diff --git gdb/aarch64-nat.h gdb/aarch64-nat.h
-new file mode 100644
-index 00000000000..56e720f02ee
---- /dev/null
-+++ gdb/aarch64-nat.h
-@@ -0,0 +1,109 @@
-+/* Native-dependent code for AArch64.
-+
-+ Copyright (C) 2011-2022 Free Software Foundation, Inc.
-+
-+ This file is part of GDB.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 3 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
-+
-+#ifndef AARCH64_NAT_H
-+#define AARCH64_NAT_H
-+
-+#include "breakpoint.h"
-+#include "nat/aarch64-hw-point.h"
-+#include "target.h"
-+
-+/* Hardware-assisted breakpoints and watchpoints. */
-+
-+/* Initialize platform-independent state for hardware-assisted
-+ breakpoints and watchpoints. */
-+
-+void aarch64_initialize_hw_point ();
-+
-+/* Return the debug register state for process PID. If no existing
-+ state is found for this process, return nullptr. */
-+
-+struct aarch64_debug_reg_state *aarch64_lookup_debug_reg_state (pid_t pid);
-+
-+/* Return the debug register state for process PID. If no existing
-+ state is found for this process, create new state. */
-+
-+struct aarch64_debug_reg_state *aarch64_get_debug_reg_state (pid_t pid);
-+
-+/* Remove any existing per-process debug state for process PID. */
-+
-+void aarch64_remove_debug_reg_state (pid_t pid);
-+
-+/* Helper for the "stopped_data_address" target method. Returns TRUE
-+ if a hardware watchpoint trap at ADDR_TRAP matches a set
-+ watchpoint. The address of the matched watchpoint is returned in
-+ *ADDR_P. */
-+
-+bool aarch64_stopped_data_address (const struct aarch64_debug_reg_state *state,
-+ CORE_ADDR addr_trap, CORE_ADDR *addr_p);
-+
-+/* Helper functions used by aarch64_nat_target below. See their
-+ definitions. */
-+
-+int aarch64_can_use_hw_breakpoint (enum bptype type, int cnt, int othertype);
-+int aarch64_insert_watchpoint (CORE_ADDR addr, int len,
-+ enum target_hw_bp_type type,
-+ struct expression *cond);
-+int aarch64_remove_watchpoint (CORE_ADDR addr, int len,
-+ enum target_hw_bp_type type,
-+ struct expression *cond);
-+int aarch64_insert_hw_breakpoint (struct gdbarch *gdbarch,
-+ struct bp_target_info *bp_tgt);
-+int aarch64_remove_hw_breakpoint (struct gdbarch *gdbarch,
-+ struct bp_target_info *bp_tgt);
-+int aarch64_stopped_by_hw_breakpoint ();
-+
-+/* Convenience template mixin used to add aarch64 watchpoints support to a
-+ target. */
-+
-+template <typename BaseTarget>
-+struct aarch64_nat_target : public BaseTarget
-+{
-+ /* Hook in common aarch64 hardware watchpoints/breakpoints support. */
-+
-+ int can_use_hw_breakpoint (enum bptype type, int cnt, int othertype) override
-+ { return aarch64_can_use_hw_breakpoint (type, cnt, othertype); }
-+
-+ int region_ok_for_hw_watchpoint (CORE_ADDR addr, int len) override
-+ { return aarch64_region_ok_for_watchpoint (addr, len); }
-+
-+ int insert_watchpoint (CORE_ADDR addr, int len,
-+ enum target_hw_bp_type type,
-+ struct expression *cond) override
-+ { return aarch64_insert_watchpoint (addr, len, type, cond); }
-+
-+ int remove_watchpoint (CORE_ADDR addr, int len,
-+ enum target_hw_bp_type type,
-+ struct expression *cond) override
-+ { return aarch64_remove_watchpoint (addr, len, type, cond); }
-+
-+ int insert_hw_breakpoint (struct gdbarch *gdbarch,
-+ struct bp_target_info *bp_tgt) override
-+ { return aarch64_insert_hw_breakpoint (gdbarch, bp_tgt); }
-+
-+ int remove_hw_breakpoint (struct gdbarch *gdbarch,
-+ struct bp_target_info *bp_tgt) override
-+ { return aarch64_remove_hw_breakpoint (gdbarch, bp_tgt); }
-+
-+ bool watchpoint_addr_within_range (CORE_ADDR addr, CORE_ADDR start,
-+ int length) override
-+ { return start <= addr && start + length - 1 >= addr; }
-+};
-+
-+#endif /* AARCH64_NAT_H */
-diff --git gdb/configure.nat gdb/configure.nat
-index ad6d35babc2..4f5850dd595 100644
---- gdb/configure.nat
-+++ gdb/configure.nat
-@@ -233,7 +233,7 @@ case ${gdb_host} in
- case ${gdb_host_cpu} in
- aarch64)
- # Host: AArch64 based machine running GNU/Linux
-- NATDEPFILES="${NATDEPFILES} aarch64-linux-nat.o \
-+ NATDEPFILES="${NATDEPFILES} aarch64-nat.o aarch64-linux-nat.o \
- aarch32-linux-nat.o nat/aarch64-hw-point.o \
- nat/aarch64-linux-hw-point.o \
- nat/aarch64-linux.o \
diff --git a/devel/gdb/files/commit-2e686a74dc4 b/devel/gdb/files/commit-2e686a74dc4
deleted file mode 100644
--- a/devel/gdb/files/commit-2e686a74dc4
+++ /dev/null
@@ -1,68 +0,0 @@
-commit a2915c914b21b07ab7916da71fc69297168d6878
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue May 3 16:05:10 2022 -0700
-
- Support TLS variables on FreeBSD/arm.
-
- Derive the pointer to the DTV array from the tpidruro register.
-
- (cherry picked from commit 2e686a74dc4782caeef75f76174909ab7ad358f8)
-
-diff --git gdb/arm-fbsd-tdep.c gdb/arm-fbsd-tdep.c
-index a27dfb2fb4a..483820c1092 100644
---- gdb/arm-fbsd-tdep.c
-+++ gdb/arm-fbsd-tdep.c
-@@ -27,6 +27,7 @@
- #include "auxv.h"
- #include "fbsd-tdep.h"
- #include "gdbcore.h"
-+#include "inferior.h"
- #include "osabi.h"
- #include "solib-svr4.h"
- #include "trad-frame.h"
-@@ -226,6 +227,30 @@ arm_fbsd_core_read_description (struct gdbarch *gdbarch,
- return arm_fbsd_read_description_auxv (target, tls != nullptr);
- }
-
-+/* Implement the get_thread_local_address gdbarch method. */
-+
-+static CORE_ADDR
-+arm_fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
-+ CORE_ADDR lm_addr, CORE_ADDR offset)
-+{
-+ arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
-+ struct regcache *regcache;
-+
-+ regcache = get_thread_arch_regcache (current_inferior ()->process_target (),
-+ ptid, gdbarch);
-+
-+ target_fetch_registers (regcache, tdep->tls_regnum);
-+
-+ ULONGEST tpidruro;
-+ if (regcache->cooked_read (tdep->tls_regnum, &tpidruro) != REG_VALID)
-+ error (_("Unable to fetch %%tpidruro"));
-+
-+ /* %tpidruro points to the TCB whose first member is the dtv
-+ pointer. */
-+ CORE_ADDR dtv_addr = tpidruro;
-+ return fbsd_get_thread_local_address (gdbarch, dtv_addr, lm_addr, offset);
-+}
-+
- /* Implement the 'init_osabi' method of struct gdb_osabi_handler. */
-
- static void
-@@ -251,6 +276,14 @@ arm_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
- (gdbarch, arm_fbsd_iterate_over_regset_sections);
- set_gdbarch_core_read_description (gdbarch, arm_fbsd_core_read_description);
-
-+ if (tdep->tls_regnum > 0)
-+ {
-+ set_gdbarch_fetch_tls_load_module_address (gdbarch,
-+ svr4_fetch_objfile_link_map);
-+ set_gdbarch_get_thread_local_address (gdbarch,
-+ arm_fbsd_get_thread_local_address);
-+ }
-+
- /* Single stepping. */
- set_gdbarch_software_single_step (gdbarch, arm_software_single_step);
- }
diff --git a/devel/gdb/files/commit-3181aed81c9 b/devel/gdb/files/commit-3181aed81c9
deleted file mode 100644
--- a/devel/gdb/files/commit-3181aed81c9
+++ /dev/null
@@ -1,20 +0,0 @@
-commit e5cfae026a00128719b409beeb03fb58c105fdae
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Fri Apr 1 15:21:09 2022 -0700
-
- Remove unused variable.
-
- (cherry picked from commit 3181aed81c92d091f5313df5dee27a9376dc1cce)
-
-diff --git a/gdb/i386-fbsd-tdep.c b/gdb/i386-fbsd-tdep.c
-index d50f35707ee..d68498cd5e9 100644
---- gdb/i386-fbsd-tdep.c
-+++ gdb/i386-fbsd-tdep.c
-@@ -347,7 +347,6 @@ static CORE_ADDR
- i386fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
- CORE_ADDR lm_addr, CORE_ADDR offset)
- {
-- i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
- struct regcache *regcache;
-
- regcache = get_thread_arch_regcache (current_inferior ()->process_target (),
diff --git a/devel/gdb/files/commit-40c23d88038 b/devel/gdb/files/commit-40c23d88038
deleted file mode 100644
--- a/devel/gdb/files/commit-40c23d88038
+++ /dev/null
@@ -1,163 +0,0 @@
-commit e4b141663b47f26ef84a6716e53731bb0debfdf4
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue May 3 16:05:10 2022 -0700
-
- fbsd-nat: Add helper routines for register sets using PT_[G]SETREGSET.
-
- FreeBSD's kernel has recently added PT_GETREGSET and PT_SETREGSET
- operations to fetch a register set named by an ELF note type. These
- helper routines provide helpers to check for a register set's
- existence, fetch registers for a register set, and store registers to
- a register set.
-
- (cherry picked from commit 40c23d880386d6e8202567eaa2a6b041feb1a652)
-
-diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
-index 934fdbad6ef..9dfbd599c92 100644
---- gdb/fbsd-nat.c
-+++ gdb/fbsd-nat.c
-@@ -49,6 +49,11 @@
-
- #include <list>
-
-+#ifndef PT_GETREGSET
-+#define PT_GETREGSET 42 /* Get a target register set */
-+#define PT_SETREGSET 43 /* Set a target register set */
-+#endif
-+
- /* Return the name of a file that can be opened to get the symbols for
- the child process identified by PID. */
-
-@@ -1774,6 +1779,76 @@ fbsd_nat_target::store_register_set (struct regcache *regcache, int regnum,
-
- /* See fbsd-nat.h. */
-
-+bool
-+fbsd_nat_target::have_regset (ptid_t ptid, int note)
-+{
-+ pid_t pid = get_ptrace_pid (ptid);
-+ struct iovec iov;
-+
-+ iov.iov_base = nullptr;
-+ iov.iov_len = 0;
-+ if (ptrace (PT_GETREGSET, pid, (PTRACE_TYPE_ARG3) &iov, note) == -1)
-+ return 0;
-+ return iov.iov_len;
-+}
-+
-+/* See fbsd-nat.h. */
-+
-+bool
-+fbsd_nat_target::fetch_regset (struct regcache *regcache, int regnum, int note,
-+ const struct regset *regset, void *regs,
-+ size_t size)
-+{
-+ const struct regcache_map_entry *map
-+ = (const struct regcache_map_entry *) regset->regmap;
-+ pid_t pid = get_ptrace_pid (regcache->ptid ());
-+
-+ if (regnum == -1 || regcache_map_supplies (map, regnum, regcache->arch(),
-+ size))
-+ {
-+ struct iovec iov;
-+
-+ iov.iov_base = regs;
-+ iov.iov_len = size;
-+ if (ptrace (PT_GETREGSET, pid, (PTRACE_TYPE_ARG3) &iov, note) == -1)
-+ perror_with_name (_("Couldn't get registers"));
-+
-+ regcache->supply_regset (regset, regnum, regs, size);
-+ return true;
-+ }
-+ return false;
-+}
-+
-+bool
-+fbsd_nat_target::store_regset (struct regcache *regcache, int regnum, int note,
-+ const struct regset *regset, void *regs,
-+ size_t size)
-+{
-+ const struct regcache_map_entry *map
-+ = (const struct regcache_map_entry *) regset->regmap;
-+ pid_t pid = get_ptrace_pid (regcache->ptid ());
-+
-+ if (regnum == -1 || regcache_map_supplies (map, regnum, regcache->arch(),
-+ size))
-+ {
-+ struct iovec iov;
-+
-+ iov.iov_base = regs;
-+ iov.iov_len = size;
-+ if (ptrace (PT_GETREGSET, pid, (PTRACE_TYPE_ARG3) &iov, note) == -1)
-+ perror_with_name (_("Couldn't get registers"));
-+
-+ regcache->collect_regset (regset, regnum, regs, size);
-+
-+ if (ptrace (PT_SETREGSET, pid, (PTRACE_TYPE_ARG3) &iov, note) == -1)
-+ perror_with_name (_("Couldn't write registers"));
-+ return true;
-+ }
-+ return false;
-+}
-+
-+/* See fbsd-nat.h. */
-+
- bool
- fbsd_nat_get_siginfo (ptid_t ptid, siginfo_t *siginfo)
- {
-diff --git gdb/fbsd-nat.h gdb/fbsd-nat.h
-index 82f7ee47949..ba359c62314 100644
---- gdb/fbsd-nat.h
-+++ gdb/fbsd-nat.h
-@@ -151,6 +151,17 @@ class fbsd_nat_target : public inf_ptrace_target
- bool store_register_set (struct regcache *regcache, int regnum, int fetch_op,
- int store_op, const struct regset *regset,
- void *regs, size_t size);
-+
-+ /* Helper routines which use PT_GETREGSET and PT_SETREGSET for the
-+ specified NOTE instead of regset-specific fetch and store
-+ ops. */
-+
-+ bool fetch_regset (struct regcache *regcache, int regnum, int note,
-+ const struct regset *regset, void *regs, size_t size);
-+
-+ bool store_regset (struct regcache *regcache, int regnum, int note,
-+ const struct regset *regset, void *regs, size_t size);
-+
- protected:
- /* Wrapper versions of the above helpers which accept a register set
- type such as 'struct reg' or 'struct fpreg'. */
-@@ -172,6 +183,33 @@ class fbsd_nat_target : public inf_ptrace_target
- return store_register_set (regcache, regnum, fetch_op, store_op, regset,
- &regs, sizeof (regs));
- }
-+
-+ /* Helper routine for use in read_description in subclasses. This
-+ routine checks if the register set for the specified NOTE is
-+ present for a given PTID. If the register set is present, the
-+ the size of the register set is returned. If the register set is
-+ not present, zero is returned. */
-+
-+ bool have_regset (ptid_t ptid, int note);
-+
-+ /* Wrapper versions of the PT_GETREGSET and PT_REGSET helpers which
-+ accept a register set type. */
-+
-+ template <class Regset>
-+ bool fetch_regset (struct regcache *regcache, int regnum, int note,
-+ const struct regset *regset)
-+ {
-+ Regset regs;
-+ return fetch_regset (regcache, regnum, note, regset, &regs, sizeof (regs));
-+ }
-+
-+ template <class Regset>
-+ bool store_regset (struct regcache *regcache, int regnum, int note,
-+ const struct regset *regset)
-+ {
-+ Regset regs;
-+ return store_regset (regcache, regnum, note, regset, &regs, sizeof (regs));
-+ }
- };
-
- /* Fetch the signal information for PTID and store it in *SIGINFO.
diff --git a/devel/gdb/files/commit-414d5848bb2 b/devel/gdb/files/commit-414d5848bb2
deleted file mode 100644
--- a/devel/gdb/files/commit-414d5848bb2
+++ /dev/null
@@ -1,293 +0,0 @@
-commit 697c5583d89eacc2d61648549df4276ad34f4ec1
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue May 3 16:05:10 2022 -0700
-
- Add an aarch64-tls feature which includes the tpidr register.
-
- (cherry picked from commit 414d5848bb2766ea7cef162c6ef5862ddb4dfe0f)
-
-diff --git gdb/aarch64-linux-nat.c gdb/aarch64-linux-nat.c
-index 7bb82d17cc8..4da274c285a 100644
---- gdb/aarch64-linux-nat.c
-+++ gdb/aarch64-linux-nat.c
-@@ -646,7 +646,8 @@ aarch64_linux_nat_target::read_description ()
- bool pauth_p = hwcap & AARCH64_HWCAP_PACA;
- bool mte_p = hwcap2 & HWCAP2_MTE;
-
-- return aarch64_read_description (aarch64_sve_get_vq (tid), pauth_p, mte_p);
-+ return aarch64_read_description (aarch64_sve_get_vq (tid), pauth_p, mte_p,
-+ false);
- }
-
- /* Convert a native/host siginfo object, into/from the siginfo in the
-diff --git gdb/aarch64-linux-tdep.c gdb/aarch64-linux-tdep.c
-index cb132d5a540..f5aac7bc0b4 100644
---- gdb/aarch64-linux-tdep.c
-+++ gdb/aarch64-linux-tdep.c
-@@ -763,7 +763,7 @@ aarch64_linux_core_read_description (struct gdbarch *gdbarch,
- bool pauth_p = hwcap & AARCH64_HWCAP_PACA;
- bool mte_p = hwcap2 & HWCAP2_MTE;
- return aarch64_read_description (aarch64_linux_core_read_vq (gdbarch, abfd),
-- pauth_p, mte_p);
-+ pauth_p, mte_p, false);
- }
-
- /* Implementation of `gdbarch_stap_is_single_operand', as defined in
-diff --git gdb/aarch64-tdep.c gdb/aarch64-tdep.c
-index b714f6194b6..c193234eb91 100644
---- gdb/aarch64-tdep.c
-+++ gdb/aarch64-tdep.c
-@@ -58,7 +58,7 @@
- #define HA_MAX_NUM_FLDS 4
-
- /* All possible aarch64 target descriptors. */
--static target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/][2 /* mte */];
-+static target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/][2 /* mte */][2 /* tls */];
-
- /* The standard register names, and all the valid aliases for them. */
- static const struct
-@@ -3327,21 +3327,23 @@ aarch64_displaced_step_hw_singlestep (struct gdbarch *gdbarch)
- If VQ is zero then it is assumed SVE is not supported.
- (It is not possible to set VQ to zero on an SVE system).
-
-- MTE_P indicates the presence of the Memory Tagging Extension feature. */
-+ MTE_P indicates the presence of the Memory Tagging Extension feature.
-+
-+ TLS_P indicates the presence of the Thread Local Storage feature. */
-
- const target_desc *
--aarch64_read_description (uint64_t vq, bool pauth_p, bool mte_p)
-+aarch64_read_description (uint64_t vq, bool pauth_p, bool mte_p, bool tls_p)
- {
- if (vq > AARCH64_MAX_SVE_VQ)
- error (_("VQ is %" PRIu64 ", maximum supported value is %d"), vq,
- AARCH64_MAX_SVE_VQ);
-
-- struct target_desc *tdesc = tdesc_aarch64_list[vq][pauth_p][mte_p];
-+ struct target_desc *tdesc = tdesc_aarch64_list[vq][pauth_p][mte_p][tls_p];
-
- if (tdesc == NULL)
- {
-- tdesc = aarch64_create_target_description (vq, pauth_p, mte_p);
-- tdesc_aarch64_list[vq][pauth_p][mte_p] = tdesc;
-+ tdesc = aarch64_create_target_description (vq, pauth_p, mte_p, tls_p);
-+ tdesc_aarch64_list[vq][pauth_p][mte_p][tls_p] = tdesc;
- }
-
- return tdesc;
-@@ -3430,7 +3432,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
- bool valid_p = true;
- int i, num_regs = 0, num_pseudo_regs = 0;
- int first_pauth_regnum = -1, pauth_ra_state_offset = -1;
-- int first_mte_regnum = -1;
-+ int first_mte_regnum = -1, tls_regnum = -1;
-
- /* Use the vector length passed via the target info. Here -1 is used for no
- SVE, and 0 is unset. If unset then use the vector length from the existing
-@@ -3462,7 +3464,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
- value. */
- const struct target_desc *tdesc = info.target_desc;
- if (!tdesc_has_registers (tdesc) || vq != aarch64_get_tdesc_vq (tdesc))
-- tdesc = aarch64_read_description (vq, false, false);
-+ tdesc = aarch64_read_description (vq, false, false, false);
- gdb_assert (tdesc);
-
- feature_core = tdesc_find_feature (tdesc,"org.gnu.gdb.aarch64.core");
-@@ -3471,6 +3473,8 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
- feature_pauth = tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.pauth");
- const struct tdesc_feature *feature_mte
- = tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.mte");
-+ const struct tdesc_feature *feature_tls
-+ = tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.tls");
-
- if (feature_core == nullptr)
- return nullptr;
-@@ -3525,6 +3529,18 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
- num_pseudo_regs += 32; /* add the Bn scalar register pseudos */
- }
-
-+ /* Add the TLS register. */
-+ if (feature_tls != nullptr)
-+ {
-+ tls_regnum = num_regs;
-+ /* Validate the descriptor provides the mandatory TLS register
-+ and allocate its number. */
-+ valid_p = tdesc_numbered_register (feature_tls, tdesc_data.get (),
-+ tls_regnum, "tpidr");
-+
-+ num_regs++;
-+ }
-+
- /* Add the pauth registers. */
- if (feature_pauth != NULL)
- {
-@@ -3573,6 +3589,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
- tdep->pauth_ra_state_regnum = (feature_pauth == NULL) ? -1
- : pauth_ra_state_offset + num_regs;
- tdep->mte_reg_base = first_mte_regnum;
-+ tdep->tls_regnum = tls_regnum;
-
- set_gdbarch_push_dummy_call (gdbarch, aarch64_push_dummy_call);
- set_gdbarch_frame_align (gdbarch, aarch64_frame_align);
-diff --git gdb/aarch64-tdep.h gdb/aarch64-tdep.h
-index 60a9d5a29c2..e4cdebb6311 100644
---- gdb/aarch64-tdep.h
-+++ gdb/aarch64-tdep.h
-@@ -111,10 +111,18 @@ struct aarch64_gdbarch_tdep : gdbarch_tdep
- {
- return mte_reg_base != -1;
- }
-+
-+ /* TLS register. This is -1 if the TLS register is not available. */
-+ int tls_regnum = 0;
-+
-+ bool has_tls() const
-+ {
-+ return tls_regnum != -1;
-+ }
- };
-
- const target_desc *aarch64_read_description (uint64_t vq, bool pauth_p,
-- bool mte_p);
-+ bool mte_p, bool tls_p);
-
- extern int aarch64_process_record (struct gdbarch *gdbarch,
- struct regcache *regcache, CORE_ADDR addr);
-diff --git gdb/arch/aarch64.c gdb/arch/aarch64.c
-index 485d667ccde..733a3fd6d2a 100644
---- gdb/arch/aarch64.c
-+++ gdb/arch/aarch64.c
-@@ -24,11 +24,13 @@
- #include "../features/aarch64-sve.c"
- #include "../features/aarch64-pauth.c"
- #include "../features/aarch64-mte.c"
-+#include "../features/aarch64-tls.c"
-
- /* See arch/aarch64.h. */
-
- target_desc *
--aarch64_create_target_description (uint64_t vq, bool pauth_p, bool mte_p)
-+aarch64_create_target_description (uint64_t vq, bool pauth_p, bool mte_p,
-+ bool tls_p)
- {
- target_desc_up tdesc = allocate_target_description ();
-
-@@ -52,5 +54,8 @@ aarch64_create_target_description (uint64_t vq, bool pauth_p, bool mte_p)
- if (mte_p)
- regnum = create_feature_aarch64_mte (tdesc.get (), regnum);
-
-+ if (tls_p)
-+ regnum = create_feature_aarch64_tls (tdesc.get (), regnum);
-+
- return tdesc.release ();
- }
-diff --git gdb/arch/aarch64.h gdb/arch/aarch64.h
-index e416e346e9a..8496a0341f7 100644
---- gdb/arch/aarch64.h
-+++ gdb/arch/aarch64.h
-@@ -29,6 +29,7 @@ struct aarch64_features
- bool sve = false;
- bool pauth = false;
- bool mte = false;
-+ bool tls = false;
- };
-
- /* Create the aarch64 target description. A non zero VQ value indicates both
-@@ -36,10 +37,12 @@ struct aarch64_features
- an SVE Z register. HAS_PAUTH_P indicates the presence of the PAUTH
- feature.
-
-- MTE_P indicates the presence of the Memory Tagging Extension feature. */
-+ MTE_P indicates the presence of the Memory Tagging Extension feature.
-+
-+ TLS_P indicates the presence of the Thread Local Storage feature. */
-
- target_desc *aarch64_create_target_description (uint64_t vq, bool has_pauth_p,
-- bool mte_p);
-+ bool mte_p, bool tls_p);
-
- /* Register numbers of various important registers.
- Note that on SVE, the Z registers reuse the V register numbers and the V
-@@ -91,6 +94,7 @@ enum aarch64_regnum
- #define AARCH64_NUM_REGS AARCH64_FPCR_REGNUM + 1
- #define AARCH64_SVE_NUM_REGS AARCH64_SVE_VG_REGNUM + 1
-
-+#define AARCH64_TLS_REGS_SIZE (8)
-
- /* There are a number of ways of expressing the current SVE vector size:
-
-diff --git gdb/features/Makefile gdb/features/Makefile
-index 4b09819389a..946ec983df5 100644
---- gdb/features/Makefile
-+++ gdb/features/Makefile
-@@ -198,6 +198,7 @@ FEATURE_XMLFILES = aarch64-core.xml \
- aarch64-fpu.xml \
- aarch64-pauth.xml \
- aarch64-mte.xml \
-+ aarch64-tls.xml \
- arc/v1-core.xml \
- arc/v1-aux.xml \
- arc/v2-core.xml \
-diff --git gdb/features/aarch64-tls.c gdb/features/aarch64-tls.c
-new file mode 100644
-index 00000000000..30d730dffba
---- /dev/null
-+++ gdb/features/aarch64-tls.c
-@@ -0,0 +1,14 @@
-+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
-+ Original: aarch64-tls.xml */
-+
-+#include "gdbsupport/tdesc.h"
-+
-+static int
-+create_feature_aarch64_tls (struct target_desc *result, long regnum)
-+{
-+ struct tdesc_feature *feature;
-+
-+ feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.tls");
-+ tdesc_create_reg (feature, "tpidr", regnum++, 1, NULL, 64, "data_ptr");
-+ return regnum;
-+}
-diff --git gdb/features/aarch64-tls.xml gdb/features/aarch64-tls.xml
-new file mode 100644
-index 00000000000..f6437785f71
---- /dev/null
-+++ gdb/features/aarch64-tls.xml
-@@ -0,0 +1,11 @@
-+<?xml version="1.0"?>
-+<!-- Copyright (C) 2022 Free Software Foundation, Inc.
-+
-+ Copying and distribution of this file, with or without modification,
-+ are permitted in any medium without royalty provided the copyright
-+ notice and this notice are preserved. -->
-+
-+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
-+<feature name="org.gnu.gdb.aarch64.tls">
-+ <reg name="tpidr" bitsize="64" type="data_ptr"/>
-+</feature>
-diff --git gdbserver/linux-aarch64-tdesc.cc gdbserver/linux-aarch64-tdesc.cc
-index e982ab85067..14d6a4f80eb 100644
---- gdbserver/linux-aarch64-tdesc.cc
-+++ gdbserver/linux-aarch64-tdesc.cc
-@@ -42,7 +42,7 @@ aarch64_linux_read_description (uint64_t vq, bool pauth_p, bool mte_p)
-
- if (tdesc == NULL)
- {
-- tdesc = aarch64_create_target_description (vq, pauth_p, mte_p);
-+ tdesc = aarch64_create_target_description (vq, pauth_p, mte_p, false);
-
- static const char *expedite_regs_aarch64[] = { "x29", "sp", "pc", NULL };
- static const char *expedite_regs_aarch64_sve[] = { "x29", "sp", "pc",
-diff --git gdbserver/netbsd-aarch64-low.cc gdbserver/netbsd-aarch64-low.cc
-index 202bf1cdac6..b371e599232 100644
---- gdbserver/netbsd-aarch64-low.cc
-+++ gdbserver/netbsd-aarch64-low.cc
-@@ -96,7 +96,7 @@ void
- netbsd_aarch64_target::low_arch_setup ()
- {
- target_desc *tdesc
-- = aarch64_create_target_description (0, false);
-+ = aarch64_create_target_description (0, false, false, false);
-
- static const char *expedite_regs_aarch64[] = { "x29", "sp", "pc", NULL };
- init_target_desc (tdesc, expedite_regs_aarch64);
diff --git a/devel/gdb/files/commit-4bd817e71ee b/devel/gdb/files/commit-4bd817e71ee
deleted file mode 100644
--- a/devel/gdb/files/commit-4bd817e71ee
+++ /dev/null
@@ -1,1726 +0,0 @@
-commit 9ea194902df6599ae8f4096fe0426feae12cd7ab
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Mar 22 12:05:43 2022 -0700
-
- nat: Split out platform-independent aarch64 debug register support.
-
- Move non-Linux-specific support for hardware break/watchpoints from
- nat/aarch64-linux-hw-point.c to nat/aarch64-hw-point.c. Changes
- beyond a simple split of the code are:
-
- - aarch64_linux_region_ok_for_watchpoint and
- aarch64_linux_any_set_debug_regs_state renamed to drop linux_ as
- they are not platform specific.
-
- - Platforms must implement the aarch64_notify_debug_reg_change
- function which is invoked from the platform-independent code when a
- debug register changes for a given debug register state. This does
- not use the indirection of a 'low' structure as is done for x86.
-
- - The handling for kernel_supports_any_contiguous_range is not
- pristine. For non-Linux it is simply defined to true. Some uses of
- this could perhaps be implemented as new 'low' routines for the
- various places that check it instead?
-
- - Pass down ptid into aarch64_handle_breakpoint and
- aarch64_handle_watchpoint rather than using current_lwp_ptid which
- is only defined on Linux. In addition, pass the ptid on to
- aarch64_notify_debug_reg_change instead of the unused state
- argument.
-
- (cherry picked from commit 4bd817e71eefd659f51ec75bfb13109c486e8311)
-
-diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c
-index db764975207..dd072d9315e 100644
---- gdb/aarch64-linux-nat.c
-+++ gdb/aarch64-linux-nat.c
-@@ -834,7 +834,8 @@ aarch64_linux_nat_target::insert_hw_breakpoint (struct gdbarch *gdbarch,
- "insert_hw_breakpoint on entry (addr=0x%08lx, len=%d))\n",
- (unsigned long) addr, len);
-
-- ret = aarch64_handle_breakpoint (type, addr, len, 1 /* is_insert */, state);
-+ ret = aarch64_handle_breakpoint (type, addr, len, 1 /* is_insert */,
-+ inferior_ptid, state);
-
- if (show_debug_regs)
- {
-@@ -866,7 +867,8 @@ aarch64_linux_nat_target::remove_hw_breakpoint (struct gdbarch *gdbarch,
- (gdb_stdlog, "remove_hw_breakpoint on entry (addr=0x%08lx, len=%d))\n",
- (unsigned long) addr, len);
-
-- ret = aarch64_handle_breakpoint (type, addr, len, 0 /* is_insert */, state);
-+ ret = aarch64_handle_breakpoint (type, addr, len, 0 /* is_insert */,
-+ inferior_ptid, state);
-
- if (show_debug_regs)
- {
-@@ -899,7 +901,8 @@ aarch64_linux_nat_target::insert_watchpoint (CORE_ADDR addr, int len,
-
- gdb_assert (type != hw_execute);
-
-- ret = aarch64_handle_watchpoint (type, addr, len, 1 /* is_insert */, state);
-+ ret = aarch64_handle_watchpoint (type, addr, len, 1 /* is_insert */,
-+ inferior_ptid, state);
-
- if (show_debug_regs)
- {
-@@ -931,7 +934,8 @@ aarch64_linux_nat_target::remove_watchpoint (CORE_ADDR addr, int len,
-
- gdb_assert (type != hw_execute);
-
-- ret = aarch64_handle_watchpoint (type, addr, len, 0 /* is_insert */, state);
-+ ret = aarch64_handle_watchpoint (type, addr, len, 0 /* is_insert */,
-+ inferior_ptid, state);
-
- if (show_debug_regs)
- {
-@@ -947,7 +951,7 @@ aarch64_linux_nat_target::remove_watchpoint (CORE_ADDR addr, int len,
- int
- aarch64_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
- {
-- return aarch64_linux_region_ok_for_watchpoint (addr, len);
-+ return aarch64_region_ok_for_watchpoint (addr, len);
- }
-
- /* Implement the "stopped_data_address" target_ops method. */
-diff --git a/gdb/configure.nat b/gdb/configure.nat
-index 92ad4a6522b..ad6d35babc2 100644
---- gdb/configure.nat
-+++ gdb/configure.nat
-@@ -234,7 +234,8 @@ case ${gdb_host} in
- aarch64)
- # Host: AArch64 based machine running GNU/Linux
- NATDEPFILES="${NATDEPFILES} aarch64-linux-nat.o \
-- aarch32-linux-nat.o nat/aarch64-linux-hw-point.o \
-+ aarch32-linux-nat.o nat/aarch64-hw-point.o \
-+ nat/aarch64-linux-hw-point.o \
- nat/aarch64-linux.o \
- nat/aarch64-sve-linux-ptrace.o \
- nat/aarch64-mte-linux-ptrace.o"
-diff --git a/gdb/nat/aarch64-hw-point.c b/gdb/nat/aarch64-hw-point.c
-new file mode 100644
-index 00000000000..f0418f7eef8
---- /dev/null
-+++ gdb/nat/aarch64-hw-point.c
-@@ -0,0 +1,624 @@
-+/* Copyright (C) 2009-2022 Free Software Foundation, Inc.
-+
-+ This file is part of GDB.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 3 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
-+
-+#include "gdbsupport/common-defs.h"
-+#include "gdbsupport/break-common.h"
-+#include "gdbsupport/common-regcache.h"
-+#include "aarch64-hw-point.h"
-+
-+#ifdef __linux__
-+/* For kernel_supports_any_contiguous_range. */
-+#include "aarch64-linux-hw-point.h"
-+#else
-+#define kernel_supports_any_contiguous_range true
-+#endif
-+
-+/* Number of hardware breakpoints/watchpoints the target supports.
-+ They are initialized with values obtained via ptrace. */
-+
-+int aarch64_num_bp_regs;
-+int aarch64_num_wp_regs;
-+
-+/* Return starting byte 0..7 incl. of a watchpoint encoded by CTRL. */
-+
-+unsigned int
-+aarch64_watchpoint_offset (unsigned int ctrl)
-+{
-+ uint8_t mask = DR_CONTROL_MASK (ctrl);
-+ unsigned retval;
-+
-+ /* Shift out bottom zeros. */
-+ for (retval = 0; mask && (mask & 1) == 0; ++retval)
-+ mask >>= 1;
-+
-+ return retval;
-+}
-+
-+/* Utility function that returns the length in bytes of a watchpoint
-+ according to the content of a hardware debug control register CTRL.
-+ Any contiguous range of bytes in CTRL is supported. The returned
-+ value can be between 0..8 (inclusive). */
-+
-+unsigned int
-+aarch64_watchpoint_length (unsigned int ctrl)
-+{
-+ uint8_t mask = DR_CONTROL_MASK (ctrl);
-+ unsigned retval;
-+
-+ /* Shift out bottom zeros. */
-+ mask >>= aarch64_watchpoint_offset (ctrl);
-+
-+ /* Count bottom ones. */
-+ for (retval = 0; (mask & 1) != 0; ++retval)
-+ mask >>= 1;
-+
-+ if (mask != 0)
-+ error (_("Unexpected hardware watchpoint length register value 0x%x"),
-+ DR_CONTROL_MASK (ctrl));
-+
-+ return retval;
-+}
-+
-+/* Given the hardware breakpoint or watchpoint type TYPE and its
-+ length LEN, return the expected encoding for a hardware
-+ breakpoint/watchpoint control register. */
-+
-+static unsigned int
-+aarch64_point_encode_ctrl_reg (enum target_hw_bp_type type, int offset, int len)
-+{
-+ unsigned int ctrl, ttype;
-+
-+ gdb_assert (offset == 0 || kernel_supports_any_contiguous_range);
-+ gdb_assert (offset + len <= AARCH64_HWP_MAX_LEN_PER_REG);
-+
-+ /* type */
-+ switch (type)
-+ {
-+ case hw_write:
-+ ttype = 2;
-+ break;
-+ case hw_read:
-+ ttype = 1;
-+ break;
-+ case hw_access:
-+ ttype = 3;
-+ break;
-+ case hw_execute:
-+ ttype = 0;
-+ break;
-+ default:
-+ perror_with_name (_("Unrecognized breakpoint/watchpoint type"));
-+ }
-+
-+ ctrl = ttype << 3;
-+
-+ /* offset and length bitmask */
-+ ctrl |= ((1 << len) - 1) << (5 + offset);
-+ /* enabled at el0 */
-+ ctrl |= (2 << 1) | 1;
-+
-+ return ctrl;
-+}
-+
-+/* Addresses to be written to the hardware breakpoint and watchpoint
-+ value registers need to be aligned; the alignment is 4-byte and
-+ 8-type respectively. Linux kernel rejects any non-aligned address
-+ it receives from the related ptrace call. Furthermore, the kernel
-+ currently only supports the following Byte Address Select (BAS)
-+ values: 0x1, 0x3, 0xf and 0xff, which means that for a hardware
-+ watchpoint to be accepted by the kernel (via ptrace call), its
-+ valid length can only be 1 byte, 2 bytes, 4 bytes or 8 bytes.
-+ Despite these limitations, the unaligned watchpoint is supported in
-+ this port.
-+
-+ Return 0 for any non-compliant ADDR and/or LEN; return 1 otherwise. */
-+
-+static int
-+aarch64_point_is_aligned (ptid_t ptid, int is_watchpoint, CORE_ADDR addr,
-+ int len)
-+{
-+ unsigned int alignment = 0;
-+
-+ if (is_watchpoint)
-+ alignment = AARCH64_HWP_ALIGNMENT;
-+ else
-+ {
-+ struct regcache *regcache
-+ = get_thread_regcache_for_ptid (ptid);
-+
-+ /* Set alignment to 2 only if the current process is 32-bit,
-+ since thumb instruction can be 2-byte aligned. Otherwise, set
-+ alignment to AARCH64_HBP_ALIGNMENT. */
-+ if (regcache_register_size (regcache, 0) == 8)
-+ alignment = AARCH64_HBP_ALIGNMENT;
-+ else
-+ alignment = 2;
-+ }
-+
-+ if (addr & (alignment - 1))
-+ return 0;
-+
-+ if ((!kernel_supports_any_contiguous_range
-+ && len != 8 && len != 4 && len != 2 && len != 1)
-+ || (kernel_supports_any_contiguous_range
-+ && (len < 1 || len > 8)))
-+ return 0;
-+
-+ return 1;
-+}
-+
-+/* Given the (potentially unaligned) watchpoint address in ADDR and
-+ length in LEN, return the aligned address, offset from that base
-+ address, and aligned length in *ALIGNED_ADDR_P, *ALIGNED_OFFSET_P
-+ and *ALIGNED_LEN_P, respectively. The returned values will be
-+ valid values to write to the hardware watchpoint value and control
-+ registers.
-+
-+ The given watchpoint may get truncated if more than one hardware
-+ register is needed to cover the watched region. *NEXT_ADDR_P
-+ and *NEXT_LEN_P, if non-NULL, will return the address and length
-+ of the remaining part of the watchpoint (which can be processed
-+ by calling this routine again to generate another aligned address,
-+ offset and length tuple.
-+
-+ Essentially, unaligned watchpoint is achieved by minimally
-+ enlarging the watched area to meet the alignment requirement, and
-+ if necessary, splitting the watchpoint over several hardware
-+ watchpoint registers.
-+
-+ On kernels that predate the support for Byte Address Select (BAS)
-+ in the hardware watchpoint control register, the offset from the
-+ base address is always zero, and so in that case the trade-off is
-+ that there will be false-positive hits for the read-type or the
-+ access-type hardware watchpoints; for the write type, which is more
-+ commonly used, there will be no such issues, as the higher-level
-+ breakpoint management in gdb always examines the exact watched
-+ region for any content change, and transparently resumes a thread
-+ from a watchpoint trap if there is no change to the watched region.
-+
-+ Another limitation is that because the watched region is enlarged,
-+ the watchpoint fault address discovered by
-+ aarch64_stopped_data_address may be outside of the original watched
-+ region, especially when the triggering instruction is accessing a
-+ larger region. When the fault address is not within any known
-+ range, watchpoints_triggered in gdb will get confused, as the
-+ higher-level watchpoint management is only aware of original
-+ watched regions, and will think that some unknown watchpoint has
-+ been triggered. To prevent such a case,
-+ aarch64_stopped_data_address implementations in gdb and gdbserver
-+ try to match the trapped address with a watched region, and return
-+ an address within the latter. */
-+
-+static void
-+aarch64_align_watchpoint (CORE_ADDR addr, int len, CORE_ADDR *aligned_addr_p,
-+ int *aligned_offset_p, int *aligned_len_p,
-+ CORE_ADDR *next_addr_p, int *next_len_p,
-+ CORE_ADDR *next_addr_orig_p)
-+{
-+ int aligned_len;
-+ unsigned int offset, aligned_offset;
-+ CORE_ADDR aligned_addr;
-+ const unsigned int alignment = AARCH64_HWP_ALIGNMENT;
-+ const unsigned int max_wp_len = AARCH64_HWP_MAX_LEN_PER_REG;
-+
-+ /* As assumed by the algorithm. */
-+ gdb_assert (alignment == max_wp_len);
-+
-+ if (len <= 0)
-+ return;
-+
-+ /* The address put into the hardware watchpoint value register must
-+ be aligned. */
-+ offset = addr & (alignment - 1);
-+ aligned_addr = addr - offset;
-+ aligned_offset
-+ = kernel_supports_any_contiguous_range ? addr & (alignment - 1) : 0;
-+
-+ gdb_assert (offset >= 0 && offset < alignment);
-+ gdb_assert (aligned_addr >= 0 && aligned_addr <= addr);
-+ gdb_assert (offset + len > 0);
-+
-+ if (offset + len >= max_wp_len)
-+ {
-+ /* Need more than one watchpoint register; truncate at the
-+ alignment boundary. */
-+ aligned_len
-+ = max_wp_len - (kernel_supports_any_contiguous_range ? offset : 0);
-+ len -= (max_wp_len - offset);
-+ addr += (max_wp_len - offset);
-+ gdb_assert ((addr & (alignment - 1)) == 0);
-+ }
-+ else
-+ {
-+ /* Find the smallest valid length that is large enough to
-+ accommodate this watchpoint. */
-+ static const unsigned char
-+ aligned_len_array[AARCH64_HWP_MAX_LEN_PER_REG] =
-+ { 1, 2, 4, 4, 8, 8, 8, 8 };
-+
-+ aligned_len = (kernel_supports_any_contiguous_range
-+ ? len : aligned_len_array[offset + len - 1]);
-+ addr += len;
-+ len = 0;
-+ }
-+
-+ if (aligned_addr_p)
-+ *aligned_addr_p = aligned_addr;
-+ if (aligned_offset_p)
-+ *aligned_offset_p = aligned_offset;
-+ if (aligned_len_p)
-+ *aligned_len_p = aligned_len;
-+ if (next_addr_p)
-+ *next_addr_p = addr;
-+ if (next_len_p)
-+ *next_len_p = len;
-+ if (next_addr_orig_p)
-+ *next_addr_orig_p = align_down (*next_addr_orig_p + alignment, alignment);
-+}
-+
-+/* Record the insertion of one breakpoint/watchpoint, as represented
-+ by ADDR and CTRL, in the process' arch-specific data area *STATE. */
-+
-+static int
-+aarch64_dr_state_insert_one_point (ptid_t ptid,
-+ struct aarch64_debug_reg_state *state,
-+ enum target_hw_bp_type type,
-+ CORE_ADDR addr, int offset, int len,
-+ CORE_ADDR addr_orig)
-+{
-+ int i, idx, num_regs, is_watchpoint;
-+ unsigned int ctrl, *dr_ctrl_p, *dr_ref_count;
-+ CORE_ADDR *dr_addr_p, *dr_addr_orig_p;
-+
-+ /* Set up state pointers. */
-+ is_watchpoint = (type != hw_execute);
-+ gdb_assert (aarch64_point_is_aligned (ptid, is_watchpoint, addr, len));
-+ if (is_watchpoint)
-+ {
-+ num_regs = aarch64_num_wp_regs;
-+ dr_addr_p = state->dr_addr_wp;
-+ dr_addr_orig_p = state->dr_addr_orig_wp;
-+ dr_ctrl_p = state->dr_ctrl_wp;
-+ dr_ref_count = state->dr_ref_count_wp;
-+ }
-+ else
-+ {
-+ num_regs = aarch64_num_bp_regs;
-+ dr_addr_p = state->dr_addr_bp;
-+ dr_addr_orig_p = nullptr;
-+ dr_ctrl_p = state->dr_ctrl_bp;
-+ dr_ref_count = state->dr_ref_count_bp;
-+ }
-+
-+ ctrl = aarch64_point_encode_ctrl_reg (type, offset, len);
-+
-+ /* Find an existing or free register in our cache. */
-+ idx = -1;
-+ for (i = 0; i < num_regs; ++i)
-+ {
-+ if ((dr_ctrl_p[i] & 1) == 0)
-+ {
-+ gdb_assert (dr_ref_count[i] == 0);
-+ idx = i;
-+ /* no break; continue hunting for an exising one. */
-+ }
-+ else if (dr_addr_p[i] == addr
-+ && (dr_addr_orig_p == nullptr || dr_addr_orig_p[i] == addr_orig)
-+ && dr_ctrl_p[i] == ctrl)
-+ {
-+ gdb_assert (dr_ref_count[i] != 0);
-+ idx = i;
-+ break;
-+ }
-+ }
-+
-+ /* No space. */
-+ if (idx == -1)
-+ return -1;
-+
-+ /* Update our cache. */
-+ if ((dr_ctrl_p[idx] & 1) == 0)
-+ {
-+ /* new entry */
-+ dr_addr_p[idx] = addr;
-+ if (dr_addr_orig_p != nullptr)
-+ dr_addr_orig_p[idx] = addr_orig;
-+ dr_ctrl_p[idx] = ctrl;
-+ dr_ref_count[idx] = 1;
-+ /* Notify the change. */
-+ aarch64_notify_debug_reg_change (ptid, is_watchpoint, idx);
-+ }
-+ else
-+ {
-+ /* existing entry */
-+ dr_ref_count[idx]++;
-+ }
-+
-+ return 0;
-+}
-+
-+/* Record the removal of one breakpoint/watchpoint, as represented by
-+ ADDR and CTRL, in the process' arch-specific data area *STATE. */
-+
-+static int
-+aarch64_dr_state_remove_one_point (ptid_t ptid,
-+ struct aarch64_debug_reg_state *state,
-+ enum target_hw_bp_type type,
-+ CORE_ADDR addr, int offset, int len,
-+ CORE_ADDR addr_orig)
-+{
-+ int i, num_regs, is_watchpoint;
-+ unsigned int ctrl, *dr_ctrl_p, *dr_ref_count;
-+ CORE_ADDR *dr_addr_p, *dr_addr_orig_p;
-+
-+ /* Set up state pointers. */
-+ is_watchpoint = (type != hw_execute);
-+ if (is_watchpoint)
-+ {
-+ num_regs = aarch64_num_wp_regs;
-+ dr_addr_p = state->dr_addr_wp;
-+ dr_addr_orig_p = state->dr_addr_orig_wp;
-+ dr_ctrl_p = state->dr_ctrl_wp;
-+ dr_ref_count = state->dr_ref_count_wp;
-+ }
-+ else
-+ {
-+ num_regs = aarch64_num_bp_regs;
-+ dr_addr_p = state->dr_addr_bp;
-+ dr_addr_orig_p = nullptr;
-+ dr_ctrl_p = state->dr_ctrl_bp;
-+ dr_ref_count = state->dr_ref_count_bp;
-+ }
-+
-+ ctrl = aarch64_point_encode_ctrl_reg (type, offset, len);
-+
-+ /* Find the entry that matches the ADDR and CTRL. */
-+ for (i = 0; i < num_regs; ++i)
-+ if (dr_addr_p[i] == addr
-+ && (dr_addr_orig_p == nullptr || dr_addr_orig_p[i] == addr_orig)
-+ && dr_ctrl_p[i] == ctrl)
-+ {
-+ gdb_assert (dr_ref_count[i] != 0);
-+ break;
-+ }
-+
-+ /* Not found. */
-+ if (i == num_regs)
-+ return -1;
-+
-+ /* Clear our cache. */
-+ if (--dr_ref_count[i] == 0)
-+ {
-+ /* Clear the enable bit. */
-+ ctrl &= ~1;
-+ dr_addr_p[i] = 0;
-+ if (dr_addr_orig_p != nullptr)
-+ dr_addr_orig_p[i] = 0;
-+ dr_ctrl_p[i] = ctrl;
-+ /* Notify the change. */
-+ aarch64_notify_debug_reg_change (ptid, is_watchpoint, i);
-+ }
-+
-+ return 0;
-+}
-+
-+int
-+aarch64_handle_breakpoint (enum target_hw_bp_type type, CORE_ADDR addr,
-+ int len, int is_insert, ptid_t ptid,
-+ struct aarch64_debug_reg_state *state)
-+{
-+ if (is_insert)
-+ {
-+ /* The hardware breakpoint on AArch64 should always be 4-byte
-+ aligned, but on AArch32, it can be 2-byte aligned. Note that
-+ we only check the alignment on inserting breakpoint because
-+ aarch64_point_is_aligned needs the inferior_ptid inferior's
-+ regcache to decide whether the inferior is 32-bit or 64-bit.
-+ However when GDB follows the parent process and detach breakpoints
-+ from child process, inferior_ptid is the child ptid, but the
-+ child inferior doesn't exist in GDB's view yet. */
-+ if (!aarch64_point_is_aligned (ptid, 0 /* is_watchpoint */ , addr, len))
-+ return -1;
-+
-+ return aarch64_dr_state_insert_one_point (ptid, state, type, addr, 0, len,
-+ -1);
-+ }
-+ else
-+ return aarch64_dr_state_remove_one_point (ptid, state, type, addr, 0, len,
-+ -1);
-+}
-+
-+/* This is essentially the same as aarch64_handle_breakpoint, apart
-+ from that it is an aligned watchpoint to be handled. */
-+
-+static int
-+aarch64_handle_aligned_watchpoint (enum target_hw_bp_type type,
-+ CORE_ADDR addr, int len, int is_insert,
-+ ptid_t ptid,
-+ struct aarch64_debug_reg_state *state)
-+{
-+ if (is_insert)
-+ return aarch64_dr_state_insert_one_point (ptid, state, type, addr, 0, len,
-+ addr);
-+ else
-+ return aarch64_dr_state_remove_one_point (ptid, state, type, addr, 0, len,
-+ addr);
-+}
-+
-+/* Insert/remove unaligned watchpoint by calling
-+ aarch64_align_watchpoint repeatedly until the whole watched region,
-+ as represented by ADDR and LEN, has been properly aligned and ready
-+ to be written to one or more hardware watchpoint registers.
-+ IS_INSERT indicates whether this is an insertion or a deletion.
-+ Return 0 if succeed. */
-+
-+static int
-+aarch64_handle_unaligned_watchpoint (enum target_hw_bp_type type,
-+ CORE_ADDR addr, int len, int is_insert,
-+ ptid_t ptid,
-+ struct aarch64_debug_reg_state *state)
-+{
-+ CORE_ADDR addr_orig = addr;
-+
-+ while (len > 0)
-+ {
-+ CORE_ADDR aligned_addr;
-+ int aligned_offset, aligned_len, ret;
-+ CORE_ADDR addr_orig_next = addr_orig;
-+
-+ aarch64_align_watchpoint (addr, len, &aligned_addr, &aligned_offset,
-+ &aligned_len, &addr, &len, &addr_orig_next);
-+
-+ if (is_insert)
-+ ret = aarch64_dr_state_insert_one_point (ptid, state, type,
-+ aligned_addr, aligned_offset,
-+ aligned_len, addr_orig);
-+ else
-+ ret = aarch64_dr_state_remove_one_point (ptid, state, type,
-+ aligned_addr, aligned_offset,
-+ aligned_len, addr_orig);
-+
-+ if (show_debug_regs)
-+ debug_printf ("handle_unaligned_watchpoint: is_insert: %d\n"
-+ " "
-+ "aligned_addr: %s, aligned_len: %d\n"
-+ " "
-+ "addr_orig: %s\n"
-+ " "
-+ "next_addr: %s, next_len: %d\n"
-+ " "
-+ "addr_orig_next: %s\n",
-+ is_insert, core_addr_to_string_nz (aligned_addr),
-+ aligned_len, core_addr_to_string_nz (addr_orig),
-+ core_addr_to_string_nz (addr), len,
-+ core_addr_to_string_nz (addr_orig_next));
-+
-+ addr_orig = addr_orig_next;
-+
-+ if (ret != 0)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+int
-+aarch64_handle_watchpoint (enum target_hw_bp_type type, CORE_ADDR addr,
-+ int len, int is_insert, ptid_t ptid,
-+ struct aarch64_debug_reg_state *state)
-+{
-+ if (aarch64_point_is_aligned (ptid, 1 /* is_watchpoint */ , addr, len))
-+ return aarch64_handle_aligned_watchpoint (type, addr, len, is_insert, ptid,
-+ state);
-+ else
-+ return aarch64_handle_unaligned_watchpoint (type, addr, len, is_insert,
-+ ptid, state);
-+}
-+
-+/* See nat/aarch64-hw-point.h. */
-+
-+bool
-+aarch64_any_set_debug_regs_state (aarch64_debug_reg_state *state,
-+ bool watchpoint)
-+{
-+ int count = watchpoint ? aarch64_num_wp_regs : aarch64_num_bp_regs;
-+ if (count == 0)
-+ return false;
-+
-+ const CORE_ADDR *addr = watchpoint ? state->dr_addr_wp : state->dr_addr_bp;
-+ const unsigned int *ctrl = watchpoint ? state->dr_ctrl_wp : state->dr_ctrl_bp;
-+
-+ for (int i = 0; i < count; i++)
-+ if (addr[i] != 0 || ctrl[i] != 0)
-+ return true;
-+
-+ return false;
-+}
-+
-+/* Print the values of the cached breakpoint/watchpoint registers. */
-+
-+void
-+aarch64_show_debug_reg_state (struct aarch64_debug_reg_state *state,
-+ const char *func, CORE_ADDR addr,
-+ int len, enum target_hw_bp_type type)
-+{
-+ int i;
-+
-+ debug_printf ("%s", func);
-+ if (addr || len)
-+ debug_printf (" (addr=0x%08lx, len=%d, type=%s)",
-+ (unsigned long) addr, len,
-+ type == hw_write ? "hw-write-watchpoint"
-+ : (type == hw_read ? "hw-read-watchpoint"
-+ : (type == hw_access ? "hw-access-watchpoint"
-+ : (type == hw_execute ? "hw-breakpoint"
-+ : "??unknown??"))));
-+ debug_printf (":\n");
-+
-+ debug_printf ("\tBREAKPOINTs:\n");
-+ for (i = 0; i < aarch64_num_bp_regs; i++)
-+ debug_printf ("\tBP%d: addr=%s, ctrl=0x%08x, ref.count=%d\n",
-+ i, core_addr_to_string_nz (state->dr_addr_bp[i]),
-+ state->dr_ctrl_bp[i], state->dr_ref_count_bp[i]);
-+
-+ debug_printf ("\tWATCHPOINTs:\n");
-+ for (i = 0; i < aarch64_num_wp_regs; i++)
-+ debug_printf ("\tWP%d: addr=%s (orig=%s), ctrl=0x%08x, ref.count=%d\n",
-+ i, core_addr_to_string_nz (state->dr_addr_wp[i]),
-+ core_addr_to_string_nz (state->dr_addr_orig_wp[i]),
-+ state->dr_ctrl_wp[i], state->dr_ref_count_wp[i]);
-+}
-+
-+/* Return true if we can watch a memory region that starts address
-+ ADDR and whose length is LEN in bytes. */
-+
-+int
-+aarch64_region_ok_for_watchpoint (CORE_ADDR addr, int len)
-+{
-+ CORE_ADDR aligned_addr;
-+
-+ /* Can not set watchpoints for zero or negative lengths. */
-+ if (len <= 0)
-+ return 0;
-+
-+ /* Must have hardware watchpoint debug register(s). */
-+ if (aarch64_num_wp_regs == 0)
-+ return 0;
-+
-+ /* We support unaligned watchpoint address and arbitrary length,
-+ as long as the size of the whole watched area after alignment
-+ doesn't exceed size of the total area that all watchpoint debug
-+ registers can watch cooperatively.
-+
-+ This is a very relaxed rule, but unfortunately there are
-+ limitations, e.g. false-positive hits, due to limited support of
-+ hardware debug registers in the kernel. See comment above
-+ aarch64_align_watchpoint for more information. */
-+
-+ aligned_addr = addr & ~(AARCH64_HWP_MAX_LEN_PER_REG - 1);
-+ if (aligned_addr + aarch64_num_wp_regs * AARCH64_HWP_MAX_LEN_PER_REG
-+ < addr + len)
-+ return 0;
-+
-+ /* All tests passed so we are likely to be able to set the watchpoint.
-+ The reason that it is 'likely' rather than 'must' is because
-+ we don't check the current usage of the watchpoint registers, and
-+ there may not be enough registers available for this watchpoint.
-+ Ideally we should check the cached debug register state, however
-+ the checking is costly. */
-+ return 1;
-+}
-diff --git a/gdb/nat/aarch64-hw-point.h b/gdb/nat/aarch64-hw-point.h
-new file mode 100644
-index 00000000000..97b37d537c2
---- /dev/null
-+++ gdb/nat/aarch64-hw-point.h
-@@ -0,0 +1,126 @@
-+/* Copyright (C) 2009-2022 Free Software Foundation, Inc.
-+
-+ This file is part of GDB.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 3 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
-+
-+#ifndef NAT_AARCH64_HW_POINT_H
-+#define NAT_AARCH64_HW_POINT_H
-+
-+/* Macro definitions, data structures, and code for the hardware
-+ breakpoint and hardware watchpoint support follow. We use the
-+ following abbreviations throughout the code:
-+
-+ hw - hardware
-+ bp - breakpoint
-+ wp - watchpoint */
-+
-+/* Maximum number of hardware breakpoint and watchpoint registers.
-+ Neither of these values may exceed the width of dr_changed_t
-+ measured in bits. */
-+
-+#define AARCH64_HBP_MAX_NUM 16
-+#define AARCH64_HWP_MAX_NUM 16
-+
-+/* Alignment requirement in bytes for addresses written to
-+ hardware breakpoint and watchpoint value registers.
-+
-+ A ptrace call attempting to set an address that does not meet the
-+ alignment criteria will fail. Limited support has been provided in
-+ this port for unaligned watchpoints, such that from a GDB user
-+ perspective, an unaligned watchpoint may be requested.
-+
-+ This is achieved by minimally enlarging the watched area to meet the
-+ alignment requirement, and if necessary, splitting the watchpoint
-+ over several hardware watchpoint registers. */
-+
-+#define AARCH64_HBP_ALIGNMENT 4
-+#define AARCH64_HWP_ALIGNMENT 8
-+
-+/* The maximum length of a memory region that can be watched by one
-+ hardware watchpoint register. */
-+
-+#define AARCH64_HWP_MAX_LEN_PER_REG 8
-+
-+/* Macro for the expected version of the ARMv8-A debug architecture. */
-+#define AARCH64_DEBUG_ARCH_V8 0x6
-+#define AARCH64_DEBUG_ARCH_V8_1 0x7
-+#define AARCH64_DEBUG_ARCH_V8_2 0x8
-+#define AARCH64_DEBUG_ARCH_V8_4 0x9
-+
-+/* ptrace expects control registers to be formatted as follows:
-+
-+ 31 13 5 3 1 0
-+ +--------------------------------+----------+------+------+----+
-+ | RESERVED (SBZ) | MASK | TYPE | PRIV | EN |
-+ +--------------------------------+----------+------+------+----+
-+
-+ The TYPE field is ignored for breakpoints. */
-+
-+#define DR_CONTROL_ENABLED(ctrl) (((ctrl) & 0x1) == 1)
-+#define DR_CONTROL_MASK(ctrl) (((ctrl) >> 5) & 0xff)
-+
-+/* Structure for managing the hardware breakpoint/watchpoint resources.
-+ DR_ADDR_* stores the address, DR_CTRL_* stores the control register
-+ content, and DR_REF_COUNT_* counts the numbers of references to the
-+ corresponding bp/wp, by which way the limited hardware resources
-+ are not wasted on duplicated bp/wp settings (though so far gdb has
-+ done a good job by not sending duplicated bp/wp requests). */
-+
-+struct aarch64_debug_reg_state
-+{
-+ /* hardware breakpoint */
-+ CORE_ADDR dr_addr_bp[AARCH64_HBP_MAX_NUM];
-+ unsigned int dr_ctrl_bp[AARCH64_HBP_MAX_NUM];
-+ unsigned int dr_ref_count_bp[AARCH64_HBP_MAX_NUM];
-+
-+ /* hardware watchpoint */
-+ /* Address aligned down to AARCH64_HWP_ALIGNMENT. */
-+ CORE_ADDR dr_addr_wp[AARCH64_HWP_MAX_NUM];
-+ /* Address as entered by user without any forced alignment. */
-+ CORE_ADDR dr_addr_orig_wp[AARCH64_HWP_MAX_NUM];
-+ unsigned int dr_ctrl_wp[AARCH64_HWP_MAX_NUM];
-+ unsigned int dr_ref_count_wp[AARCH64_HWP_MAX_NUM];
-+};
-+
-+extern int aarch64_num_bp_regs;
-+extern int aarch64_num_wp_regs;
-+
-+/* Invoked when IDXth breakpoint/watchpoint register pair needs to be
-+ updated. */
-+void aarch64_notify_debug_reg_change (ptid_t ptid, int is_watchpoint,
-+ unsigned int idx);
-+
-+unsigned int aarch64_watchpoint_offset (unsigned int ctrl);
-+unsigned int aarch64_watchpoint_length (unsigned int ctrl);
-+
-+int aarch64_handle_breakpoint (enum target_hw_bp_type type, CORE_ADDR addr,
-+ int len, int is_insert, ptid_t ptid,
-+ struct aarch64_debug_reg_state *state);
-+int aarch64_handle_watchpoint (enum target_hw_bp_type type, CORE_ADDR addr,
-+ int len, int is_insert, ptid_t ptid,
-+ struct aarch64_debug_reg_state *state);
-+
-+/* Return TRUE if there are any hardware breakpoints. If WATCHPOINT is TRUE,
-+ check hardware watchpoints instead. */
-+bool aarch64_any_set_debug_regs_state (aarch64_debug_reg_state *state,
-+ bool watchpoint);
-+
-+void aarch64_show_debug_reg_state (struct aarch64_debug_reg_state *state,
-+ const char *func, CORE_ADDR addr,
-+ int len, enum target_hw_bp_type type);
-+
-+int aarch64_region_ok_for_watchpoint (CORE_ADDR addr, int len);
-+
-+#endif /* NAT_AARCH64_HW_POINT_H */
-diff --git a/gdb/nat/aarch64-linux-hw-point.c b/gdb/nat/aarch64-linux-hw-point.c
-index f5dd3b2be2c..a6d91a367b7 100644
---- gdb/nat/aarch64-linux-hw-point.c
-+++ gdb/nat/aarch64-linux-hw-point.c
-@@ -34,256 +34,9 @@
-
- #include <elf.h>
-
--/* Number of hardware breakpoints/watchpoints the target supports.
-- They are initialized with values obtained via the ptrace calls
-- with NT_ARM_HW_BREAK and NT_ARM_HW_WATCH respectively. */
-+/* See aarch64-linux-hw-point.h */
-
--int aarch64_num_bp_regs;
--int aarch64_num_wp_regs;
--
--/* True if this kernel does not have the bug described by PR
-- external/20207 (Linux >= 4.10). A fixed kernel supports any
-- contiguous range of bits in 8-bit byte DR_CONTROL_MASK. A buggy
-- kernel supports only 0x01, 0x03, 0x0f and 0xff. We start by
-- assuming the bug is fixed, and then detect the bug at
-- PTRACE_SETREGSET time. */
--static bool kernel_supports_any_contiguous_range = true;
--
--/* Return starting byte 0..7 incl. of a watchpoint encoded by CTRL. */
--
--unsigned int
--aarch64_watchpoint_offset (unsigned int ctrl)
--{
-- uint8_t mask = DR_CONTROL_MASK (ctrl);
-- unsigned retval;
--
-- /* Shift out bottom zeros. */
-- for (retval = 0; mask && (mask & 1) == 0; ++retval)
-- mask >>= 1;
--
-- return retval;
--}
--
--/* Utility function that returns the length in bytes of a watchpoint
-- according to the content of a hardware debug control register CTRL.
-- Any contiguous range of bytes in CTRL is supported. The returned
-- value can be between 0..8 (inclusive). */
--
--unsigned int
--aarch64_watchpoint_length (unsigned int ctrl)
--{
-- uint8_t mask = DR_CONTROL_MASK (ctrl);
-- unsigned retval;
--
-- /* Shift out bottom zeros. */
-- mask >>= aarch64_watchpoint_offset (ctrl);
--
-- /* Count bottom ones. */
-- for (retval = 0; (mask & 1) != 0; ++retval)
-- mask >>= 1;
--
-- if (mask != 0)
-- error (_("Unexpected hardware watchpoint length register value 0x%x"),
-- DR_CONTROL_MASK (ctrl));
--
-- return retval;
--}
--
--/* Given the hardware breakpoint or watchpoint type TYPE and its
-- length LEN, return the expected encoding for a hardware
-- breakpoint/watchpoint control register. */
--
--static unsigned int
--aarch64_point_encode_ctrl_reg (enum target_hw_bp_type type, int offset, int len)
--{
-- unsigned int ctrl, ttype;
--
-- gdb_assert (offset == 0 || kernel_supports_any_contiguous_range);
-- gdb_assert (offset + len <= AARCH64_HWP_MAX_LEN_PER_REG);
--
-- /* type */
-- switch (type)
-- {
-- case hw_write:
-- ttype = 2;
-- break;
-- case hw_read:
-- ttype = 1;
-- break;
-- case hw_access:
-- ttype = 3;
-- break;
-- case hw_execute:
-- ttype = 0;
-- break;
-- default:
-- perror_with_name (_("Unrecognized breakpoint/watchpoint type"));
-- }
--
-- ctrl = ttype << 3;
--
-- /* offset and length bitmask */
-- ctrl |= ((1 << len) - 1) << (5 + offset);
-- /* enabled at el0 */
-- ctrl |= (2 << 1) | 1;
--
-- return ctrl;
--}
--
--/* Addresses to be written to the hardware breakpoint and watchpoint
-- value registers need to be aligned; the alignment is 4-byte and
-- 8-type respectively. Linux kernel rejects any non-aligned address
-- it receives from the related ptrace call. Furthermore, the kernel
-- currently only supports the following Byte Address Select (BAS)
-- values: 0x1, 0x3, 0xf and 0xff, which means that for a hardware
-- watchpoint to be accepted by the kernel (via ptrace call), its
-- valid length can only be 1 byte, 2 bytes, 4 bytes or 8 bytes.
-- Despite these limitations, the unaligned watchpoint is supported in
-- this port.
--
-- Return 0 for any non-compliant ADDR and/or LEN; return 1 otherwise. */
--
--static int
--aarch64_point_is_aligned (int is_watchpoint, CORE_ADDR addr, int len)
--{
-- unsigned int alignment = 0;
--
-- if (is_watchpoint)
-- alignment = AARCH64_HWP_ALIGNMENT;
-- else
-- {
-- struct regcache *regcache
-- = get_thread_regcache_for_ptid (current_lwp_ptid ());
--
-- /* Set alignment to 2 only if the current process is 32-bit,
-- since thumb instruction can be 2-byte aligned. Otherwise, set
-- alignment to AARCH64_HBP_ALIGNMENT. */
-- if (regcache_register_size (regcache, 0) == 8)
-- alignment = AARCH64_HBP_ALIGNMENT;
-- else
-- alignment = 2;
-- }
--
-- if (addr & (alignment - 1))
-- return 0;
--
-- if ((!kernel_supports_any_contiguous_range
-- && len != 8 && len != 4 && len != 2 && len != 1)
-- || (kernel_supports_any_contiguous_range
-- && (len < 1 || len > 8)))
-- return 0;
--
-- return 1;
--}
--
--/* Given the (potentially unaligned) watchpoint address in ADDR and
-- length in LEN, return the aligned address, offset from that base
-- address, and aligned length in *ALIGNED_ADDR_P, *ALIGNED_OFFSET_P
-- and *ALIGNED_LEN_P, respectively. The returned values will be
-- valid values to write to the hardware watchpoint value and control
-- registers.
--
-- The given watchpoint may get truncated if more than one hardware
-- register is needed to cover the watched region. *NEXT_ADDR_P
-- and *NEXT_LEN_P, if non-NULL, will return the address and length
-- of the remaining part of the watchpoint (which can be processed
-- by calling this routine again to generate another aligned address,
-- offset and length tuple.
--
-- Essentially, unaligned watchpoint is achieved by minimally
-- enlarging the watched area to meet the alignment requirement, and
-- if necessary, splitting the watchpoint over several hardware
-- watchpoint registers.
--
-- On kernels that predate the support for Byte Address Select (BAS)
-- in the hardware watchpoint control register, the offset from the
-- base address is always zero, and so in that case the trade-off is
-- that there will be false-positive hits for the read-type or the
-- access-type hardware watchpoints; for the write type, which is more
-- commonly used, there will be no such issues, as the higher-level
-- breakpoint management in gdb always examines the exact watched
-- region for any content change, and transparently resumes a thread
-- from a watchpoint trap if there is no change to the watched region.
--
-- Another limitation is that because the watched region is enlarged,
-- the watchpoint fault address discovered by
-- aarch64_stopped_data_address may be outside of the original watched
-- region, especially when the triggering instruction is accessing a
-- larger region. When the fault address is not within any known
-- range, watchpoints_triggered in gdb will get confused, as the
-- higher-level watchpoint management is only aware of original
-- watched regions, and will think that some unknown watchpoint has
-- been triggered. To prevent such a case,
-- aarch64_stopped_data_address implementations in gdb and gdbserver
-- try to match the trapped address with a watched region, and return
-- an address within the latter. */
--
--static void
--aarch64_align_watchpoint (CORE_ADDR addr, int len, CORE_ADDR *aligned_addr_p,
-- int *aligned_offset_p, int *aligned_len_p,
-- CORE_ADDR *next_addr_p, int *next_len_p,
-- CORE_ADDR *next_addr_orig_p)
--{
-- int aligned_len;
-- unsigned int offset, aligned_offset;
-- CORE_ADDR aligned_addr;
-- const unsigned int alignment = AARCH64_HWP_ALIGNMENT;
-- const unsigned int max_wp_len = AARCH64_HWP_MAX_LEN_PER_REG;
--
-- /* As assumed by the algorithm. */
-- gdb_assert (alignment == max_wp_len);
--
-- if (len <= 0)
-- return;
--
-- /* The address put into the hardware watchpoint value register must
-- be aligned. */
-- offset = addr & (alignment - 1);
-- aligned_addr = addr - offset;
-- aligned_offset
-- = kernel_supports_any_contiguous_range ? addr & (alignment - 1) : 0;
--
-- gdb_assert (offset >= 0 && offset < alignment);
-- gdb_assert (aligned_addr >= 0 && aligned_addr <= addr);
-- gdb_assert (offset + len > 0);
--
-- if (offset + len >= max_wp_len)
-- {
-- /* Need more than one watchpoint register; truncate at the
-- alignment boundary. */
-- aligned_len
-- = max_wp_len - (kernel_supports_any_contiguous_range ? offset : 0);
-- len -= (max_wp_len - offset);
-- addr += (max_wp_len - offset);
-- gdb_assert ((addr & (alignment - 1)) == 0);
-- }
-- else
-- {
-- /* Find the smallest valid length that is large enough to
-- accommodate this watchpoint. */
-- static const unsigned char
-- aligned_len_array[AARCH64_HWP_MAX_LEN_PER_REG] =
-- { 1, 2, 4, 4, 8, 8, 8, 8 };
--
-- aligned_len = (kernel_supports_any_contiguous_range
-- ? len : aligned_len_array[offset + len - 1]);
-- addr += len;
-- len = 0;
-- }
--
-- if (aligned_addr_p)
-- *aligned_addr_p = aligned_addr;
-- if (aligned_offset_p)
-- *aligned_offset_p = aligned_offset;
-- if (aligned_len_p)
-- *aligned_len_p = aligned_len;
-- if (next_addr_p)
-- *next_addr_p = addr;
-- if (next_len_p)
-- *next_len_p = len;
-- if (next_addr_orig_p)
-- *next_addr_orig_p = align_down (*next_addr_orig_p + alignment, alignment);
--}
-+bool kernel_supports_any_contiguous_range = true;
-
- /* Helper for aarch64_notify_debug_reg_change. Records the
- information about the change of one hardware breakpoint/watchpoint
-@@ -349,11 +102,11 @@ debug_reg_change_callback (struct lwp_info *lwp, int is_watchpoint,
- thread's arch-specific data area, the actual updating will be done
- when the thread is resumed. */
-
--static void
--aarch64_notify_debug_reg_change (const struct aarch64_debug_reg_state *state,
-+void
-+aarch64_notify_debug_reg_change (ptid_t ptid,
- int is_watchpoint, unsigned int idx)
- {
-- ptid_t pid_ptid = ptid_t (current_lwp_ptid ().pid ());
-+ ptid_t pid_ptid = ptid_t (ptid.pid ());
-
- iterate_over_lwps (pid_ptid, [=] (struct lwp_info *info)
- {
-@@ -414,261 +167,11 @@ aarch64_downgrade_regs (struct aarch64_debug_reg_state *state)
- break;
- }
-
-- aarch64_notify_debug_reg_change (state, 1 /* is_watchpoint */, i);
-+ aarch64_notify_debug_reg_change (current_lwp_ptid (),
-+ 1 /* is_watchpoint */, i);
- }
- }
-
--/* Record the insertion of one breakpoint/watchpoint, as represented
-- by ADDR and CTRL, in the process' arch-specific data area *STATE. */
--
--static int
--aarch64_dr_state_insert_one_point (struct aarch64_debug_reg_state *state,
-- enum target_hw_bp_type type,
-- CORE_ADDR addr, int offset, int len,
-- CORE_ADDR addr_orig)
--{
-- int i, idx, num_regs, is_watchpoint;
-- unsigned int ctrl, *dr_ctrl_p, *dr_ref_count;
-- CORE_ADDR *dr_addr_p, *dr_addr_orig_p;
--
-- /* Set up state pointers. */
-- is_watchpoint = (type != hw_execute);
-- gdb_assert (aarch64_point_is_aligned (is_watchpoint, addr, len));
-- if (is_watchpoint)
-- {
-- num_regs = aarch64_num_wp_regs;
-- dr_addr_p = state->dr_addr_wp;
-- dr_addr_orig_p = state->dr_addr_orig_wp;
-- dr_ctrl_p = state->dr_ctrl_wp;
-- dr_ref_count = state->dr_ref_count_wp;
-- }
-- else
-- {
-- num_regs = aarch64_num_bp_regs;
-- dr_addr_p = state->dr_addr_bp;
-- dr_addr_orig_p = nullptr;
-- dr_ctrl_p = state->dr_ctrl_bp;
-- dr_ref_count = state->dr_ref_count_bp;
-- }
--
-- ctrl = aarch64_point_encode_ctrl_reg (type, offset, len);
--
-- /* Find an existing or free register in our cache. */
-- idx = -1;
-- for (i = 0; i < num_regs; ++i)
-- {
-- if ((dr_ctrl_p[i] & 1) == 0)
-- {
-- gdb_assert (dr_ref_count[i] == 0);
-- idx = i;
-- /* no break; continue hunting for an exising one. */
-- }
-- else if (dr_addr_p[i] == addr
-- && (dr_addr_orig_p == nullptr || dr_addr_orig_p[i] == addr_orig)
-- && dr_ctrl_p[i] == ctrl)
-- {
-- gdb_assert (dr_ref_count[i] != 0);
-- idx = i;
-- break;
-- }
-- }
--
-- /* No space. */
-- if (idx == -1)
-- return -1;
--
-- /* Update our cache. */
-- if ((dr_ctrl_p[idx] & 1) == 0)
-- {
-- /* new entry */
-- dr_addr_p[idx] = addr;
-- if (dr_addr_orig_p != nullptr)
-- dr_addr_orig_p[idx] = addr_orig;
-- dr_ctrl_p[idx] = ctrl;
-- dr_ref_count[idx] = 1;
-- /* Notify the change. */
-- aarch64_notify_debug_reg_change (state, is_watchpoint, idx);
-- }
-- else
-- {
-- /* existing entry */
-- dr_ref_count[idx]++;
-- }
--
-- return 0;
--}
--
--/* Record the removal of one breakpoint/watchpoint, as represented by
-- ADDR and CTRL, in the process' arch-specific data area *STATE. */
--
--static int
--aarch64_dr_state_remove_one_point (struct aarch64_debug_reg_state *state,
-- enum target_hw_bp_type type,
-- CORE_ADDR addr, int offset, int len,
-- CORE_ADDR addr_orig)
--{
-- int i, num_regs, is_watchpoint;
-- unsigned int ctrl, *dr_ctrl_p, *dr_ref_count;
-- CORE_ADDR *dr_addr_p, *dr_addr_orig_p;
--
-- /* Set up state pointers. */
-- is_watchpoint = (type != hw_execute);
-- if (is_watchpoint)
-- {
-- num_regs = aarch64_num_wp_regs;
-- dr_addr_p = state->dr_addr_wp;
-- dr_addr_orig_p = state->dr_addr_orig_wp;
-- dr_ctrl_p = state->dr_ctrl_wp;
-- dr_ref_count = state->dr_ref_count_wp;
-- }
-- else
-- {
-- num_regs = aarch64_num_bp_regs;
-- dr_addr_p = state->dr_addr_bp;
-- dr_addr_orig_p = nullptr;
-- dr_ctrl_p = state->dr_ctrl_bp;
-- dr_ref_count = state->dr_ref_count_bp;
-- }
--
-- ctrl = aarch64_point_encode_ctrl_reg (type, offset, len);
--
-- /* Find the entry that matches the ADDR and CTRL. */
-- for (i = 0; i < num_regs; ++i)
-- if (dr_addr_p[i] == addr
-- && (dr_addr_orig_p == nullptr || dr_addr_orig_p[i] == addr_orig)
-- && dr_ctrl_p[i] == ctrl)
-- {
-- gdb_assert (dr_ref_count[i] != 0);
-- break;
-- }
--
-- /* Not found. */
-- if (i == num_regs)
-- return -1;
--
-- /* Clear our cache. */
-- if (--dr_ref_count[i] == 0)
-- {
-- /* Clear the enable bit. */
-- ctrl &= ~1;
-- dr_addr_p[i] = 0;
-- if (dr_addr_orig_p != nullptr)
-- dr_addr_orig_p[i] = 0;
-- dr_ctrl_p[i] = ctrl;
-- /* Notify the change. */
-- aarch64_notify_debug_reg_change (state, is_watchpoint, i);
-- }
--
-- return 0;
--}
--
--int
--aarch64_handle_breakpoint (enum target_hw_bp_type type, CORE_ADDR addr,
-- int len, int is_insert,
-- struct aarch64_debug_reg_state *state)
--{
-- if (is_insert)
-- {
-- /* The hardware breakpoint on AArch64 should always be 4-byte
-- aligned, but on AArch32, it can be 2-byte aligned. Note that
-- we only check the alignment on inserting breakpoint because
-- aarch64_point_is_aligned needs the inferior_ptid inferior's
-- regcache to decide whether the inferior is 32-bit or 64-bit.
-- However when GDB follows the parent process and detach breakpoints
-- from child process, inferior_ptid is the child ptid, but the
-- child inferior doesn't exist in GDB's view yet. */
-- if (!aarch64_point_is_aligned (0 /* is_watchpoint */ , addr, len))
-- return -1;
--
-- return aarch64_dr_state_insert_one_point (state, type, addr, 0, len, -1);
-- }
-- else
-- return aarch64_dr_state_remove_one_point (state, type, addr, 0, len, -1);
--}
--
--/* This is essentially the same as aarch64_handle_breakpoint, apart
-- from that it is an aligned watchpoint to be handled. */
--
--static int
--aarch64_handle_aligned_watchpoint (enum target_hw_bp_type type,
-- CORE_ADDR addr, int len, int is_insert,
-- struct aarch64_debug_reg_state *state)
--{
-- if (is_insert)
-- return aarch64_dr_state_insert_one_point (state, type, addr, 0, len, addr);
-- else
-- return aarch64_dr_state_remove_one_point (state, type, addr, 0, len, addr);
--}
--
--/* Insert/remove unaligned watchpoint by calling
-- aarch64_align_watchpoint repeatedly until the whole watched region,
-- as represented by ADDR and LEN, has been properly aligned and ready
-- to be written to one or more hardware watchpoint registers.
-- IS_INSERT indicates whether this is an insertion or a deletion.
-- Return 0 if succeed. */
--
--static int
--aarch64_handle_unaligned_watchpoint (enum target_hw_bp_type type,
-- CORE_ADDR addr, int len, int is_insert,
-- struct aarch64_debug_reg_state *state)
--{
-- CORE_ADDR addr_orig = addr;
--
-- while (len > 0)
-- {
-- CORE_ADDR aligned_addr;
-- int aligned_offset, aligned_len, ret;
-- CORE_ADDR addr_orig_next = addr_orig;
--
-- aarch64_align_watchpoint (addr, len, &aligned_addr, &aligned_offset,
-- &aligned_len, &addr, &len, &addr_orig_next);
--
-- if (is_insert)
-- ret = aarch64_dr_state_insert_one_point (state, type, aligned_addr,
-- aligned_offset,
-- aligned_len, addr_orig);
-- else
-- ret = aarch64_dr_state_remove_one_point (state, type, aligned_addr,
-- aligned_offset,
-- aligned_len, addr_orig);
--
-- if (show_debug_regs)
-- debug_printf ("handle_unaligned_watchpoint: is_insert: %d\n"
-- " "
-- "aligned_addr: %s, aligned_len: %d\n"
-- " "
-- "addr_orig: %s\n"
-- " "
-- "next_addr: %s, next_len: %d\n"
-- " "
-- "addr_orig_next: %s\n",
-- is_insert, core_addr_to_string_nz (aligned_addr),
-- aligned_len, core_addr_to_string_nz (addr_orig),
-- core_addr_to_string_nz (addr), len,
-- core_addr_to_string_nz (addr_orig_next));
--
-- addr_orig = addr_orig_next;
--
-- if (ret != 0)
-- return ret;
-- }
--
-- return 0;
--}
--
--int
--aarch64_handle_watchpoint (enum target_hw_bp_type type, CORE_ADDR addr,
-- int len, int is_insert,
-- struct aarch64_debug_reg_state *state)
--{
-- if (aarch64_point_is_aligned (1 /* is_watchpoint */ , addr, len))
-- return aarch64_handle_aligned_watchpoint (type, addr, len, is_insert,
-- state);
-- else
-- return aarch64_handle_unaligned_watchpoint (type, addr, len, is_insert,
-- state);
--}
--
- /* Call ptrace to set the thread TID's hardware breakpoint/watchpoint
- registers with data from *STATE. */
-
-@@ -715,60 +218,6 @@ aarch64_linux_set_debug_regs (struct aarch64_debug_reg_state *state,
- }
- }
-
--/* See nat/aarch64-linux-hw-point.h. */
--
--bool
--aarch64_linux_any_set_debug_regs_state (aarch64_debug_reg_state *state,
-- bool watchpoint)
--{
-- int count = watchpoint ? aarch64_num_wp_regs : aarch64_num_bp_regs;
-- if (count == 0)
-- return false;
--
-- const CORE_ADDR *addr = watchpoint ? state->dr_addr_wp : state->dr_addr_bp;
-- const unsigned int *ctrl = watchpoint ? state->dr_ctrl_wp : state->dr_ctrl_bp;
--
-- for (int i = 0; i < count; i++)
-- if (addr[i] != 0 || ctrl[i] != 0)
-- return true;
--
-- return false;
--}
--
--/* Print the values of the cached breakpoint/watchpoint registers. */
--
--void
--aarch64_show_debug_reg_state (struct aarch64_debug_reg_state *state,
-- const char *func, CORE_ADDR addr,
-- int len, enum target_hw_bp_type type)
--{
-- int i;
--
-- debug_printf ("%s", func);
-- if (addr || len)
-- debug_printf (" (addr=0x%08lx, len=%d, type=%s)",
-- (unsigned long) addr, len,
-- type == hw_write ? "hw-write-watchpoint"
-- : (type == hw_read ? "hw-read-watchpoint"
-- : (type == hw_access ? "hw-access-watchpoint"
-- : (type == hw_execute ? "hw-breakpoint"
-- : "??unknown??"))));
-- debug_printf (":\n");
--
-- debug_printf ("\tBREAKPOINTs:\n");
-- for (i = 0; i < aarch64_num_bp_regs; i++)
-- debug_printf ("\tBP%d: addr=%s, ctrl=0x%08x, ref.count=%d\n",
-- i, core_addr_to_string_nz (state->dr_addr_bp[i]),
-- state->dr_ctrl_bp[i], state->dr_ref_count_bp[i]);
--
-- debug_printf ("\tWATCHPOINTs:\n");
-- for (i = 0; i < aarch64_num_wp_regs; i++)
-- debug_printf ("\tWP%d: addr=%s (orig=%s), ctrl=0x%08x, ref.count=%d\n",
-- i, core_addr_to_string_nz (state->dr_addr_wp[i]),
-- core_addr_to_string_nz (state->dr_addr_orig_wp[i]),
-- state->dr_ctrl_wp[i], state->dr_ref_count_wp[i]);
--}
--
- /* Return true if debug arch level is compatible for hw watchpoints
- and breakpoints. */
-
-@@ -839,43 +288,3 @@ aarch64_linux_get_debug_reg_capacity (int tid)
- aarch64_num_bp_regs = 0;
- }
- }
--
--/* Return true if we can watch a memory region that starts address
-- ADDR and whose length is LEN in bytes. */
--
--int
--aarch64_linux_region_ok_for_watchpoint (CORE_ADDR addr, int len)
--{
-- CORE_ADDR aligned_addr;
--
-- /* Can not set watchpoints for zero or negative lengths. */
-- if (len <= 0)
-- return 0;
--
-- /* Must have hardware watchpoint debug register(s). */
-- if (aarch64_num_wp_regs == 0)
-- return 0;
--
-- /* We support unaligned watchpoint address and arbitrary length,
-- as long as the size of the whole watched area after alignment
-- doesn't exceed size of the total area that all watchpoint debug
-- registers can watch cooperatively.
--
-- This is a very relaxed rule, but unfortunately there are
-- limitations, e.g. false-positive hits, due to limited support of
-- hardware debug registers in the kernel. See comment above
-- aarch64_align_watchpoint for more information. */
--
-- aligned_addr = addr & ~(AARCH64_HWP_MAX_LEN_PER_REG - 1);
-- if (aligned_addr + aarch64_num_wp_regs * AARCH64_HWP_MAX_LEN_PER_REG
-- < addr + len)
-- return 0;
--
-- /* All tests passed so we are likely to be able to set the watchpoint.
-- The reason that it is 'likely' rather than 'must' is because
-- we don't check the current usage of the watchpoint registers, and
-- there may not be enough registers available for this watchpoint.
-- Ideally we should check the cached debug register state, however
-- the checking is costly. */
-- return 1;
--}
-diff --git a/gdb/nat/aarch64-linux-hw-point.h b/gdb/nat/aarch64-linux-hw-point.h
-index c746a7622a0..7c694ff0882 100644
---- gdb/nat/aarch64-linux-hw-point.h
-+++ gdb/nat/aarch64-linux-hw-point.h
-@@ -21,40 +21,7 @@
-
- #include "gdbsupport/break-common.h" /* For enum target_hw_bp_type. */
-
--/* Macro definitions, data structures, and code for the hardware
-- breakpoint and hardware watchpoint support follow. We use the
-- following abbreviations throughout the code:
--
-- hw - hardware
-- bp - breakpoint
-- wp - watchpoint */
--
--/* Maximum number of hardware breakpoint and watchpoint registers.
-- Neither of these values may exceed the width of dr_changed_t
-- measured in bits. */
--
--#define AARCH64_HBP_MAX_NUM 16
--#define AARCH64_HWP_MAX_NUM 16
--
--/* Alignment requirement in bytes for addresses written to
-- hardware breakpoint and watchpoint value registers.
--
-- A ptrace call attempting to set an address that does not meet the
-- alignment criteria will fail. Limited support has been provided in
-- this port for unaligned watchpoints, such that from a GDB user
-- perspective, an unaligned watchpoint may be requested.
--
-- This is achieved by minimally enlarging the watched area to meet the
-- alignment requirement, and if necessary, splitting the watchpoint
-- over several hardware watchpoint registers. */
--
--#define AARCH64_HBP_ALIGNMENT 4
--#define AARCH64_HWP_ALIGNMENT 8
--
--/* The maximum length of a memory region that can be watched by one
-- hardware watchpoint register. */
--
--#define AARCH64_HWP_MAX_LEN_PER_REG 8
-+#include "nat/aarch64-hw-point.h"
-
- /* ptrace hardware breakpoint resource info is formatted as follows:
-
-@@ -68,24 +35,6 @@
- #define AARCH64_DEBUG_NUM_SLOTS(x) ((x) & 0xff)
- #define AARCH64_DEBUG_ARCH(x) (((x) >> 8) & 0xff)
-
--/* Macro for the expected version of the ARMv8-A debug architecture. */
--#define AARCH64_DEBUG_ARCH_V8 0x6
--#define AARCH64_DEBUG_ARCH_V8_1 0x7
--#define AARCH64_DEBUG_ARCH_V8_2 0x8
--#define AARCH64_DEBUG_ARCH_V8_4 0x9
--
--/* ptrace expects control registers to be formatted as follows:
--
-- 31 13 5 3 1 0
-- +--------------------------------+----------+------+------+----+
-- | RESERVED (SBZ) | MASK | TYPE | PRIV | EN |
-- +--------------------------------+----------+------+------+----+
--
-- The TYPE field is ignored for breakpoints. */
--
--#define DR_CONTROL_ENABLED(ctrl) (((ctrl) & 0x1) == 1)
--#define DR_CONTROL_MASK(ctrl) (((ctrl) >> 5) & 0xff)
--
- /* Each bit of a variable of this type is used to indicate whether a
- hardware breakpoint or watchpoint setting has been changed since
- the last update.
-@@ -133,29 +82,6 @@ typedef ULONGEST dr_changed_t;
- #define DR_HAS_CHANGED(x) ((x) != 0)
- #define DR_N_HAS_CHANGED(x, n) ((x) & ((dr_changed_t)1 << (n)))
-
--/* Structure for managing the hardware breakpoint/watchpoint resources.
-- DR_ADDR_* stores the address, DR_CTRL_* stores the control register
-- content, and DR_REF_COUNT_* counts the numbers of references to the
-- corresponding bp/wp, by which way the limited hardware resources
-- are not wasted on duplicated bp/wp settings (though so far gdb has
-- done a good job by not sending duplicated bp/wp requests). */
--
--struct aarch64_debug_reg_state
--{
-- /* hardware breakpoint */
-- CORE_ADDR dr_addr_bp[AARCH64_HBP_MAX_NUM];
-- unsigned int dr_ctrl_bp[AARCH64_HBP_MAX_NUM];
-- unsigned int dr_ref_count_bp[AARCH64_HBP_MAX_NUM];
--
-- /* hardware watchpoint */
-- /* Address aligned down to AARCH64_HWP_ALIGNMENT. */
-- CORE_ADDR dr_addr_wp[AARCH64_HWP_MAX_NUM];
-- /* Address as entered by user without any forced alignment. */
-- CORE_ADDR dr_addr_orig_wp[AARCH64_HWP_MAX_NUM];
-- unsigned int dr_ctrl_wp[AARCH64_HWP_MAX_NUM];
-- unsigned int dr_ref_count_wp[AARCH64_HWP_MAX_NUM];
--};
--
- /* Per-thread arch-specific data we want to keep. */
-
- struct arch_lwp_info
-@@ -167,35 +93,20 @@ struct arch_lwp_info
- dr_changed_t dr_changed_wp;
- };
-
--extern int aarch64_num_bp_regs;
--extern int aarch64_num_wp_regs;
-+/* True if this kernel does not have the bug described by PR
-+ external/20207 (Linux >= 4.10). A fixed kernel supports any
-+ contiguous range of bits in 8-bit byte DR_CONTROL_MASK. A buggy
-+ kernel supports only 0x01, 0x03, 0x0f and 0xff. We start by
-+ assuming the bug is fixed, and then detect the bug at
-+ PTRACE_SETREGSET time. */
-
--unsigned int aarch64_watchpoint_offset (unsigned int ctrl);
--unsigned int aarch64_watchpoint_length (unsigned int ctrl);
--
--int aarch64_handle_breakpoint (enum target_hw_bp_type type, CORE_ADDR addr,
-- int len, int is_insert,
-- struct aarch64_debug_reg_state *state);
--int aarch64_handle_watchpoint (enum target_hw_bp_type type, CORE_ADDR addr,
-- int len, int is_insert,
-- struct aarch64_debug_reg_state *state);
-+extern bool kernel_supports_any_contiguous_range;
-
- void aarch64_linux_set_debug_regs (struct aarch64_debug_reg_state *state,
- int tid, int watchpoint);
-
--/* Return TRUE if there are any hardware breakpoints. If WATCHPOINT is TRUE,
-- check hardware watchpoints instead. */
--bool aarch64_linux_any_set_debug_regs_state (aarch64_debug_reg_state *state,
-- bool watchpoint);
--
--void aarch64_show_debug_reg_state (struct aarch64_debug_reg_state *state,
-- const char *func, CORE_ADDR addr,
-- int len, enum target_hw_bp_type type);
--
- void aarch64_linux_get_debug_reg_capacity (int tid);
-
- struct aarch64_debug_reg_state *aarch64_get_debug_reg_state (pid_t pid);
-
--int aarch64_linux_region_ok_for_watchpoint (CORE_ADDR addr, int len);
--
- #endif /* NAT_AARCH64_LINUX_HW_POINT_H */
-diff --git a/gdb/nat/aarch64-linux.c b/gdb/nat/aarch64-linux.c
-index b2ed8f9a2a5..421d1ecb53c 100644
---- gdb/nat/aarch64-linux.c
-+++ gdb/nat/aarch64-linux.c
-@@ -81,9 +81,9 @@ aarch64_linux_new_thread (struct lwp_info *lwp)
- /* If there are hardware breakpoints/watchpoints in the process then mark that
- all the hardware breakpoint/watchpoint register pairs for this thread need
- to be initialized (with data from aarch_process_info.debug_reg_state). */
-- if (aarch64_linux_any_set_debug_regs_state (state, false))
-+ if (aarch64_any_set_debug_regs_state (state, false))
- DR_MARK_ALL_CHANGED (info->dr_changed_bp, aarch64_num_bp_regs);
-- if (aarch64_linux_any_set_debug_regs_state (state, true))
-+ if (aarch64_any_set_debug_regs_state (state, true))
- DR_MARK_ALL_CHANGED (info->dr_changed_wp, aarch64_num_wp_regs);
-
- lwp_set_arch_private_info (lwp, info);
-diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv
-index 6e09b0eeb79..d37053628fc 100644
---- gdbserver/configure.srv
-+++ gdbserver/configure.srv
-@@ -39,6 +39,7 @@ fi
-
- case "${gdbserver_host}" in
- aarch64*-*-linux*) srv_tgtobj="linux-aarch64-low.o"
-+ srv_tgtobj="$srv_tgtobj nat/aarch64-hw-point.o"
- srv_tgtobj="$srv_tgtobj nat/aarch64-linux-hw-point.o"
- srv_tgtobj="$srv_tgtobj linux-aarch32-low.o"
- srv_tgtobj="$srv_tgtobj linux-aarch32-tdesc.o"
-diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc
-index aef69b34525..0091f998c63 100644
---- gdbserver/linux-aarch64-low.cc
-+++ gdbserver/linux-aarch64-low.cc
-@@ -413,9 +413,10 @@ aarch64_target::low_insert_point (raw_bkpt_type type, CORE_ADDR addr,
-
- if (targ_type != hw_execute)
- {
-- if (aarch64_linux_region_ok_for_watchpoint (addr, len))
-+ if (aarch64_region_ok_for_watchpoint (addr, len))
- ret = aarch64_handle_watchpoint (targ_type, addr, len,
-- 1 /* is_insert */, state);
-+ 1 /* is_insert */,
-+ current_lwp_ptid (), state);
- else
- ret = -1;
- }
-@@ -429,7 +430,8 @@ aarch64_target::low_insert_point (raw_bkpt_type type, CORE_ADDR addr,
- len = 2;
- }
- ret = aarch64_handle_breakpoint (targ_type, addr, len,
-- 1 /* is_insert */, state);
-+ 1 /* is_insert */, current_lwp_ptid (),
-+ state);
- }
-
- if (show_debug_regs)
-@@ -464,7 +466,7 @@ aarch64_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr,
- if (targ_type != hw_execute)
- ret =
- aarch64_handle_watchpoint (targ_type, addr, len, 0 /* is_insert */,
-- state);
-+ current_lwp_ptid (), state);
- else
- {
- if (len == 3)
-@@ -475,7 +477,8 @@ aarch64_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr,
- len = 2;
- }
- ret = aarch64_handle_breakpoint (targ_type, addr, len,
-- 0 /* is_insert */, state);
-+ 0 /* is_insert */, current_lwp_ptid (),
-+ state);
- }
-
- if (show_debug_regs)
diff --git a/devel/gdb/files/commit-6719bc690e2 b/devel/gdb/files/commit-6719bc690e2
deleted file mode 100644
--- a/devel/gdb/files/commit-6719bc690e2
+++ /dev/null
@@ -1,48 +0,0 @@
-commit 20c8aa681d97f5ab8a8f374b23339777b1dc4353
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Mar 22 12:05:43 2022 -0700
-
- fbsd-nat: Add helper routine to fetch siginfo_t for a ptid.
-
- (cherry picked from commit 6719bc690e2829c50d3d3bb22ede1324e5baa12a)
-
-diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c
-index 6d76c8234d5..51234eaa6c9 100644
---- gdb/fbsd-nat.c
-+++ gdb/fbsd-nat.c
-@@ -1766,6 +1766,22 @@ fbsd_nat_target::store_register_set (struct regcache *regcache, int regnum,
- return false;
- }
-
-+/* See fbsd-nat.h. */
-+
-+bool
-+fbsd_nat_get_siginfo (ptid_t ptid, siginfo_t *siginfo)
-+{
-+ struct ptrace_lwpinfo pl;
-+ pid_t pid = get_ptrace_pid (ptid);
-+
-+ if (ptrace (PT_LWPINFO, pid, (caddr_t) &pl, sizeof pl) == -1)
-+ return false;
-+ if (!(pl.pl_flags & PL_FLAG_SI))
-+ return false;;
-+ *siginfo = pl.pl_siginfo;
-+ return (true);
-+}
-+
- void _initialize_fbsd_nat ();
- void
- _initialize_fbsd_nat ()
-diff --git a/gdb/fbsd-nat.h b/gdb/fbsd-nat.h
-index 2f17be5a8f0..d7c8eb81e96 100644
---- gdb/fbsd-nat.h
-+++ gdb/fbsd-nat.h
-@@ -166,4 +166,8 @@ class fbsd_nat_target : public inf_ptrace_target
- }
- };
-
-+/* Fetch the signal information for PTID and store it in *SIGINFO.
-+ Return true if successful. */
-+bool fbsd_nat_get_siginfo (ptid_t ptid, siginfo_t *siginfo);
-+
- #endif /* fbsd-nat.h */
diff --git a/devel/gdb/files/commit-684943d213b b/devel/gdb/files/commit-684943d213b
deleted file mode 100644
--- a/devel/gdb/files/commit-684943d213b
+++ /dev/null
@@ -1,102 +0,0 @@
-commit 1264775133315cab3598b3bceea4aa969e49715c
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue May 3 16:05:10 2022 -0700
-
- Fetch the NT_ARM_TLS register set for native FreeBSD/arm processes.
-
- This permits resolving TLS variables.
-
- (cherry picked from commit 684943d213b461a6a84ae67a9b8fcae5a28f007d)
-
-diff --git gdb/arm-fbsd-nat.c gdb/arm-fbsd-nat.c
-index c32924de735..a306e1e2ee0 100644
---- gdb/arm-fbsd-nat.c
-+++ gdb/arm-fbsd-nat.c
-@@ -18,13 +18,17 @@
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
-
- #include "defs.h"
-+#include "inferior.h"
- #include "target.h"
-
-+#include "elf/common.h"
-+
- #include <sys/types.h>
- #include <sys/ptrace.h>
- #include <machine/reg.h>
-
- #include "fbsd-nat.h"
-+#include "arm-tdep.h"
- #include "arm-fbsd-tdep.h"
- #include "inf-ptrace.h"
-
-@@ -49,6 +53,27 @@ arm_fbsd_nat_target::fetch_registers (struct regcache *regcache, int regnum)
- fetch_register_set<struct vfpreg> (regcache, regnum, PT_GETVFPREGS,
- &arm_fbsd_vfpregset);
- #endif
-+#ifdef PT_GETREGSET
-+ gdbarch *gdbarch = regcache->arch ();
-+ arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
-+
-+ if (tdep->tls_regnum > 0)
-+ {
-+ const struct regcache_map_entry arm_fbsd_tlsregmap[] =
-+ {
-+ { 1, tdep->tls_regnum, 4 },
-+ { 0 }
-+ };
-+
-+ const struct regset arm_fbsd_tlsregset =
-+ {
-+ arm_fbsd_tlsregmap,
-+ regcache_supply_regset, regcache_collect_regset
-+ };
-+
-+ fetch_regset<uint32_t> (regcache, regnum, NT_ARM_TLS, &arm_fbsd_tlsregset);
-+ }
-+#endif
- }
-
- /* Store register REGNUM back into the inferior. If REGNUM is -1, do
-@@ -63,6 +88,27 @@ arm_fbsd_nat_target::store_registers (struct regcache *regcache, int regnum)
- store_register_set<struct vfpreg> (regcache, regnum, PT_GETVFPREGS,
- PT_SETVFPREGS, &arm_fbsd_vfpregset);
- #endif
-+#ifdef PT_GETREGSET
-+ gdbarch *gdbarch = regcache->arch ();
-+ arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
-+
-+ if (tdep->tls_regnum > 0)
-+ {
-+ const struct regcache_map_entry arm_fbsd_tlsregmap[] =
-+ {
-+ { 1, tdep->tls_regnum, 4 },
-+ { 0 }
-+ };
-+
-+ const struct regset arm_fbsd_tlsregset =
-+ {
-+ arm_fbsd_tlsregmap,
-+ regcache_supply_regset, regcache_collect_regset
-+ };
-+
-+ store_regset<uint32_t> (regcache, regnum, NT_ARM_TLS, &arm_fbsd_tlsregset);
-+ }
-+#endif
- }
-
- /* Implement the to_read_description method. */
-@@ -71,8 +117,12 @@ const struct target_desc *
- arm_fbsd_nat_target::read_description ()
- {
- const struct target_desc *desc;
-+ bool tls = false;
-
-- desc = arm_fbsd_read_description_auxv (this, false);
-+#ifdef PT_GETREGSET
-+ tls = have_regset (inferior_ptid, NT_ARM_TLS) != 0;
-+#endif
-+ desc = arm_fbsd_read_description_auxv (this, tls);
- if (desc == NULL)
- desc = this->beneath ()->read_description ();
- return desc;
diff --git a/devel/gdb/files/commit-711b0b6698f b/devel/gdb/files/commit-711b0b6698f
deleted file mode 100644
--- a/devel/gdb/files/commit-711b0b6698f
+++ /dev/null
@@ -1,55 +0,0 @@
-commit 8a8b3a6ad25f6bd379f7cbd6cc1f9edcf076d940
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Mar 22 12:05:43 2022 -0700
-
- Remove USE_SIGTRAP_SIGINFO condition for FreeBSD/x86 debug regs support.
-
- For BSD x86 targets, stopped_by_hw_breakpoint doesn't check siginfo_t
- but inspects the DR6 register directly via PT_GETDBREGS.
-
- (cherry picked from commit 711b0b6698ff6350b7c61710491c76c749945d4a)
-
-diff --git a/gdb/amd64-fbsd-nat.c b/gdb/amd64-fbsd-nat.c
-index 98a1af03a66..368f4c10786 100644
---- gdb/amd64-fbsd-nat.c
-+++ gdb/amd64-fbsd-nat.c
-@@ -46,7 +46,7 @@ class amd64_fbsd_nat_target final
-
- const struct target_desc *read_description () override;
-
--#if defined(HAVE_PT_GETDBREGS) && defined(USE_SIGTRAP_SIGINFO)
-+#if defined(HAVE_PT_GETDBREGS)
- bool supports_stopped_by_hw_breakpoint () override;
- #endif
- };
-@@ -348,7 +348,7 @@ amd64_fbsd_nat_target::read_description ()
- return i386_target_description (X86_XSTATE_SSE_MASK, true);
- }
-
--#if defined(HAVE_PT_GETDBREGS) && defined(USE_SIGTRAP_SIGINFO)
-+#if defined(HAVE_PT_GETDBREGS)
- /* Implement the supports_stopped_by_hw_breakpoints method. */
-
- bool
-diff --git a/gdb/i386-fbsd-nat.c b/gdb/i386-fbsd-nat.c
-index a6ced66250c..023f24bab37 100644
---- gdb/i386-fbsd-nat.c
-+++ gdb/i386-fbsd-nat.c
-@@ -46,7 +46,7 @@ class i386_fbsd_nat_target final
-
- void resume (ptid_t, int, enum gdb_signal) override;
-
--#if defined(HAVE_PT_GETDBREGS) && defined(USE_SIGTRAP_SIGINFO)
-+#if defined(HAVE_PT_GETDBREGS)
- bool supports_stopped_by_hw_breakpoint () override;
- #endif
- };
-@@ -361,7 +361,7 @@ i386_fbsd_nat_target::read_description ()
- return i386_target_description (X86_XSTATE_X87_MASK, true);
- }
-
--#if defined(HAVE_PT_GETDBREGS) && defined(USE_SIGTRAP_SIGINFO)
-+#if defined(HAVE_PT_GETDBREGS)
- /* Implement the supports_stopped_by_hw_breakpoints method. */
-
- bool
diff --git a/devel/gdb/files/commit-8e6afe4013f b/devel/gdb/files/commit-8e6afe4013f
deleted file mode 100644
--- a/devel/gdb/files/commit-8e6afe4013f
+++ /dev/null
@@ -1,38 +0,0 @@
-commit 8e1e09542c37a8937af47fd740806ea71ff260e9
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Wed Apr 27 08:06:39 2022 -0700
-
- Create pseudo sections for NT_ARM_TLS notes on FreeBSD.
-
- bfd/ChangeLog:
-
- * elf.c (elfcore_grok_freebsd_note): Handle NT_ARM_TLS notes.
-
- (cherry picked from commit 8e6afe4013fd57f92eec4659439bc6e44b0446f8)
-
-diff --git a/bfd/ChangeLog b/bfd/ChangeLog
-index 10098014297..197bfd425a7 100644
---- bfd/ChangeLog
-+++ bfd/ChangeLog
-@@ -1,3 +1,7 @@
-+2022-04-27 John Baldwin <jhb@FreeBSD.org>
-+
-+ * elf.c (elfcore_grok_freebsd_note): Handle NT_ARM_TLS notes.
-+
- 2022-04-01 John Baldwin <jhb@FreeBSD.org>
-
- * elf-bfd.h (elfcore_write_x86_segbases): New.
-diff --git a/bfd/elf.c b/bfd/elf.c
-index 37c53cfdf32..e9148dbecab 100644
---- bfd/elf.c
-+++ bfd/elf.c
-@@ -11037,6 +11037,9 @@ elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note)
- return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.lwpinfo",
- note);
-
-+ case NT_ARM_TLS:
-+ return elfcore_grok_aarch_tls (abfd, note);
-+
- case NT_ARM_VFP:
- return elfcore_grok_arm_vfp (abfd, note);
-
diff --git a/devel/gdb/files/commit-922c2fc18e4 b/devel/gdb/files/commit-922c2fc18e4
deleted file mode 100644
--- a/devel/gdb/files/commit-922c2fc18e4
+++ /dev/null
@@ -1,132 +0,0 @@
-commit 0167735706a3328fb8d2206e6eae472e231e8695
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Mar 22 12:05:43 2022 -0700
-
- x86-nat: Use an unordered_map to store per-pid debug reg state.
-
- This replaces a manual linked list which used O(n) lookup and removal.
-
- (cherry picked from commit 922c2fc18e4de33d24b6ba3b7b6e8732209a5e69)
-
-diff --git a/gdb/x86-nat.c b/gdb/x86-nat.c
-index d0d52a00265..c1e892bf564 100644
---- gdb/x86-nat.c
-+++ gdb/x86-nat.c
-@@ -22,6 +22,8 @@
- #include "gdbcmd.h"
- #include "inferior.h"
-
-+#include <unordered_map>
-+
- /* Support for hardware watchpoints and breakpoints using the x86
- debug registers.
-
-@@ -36,75 +38,20 @@
- /* Low-level function vector. */
- struct x86_dr_low_type x86_dr_low;
-
--/* Per-process data. We don't bind this to a per-inferior registry
-- because of targets like x86 GNU/Linux that need to keep track of
-- processes that aren't bound to any inferior (e.g., fork children,
-- checkpoints). */
-+/* Hash table storing per-process data. We don't bind this to a
-+ per-inferior registry because of targets like x86 GNU/Linux that
-+ need to keep track of processes that aren't bound to any inferior
-+ (e.g., fork children, checkpoints). */
-
--struct x86_process_info
--{
-- /* Linked list. */
-- struct x86_process_info *next;
--
-- /* The process identifier. */
-- pid_t pid;
--
-- /* Copy of x86 hardware debug registers. */
-- struct x86_debug_reg_state state;
--};
--
--static struct x86_process_info *x86_process_list = NULL;
--
--/* Find process data for process PID. */
--
--static struct x86_process_info *
--x86_find_process_pid (pid_t pid)
--{
-- struct x86_process_info *proc;
--
-- for (proc = x86_process_list; proc; proc = proc->next)
-- if (proc->pid == pid)
-- return proc;
--
-- return NULL;
--}
--
--/* Add process data for process PID. Returns newly allocated info
-- object. */
--
--static struct x86_process_info *
--x86_add_process (pid_t pid)
--{
-- struct x86_process_info *proc = XCNEW (struct x86_process_info);
--
-- proc->pid = pid;
-- proc->next = x86_process_list;
-- x86_process_list = proc;
--
-- return proc;
--}
--
--/* Get data specific info for process PID, creating it if necessary.
-- Never returns NULL. */
--
--static struct x86_process_info *
--x86_process_info_get (pid_t pid)
--{
-- struct x86_process_info *proc;
--
-- proc = x86_find_process_pid (pid);
-- if (proc == NULL)
-- proc = x86_add_process (pid);
--
-- return proc;
--}
-+static std::unordered_map<pid_t,
-+ struct x86_debug_reg_state> x86_debug_process_state;
-
- /* Get debug registers state for process PID. */
-
- struct x86_debug_reg_state *
- x86_debug_reg_state (pid_t pid)
- {
-- return &x86_process_info_get (pid)->state;
-+ return &x86_debug_process_state[pid];
- }
-
- /* See declaration in x86-nat.h. */
-@@ -112,24 +59,7 @@ x86_debug_reg_state (pid_t pid)
- void
- x86_forget_process (pid_t pid)
- {
-- struct x86_process_info *proc, **proc_link;
--
-- proc = x86_process_list;
-- proc_link = &x86_process_list;
--
-- while (proc != NULL)
-- {
-- if (proc->pid == pid)
-- {
-- *proc_link = proc->next;
--
-- xfree (proc);
-- return;
-- }
--
-- proc_link = &proc->next;
-- proc = *proc_link;
-- }
-+ x86_debug_process_state.erase (pid);
- }
-
- /* Clear the reference counts and forget everything we knew about the
diff --git a/devel/gdb/files/commit-92d48a1e4ea b/devel/gdb/files/commit-92d48a1e4ea
deleted file mode 100644
--- a/devel/gdb/files/commit-92d48a1e4ea
+++ /dev/null
@@ -1,288 +0,0 @@
-commit 1a0c401bbc882307404666733808666715f93dd7
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue May 3 16:05:10 2022 -0700
-
- Add an arm-tls feature which includes the tpidruro register from CP15.
-
- (cherry picked from commit 92d48a1e4eac54db11f1a110328672394fce2853)
-
-diff --git gdb/arch/aarch32.c gdb/arch/aarch32.c
-index 0c544d381f1..4d6ffb44a15 100644
---- gdb/arch/aarch32.c
-+++ gdb/arch/aarch32.c
-@@ -19,6 +19,7 @@
- #include "aarch32.h"
-
- #include "../features/arm/arm-core.c"
-+#include "../features/arm/arm-tls.c"
- #include "../features/arm/arm-vfpv3.c"
-
- /* See aarch32.h. */
-@@ -38,6 +39,7 @@ aarch32_create_target_description ()
- /* Create a vfpv3 feature, then a blank NEON feature. */
- regnum = create_feature_arm_arm_vfpv3 (tdesc.get (), regnum);
- tdesc_create_feature (tdesc.get (), "org.gnu.gdb.arm.neon");
-+ regnum = create_feature_arm_arm_tls (tdesc.get (), regnum);
-
- return tdesc.release ();
- }
-diff --git gdb/arch/arm.c gdb/arch/arm.c
-index 126e46a950a..15b600e22f4 100644
---- gdb/arch/arm.c
-+++ gdb/arch/arm.c
-@@ -22,6 +22,7 @@
- #include "arm.h"
-
- #include "../features/arm/arm-core.c"
-+#include "../features/arm/arm-tls.c"
- #include "../features/arm/arm-vfpv2.c"
- #include "../features/arm/arm-vfpv3.c"
- #include "../features/arm/xscale-iwmmxt.c"
-@@ -373,7 +374,7 @@ shifted_reg_val (struct regcache *regcache, unsigned long inst,
- /* See arch/arm.h. */
-
- target_desc *
--arm_create_target_description (arm_fp_type fp_type)
-+arm_create_target_description (arm_fp_type fp_type, bool tls)
- {
- target_desc_up tdesc = allocate_target_description ();
-
-@@ -409,6 +410,9 @@ arm_create_target_description (arm_fp_type fp_type)
- error (_("Invalid Arm FP type: %d"), fp_type);
- }
-
-+ if (tls)
-+ regnum = create_feature_arm_arm_tls (tdesc.get (), regnum);
-+
- return tdesc.release ();
- }
-
-diff --git gdb/arch/arm.h gdb/arch/arm.h
-index f75470e7572..2873effae8b 100644
---- gdb/arch/arm.h
-+++ gdb/arch/arm.h
-@@ -193,7 +193,7 @@ unsigned long shifted_reg_val (struct regcache *regcache,
-
- /* Create an Arm target description with the given FP hardware type. */
-
--target_desc *arm_create_target_description (arm_fp_type fp_type);
-+target_desc *arm_create_target_description (arm_fp_type fp_type, bool tls);
-
- /* Create an Arm M-profile target description with the given hardware type. */
-
-diff --git gdb/arm-fbsd-tdep.c gdb/arm-fbsd-tdep.c
-index bf337b13f98..06745a36186 100644
---- gdb/arm-fbsd-tdep.c
-+++ gdb/arm-fbsd-tdep.c
-@@ -188,9 +188,9 @@ arm_fbsd_read_description_auxv (struct target_ops *target)
- return aarch32_read_description ();
- else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPD32))
- == (HWCAP_VFPv3 | HWCAP_VFPD32))
-- return arm_read_description (ARM_FP_TYPE_VFPV3);
-+ return arm_read_description (ARM_FP_TYPE_VFPV3, false);
- else
-- return arm_read_description (ARM_FP_TYPE_VFPV2);
-+ return arm_read_description (ARM_FP_TYPE_VFPV2, false);
- }
-
- return nullptr;
-diff --git gdb/arm-linux-nat.c gdb/arm-linux-nat.c
-index f0f09acf2f9..2abaf5a675d 100644
---- gdb/arm-linux-nat.c
-+++ gdb/arm-linux-nat.c
-@@ -550,7 +550,7 @@ arm_linux_nat_target::read_description ()
- }
-
- if (arm_hwcap & HWCAP_IWMMXT)
-- return arm_read_description (ARM_FP_TYPE_IWMMXT);
-+ return arm_read_description (ARM_FP_TYPE_IWMMXT, false);
-
- if (arm_hwcap & HWCAP_VFP)
- {
-@@ -567,9 +567,9 @@ arm_linux_nat_target::read_description ()
- if (arm_hwcap & HWCAP_NEON)
- return aarch32_read_description ();
- else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
-- return arm_read_description (ARM_FP_TYPE_VFPV3);
-+ return arm_read_description (ARM_FP_TYPE_VFPV3, false);
-
-- return arm_read_description (ARM_FP_TYPE_VFPV2);
-+ return arm_read_description (ARM_FP_TYPE_VFPV2, false);
- }
-
- return this->beneath ()->read_description ();
-diff --git gdb/arm-linux-tdep.c gdb/arm-linux-tdep.c
-index 6aac016afb9..805c6ac0459 100644
---- gdb/arm-linux-tdep.c
-+++ gdb/arm-linux-tdep.c
-@@ -741,9 +741,9 @@ arm_linux_core_read_description (struct gdbarch *gdbarch,
- if (arm_hwcap & HWCAP_NEON)
- return aarch32_read_description ();
- else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
-- return arm_read_description (ARM_FP_TYPE_VFPV3);
-+ return arm_read_description (ARM_FP_TYPE_VFPV3, false);
-
-- return arm_read_description (ARM_FP_TYPE_VFPV2);
-+ return arm_read_description (ARM_FP_TYPE_VFPV2, false);
- }
-
- return nullptr;
-diff --git gdb/arm-netbsd-nat.c gdb/arm-netbsd-nat.c
-index 591a0ab1d54..764bbe8cd3d 100644
---- gdb/arm-netbsd-nat.c
-+++ gdb/arm-netbsd-nat.c
-@@ -346,13 +346,13 @@ arm_netbsd_nat_target::read_description ()
-
- if (sysctlbyname("machdep.fpu_present", &flag, &len, NULL, 0) != 0
- || !flag)
-- return arm_read_description (ARM_FP_TYPE_NONE);
-+ return arm_read_description (ARM_FP_TYPE_NONE, false);
-
- len = sizeof(flag);
- if (sysctlbyname("machdep.neon_present", &flag, &len, NULL, 0) == 0 && flag)
- return aarch32_read_description ();
-
-- return arm_read_description (ARM_FP_TYPE_VFPV3);
-+ return arm_read_description (ARM_FP_TYPE_VFPV3, false);
- }
-
- void _initialize_arm_netbsd_nat ();
-diff --git gdb/arm-tdep.c gdb/arm-tdep.c
-index 8e245648f23..0c87388bc11 100644
---- gdb/arm-tdep.c
-+++ gdb/arm-tdep.c
-@@ -239,7 +239,7 @@ static const char **valid_disassembly_styles;
- static const char *disassembly_style;
-
- /* All possible arm target descriptors. */
--static struct target_desc *tdesc_arm_list[ARM_FP_TYPE_INVALID];
-+static struct target_desc *tdesc_arm_list[ARM_FP_TYPE_INVALID][2];
- static struct target_desc *tdesc_arm_mprofile_list[ARM_M_TYPE_INVALID];
-
- /* This is used to keep the bfd arch_info in sync with the disassembly
-@@ -9100,6 +9100,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
- bool have_mve = false;
- int mve_vpr_regnum = -1;
- int register_count = ARM_NUM_REGS;
-+ int tls_regnum = 0;
-
- /* If we have an object to base this architecture on, try to determine
- its ABI. */
-@@ -9410,6 +9411,19 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
- }
- }
-
-+ /* Check for the TLS register feature. */
-+ feature = tdesc_find_feature (tdesc, "org.gnu.gdb.arm.tls");
-+ if (feature != nullptr)
-+ {
-+ valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
-+ register_count, "tpidruro");
-+ if (!valid_p)
-+ return nullptr;
-+
-+ tls_regnum = register_count;
-+ register_count++;
-+ }
-+
- /* Check for MVE after all the checks for GPR's, VFP and Neon.
- MVE (Helium) is an M-profile extension. */
- if (is_m)
-@@ -9493,6 +9507,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
- tdep->have_s_pseudos = have_s_pseudos;
- tdep->have_q_pseudos = have_q_pseudos;
- tdep->have_neon = have_neon;
-+ tdep->tls_regnum = tls_regnum;
-
- /* Adjust the MVE feature settings. */
- if (have_mve)
-@@ -13725,14 +13740,14 @@ arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
- /* See arm-tdep.h. */
-
- const target_desc *
--arm_read_description (arm_fp_type fp_type)
-+arm_read_description (arm_fp_type fp_type, bool tls)
- {
-- struct target_desc *tdesc = tdesc_arm_list[fp_type];
-+ struct target_desc *tdesc = tdesc_arm_list[fp_type][tls];
-
- if (tdesc == nullptr)
- {
-- tdesc = arm_create_target_description (fp_type);
-- tdesc_arm_list[fp_type] = tdesc;
-+ tdesc = arm_create_target_description (fp_type, tls);
-+ tdesc_arm_list[fp_type][tls] = tdesc;
- }
-
- return tdesc;
-diff --git gdb/arm-tdep.h gdb/arm-tdep.h
-index 8a9f618539f..ddcd08a4dc9 100644
---- gdb/arm-tdep.h
-+++ gdb/arm-tdep.h
-@@ -119,6 +119,8 @@ struct arm_gdbarch_tdep : gdbarch_tdep
- int mve_pseudo_base = 0; /* Number of the first MVE pseudo register. */
- int mve_pseudo_count = 0; /* Total number of MVE pseudo registers. */
-
-+ int tls_regnum = 0; /* Number of the tpidruro register. */
-+
- bool is_m = false; /* Does the target follow the "M" profile. */
- CORE_ADDR lowest_pc = 0; /* Lowest address at which instructions
- will appear. */
-@@ -301,7 +303,7 @@ extern void
- const struct regcache *regcache);
-
- /* Get the correct Arm target description with given FP hardware type. */
--const target_desc *arm_read_description (arm_fp_type fp_type);
-+const target_desc *arm_read_description (arm_fp_type fp_type, bool tls);
-
- /* Get the correct Arm M-Profile target description with given hardware
- type. */
-diff --git gdb/features/Makefile gdb/features/Makefile
-index 68e17d0085d..4b09819389a 100644
---- gdb/features/Makefile
-+++ gdb/features/Makefile
-@@ -207,6 +207,7 @@ FEATURE_XMLFILES = aarch64-core.xml \
- arm/arm-m-profile.xml \
- arm/arm-m-profile-mve.xml \
- arm/arm-m-profile-with-fpa.xml \
-+ arm/arm-tls.xml \
- arm/arm-vfpv2.xml \
- arm/arm-vfpv3.xml \
- arm/xscale-iwmmxt.xml \
-diff --git gdb/features/arm/arm-tls.c gdb/features/arm/arm-tls.c
-new file mode 100644
-index 00000000000..d1214dda8ec
---- /dev/null
-+++ gdb/features/arm/arm-tls.c
-@@ -0,0 +1,14 @@
-+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
-+ Original: arm-tls.xml */
-+
-+#include "gdbsupport/tdesc.h"
-+
-+static int
-+create_feature_arm_arm_tls (struct target_desc *result, long regnum)
-+{
-+ struct tdesc_feature *feature;
-+
-+ feature = tdesc_create_feature (result, "org.gnu.gdb.arm.tls");
-+ tdesc_create_reg (feature, "tpidruro", regnum++, 1, NULL, 32, "data_ptr");
-+ return regnum;
-+}
-diff --git gdb/features/arm/arm-tls.xml gdb/features/arm/arm-tls.xml
-new file mode 100644
-index 00000000000..3cdf73e776f
---- /dev/null
-+++ gdb/features/arm/arm-tls.xml
-@@ -0,0 +1,11 @@
-+<?xml version="1.0"?>
-+<!-- Copyright (C) 2022 Free Software Foundation, Inc.
-+
-+ Copying and distribution of this file, with or without modification,
-+ are permitted in any medium without royalty provided the copyright
-+ notice and this notice are preserved. -->
-+
-+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
-+<feature name="org.gnu.gdb.arm.tls">
-+ <reg name="tpidruro" bitsize="32" type="data_ptr"/>
-+</feature>
diff --git a/devel/gdb/files/commit-983b1119bc3 b/devel/gdb/files/commit-983b1119bc3
deleted file mode 100644
--- a/devel/gdb/files/commit-983b1119bc3
+++ /dev/null
@@ -1,42 +0,0 @@
-commit 1371da3a2d71dbd58f5ba3dd3c39841f0182556d
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Mar 22 12:05:43 2022 -0700
-
- fbsd-nat: Add a low_delete_thread virtual method.
-
- This method can be overridden by architecture-specific targets to
- perform additional work when a thread is deleted.
-
- Note that this method is only invoked on systems supporting LWP
- events, but the pending use case (aarch64 debug registers) is not
- supported on older kernels that do not support LWP events.
-
- (cherry picked from commit 983b1119bc315c9182e3aba898ca8099e54da49e)
-
-diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
-index 51234eaa6c9..2bc7937a38b 100644
---- gdb/fbsd-nat.c
-+++ gdb/fbsd-nat.c
-@@ -1293,6 +1293,7 @@ fbsd_nat_target::wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus,
- if (print_thread_events)
- printf_unfiltered (_("[%s exited]\n"),
- target_pid_to_str (wptid).c_str ());
-+ low_delete_thread (thr);
- delete_thread (thr);
- }
- if (ptrace (PT_CONTINUE, pid, (caddr_t) 1, 0) == -1)
-diff --git gdb/fbsd-nat.h gdb/fbsd-nat.h
-index d7c8eb81e96..6028aebfccc 100644
---- gdb/fbsd-nat.h
-+++ gdb/fbsd-nat.h
-@@ -115,6 +115,10 @@ class fbsd_nat_target : public inf_ptrace_target
- virtual void low_new_fork (ptid_t parent, pid_t child)
- {}
-
-+ /* The method to call, if any, when a thread is destroyed. */
-+ virtual void low_delete_thread (thread_info *)
-+ {}
-+
- protected:
-
- void post_startup_inferior (ptid_t) override;
diff --git a/devel/gdb/files/commit-a171378aa47 b/devel/gdb/files/commit-a171378aa47
deleted file mode 100644
--- a/devel/gdb/files/commit-a171378aa47
+++ /dev/null
@@ -1,45 +0,0 @@
-commit 9f5989ef192efab3d477fd6cc8712a8fd53e1856
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Fri Apr 1 13:16:46 2022 -0700
-
- Recognize FreeBSD core dump note for x86 segment base registers.
-
- This core dump note contains the value of the base address of the %fs
- and %gs segments for both i386 and amd64 core dumps. It is primarily
- useful in resolving the address of TLS variables in core dumps.
-
- binutils/ChangeLog:
-
- * readelf.c (get_freebsd_elfcore_note_type): Handle
- NT_FREEBSD_X86_SEGBASES.
-
- include/ChangeLog:
-
- * elf/common.h (NT_FREEBSD_X86_SEGBASES): Define.
-
- (cherry picked from commit a171378aa472fab0407dc1f99e8e7782286719ed)
-
-diff --git a/include/ChangeLog b/include/ChangeLog
-index 82194629c97..502fc47c148 100644
---- include/ChangeLog
-+++ include/ChangeLog
-@@ -1,3 +1,7 @@
-+2022-04-01 John Baldwin <jhb@FreeBSD.org>
-+
-+ * elf/common.h (NT_FREEBSD_X86_SEGBASES): Define.
-+
- 2022-03-16 Simon Marchi <simon.marchi@efficios.com>
-
- * elf/amdgpu.h: Add relocation values.
-diff --git a/include/elf/common.h b/include/elf/common.h
-index 70d63e3299c..ad62a7d8523 100644
---- include/elf/common.h
-+++ include/elf/common.h
-@@ -738,6 +738,7 @@
- #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. */
-+#define NT_FREEBSD_X86_SEGBASES 0x200 /* x86 segment base registers */
-
- /* Note segments for core files on NetBSD systems. Note name
- must start with "NetBSD-CORE". */
diff --git a/devel/gdb/files/commit-a3627b54280 b/devel/gdb/files/commit-a3627b54280
deleted file mode 100644
--- a/devel/gdb/files/commit-a3627b54280
+++ /dev/null
@@ -1,53 +0,0 @@
-commit 28207615d3f3d639a71df51be9ceed3033bb17c6
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Mar 22 12:05:43 2022 -0700
-
- fbsd-nat: Add a low_prepare_to_resume virtual method.
-
- This method can be overridden by architecture-specific targets to
- perform additional work before a thread is resumed.
-
- (cherry picked from commit a3627b54280ba306766f2689fb35442f24c4c313)
-
-diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c
-index 2bc7937a38b..934fdbad6ef 100644
---- gdb/fbsd-nat.c
-+++ gdb/fbsd-nat.c
-@@ -1138,6 +1138,8 @@ fbsd_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signo)
- perror_with_name (request == PT_RESUME ?
- ("ptrace (PT_RESUME)") :
- ("ptrace (PT_SUSPEND)"));
-+ if (request == PT_RESUME)
-+ low_prepare_to_resume (tp);
- }
- }
- else
-@@ -1145,8 +1147,11 @@ fbsd_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signo)
- /* If ptid is a wildcard, resume all matching threads (they won't run
- until the process is continued however). */
- for (thread_info *tp : all_non_exited_threads (this, ptid))
-- if (ptrace (PT_RESUME, tp->ptid.lwp (), NULL, 0) == -1)
-- perror_with_name (("ptrace (PT_RESUME)"));
-+ {
-+ if (ptrace (PT_RESUME, tp->ptid.lwp (), NULL, 0) == -1)
-+ perror_with_name (("ptrace (PT_RESUME)"));
-+ low_prepare_to_resume (tp);
-+ }
- ptid = inferior_ptid;
- }
-
-diff --git a/gdb/fbsd-nat.h b/gdb/fbsd-nat.h
-index 6028aebfccc..82f7ee47949 100644
---- gdb/fbsd-nat.h
-+++ gdb/fbsd-nat.h
-@@ -119,6 +119,10 @@ class fbsd_nat_target : public inf_ptrace_target
- virtual void low_delete_thread (thread_info *)
- {}
-
-+ /* Hook to call prior to resuming a thread. */
-+ virtual void low_prepare_to_resume (thread_info *)
-+ {}
-+
- protected:
-
- void post_startup_inferior (ptid_t) override;
diff --git a/devel/gdb/files/commit-a49ce729c80 b/devel/gdb/files/commit-a49ce729c80
deleted file mode 100644
--- a/devel/gdb/files/commit-a49ce729c80
+++ /dev/null
@@ -1,157 +0,0 @@
-commit 6f5759385274e15c5ef1a7d879ce7324ab0605ab
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Mar 22 12:05:43 2022 -0700
-
- Add an x86_fbsd_nat_target mixin class for FreeBSD x86 native targets.
-
- This class implements debug register support common between the i386
- and amd64 native targets.
-
- While here, remove #ifdef's for HAVE_PT_GETDBREGS in FreeBSD-specific
- code. The ptrace request has been present on FreeBSD x86
- architectures since 4.0 (released in March 2000). The last FreeBSD
- release without this support is 3.5 released in June 2000.
-
- (cherry picked from commit a49ce729c808b5762faf948a34e6159a6d8874de)
-
-diff --git a/gdb/amd64-fbsd-nat.c b/gdb/amd64-fbsd-nat.c
-index 368f4c10786..d125d582a21 100644
---- gdb/amd64-fbsd-nat.c
-+++ gdb/amd64-fbsd-nat.c
-@@ -29,26 +29,20 @@
- #include <sys/user.h>
- #include <machine/reg.h>
-
--#include "fbsd-nat.h"
- #include "amd64-tdep.h"
- #include "amd64-fbsd-tdep.h"
- #include "amd64-nat.h"
- #include "x86-nat.h"
- #include "gdbsupport/x86-xstate.h"
--#include "x86-bsd-nat.h"
-+#include "x86-fbsd-nat.h"
-
--class amd64_fbsd_nat_target final
-- : public x86bsd_nat_target<fbsd_nat_target>
-+class amd64_fbsd_nat_target final : public x86_fbsd_nat_target
- {
- public:
- void fetch_registers (struct regcache *, int) override;
- void store_registers (struct regcache *, int) override;
-
- const struct target_desc *read_description () override;
--
--#if defined(HAVE_PT_GETDBREGS)
-- bool supports_stopped_by_hw_breakpoint () override;
--#endif
- };
-
- static amd64_fbsd_nat_target the_amd64_fbsd_nat_target;
-@@ -348,16 +342,6 @@ amd64_fbsd_nat_target::read_description ()
- return i386_target_description (X86_XSTATE_SSE_MASK, true);
- }
-
--#if defined(HAVE_PT_GETDBREGS)
--/* Implement the supports_stopped_by_hw_breakpoints method. */
--
--bool
--amd64_fbsd_nat_target::supports_stopped_by_hw_breakpoint ()
--{
-- return true;
--}
--#endif
--
- void _initialize_amd64fbsd_nat ();
- void
- _initialize_amd64fbsd_nat ()
-diff --git a/gdb/i386-fbsd-nat.c b/gdb/i386-fbsd-nat.c
-index 023f24bab37..4b8ba8b598f 100644
---- gdb/i386-fbsd-nat.c
-+++ gdb/i386-fbsd-nat.c
-@@ -27,16 +27,14 @@
- #include <sys/sysctl.h>
- #include <sys/user.h>
-
--#include "fbsd-nat.h"
- #include "i386-tdep.h"
- #include "i386-fbsd-tdep.h"
- #include "i387-tdep.h"
- #include "x86-nat.h"
- #include "gdbsupport/x86-xstate.h"
--#include "x86-bsd-nat.h"
-+#include "x86-fbsd-nat.h"
-
--class i386_fbsd_nat_target final
-- : public x86bsd_nat_target<fbsd_nat_target>
-+class i386_fbsd_nat_target final : public x86_fbsd_nat_target
- {
- public:
- void fetch_registers (struct regcache *, int) override;
-@@ -45,10 +43,6 @@ class i386_fbsd_nat_target final
- const struct target_desc *read_description () override;
-
- void resume (ptid_t, int, enum gdb_signal) override;
--
--#if defined(HAVE_PT_GETDBREGS)
-- bool supports_stopped_by_hw_breakpoint () override;
--#endif
- };
-
- static i386_fbsd_nat_target the_i386_fbsd_nat_target;
-@@ -361,16 +355,6 @@ i386_fbsd_nat_target::read_description ()
- return i386_target_description (X86_XSTATE_X87_MASK, true);
- }
-
--#if defined(HAVE_PT_GETDBREGS)
--/* Implement the supports_stopped_by_hw_breakpoints method. */
--
--bool
--i386_fbsd_nat_target::supports_stopped_by_hw_breakpoint ()
--{
-- return true;
--}
--#endif
--
- void _initialize_i386fbsd_nat ();
- void
- _initialize_i386fbsd_nat ()
-diff --git a/gdb/x86-fbsd-nat.h b/gdb/x86-fbsd-nat.h
-new file mode 100644
-index 00000000000..f9d3514aab4
---- /dev/null
-+++ gdb/x86-fbsd-nat.h
-@@ -0,0 +1,34 @@
-+/* Native-dependent code for FreeBSD x86.
-+
-+ Copyright (C) 2022 Free Software Foundation, Inc.
-+
-+ This file is part of GDB.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 3 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
-+
-+#ifndef X86_FBSD_NAT_H
-+#define X86_FBSD_NAT_H
-+
-+#include "fbsd-nat.h"
-+#include "x86-bsd-nat.h"
-+
-+/* A prototype FreeBSD/x86 target. */
-+
-+class x86_fbsd_nat_target : public x86bsd_nat_target<fbsd_nat_target>
-+{
-+ bool supports_stopped_by_hw_breakpoint () override
-+ { return true; }
-+};
-+
-+#endif /* x86-bsd-nat.h */
diff --git a/devel/gdb/files/commit-a980a7d24b9 b/devel/gdb/files/commit-a980a7d24b9
new file mode 100644
--- /dev/null
+++ b/devel/gdb/files/commit-a980a7d24b9
@@ -0,0 +1,37 @@
+commit a980a7d24b9ab416a70880182d4e6b4975967d38
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Fri Mar 10 12:01:40 2023 -0800
+
+ PR gdb/30214: Prefer local include paths to system include paths
+
+ Some systems may install binutils headers into a system location
+ (e.g. /usr/local/include on FreeBSD) which may also include headers
+ for other external packages used by GDB such as zlib or zstd. If a
+ system include path such as /usr/local/include is added before local
+ include paths to directories within a clone or release tarball, then
+ headers from the external binutils package are used which can result
+ in build failures if the external binutils package is out of sync with
+ the version of GDB being built.
+
+ To fix, sort the include paths in INTERNAL_CFLAGS_BASE to add CFLAGS
+ for "local" componenets before external components.
+
+ Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30214
+ Reviewed-By: Tom Tromey <tom@tromey.com>
+ (cherry picked from commit a2fbb6903889c8fe32f4f3b890ef4b8c565d6b84)
+
+diff --git gdb/Makefile.in gdb/Makefile.in
+index 321a58c4635..fa7c81a0fab 100644
+--- gdb/Makefile.in
++++ gdb/Makefile.in
+@@ -629,8 +629,8 @@ INTERNAL_CPPFLAGS = $(CPPFLAGS) @GUILE_CPPFLAGS@ @PYTHON_CPPFLAGS@ \
+ # INTERNAL_CFLAGS is the aggregate of all other *CFLAGS macros.
+ INTERNAL_CFLAGS_BASE = \
+ $(GLOBAL_CFLAGS) $(PROFILE_CFLAGS) \
+- $(GDB_CFLAGS) $(OPCODES_CFLAGS) $(READLINE_CFLAGS) $(ZLIBINC) \
+- $(ZSTD_CFLAGS) $(BFD_CFLAGS) $(INCLUDE_CFLAGS) $(LIBDECNUMBER_CFLAGS) \
++ $(GDB_CFLAGS) $(OPCODES_CFLAGS) $(BFD_CFLAGS) $(INCLUDE_CFLAGS) \
++ $(READLINE_CFLAGS) $(ZLIBINC) $(ZSTD_CFLAGS) $(LIBDECNUMBER_CFLAGS) \
+ $(INTL_CFLAGS) $(INCGNU) $(INCSUPPORT) $(LIBBACKTRACE_INC) \
+ $(ENABLE_CFLAGS) $(INTERNAL_CPPFLAGS) $(SRCHIGH_CFLAGS) \
+ $(TOP_CFLAGS) $(PTHREAD_CFLAGS) $(DEBUGINFOD_CFLAGS)
diff --git a/devel/gdb/files/commit-b1babce7c31 b/devel/gdb/files/commit-b1babce7c31
deleted file mode 100644
--- a/devel/gdb/files/commit-b1babce7c31
+++ /dev/null
@@ -1,50 +0,0 @@
-commit 8a528699fdc82963d528bbbbd3f3509e1472a64b
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Mar 22 12:05:43 2022 -0700
-
- x86-nat: Add x86_lookup_debug_reg_state.
-
- This function returns nullptr if debug register state does not yet
- exist for a given process rather than creating new state.
-
- (cherry picked from commit b1babce7c31def7fb894875136788490b167f989)
-
-diff --git a/gdb/x86-nat.c b/gdb/x86-nat.c
-index c1e892bf564..36513dd8cfb 100644
---- gdb/x86-nat.c
-+++ gdb/x86-nat.c
-@@ -46,6 +46,18 @@ struct x86_dr_low_type x86_dr_low;
- static std::unordered_map<pid_t,
- struct x86_debug_reg_state> x86_debug_process_state;
-
-+/* See x86-nat.h. */
-+
-+struct x86_debug_reg_state *
-+x86_lookup_debug_reg_state (pid_t pid)
-+{
-+ auto it = x86_debug_process_state.find (pid);
-+ if (it != x86_debug_process_state.end ())
-+ return &it->second;
-+
-+ return nullptr;
-+}
-+
- /* Get debug registers state for process PID. */
-
- struct x86_debug_reg_state *
-diff --git a/gdb/x86-nat.h b/gdb/x86-nat.h
-index 913291a2305..d9c2a3f6e14 100644
---- gdb/x86-nat.h
-+++ gdb/x86-nat.h
-@@ -40,6 +40,11 @@ extern void x86_set_debug_register_length (int len);
-
- extern void x86_cleanup_dregs (void);
-
-+/* Return the debug register state for process PID. If no existing
-+ state is found for this process, return nullptr. */
-+
-+struct x86_debug_reg_state *x86_lookup_debug_reg_state (pid_t pid);
-+
- /* Called whenever GDB is no longer debugging process PID. It deletes
- data structures that keep track of debug register state. */
-
diff --git a/devel/gdb/files/commit-b2fdd31b03e b/devel/gdb/files/commit-b2fdd31b03e
deleted file mode 100644
--- a/devel/gdb/files/commit-b2fdd31b03e
+++ /dev/null
@@ -1,32 +0,0 @@
-commit 7b45afa632e0484835a56cc60393d5e118c0f605
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Thu May 26 14:14:46 2022 -0700
-
- aarch64-fbsd-nat: Move definition of debug_regs_probed under HAVE_DBREG.
-
- This fixes the build on older FreeBSD systems without support for
- hardware breakpoints/watchpoints.
-
- (cherry picked from commit b2fdd31b03ef01a9a790ecb5d0dc0fea209b49ec)
-
-diff --git gdb/aarch64-fbsd-nat.c gdb/aarch64-fbsd-nat.c
-index 910bf5bb190..ab6ab36a39a 100644
---- gdb/aarch64-fbsd-nat.c
-+++ gdb/aarch64-fbsd-nat.c
-@@ -76,7 +76,6 @@ struct aarch64_fbsd_nat_target final : public fbsd_nat_target
- };
-
- static aarch64_fbsd_nat_target the_aarch64_fbsd_nat_target;
--bool aarch64_fbsd_nat_target::debug_regs_probed;
-
- /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
- for all registers. */
-@@ -154,6 +153,8 @@ aarch64_fbsd_nat_target::read_description ()
- }
-
- #ifdef HAVE_DBREG
-+bool aarch64_fbsd_nat_target::debug_regs_probed;
-+
- /* Set of threads which need to update debug registers on next resume. */
-
- static std::unordered_set<lwpid_t> aarch64_debug_pending_threads;
diff --git a/devel/gdb/files/commit-b5c2367c3ac b/devel/gdb/files/commit-b5c2367c3ac
deleted file mode 100644
--- a/devel/gdb/files/commit-b5c2367c3ac
+++ /dev/null
@@ -1,89 +0,0 @@
-commit f5bae6f6cb45860d63ebc6d309404cf5d7d29052
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Fri Apr 1 13:16:46 2022 -0700
-
- Use pseudosections for NT_FREEBSD_X86_SEGBASES core dump notes.
-
- This includes adding pseudosections when reading a core dump as well
- as support for writing out a core dump note from a pseudosection.
-
- bfd/ChangeLog:
-
- * elf-bfd.h (elfcore_write_x86_segbases): New.
- * elf.c (elfcore_grok_freebsd_note): Add pseudosections for
- NT_FREEBSD_X86_SEGBASES register notes.
- (elfcore_write_x86_segbases): New.
- (elfcore_write_register_note): Write NT_FREEBSD_X86_SEGBASES
- register notes.
-
- (cherry picked from commit b5c2367c3ac5f696221d9c24f470498abdb83257)
-
-diff --git a/bfd/ChangeLog b/bfd/ChangeLog
-index ae8b25faae4..10098014297 100644
---- bfd/ChangeLog
-+++ bfd/ChangeLog
-@@ -1,3 +1,12 @@
-+2022-04-01 John Baldwin <jhb@FreeBSD.org>
-+
-+ * elf-bfd.h (elfcore_write_x86_segbases): New.
-+ * elf.c (elfcore_grok_freebsd_note): Add pseudosections for
-+ NT_FREEBSD_X86_SEGBASES register notes.
-+ (elfcore_write_x86_segbases): New.
-+ (elfcore_write_register_note): Write NT_FREEBSD_X86_SEGBASES
-+ register notes.
-+
- 2022-04-01 John Baldwin <jhb@FreeBSD.org>
-
- * elf.c (elfcore_grok_freebsd_note): Remove checks for namesz.
-diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
-index 5c3985f6e57..c7c0a793b15 100644
---- bfd/elf-bfd.h
-+++ bfd/elf-bfd.h
-@@ -2786,6 +2786,8 @@ extern char *elfcore_write_prxfpreg
- (bfd *, char *, int *, const void *, int);
- extern char *elfcore_write_xstatereg
- (bfd *, char *, int *, const void *, int);
-+extern char *elfcore_write_x86_segbases
-+ (bfd *, char *, int *, const void *, int);
- extern char *elfcore_write_ppc_vmx
- (bfd *, char *, int *, const void *, int);
- extern char *elfcore_write_ppc_vsx
-diff --git a/bfd/elf.c b/bfd/elf.c
-index a99149e50b3..37c53cfdf32 100644
---- bfd/elf.c
-+++ bfd/elf.c
-@@ -11027,6 +11027,9 @@ elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note)
- case NT_FREEBSD_PROCSTAT_AUXV:
- return elfcore_make_auxv_note_section (abfd, note, 4);
-
-+ case NT_FREEBSD_X86_SEGBASES:
-+ return elfcore_make_note_pseudosection (abfd, ".reg-x86-segbases", note);
-+
- case NT_X86_XSTATE:
- return elfcore_grok_xstatereg (abfd, note);
-
-@@ -11904,6 +11907,15 @@ elfcore_write_xstatereg (bfd *abfd, char *buf, int *bufsiz,
- note_name, NT_X86_XSTATE, xfpregs, size);
- }
-
-+char *
-+elfcore_write_x86_segbases (bfd *abfd, char *buf, int *bufsiz,
-+ const void *regs, int size)
-+{
-+ char *note_name = "FreeBSD";
-+ return elfcore_write_note (abfd, buf, bufsiz,
-+ note_name, NT_FREEBSD_X86_SEGBASES, regs, size);
-+}
-+
- char *
- elfcore_write_ppc_vmx (bfd *abfd,
- char *buf,
-@@ -12441,6 +12453,8 @@ elfcore_write_register_note (bfd *abfd,
- return elfcore_write_prxfpreg (abfd, buf, bufsiz, data, size);
- if (strcmp (section, ".reg-xstate") == 0)
- return elfcore_write_xstatereg (abfd, buf, bufsiz, data, size);
-+ if (strcmp (section, ".reg-x86-segbases") == 0)
-+ return elfcore_write_x86_segbases (abfd, buf, bufsiz, data, size);
- if (strcmp (section, ".reg-ppc-vmx") == 0)
- return elfcore_write_ppc_vmx (abfd, buf, bufsiz, data, size);
- if (strcmp (section, ".reg-ppc-vsx") == 0)
diff --git a/devel/gdb/files/commit-b7fe5463cf0 b/devel/gdb/files/commit-b7fe5463cf0
deleted file mode 100644
--- a/devel/gdb/files/commit-b7fe5463cf0
+++ /dev/null
@@ -1,102 +0,0 @@
-commit 0e67403c6b094d638a4ca130ff6dcd6a153f3eb2
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue May 3 16:05:10 2022 -0700
-
- Fetch the NT_ARM_TLS register set for native FreeBSD/Aarch64 processes.
-
- This permits resolving TLS variables.
-
- (cherry picked from commit b7fe5463cf0dd6d7701d0be5ae129a9d4ecd28bc)
-
-diff --git gdb/aarch64-fbsd-nat.c gdb/aarch64-fbsd-nat.c
-index 99e2bf35276..910bf5bb190 100644
---- gdb/aarch64-fbsd-nat.c
-+++ gdb/aarch64-fbsd-nat.c
-@@ -24,12 +24,15 @@
- #include "target.h"
- #include "nat/aarch64-hw-point.h"
-
-+#include "elf/common.h"
-+
- #include <sys/param.h>
- #include <sys/ptrace.h>
- #include <machine/armreg.h>
- #include <machine/reg.h>
-
- #include "fbsd-nat.h"
-+#include "aarch64-tdep.h"
- #include "aarch64-fbsd-tdep.h"
- #include "aarch64-nat.h"
- #include "inf-ptrace.h"
-@@ -50,6 +53,8 @@ struct aarch64_fbsd_nat_target final : public fbsd_nat_target
- void fetch_registers (struct regcache *, int) override;
- void store_registers (struct regcache *, int) override;
-
-+ const struct target_desc *read_description () override;
-+
- #ifdef HAVE_DBREG
- /* Hardware breakpoints and watchpoints. */
- bool stopped_by_watchpoint () override;
-@@ -84,6 +89,26 @@ aarch64_fbsd_nat_target::fetch_registers (struct regcache *regcache,
- &aarch64_fbsd_gregset);
- fetch_register_set<struct fpreg> (regcache, regnum, PT_GETFPREGS,
- &aarch64_fbsd_fpregset);
-+
-+ gdbarch *gdbarch = regcache->arch ();
-+ aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
-+ if (tdep->has_tls ())
-+ {
-+ const struct regcache_map_entry aarch64_fbsd_tls_regmap[] =
-+ {
-+ { 1, tdep->tls_regnum, 8 },
-+ { 0 }
-+ };
-+
-+ const struct regset aarch64_fbsd_tls_regset =
-+ {
-+ aarch64_fbsd_tls_regmap,
-+ regcache_supply_regset, regcache_collect_regset
-+ };
-+
-+ fetch_regset<uint64_t> (regcache, regnum, NT_ARM_TLS,
-+ &aarch64_fbsd_tls_regset);
-+ }
- }
-
- /* Store register REGNUM back into the inferior. If REGNUM is -1, do
-@@ -97,6 +122,35 @@ aarch64_fbsd_nat_target::store_registers (struct regcache *regcache,
- &aarch64_fbsd_gregset);
- store_register_set<struct fpreg> (regcache, regnum, PT_GETFPREGS,
- PT_SETFPREGS, &aarch64_fbsd_fpregset);
-+
-+ gdbarch *gdbarch = regcache->arch ();
-+ aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
-+ if (tdep->has_tls ())
-+ {
-+ const struct regcache_map_entry aarch64_fbsd_tls_regmap[] =
-+ {
-+ { 1, tdep->tls_regnum, 8 },
-+ { 0 }
-+ };
-+
-+ const struct regset aarch64_fbsd_tls_regset =
-+ {
-+ aarch64_fbsd_tls_regmap,
-+ regcache_supply_regset, regcache_collect_regset
-+ };
-+
-+ store_regset<uint64_t> (regcache, regnum, NT_ARM_TLS,
-+ &aarch64_fbsd_tls_regset);
-+ }
-+}
-+
-+/* Implement the target read_description method. */
-+
-+const struct target_desc *
-+aarch64_fbsd_nat_target::read_description ()
-+{
-+ bool tls = have_regset (inferior_ptid, NT_ARM_TLS) != 0;
-+ return aarch64_read_description (0, false, false, tls);
- }
-
- #ifdef HAVE_DBREG
diff --git a/devel/gdb/files/commit-c13566fdd57 b/devel/gdb/files/commit-c13566fdd57
deleted file mode 100644
--- a/devel/gdb/files/commit-c13566fdd57
+++ /dev/null
@@ -1,35 +0,0 @@
-commit 7995cf839e5c608372e78f8bd5f6d120803a4e63
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Fri Apr 1 13:16:46 2022 -0700
-
- Use I386_GSBASE_REGNUM in i386fbsd_get_thread_local_address.
-
- 32-bit x86 arches always the I386_*BASE_REGNUM values. Only code that
- needs to support both 64-bit and 32-bit arches needs to use
- tdep->fsbase_regnum to compute a segment base register number.
-
- (cherry picked from commit c13566fdd5725d4c337a2741be02c12c4f430022)
-
-diff --git a/gdb/i386-fbsd-tdep.c b/gdb/i386-fbsd-tdep.c
-index fad091f8472..d50f35707ee 100644
---- gdb/i386-fbsd-tdep.c
-+++ gdb/i386-fbsd-tdep.c
-@@ -350,16 +350,13 @@ i386fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
- i386_gdbarch_tdep *tdep = (i386_gdbarch_tdep *) gdbarch_tdep (gdbarch);
- struct regcache *regcache;
-
-- if (tdep->fsbase_regnum == -1)
-- error (_("Unable to fetch %%gsbase"));
--
- regcache = get_thread_arch_regcache (current_inferior ()->process_target (),
- ptid, gdbarch);
-
-- target_fetch_registers (regcache, tdep->fsbase_regnum + 1);
-+ target_fetch_registers (regcache, I386_GSBASE_REGNUM);
-
- ULONGEST gsbase;
-- if (regcache->cooked_read (tdep->fsbase_regnum + 1, &gsbase) != REG_VALID)
-+ if (regcache->cooked_read (I386_GSBASE_REGNUM, &gsbase) != REG_VALID)
- error (_("Unable to fetch %%gsbase"));
-
- CORE_ADDR dtv_addr = gsbase + gdbarch_ptr_bit (gdbarch) / 8;
diff --git a/devel/gdb/files/commit-c77282d8ba9 b/devel/gdb/files/commit-c77282d8ba9
deleted file mode 100644
--- a/devel/gdb/files/commit-c77282d8ba9
+++ /dev/null
@@ -1,41 +0,0 @@
-commit 066ae99a326d77966288c59066018ca6f3f1d22d
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue Mar 22 12:05:43 2022 -0700
-
- fbsd-nat: Add a low_new_fork virtual method.
-
- This method can be overridden by architecture-specific targets to
- perform additional work when a new child process is forked.
-
- (cherry picked from commit c77282d8ba91cf25cf2f08b76702c447e2e74575)
-
-diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
-index ba84265dd58..6d76c8234d5 100644
---- gdb/fbsd-nat.c
-+++ gdb/fbsd-nat.c
-@@ -1380,6 +1380,8 @@ fbsd_nat_target::wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus,
- warning (_("Failed to fetch process information"));
- #endif
-
-+ low_new_fork (wptid, child);
-+
- if (is_vfork)
- ourstatus->set_vforked (child_ptid);
- else
-diff --git gdb/fbsd-nat.h gdb/fbsd-nat.h
-index 2d9c6e19a2c..2f17be5a8f0 100644
---- gdb/fbsd-nat.h
-+++ gdb/fbsd-nat.h
-@@ -109,6 +109,12 @@ class fbsd_nat_target : public inf_ptrace_target
-
- bool supports_disable_randomization () override;
-
-+ /* Methods meant to be overridden by arch-specific target
-+ classes. */
-+
-+ virtual void low_new_fork (ptid_t parent, pid_t child)
-+ {}
-+
- protected:
-
- void post_startup_inferior (ptid_t) override;
diff --git a/devel/gdb/files/commit-e330d4c033e b/devel/gdb/files/commit-e330d4c033e
deleted file mode 100644
--- a/devel/gdb/files/commit-e330d4c033e
+++ /dev/null
@@ -1,55 +0,0 @@
-commit 1ec77d89016f9b26dde3de6cdc4f4eaa44bbff13
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Fri Apr 1 13:16:46 2022 -0700
-
- elfcore_grok_freebsd_note: Remove checks of note->namesz.
-
- This function is only called if the note name is "FreeBSD", so
- checking the name size is unnecessary.
-
- bfd/ChangeLog:
-
- * elf.c (elfcore_grok_freebsd_note): Remove checks for namesz.
-
- (cherry picked from commit e330d4c033eab2e0e7206a29d6c11a9a59fd205b)
-
-diff --git a/bfd/ChangeLog b/bfd/ChangeLog
-index 6ac8b96c57a..ae8b25faae4 100644
---- bfd/ChangeLog
-+++ bfd/ChangeLog
-@@ -1,3 +1,7 @@
-+2022-04-01 John Baldwin <jhb@FreeBSD.org>
-+
-+ * elf.c (elfcore_grok_freebsd_note): Remove checks for namesz.
-+
- 2022-03-18 Viorel Preoteasa <viorel.preoteasa@gmail.com>
-
- PR 28924
-diff --git a/bfd/elf.c b/bfd/elf.c
-index 82b53be99f9..a99149e50b3 100644
---- bfd/elf.c
-+++ bfd/elf.c
-@@ -11010,10 +11010,7 @@ elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note)
- return elfcore_grok_freebsd_psinfo (abfd, note);
-
- case NT_FREEBSD_THRMISC:
-- if (note->namesz == 8)
-- return elfcore_make_note_pseudosection (abfd, ".thrmisc", note);
-- else
-- return true;
-+ return elfcore_make_note_pseudosection (abfd, ".thrmisc", note);
-
- case NT_FREEBSD_PROCSTAT_PROC:
- return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.proc",
-@@ -11031,10 +11028,7 @@ elfcore_grok_freebsd_note (bfd *abfd, Elf_Internal_Note *note)
- return elfcore_make_auxv_note_section (abfd, note, 4);
-
- case NT_X86_XSTATE:
-- if (note->namesz == 8)
-- return elfcore_grok_xstatereg (abfd, note);
-- else
-- return true;
-+ return elfcore_grok_xstatereg (abfd, note);
-
- case NT_FREEBSD_PTLWPINFO:
- return elfcore_make_note_pseudosection (abfd, ".note.freebsdcore.lwpinfo",
diff --git a/devel/gdb/files/commit-f3215e1526d b/devel/gdb/files/commit-f3215e1526d
deleted file mode 100644
--- a/devel/gdb/files/commit-f3215e1526d
+++ /dev/null
@@ -1,114 +0,0 @@
-commit 87716bf398bfa17f73de9d6ac4a8573e520985e5
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Fri Apr 1 13:16:46 2022 -0700
-
- FreeBSD/x86: Read segment base registers from NT_X86_SEGBASES.
-
- FreeBSD kernels recently grew a new register core dump note containing
- the base addresses of the %fs and %gs segments (corresponding to the
- %fsbase and %gsbase registers). Parse this note to permit inspecting
- TLS variables in core dumps. Native processes already supported TLS
- via older ptrace() operations.
-
- (cherry picked from commit f3215e1526d762f005fdf86abac81da514c74e50)
-
-diff --git a/gdb/amd64-fbsd-tdep.c b/gdb/amd64-fbsd-tdep.c
-index da5c297902d..55764beaad2 100644
---- gdb/amd64-fbsd-tdep.c
-+++ gdb/amd64-fbsd-tdep.c
-@@ -37,6 +37,9 @@
- 16-bit segment registers. */
- #define AMD64_FBSD_SIZEOF_GREGSET (22 * 8)
-
-+/* The segment base register set consists of 2 64-bit registers. */
-+#define AMD64_FBSD_SIZEOF_SEGBASES_REGSET (2 * 8)
-+
- /* Register maps. */
-
- static const struct regcache_map_entry amd64_fbsd_gregmap[] =
-@@ -70,6 +73,13 @@ static const struct regcache_map_entry amd64_fbsd_gregmap[] =
- { 0 }
- };
-
-+static const struct regcache_map_entry amd64_fbsd_segbases_regmap[] =
-+{
-+ { 1, AMD64_FSBASE_REGNUM, 0 },
-+ { 1, AMD64_GSBASE_REGNUM, 0 },
-+ { 0 }
-+};
-+
- /* This layout including fsbase and gsbase was adopted in FreeBSD
- 8.0. */
-
-@@ -120,6 +130,11 @@ const struct regset amd64_fbsd_gregset =
- amd64_fbsd_gregmap, regcache_supply_regset, regcache_collect_regset
- };
-
-+const struct regset amd64_fbsd_segbases_regset =
-+{
-+ amd64_fbsd_segbases_regmap, regcache_supply_regset, regcache_collect_regset
-+};
-+
- /* Support for signal handlers. */
-
- /* In a signal frame, rsp points to a 'struct sigframe' which is
-@@ -253,6 +268,9 @@ amd64fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
- &amd64_fbsd_gregset, NULL, cb_data);
- cb (".reg2", tdep->sizeof_fpregset, tdep->sizeof_fpregset, &amd64_fpregset,
- NULL, cb_data);
-+ cb (".reg-x86-segbases", AMD64_FBSD_SIZEOF_SEGBASES_REGSET,
-+ AMD64_FBSD_SIZEOF_SEGBASES_REGSET, &amd64_fbsd_segbases_regset,
-+ "segment bases", cb_data);
- cb (".reg-xstate", X86_XSTATE_SIZE (tdep->xcr0), X86_XSTATE_SIZE (tdep->xcr0),
- &amd64fbsd_xstateregset, "XSAVE extended state", cb_data);
- }
-diff --git a/gdb/i386-fbsd-tdep.c b/gdb/i386-fbsd-tdep.c
-index 16ffd576323..fad091f8472 100644
---- gdb/i386-fbsd-tdep.c
-+++ gdb/i386-fbsd-tdep.c
-@@ -35,6 +35,9 @@
- /* The general-purpose regset consists of 19 32-bit slots. */
- #define I386_FBSD_SIZEOF_GREGSET (19 * 4)
-
-+/* The segment base register set consists of 2 32-bit registers. */
-+#define I386_FBSD_SIZEOF_SEGBASES_REGSET (2 * 4)
-+
- /* Register maps. */
-
- static const struct regcache_map_entry i386_fbsd_gregmap[] =
-@@ -61,6 +64,13 @@ static const struct regcache_map_entry i386_fbsd_gregmap[] =
- { 0 }
- };
-
-+static const struct regcache_map_entry i386_fbsd_segbases_regmap[] =
-+{
-+ { 1, I386_FSBASE_REGNUM, 0 },
-+ { 1, I386_GSBASE_REGNUM, 0 },
-+ { 0 }
-+};
-+
- /* This layout including fsbase and gsbase was adopted in FreeBSD
- 8.0. */
-
-@@ -103,6 +113,11 @@ const struct regset i386_fbsd_gregset =
- i386_fbsd_gregmap, regcache_supply_regset, regcache_collect_regset
- };
-
-+const struct regset i386_fbsd_segbases_regset =
-+{
-+ i386_fbsd_segbases_regmap, regcache_supply_regset, regcache_collect_regset
-+};
-+
- /* Support for signal handlers. */
-
- /* In a signal frame, esp points to a 'struct sigframe' which is
-@@ -316,6 +331,9 @@ i386fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
- &i386_fbsd_gregset, NULL, cb_data);
- cb (".reg2", tdep->sizeof_fpregset, tdep->sizeof_fpregset, &i386_fpregset,
- NULL, cb_data);
-+ cb (".reg-x86-segbases", I386_FBSD_SIZEOF_SEGBASES_REGSET,
-+ I386_FBSD_SIZEOF_SEGBASES_REGSET, &i386_fbsd_segbases_regset,
-+ "segment bases", cb_data);
-
- if (tdep->xcr0 & X86_XSTATE_AVX)
- cb (".reg-xstate", X86_XSTATE_SIZE (tdep->xcr0),
diff --git a/devel/gdb/files/commit-f9fbb7636a5 b/devel/gdb/files/commit-f9fbb7636a5
deleted file mode 100644
--- a/devel/gdb/files/commit-f9fbb7636a5
+++ /dev/null
@@ -1,68 +0,0 @@
-commit e6107bf932b37ae7e30a5fffe93f9998c4b9c20a
-Author: John Baldwin <jhb@FreeBSD.org>
-Date: Tue May 3 16:05:10 2022 -0700
-
- Support TLS variables on FreeBSD/Aarch64.
-
- Derive the pointer to the DTV array from the tpidr register.
-
- (cherry picked from commit f9fbb7636a5b67abae41a35f02ae70f58523d375)
-
-diff --git gdb/aarch64-fbsd-tdep.c gdb/aarch64-fbsd-tdep.c
-index ed1b84387f0..fdf0795b9bf 100644
---- gdb/aarch64-fbsd-tdep.c
-+++ gdb/aarch64-fbsd-tdep.c
-@@ -23,6 +23,7 @@
- #include "fbsd-tdep.h"
- #include "aarch64-tdep.h"
- #include "aarch64-fbsd-tdep.h"
-+#include "inferior.h"
- #include "osabi.h"
- #include "solib-svr4.h"
- #include "target.h"
-@@ -180,6 +181,30 @@ aarch64_fbsd_core_read_description (struct gdbarch *gdbarch,
- return aarch64_read_description (0, false, false, tls != nullptr);
- }
-
-+/* Implement the get_thread_local_address gdbarch method. */
-+
-+static CORE_ADDR
-+aarch64_fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid,
-+ CORE_ADDR lm_addr, CORE_ADDR offset)
-+{
-+ aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
-+ struct regcache *regcache;
-+
-+ regcache = get_thread_arch_regcache (current_inferior ()->process_target (),
-+ ptid, gdbarch);
-+
-+ target_fetch_registers (regcache, tdep->tls_regnum);
-+
-+ ULONGEST tpidr;
-+ if (regcache->cooked_read (tdep->tls_regnum, &tpidr) != REG_VALID)
-+ error (_("Unable to fetch %%tpidr"));
-+
-+ /* %tpidr points to the TCB whose first member is the dtv
-+ pointer. */
-+ CORE_ADDR dtv_addr = tpidr;
-+ return fbsd_get_thread_local_address (gdbarch, dtv_addr, lm_addr, offset);
-+}
-+
- /* Implement the 'init_osabi' method of struct gdb_osabi_handler. */
-
- static void
-@@ -202,6 +227,14 @@ aarch64_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
- (gdbarch, aarch64_fbsd_iterate_over_regset_sections);
- set_gdbarch_core_read_description (gdbarch,
- aarch64_fbsd_core_read_description);
-+
-+ if (tdep->has_tls ())
-+ {
-+ set_gdbarch_fetch_tls_load_module_address (gdbarch,
-+ svr4_fetch_objfile_link_map);
-+ set_gdbarch_get_thread_local_address
-+ (gdbarch, aarch64_fbsd_get_thread_local_address);
-+ }
- }
-
- void _initialize_aarch64_fbsd_tdep ();
diff --git a/devel/gdb/files/extrapatch-kgdb b/devel/gdb/files/extrapatch-kgdb
--- a/devel/gdb/files/extrapatch-kgdb
+++ b/devel/gdb/files/extrapatch-kgdb
@@ -1,8 +1,8 @@
diff --git gdb/Makefile.in gdb/Makefile.in
-index aecab41eeb8..45aa63c31f4 100644
+index 321a58c4635..57a45c391ef 100644
--- gdb/Makefile.in
+++ gdb/Makefile.in
-@@ -688,6 +688,7 @@ TARGET_OBS = @TARGET_OBS@
+@@ -696,6 +696,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 = \
@@ -10,7 +10,7 @@
aarch64-fbsd-tdep.o \
aarch64-linux-tdep.o \
aarch64-newlib-tdep.o \
-@@ -702,6 +703,7 @@ ALL_64_TARGET_OBS = \
+@@ -710,6 +711,7 @@ ALL_64_TARGET_OBS = \
amd64-darwin-tdep.o \
amd64-dicos-tdep.o \
amd64-fbsd-tdep.o \
@@ -18,10 +18,10 @@
amd64-linux-tdep.o \
amd64-netbsd-tdep.o \
amd64-obsd-tdep.o \
-@@ -717,18 +719,21 @@ ALL_64_TARGET_OBS = \
- ia64-linux-tdep.o \
- ia64-tdep.o \
+@@ -728,18 +730,21 @@ ALL_64_TARGET_OBS = \
ia64-vms-tdep.o \
+ loongarch-linux-tdep.o \
+ loongarch-tdep.o \
+ mipsfbsd-kern.o \
mips-fbsd-tdep.o \
mips-linux-tdep.o \
@@ -40,7 +40,7 @@
sparc64-linux-tdep.o \
sparc64-netbsd-tdep.o \
sparc64-obsd-tdep.o \
-@@ -750,6 +755,7 @@ ALL_TARGET_OBS = \
+@@ -764,6 +769,7 @@ ALL_TARGET_OBS = \
arch/loongarch.o \
arch/ppc-linux-common.o \
arm-bsd-tdep.o \
@@ -48,7 +48,7 @@
arm-fbsd-tdep.o \
arm-linux-tdep.o \
arm-netbsd-tdep.o \
-@@ -768,6 +774,8 @@ ALL_TARGET_OBS = \
+@@ -781,6 +787,8 @@ ALL_TARGET_OBS = \
csky-linux-tdep.o \
csky-tdep.o \
dicos-tdep.o \
@@ -57,61 +57,31 @@
fbsd-tdep.o \
frv-linux-tdep.o \
frv-tdep.o \
-@@ -783,6 +791,7 @@ ALL_TARGET_OBS = \
+@@ -795,6 +803,7 @@ ALL_TARGET_OBS = \
+ i386-bsd-tdep.o \
i386-darwin-tdep.o \
i386-dicos-tdep.o \
- i386-fbsd-tdep.o \
+ i386fbsd-kern.o \
+ i386-fbsd-tdep.o \
i386-gnu-tdep.o \
i386-go32-tdep.o \
- i386-linux-tdep.o \
-@@ -822,6 +831,7 @@ ALL_TARGET_OBS = \
+@@ -832,6 +841,7 @@ ALL_TARGET_OBS = \
+ obsd-tdep.o \
or1k-linux-tdep.o \
or1k-tdep.o \
- ppc-fbsd-tdep.o \
+ ppcfbsd-kern.o \
+ ppc-fbsd-tdep.o \
ppc-linux-tdep.o \
ppc-netbsd-tdep.o \
- ppc-obsd-tdep.o \
-@@ -1647,7 +1657,7 @@ generated_files = \
- # Flags needed to compile Python code
- PYTHON_CFLAGS = @PYTHON_CFLAGS@
-
--all: gdb$(EXEEXT) $(CONFIG_ALL) gdb-gdb.py gdb-gdb.gdb
-+all: gdb$(EXEEXT) kgdb$(EXEEXT) $(CONFIG_ALL) gdb-gdb.py gdb-gdb.gdb
- @$(MAKE) $(FLAGS_TO_PASS) DO=all "DODIRS=$(SUBDIRS)" subdir_do
-
- # Rule for compiling .c files in the top-level gdb directory.
-@@ -1909,6 +1919,12 @@ ifneq ($(CODESIGN_CERT),)
- $(ECHO_SIGN) $(CODESIGN) -s $(CODESIGN_CERT) gdb$(EXEEXT)
- endif
-
-+kgdb$(EXEEXT): kgdb-main.o $(LIBGDB_OBS) $(ADD_DEPS) $(CDEPS) $(TDEPLIBS)
-+ $(SILENCE) rm -f kgdb$(EXEEXT)
-+ $(ECHO_CXXLD) $(CC_LD) $(INTERNAL_LDFLAGS) $(WIN32LDAPP) \
-+ -o kgdb$(EXEEXT) kgdb-main.o $(LIBGDB_OBS) \
-+ $(TDEPLIBS) $(TUI_LIBRARY) $(CLIBS) $(LOADLIBES)
-+
- # This is useful when debugging GDB, because some Unix's don't let you run GDB
- # on itself without copying the executable. So "make gdb1" will make
- # gdb and put a copy in gdb1, and you can run it with "gdb gdb1".
-@@ -1944,6 +1960,7 @@ clean mostlyclean: $(CONFIG_CLEAN)
- rm -f init.c stamp-init version.c stamp-version
- rm -f gdb$(EXEEXT) core make.log
- rm -f gdb[0-9]$(EXEEXT)
-+ rm -f kgdb$(EXEEXT)
- rm -f test-cp-name-parser$(EXEEXT)
- rm -f xml-builtin.c stamp-xml
- rm -f $(DEPDIR)/*
-@@ -2136,6 +2153,7 @@ MAKEOVERRIDES =
-
- ALLDEPFILES = \
+@@ -1622,6 +1632,7 @@ ALLDEPFILES = \
+ arch/riscv.c \
+ arch/tic6x.c \
aarch32-tdep.c \
+ aarch64-fbsd-kern.c \
aarch64-fbsd-nat.c \
aarch64-fbsd-tdep.c \
aarch64-linux-nat.c \
-@@ -2155,6 +2173,7 @@ ALLDEPFILES = \
+@@ -1641,6 +1652,7 @@ ALLDEPFILES = \
amd64-bsd-nat.c \
amd64-darwin-tdep.c \
amd64-dicos-tdep.c \
@@ -119,15 +89,15 @@
amd64-fbsd-nat.c \
amd64-fbsd-tdep.c \
amd64-linux-nat.c \
-@@ -2171,6 +2190,7 @@ ALLDEPFILES = \
+@@ -1656,6 +1668,7 @@ ALLDEPFILES = \
+ arc-linux-nat.c \
arc-tdep.c \
- arm.c \
arm-bsd-tdep.c \
+ arm-fbsd-kern.c \
arm-fbsd-nat.c \
arm-fbsd-tdep.c \
- arm-get-next-pcs.c \
-@@ -2192,6 +2212,9 @@ ALLDEPFILES = \
+ arm-linux-nat.c \
+@@ -1675,6 +1688,9 @@ ALLDEPFILES = \
csky-tdep.c \
darwin-nat.c \
dicos-tdep.c \
@@ -137,7 +107,7 @@
fbsd-nat.c \
fbsd-tdep.c \
fork-child.c \
-@@ -2212,6 +2235,7 @@ ALLDEPFILES = \
+@@ -1695,6 +1711,7 @@ ALLDEPFILES = \
i386-darwin-nat.c \
i386-darwin-tdep.c \
i386-dicos-tdep.c \
@@ -145,7 +115,7 @@
i386-fbsd-nat.c \
i386-fbsd-tdep.c \
i386-gnu-nat.c \
-@@ -2252,6 +2276,7 @@ ALLDEPFILES = \
+@@ -1735,6 +1752,7 @@ ALLDEPFILES = \
microblaze-linux-tdep.c \
microblaze-tdep.c \
mingw-hdep.c \
@@ -153,7 +123,7 @@
mips-fbsd-nat.c \
mips-fbsd-tdep.c \
mips-linux-nat.c \
-@@ -2272,6 +2297,7 @@ ALLDEPFILES = \
+@@ -1755,6 +1773,7 @@ ALLDEPFILES = \
obsd-tdep.c \
or1k-linux-nat.c \
posix-hdep.c \
@@ -161,7 +131,7 @@
ppc-fbsd-nat.c \
ppc-fbsd-tdep.c \
ppc-linux-nat.c \
-@@ -2286,6 +2312,7 @@ ALLDEPFILES = \
+@@ -1769,6 +1788,7 @@ ALLDEPFILES = \
procfs.c \
ravenscar-thread.c \
remote-sim.c \
@@ -169,7 +139,7 @@
riscv-fbsd-nat.c \
riscv-fbsd-tdep.c \
riscv-linux-nat.c \
-@@ -2322,6 +2349,7 @@ ALLDEPFILES = \
+@@ -1805,6 +1825,7 @@ ALLDEPFILES = \
sparc-sol2-nat.c \
sparc-sol2-tdep.c \
sparc-tdep.c \
@@ -177,7 +147,37 @@
sparc64-fbsd-nat.c \
sparc64-fbsd-tdep.c \
sparc64-linux-nat.c \
-@@ -2579,7 +2607,7 @@ endif
+@@ -1891,7 +1912,7 @@ generated_files = \
+ # Flags needed to compile Python code
+ PYTHON_CFLAGS = @PYTHON_CFLAGS@
+
+-all: gdb$(EXEEXT) $(CONFIG_ALL) gdb-gdb.py gdb-gdb.gdb
++all: gdb$(EXEEXT) kgdb$(EXEEXT) $(CONFIG_ALL) gdb-gdb.py gdb-gdb.gdb
+ @$(MAKE) $(FLAGS_TO_PASS) DO=all "DODIRS=$(SUBDIRS)" subdir_do
+
+ # Rule for compiling .c files in the top-level gdb directory.
+@@ -2154,6 +2175,12 @@ ifneq ($(CODESIGN_CERT),)
+ $(ECHO_SIGN) $(CODESIGN) -s $(CODESIGN_CERT) gdb$(EXEEXT)
+ endif
+
++kgdb$(EXEEXT): kgdb-main.o $(LIBGDB_OBS) $(ADD_DEPS) $(CDEPS) $(TDEPLIBS)
++ $(SILENCE) rm -f kgdb$(EXEEXT)
++ $(ECHO_CXXLD) $(CC_LD) $(INTERNAL_LDFLAGS) $(WIN32LDAPP) \
++ -o kgdb$(EXEEXT) kgdb-main.o $(LIBGDB_OBS) \
++ $(TDEPLIBS) $(TUI_LIBRARY) $(CLIBS) $(LOADLIBES)
++
+ # This is useful when debugging GDB, because some Unix's don't let you run GDB
+ # on itself without copying the executable. So "make gdb1" will make
+ # gdb and put a copy in gdb1, and you can run it with "gdb gdb1".
+@@ -2189,6 +2216,7 @@ clean mostlyclean: $(CONFIG_CLEAN)
+ rm -f init.c stamp-init version.c stamp-version
+ rm -f gdb$(EXEEXT) core make.log
+ rm -f gdb[0-9]$(EXEEXT)
++ rm -f kgdb$(EXEEXT)
+ rm -f test-cp-name-parser$(EXEEXT)
+ rm -f xml-builtin.c stamp-xml
+ rm -f $(DEPDIR)/*
+@@ -2608,7 +2636,7 @@ endif
# A list of all the objects we might care about in this build, for
# dependency tracking.
@@ -187,7 +187,7 @@
# All the .deps files to include.
diff --git gdb/config.in gdb/config.in
-index cd9f252eba1..f2fea54353d 100644
+index 736e6be1c48..7df4d954db0 100644
--- gdb/config.in
+++ gdb/config.in
@@ -223,6 +223,12 @@
@@ -204,10 +204,10 @@
#undef HAVE_LANGINFO_CODESET
diff --git gdb/configure gdb/configure
-index b34baff13be..16fafffb245 100755
+index bdc84be9c01..607ee3618cc 100755
--- gdb/configure
+++ gdb/configure
-@@ -8249,6 +8249,126 @@ fi
+@@ -19476,6 +19476,126 @@ fi
@@ -332,15 +332,15 @@
+
+
- if test "X$prefix" = "XNONE"; then
- acl_final_prefix="$ac_default_prefix"
+ # Check whether --with-zstd was given.
+ if test "${with_zstd+set}" = set; then :
diff --git gdb/configure.ac gdb/configure.ac
-index bc8925ddd69..04540240760 100644
+index c81df8c4967..b3e1b3b5283 100644
--- gdb/configure.ac
+++ gdb/configure.ac
-@@ -481,6 +481,16 @@ AC_SEARCH_LIBS(socketpair, socket)
- # Link in zlib if we can. This allows us to read compressed debug sections.
+@@ -472,6 +472,16 @@ AC_SEARCH_LIBS(socketpair, socket)
AM_ZLIB
+ AC_ZSTD
+# kgdb needs kvm_open2 for cross-debugging
+AC_SEARCH_LIBS(kvm_open2, kvm,
@@ -356,7 +356,7 @@
# GDB may fork/exec the iconv program to get the list of supported character
diff --git gdb/configure.nat gdb/configure.nat
-index b45519fd116..6443969f2f0 100644
+index aabcdeff989..6aeee4b61fa 100644
--- gdb/configure.nat
+++ gdb/configure.nat
@@ -63,7 +63,8 @@ case ${gdb_host} in
@@ -370,10 +370,10 @@
LOADLIBES='-lkvm'
;;
diff --git gdb/configure.tgt gdb/configure.tgt
-index 0705ccf32b8..babf4920139 100644
+index e84e222ba0d..cd3ef37fac6 100644
--- gdb/configure.tgt
+++ gdb/configure.tgt
-@@ -114,7 +114,7 @@ esac
+@@ -115,7 +115,7 @@ esac
case "${targ}" in
*-*-freebsd* | *-*-kfreebsd*-gnu)
@@ -382,7 +382,7 @@
*-*-netbsd* | *-*-knetbsd*-gnu)
os_obs="netbsd-tdep.o solib-svr4.o";;
*-*-openbsd*)
-@@ -131,7 +131,7 @@ aarch64*-*-elf | aarch64*-*-rtems*)
+@@ -132,7 +132,7 @@ aarch64*-*-elf | aarch64*-*-rtems*)
aarch64*-*-freebsd*)
# Target: FreeBSD/aarch64
@@ -391,7 +391,7 @@
;;
aarch64*-*-linux*)
-@@ -187,7 +187,7 @@ arm*-*-linux*)
+@@ -188,7 +188,7 @@ arm*-*-linux*)
;;
arm*-*-freebsd*)
# Target: FreeBSD/arm
@@ -400,7 +400,7 @@
;;
arm*-*-netbsd* | arm*-*-knetbsd*-gnu)
# Target: NetBSD/arm
-@@ -279,7 +279,11 @@ i[34567]86-*-dicos*)
+@@ -280,7 +280,11 @@ i[34567]86-*-dicos*)
;;
i[34567]86-*-freebsd* | i[34567]86-*-kfreebsd*-gnu)
# Target: FreeBSD/i386
@@ -413,7 +413,7 @@
;;
i[34567]86-*-netbsd* | i[34567]86-*-knetbsd*-gnu)
# Target: NetBSD/i386
-@@ -419,7 +423,7 @@ mips*-*-netbsd* | mips*-*-knetbsd*-gnu)
+@@ -420,7 +424,7 @@ mips*-*-netbsd* | mips*-*-knetbsd*-gnu)
;;
mips*-*-freebsd*)
# Target: MIPS running FreeBSD
@@ -422,7 +422,7 @@
;;
mips64*-*-openbsd*)
# Target: OpenBSD/mips64
-@@ -477,7 +481,7 @@ or1k-*-* | or1knd-*-*)
+@@ -478,7 +482,7 @@ or1k-*-* | or1knd-*-*)
powerpc*-*-freebsd*)
# Target: FreeBSD/powerpc
gdb_target_obs="rs6000-tdep.o ppc-sysv-tdep.o ppc64-tdep.o \
@@ -431,7 +431,7 @@
ravenscar-thread.o ppc-ravenscar-thread.o"
;;
-@@ -526,7 +530,7 @@ s390*-*-linux*)
+@@ -527,7 +531,7 @@ s390*-*-linux*)
riscv*-*-freebsd*)
# Target: FreeBSD/riscv
@@ -440,7 +440,7 @@
;;
riscv*-*-linux*)
-@@ -591,6 +595,7 @@ sparc64-*-linux*)
+@@ -592,6 +596,7 @@ sparc64-*-linux*)
sparc*-*-freebsd* | sparc*-*-kfreebsd*-gnu)
# Target: FreeBSD/sparc64
gdb_target_obs="sparc-tdep.o sparc64-tdep.o sparc64-fbsd-tdep.o \
@@ -448,7 +448,7 @@
ravenscar-thread.o sparc-ravenscar-thread.o"
;;
sparc-*-netbsd* | sparc-*-knetbsd*-gnu)
-@@ -707,8 +712,8 @@ x86_64-*-linux*)
+@@ -708,8 +713,8 @@ x86_64-*-linux*)
;;
x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
# Target: FreeBSD/amd64
@@ -460,7 +460,7 @@
x86_64-*-mingw* | x86_64-*-cygwin*)
# Target: MingW/amd64
diff --git gdb/osabi.c gdb/osabi.c
-index d4a98061dbd..ff4117ca8a1 100644
+index d18802ac3a4..4f3aa6a52da 100644
--- gdb/osabi.c
+++ gdb/osabi.c
@@ -67,6 +67,7 @@ static const struct osabi_names gdb_osabi_names[] =
@@ -472,7 +472,7 @@
{ "OpenBSD", NULL },
{ "WindowsCE", NULL },
diff --git gdb/osabi.h gdb/osabi.h
-index be016732cbc..866e764c220 100644
+index 35f14ec433c..1276d34d5f7 100644
--- gdb/osabi.h
+++ gdb/osabi.h
@@ -31,6 +31,7 @@ enum gdb_osabi
@@ -484,10 +484,10 @@
GDB_OSABI_OPENBSD,
GDB_OSABI_WINCE,
diff --git gdb/regcache.c gdb/regcache.c
-index 00d7a10e289..7639d459286 100644
+index 56b6d047874..47637c628a7 100644
--- gdb/regcache.c
+++ gdb/regcache.c
-@@ -1107,6 +1107,22 @@ reg_buffer::raw_supply_zeroed (int regnum)
+@@ -1112,6 +1112,22 @@ reg_buffer::raw_supply_zeroed (int regnum)
m_register_status[regnum] = REG_VALID;
}
@@ -511,7 +511,7 @@
void
diff --git gdb/regcache.h gdb/regcache.h
-index 1dbba5ce9af..7d4e404a96c 100644
+index b9ffab9950d..f32d7a3bd00 100644
--- gdb/regcache.h
+++ gdb/regcache.h
@@ -237,6 +237,8 @@ class reg_buffer : public reg_buffer_common
diff --git a/devel/gdb/files/kgdb/aarch64-fbsd-kern.c b/devel/gdb/files/kgdb/aarch64-fbsd-kern.c
--- a/devel/gdb/files/kgdb/aarch64-fbsd-kern.c
+++ b/devel/gdb/files/kgdb/aarch64-fbsd-kern.c
@@ -67,7 +67,7 @@
}
static struct trad_frame_cache *
-aarch64_fbsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
+aarch64_fbsd_trapframe_cache (frame_info_ptr this_frame, void **this_cache)
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -119,8 +119,8 @@
}
static void
-aarch64_fbsd_trapframe_this_id (struct frame_info *this_frame,
- void **this_cache, struct frame_id *this_id)
+aarch64_fbsd_trapframe_this_id (frame_info_ptr this_frame,
+ void **this_cache, struct frame_id *this_id)
{
struct trad_frame_cache *cache =
aarch64_fbsd_trapframe_cache (this_frame, this_cache);
@@ -129,8 +129,8 @@
}
static struct value *
-aarch64_fbsd_trapframe_prev_register (struct frame_info *this_frame,
- void **this_cache, int regnum)
+aarch64_fbsd_trapframe_prev_register (frame_info_ptr this_frame,
+ void **this_cache, int regnum)
{
struct trad_frame_cache *cache =
aarch64_fbsd_trapframe_cache (this_frame, this_cache);
@@ -140,7 +140,7 @@
static int
aarch64_fbsd_trapframe_sniffer (const struct frame_unwind *self,
- struct frame_info *this_frame,
+ frame_info_ptr this_frame,
void **this_prologue_cache)
{
const char *name;
@@ -169,22 +169,17 @@
static void
aarch64_fbsd_kernel_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
- aarch64_gdbarch_tdep *tdep = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+ aarch64_gdbarch_tdep *tdep = gdbarch_tdep<aarch64_gdbarch_tdep> (gdbarch);
frame_unwind_prepend_unwinder (gdbarch, &aarch64_fbsd_trapframe_unwind);
- set_solib_ops (gdbarch, &kld_so_ops);
+ set_gdbarch_so_ops (gdbarch, &kld_so_ops);
/* Enable longjmp. */
tdep->jb_pc = 13;
fbsd_vmcore_set_supply_pcb (gdbarch, aarch64_fbsd_supply_pcb);
fbsd_vmcore_set_cpu_pcb_addr (gdbarch, kgdb_trgt_stop_pcb);
-
- /* The kernel is linked at a virtual address with the upper 4 bits
- set, so all 64 bits of virtual addresses need to be treated as
- significant. */
- set_gdbarch_significant_addr_bit (gdbarch, 64);
}
void _initialize_aarch64_kgdb_tdep ();
diff --git a/devel/gdb/files/kgdb/amd64fbsd-kern.c b/devel/gdb/files/kgdb/amd64fbsd-kern.c
--- a/devel/gdb/files/kgdb/amd64fbsd-kern.c
+++ b/devel/gdb/files/kgdb/amd64fbsd-kern.c
@@ -128,7 +128,7 @@
#define TRAPFRAME_SIZE 192
static struct trad_frame_cache *
-amd64fbsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
+amd64fbsd_trapframe_cache (frame_info_ptr this_frame, void **this_cache)
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -179,7 +179,7 @@
}
static void
-amd64fbsd_trapframe_this_id (struct frame_info *this_frame,
+amd64fbsd_trapframe_this_id (frame_info_ptr this_frame,
void **this_cache, struct frame_id *this_id)
{
struct trad_frame_cache *cache =
@@ -189,7 +189,7 @@
}
static struct value *
-amd64fbsd_trapframe_prev_register (struct frame_info *this_frame,
+amd64fbsd_trapframe_prev_register (frame_info_ptr this_frame,
void **this_cache, int regnum)
{
struct trad_frame_cache *cache =
@@ -200,7 +200,7 @@
static int
amd64fbsd_trapframe_sniffer (const struct frame_unwind *self,
- struct frame_info *this_frame,
+ frame_info_ptr this_frame,
void **this_prologue_cache)
{
const char *name;
@@ -233,7 +233,7 @@
frame_unwind_prepend_unwinder(gdbarch, &amd64fbsd_trapframe_unwind);
- set_solib_ops(gdbarch, &kld_so_ops);
+ set_gdbarch_so_ops(gdbarch, &kld_so_ops);
fbsd_vmcore_set_supply_pcb(gdbarch, amd64fbsd_supply_pcb);
fbsd_vmcore_set_cpu_pcb_addr(gdbarch, kgdb_trgt_stop_pcb);
diff --git a/devel/gdb/files/kgdb/arm-fbsd-kern.c b/devel/gdb/files/kgdb/arm-fbsd-kern.c
--- a/devel/gdb/files/kgdb/arm-fbsd-kern.c
+++ b/devel/gdb/files/kgdb/arm-fbsd-kern.c
@@ -75,7 +75,7 @@
#define PSR_USR32_MODE 0x00000010
static struct trad_frame_cache *
-arm_fbsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
+arm_fbsd_trapframe_cache (frame_info_ptr this_frame, void **this_cache)
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -132,8 +132,8 @@
}
static void
-arm_fbsd_trapframe_this_id (struct frame_info *this_frame,
- void **this_cache, struct frame_id *this_id)
+arm_fbsd_trapframe_this_id (frame_info_ptr this_frame,
+ void **this_cache, struct frame_id *this_id)
{
struct trad_frame_cache *cache =
arm_fbsd_trapframe_cache (this_frame, this_cache);
@@ -142,8 +142,8 @@
}
static struct value *
-arm_fbsd_trapframe_prev_register (struct frame_info *this_frame,
- void **this_cache, int regnum)
+arm_fbsd_trapframe_prev_register (frame_info_ptr this_frame,
+ void **this_cache, int regnum)
{
struct trad_frame_cache *cache =
arm_fbsd_trapframe_cache (this_frame, this_cache);
@@ -153,8 +153,8 @@
static int
arm_fbsd_trapframe_sniffer (const struct frame_unwind *self,
- struct frame_info *this_frame,
- void **this_prologue_cache)
+ frame_info_ptr this_frame,
+ void **this_prologue_cache)
{
const char *name;
@@ -183,11 +183,11 @@
static void
arm_fbsd_kernel_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
- arm_gdbarch_tdep *tdep = (arm_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+ arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
frame_unwind_prepend_unwinder (gdbarch, &arm_fbsd_trapframe_unwind);
- set_solib_ops (gdbarch, &kld_so_ops);
+ set_gdbarch_so_ops (gdbarch, &kld_so_ops);
tdep->jb_pc = 24;
tdep->jb_elt_size = 4;
diff --git a/devel/gdb/files/kgdb/fbsd-kld.c b/devel/gdb/files/kgdb/fbsd-kld.c
--- a/devel/gdb/files/kgdb/fbsd-kld.c
+++ b/devel/gdb/files/kgdb/fbsd-kld.c
@@ -56,15 +56,7 @@
struct target_so_ops kld_so_ops;
/* Per-program-space data key. */
-static const struct program_space_data *kld_pspace_data;
-
-static void
-kld_pspace_data_cleanup (struct program_space *pspace, void *arg)
-{
- struct kld_info *info = (struct kld_info *)arg;
-
- xfree (info);
-}
+static const registry<program_space>::key<kld_info> kld_pspace_data;
/* Get the current kld data. If none is found yet, add it now. This
function always returns a valid object. */
@@ -74,13 +66,10 @@
{
struct kld_info *info;
- info = (struct kld_info *)
- program_space_data (current_program_space, kld_pspace_data);
- if (info != NULL)
- return info;
+ info = kld_pspace_data.get (current_program_space);
+ if (info == nullptr)
+ info = kld_pspace_data.emplace (current_program_space);
- info = XCNEW (struct kld_info);
- set_program_space_data (current_program_space, kld_pspace_data, info);
return info;
}
@@ -272,7 +261,7 @@
symfile_add_flags add_flags = 0;
if (from_tty)
add_flags |= SYMFILE_VERBOSE;
- symbol_file_add_from_bfd(bfd.get(), path, add_flags, &sap,
+ symbol_file_add_from_bfd(bfd, path, add_flags, &sap,
OBJF_USERLOADED, NULL);
}
@@ -544,7 +533,4 @@
"Usage: add-kld FILE\n\
Load the symbols from the kernel loadable module FILE.");
set_cmd_completer(c, filename_completer);
-
- kld_pspace_data = register_program_space_data_with_cleanup (NULL,
- kld_pspace_data_cleanup);
}
diff --git a/devel/gdb/files/kgdb/fbsd-kthr.c b/devel/gdb/files/kgdb/fbsd-kthr.c
--- a/devel/gdb/files/kgdb/fbsd-kthr.c
+++ b/devel/gdb/files/kgdb/fbsd-kthr.c
@@ -58,7 +58,7 @@
msym = lookup_minimal_symbol(sym, NULL, NULL);
if (msym.minsym == NULL)
return (0);
- return (BMSYMBOL_VALUE_ADDRESS(msym));
+ return (msym.value_address ());
}
/*
@@ -159,7 +159,7 @@
for (i = 0; i < pidhash; i++) {
try {
paddr = read_memory_typed_address (pidhashtbl +
- i * TYPE_LENGTH(ptr_type), ptr_type);
+ i * ptr_type->length (), ptr_type);
} catch (const gdb_exception_error &e) {
continue;
}
diff --git a/devel/gdb/files/kgdb/fbsd-kvm.c b/devel/gdb/files/kgdb/fbsd-kvm.c
--- a/devel/gdb/files/kgdb/fbsd-kvm.c
+++ b/devel/gdb/files/kgdb/fbsd-kvm.c
@@ -41,6 +41,7 @@
#include "readline/tilde.h"
#include "gdbsupport/buildargv.h"
#include "gdbsupport/pathstuff.h"
+#include "gdbsupport/gdb_tilde_expand.h"
#include <sys/user.h>
#include <fcntl.h>
@@ -51,26 +52,26 @@
static CORE_ADDR stoppcbs;
static LONGEST pcb_size;
-static char *vmcore;
-
-/* Per-architecture data key. */
-static struct gdbarch_data *fbsd_vmcore_data;
+static std::string vmcore;
struct fbsd_vmcore_ops
{
/* Supply registers for a pcb to a register cache. */
- void (*supply_pcb)(struct regcache *, CORE_ADDR);
+ void (*supply_pcb)(struct regcache *, CORE_ADDR) = nullptr;
/* Return address of pcb for thread running on a CPU. */
- CORE_ADDR (*cpu_pcb_addr)(u_int);
+ CORE_ADDR (*cpu_pcb_addr)(u_int) = nullptr;
};
-static void *
-fbsd_vmcore_init (struct obstack *obstack)
-{
- struct fbsd_vmcore_ops *ops;
+/* Per-architecture data key. */
+static const registry<gdbarch>::key<struct fbsd_vmcore_ops> fbsd_vmcore_data;
- ops = OBSTACK_ZALLOC (obstack, struct fbsd_vmcore_ops);
+static struct fbsd_vmcore_ops *
+get_fbsd_vmcore_ops (struct gdbarch *gdbarch)
+{
+ struct fbsd_vmcore_ops *ops = fbsd_vmcore_data.get (gdbarch);
+ if (ops == nullptr)
+ ops = fbsd_vmcore_data.emplace (gdbarch);
return ops;
}
@@ -82,8 +83,7 @@
void (*supply_pcb) (struct regcache *,
CORE_ADDR))
{
- struct fbsd_vmcore_ops *ops = (struct fbsd_vmcore_ops *)
- gdbarch_data (gdbarch, fbsd_vmcore_data);
+ struct fbsd_vmcore_ops *ops = get_fbsd_vmcore_ops (gdbarch);
ops->supply_pcb = supply_pcb;
}
@@ -95,8 +95,7 @@
fbsd_vmcore_set_cpu_pcb_addr (struct gdbarch *gdbarch,
CORE_ADDR (*cpu_pcb_addr) (u_int))
{
- struct fbsd_vmcore_ops *ops = (struct fbsd_vmcore_ops *)
- gdbarch_data (gdbarch, fbsd_vmcore_data);
+ struct fbsd_vmcore_ops *ops = get_fbsd_vmcore_ops (gdbarch);
ops->cpu_pcb_addr = cpu_pcb_addr;
}
@@ -242,7 +241,6 @@
void files_info () override;
bool thread_alive (ptid_t ptid) override;
- void update_thread_list () override;
std::string pid_to_str (ptid_t) override;
const char *extra_thread_info (thread_info *) override;
@@ -265,7 +263,7 @@
ms = lookup_minimal_symbol (name, NULL, NULL);
if (ms.minsym == NULL)
return (1);
- *kva = BMSYMBOL_VALUE_ADDRESS (ms);
+ *kva = ms.value_address ();
return (0);
}
#endif
@@ -273,15 +271,14 @@
static void
fbsd_kvm_target_open (const char *args, int from_tty)
{
- struct fbsd_vmcore_ops *ops = (struct fbsd_vmcore_ops *)
- gdbarch_data (target_gdbarch(), fbsd_vmcore_data);
+ struct fbsd_vmcore_ops *ops = get_fbsd_vmcore_ops (target_gdbarch ());
char kvm_err[_POSIX2_LINE_MAX];
struct inferior *inf;
struct cleanup *old_chain;
struct kthr *kt;
kvm_t *nkvm;
const char *kernel;
- char *temp, *filename;
+ std::string filename;
bool writeable;
if (ops == NULL || ops->supply_pcb == NULL || ops->cpu_pcb_addr == NULL)
@@ -293,7 +290,6 @@
error ("Can't open a vmcore without a kernel");
writeable = false;
- filename = NULL;
if (args != NULL) {
gdb_argv built_argv (args);
@@ -304,29 +300,24 @@
else
error (_("Invalid argument"));
} else {
- if (filename != NULL)
+ if (!filename.empty ())
error (_("Invalid argument"));
- filename = tilde_expand (*argv);
- if (filename[0] != '/') {
- gdb::unique_xmalloc_ptr<char> temp (gdb_abspath (filename));
-
- xfree (filename);
- filename = temp.release ();
- }
+ filename = gdb_tilde_expand (*argv);
+ if (!IS_ABSOLUTE_PATH (filename))
+ filename = gdb_abspath (filename.c_str ());
}
}
}
#ifdef HAVE_KVM_OPEN2
- nkvm = kvm_open2(kernel, filename,
+ nkvm = kvm_open2(kernel, filename.c_str (),
writeable ? O_RDWR : O_RDONLY, kvm_err, kgdb_resolve_symbol);
#else
- nkvm = kvm_openfiles(kernel, filename, NULL,
+ nkvm = kvm_openfiles(kernel, filename.c_str (), NULL,
writeable ? O_RDWR : O_RDONLY, kvm_err);
#endif
if (nkvm == NULL) {
- xfree (filename);
error ("Failed to open vmcore: %s", kvm_err);
}
@@ -338,7 +329,7 @@
struct objfile *symfile_objfile =
current_program_space->symfile_object_file;
if (symfile_objfile != nullptr &&
- (bfd_get_file_flags(symfile_objfile->obfd) &
+ (bfd_get_file_flags(symfile_objfile->obfd.get ()) &
(EXEC_P | DYNAMIC)) != 0) {
CORE_ADDR displacement = kvm_kerndisp(nkvm);
if (displacement != 0) {
@@ -389,7 +380,7 @@
}
kvm = nkvm;
- vmcore = filename;
+ vmcore = std::move(filename);
current_inferior()->push_target (&fbsd_kvm_ops);
kgdb_dmesg();
@@ -427,11 +418,10 @@
clear_solib();
if (kvm_close(kvm) != 0)
- warning("cannot close \"%s\": %s", vmcore,
+ warning("cannot close \"%s\": %s", vmcore.c_str (),
kvm_geterr(kvm));
kvm = NULL;
- xfree(vmcore);
- vmcore = NULL;
+ vmcore.clear ();
}
}
@@ -446,7 +436,7 @@
unpush_target(&kgdb_trgt_ops);
reinit_frame_cache();
if (from_tty)
- printf_filtered("No vmcore file now.\n");
+ gdb_printf("No vmcore file now.\n");
}
#endif
@@ -479,39 +469,15 @@
fbsd_kvm_target::files_info()
{
- printf_filtered ("\t`%s', ", vmcore);
+ gdb_printf ("\t`%s', ", vmcore.c_str ());
gdb_stdout->wrap_here (8);
- printf_filtered ("file type %s.\n", "FreeBSD kernel vmcore");
-}
-
-void
-fbsd_kvm_target::update_thread_list()
-{
- /*
- * XXX: We should probably rescan the thread list here and update
- * it if there are any changes. One nit though is that we'd have
- * to detect exited threads.
- */
- gdb_assert(kvm != NULL);
-#if 0
- prune_threads();
-#endif
-#if 0
- struct target_ops *tb;
-
- if (kvm != NULL)
- return;
-
- tb = find_target_beneath(ops);
- if (tb->to_update_thread_list != NULL)
- tb->to_update_thread_list(tb);
-#endif
+ gdb_printf ("file type %s.\n", "FreeBSD kernel vmcore");
}
std::string
fbsd_kvm_target::pid_to_str(ptid_t ptid)
{
- return string_printf (_("Thread %llu"), ptid.tid ());
+ return string_printf (_("Thread %ld"), ptid.tid ());
}
bool
@@ -523,8 +489,7 @@
void
fbsd_kvm_target::fetch_registers(struct regcache *regcache, int regnum)
{
- struct fbsd_vmcore_ops *ops = (struct fbsd_vmcore_ops *)
- gdbarch_data (target_gdbarch(), fbsd_vmcore_data);
+ struct fbsd_vmcore_ops *ops = get_fbsd_vmcore_ops (target_gdbarch ());
struct kthr *kt;
if (ops->supply_pcb == NULL)
@@ -566,24 +531,6 @@
}
}
-#if 0
-static int
-kgdb_trgt_insert_breakpoint(struct target_ops *ops, struct gdbarch *gdbarch,
- struct bp_target_info *bp_tgt)
-{
-
- return 0;
-}
-
-static int
-kgdb_trgt_remove_breakpoint(struct target_ops *ops, struct gdbarch *gdbarch,
- struct bp_target_info *bp_tgt, enum remove_bp_reason reason)
-{
-
- return 0;
-}
-#endif
-
static void
kgdb_switch_to_thread(const char *arg, int tid)
{
@@ -649,8 +596,6 @@
add_target(fbsd_kvm_target_info, fbsd_kvm_target_open,
filename_completer);
- fbsd_vmcore_data = gdbarch_data_register_pre_init(fbsd_vmcore_init);
-
add_com ("proc", class_obscure, kgdb_set_proc_cmd,
"Set current process context");
add_com ("tid", class_obscure, kgdb_set_tid_cmd,
diff --git a/devel/gdb/files/kgdb/i386fbsd-kern.c b/devel/gdb/files/kgdb/i386fbsd-kern.c
--- a/devel/gdb/files/kgdb/i386fbsd-kern.c
+++ b/devel/gdb/files/kgdb/i386fbsd-kern.c
@@ -50,15 +50,7 @@
};
/* Per-program-space data key. */
-static const struct program_space_data *i386fbsd_pspace_data;
-
-static void
-i386fbsd_pspace_data_cleanup (struct program_space *pspace, void *arg)
-{
- struct i386fbsd_info *info = (struct i386fbsd_info *)arg;
-
- xfree (info);
-}
+static const registry<program_space>::key<i386fbsd_info> i386fbsd_pspace_data;
/* Get the current i386fbsd data. If none is found yet, add it now. This
function always returns a valid object. */
@@ -68,13 +60,11 @@
{
struct i386fbsd_info *info;
- info = (struct i386fbsd_info *)
- program_space_data (current_program_space, i386fbsd_pspace_data);
- if (info != NULL)
+ info = i386fbsd_pspace_data.get (current_program_space);
+ if (info != nullptr)
return info;
- info = XCNEW (struct i386fbsd_info);
- set_program_space_data (current_program_space, i386fbsd_pspace_data, info);
+ info = i386fbsd_pspace_data.emplace (current_program_space);
/*
* In revision 1.117 of i386/i386/exception.S trap handlers
@@ -219,7 +209,7 @@
}
static struct trad_frame_cache *
-i386fbsd_dblfault_cache (struct frame_info *this_frame, void **this_cache)
+i386fbsd_dblfault_cache (frame_info_ptr this_frame, void **this_cache)
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -249,8 +239,8 @@
}
static void
-i386fbsd_dblfault_this_id (struct frame_info *this_frame,
- void **this_cache, struct frame_id *this_id)
+i386fbsd_dblfault_this_id (frame_info_ptr this_frame,
+ void **this_cache, struct frame_id *this_id)
{
struct trad_frame_cache *cache =
i386fbsd_dblfault_cache (this_frame, this_cache);
@@ -259,8 +249,8 @@
}
static struct value *
-i386fbsd_dblfault_prev_register (struct frame_info *this_frame,
- void **this_cache, int regnum)
+i386fbsd_dblfault_prev_register (frame_info_ptr this_frame,
+ void **this_cache, int regnum)
{
struct trad_frame_cache *cache =
i386fbsd_dblfault_cache (this_frame, this_cache);
@@ -270,8 +260,8 @@
static int
i386fbsd_dblfault_sniffer (const struct frame_unwind *self,
- struct frame_info *this_frame,
- void **this_prologue_cache)
+ frame_info_ptr this_frame,
+ void **this_prologue_cache)
{
const char *name;
@@ -312,7 +302,7 @@
#define TRAPFRAME_SIZE 72
static struct trad_frame_cache *
-i386fbsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
+i386fbsd_trapframe_cache (frame_info_ptr this_frame, void **this_cache)
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -407,8 +397,8 @@
}
static void
-i386fbsd_trapframe_this_id (struct frame_info *this_frame,
- void **this_cache, struct frame_id *this_id)
+i386fbsd_trapframe_this_id (frame_info_ptr this_frame,
+ void **this_cache, struct frame_id *this_id)
{
struct trad_frame_cache *cache =
i386fbsd_trapframe_cache (this_frame, this_cache);
@@ -417,8 +407,8 @@
}
static struct value *
-i386fbsd_trapframe_prev_register (struct frame_info *this_frame,
- void **this_cache, int regnum)
+i386fbsd_trapframe_prev_register (frame_info_ptr this_frame,
+ void **this_cache, int regnum)
{
struct trad_frame_cache *cache =
i386fbsd_trapframe_cache (this_frame, this_cache);
@@ -428,8 +418,8 @@
static int
i386fbsd_trapframe_sniffer (const struct frame_unwind *self,
- struct frame_info *this_frame,
- void **this_prologue_cache)
+ frame_info_ptr this_frame,
+ void **this_prologue_cache)
{
const char *name;
@@ -460,7 +450,7 @@
#endif
frame_unwind_prepend_unwinder(gdbarch, &i386fbsd_trapframe_unwind);
- set_solib_ops(gdbarch, &kld_so_ops);
+ set_gdbarch_so_ops(gdbarch, &kld_so_ops);
fbsd_vmcore_set_supply_pcb(gdbarch, i386fbsd_supply_pcb);
fbsd_vmcore_set_cpu_pcb_addr(gdbarch, kgdb_trgt_stop_pcb);
@@ -478,9 +468,6 @@
gdbarch_register_osabi (bfd_arch_i386, 0,
GDB_OSABI_FREEBSD_KERNEL, i386fbsd_kernel_init_abi);
- i386fbsd_pspace_data = register_program_space_data_with_cleanup (NULL,
- i386fbsd_pspace_data_cleanup);
-
#ifdef __i386__
/*
* FreeBSD/i386 kernels prior to the introduction of AVX
diff --git a/devel/gdb/files/kgdb/mipsfbsd-kern.c b/devel/gdb/files/kgdb/mipsfbsd-kern.c
--- a/devel/gdb/files/kgdb/mipsfbsd-kern.c
+++ b/devel/gdb/files/kgdb/mipsfbsd-kern.c
@@ -124,7 +124,7 @@
}
static struct trad_frame_cache *
-mipsfbsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
+mipsfbsd_trapframe_cache (frame_info_ptr this_frame, void **this_cache)
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
size_t regsize = mips_isa_regsize (gdbarch);
@@ -203,7 +203,7 @@
}
static void
-mipsfbsd_trapframe_this_id (struct frame_info *this_frame,
+mipsfbsd_trapframe_this_id (frame_info_ptr this_frame,
void **this_cache, struct frame_id *this_id)
{
struct trad_frame_cache *cache =
@@ -213,7 +213,7 @@
}
static struct value *
-mipsfbsd_trapframe_prev_register (struct frame_info *this_frame,
+mipsfbsd_trapframe_prev_register (frame_info_ptr this_frame,
void **this_cache, int regnum)
{
struct trad_frame_cache *cache =
@@ -224,7 +224,7 @@
static int
mipsfbsd_trapframe_sniffer (const struct frame_unwind *self,
- struct frame_info *this_frame,
+ frame_info_ptr this_frame,
void **this_prologue_cache)
{
const char *name;
@@ -258,25 +258,17 @@
break;
case MIPS_ABI_N32:
set_gdbarch_long_double_bit (gdbarch, 128);
- /* These floatformats should probably be renamed. MIPS uses
- the same 128-bit IEEE floating point format that IA-64 uses,
- except that the quiet/signalling NaN bit is reversed (GDB
- does not distinguish between quiet and signalling NaNs). */
- set_gdbarch_long_double_format (gdbarch, floatformats_ia64_quad);
+ set_gdbarch_long_double_format (gdbarch, floatformats_ieee_quad);
break;
case MIPS_ABI_N64:
set_gdbarch_long_double_bit (gdbarch, 128);
- /* These floatformats should probably be renamed. MIPS uses
- the same 128-bit IEEE floating point format that IA-64 uses,
- except that the quiet/signalling NaN bit is reversed (GDB
- does not distinguish between quiet and signalling NaNs). */
- set_gdbarch_long_double_format (gdbarch, floatformats_ia64_quad);
+ set_gdbarch_long_double_format (gdbarch, floatformats_ieee_quad);
break;
}
frame_unwind_prepend_unwinder (gdbarch, &mipsfbsd_trapframe_unwind);
- set_solib_ops (gdbarch, &kld_so_ops);
+ set_gdbarch_so_ops (gdbarch, &kld_so_ops);
fbsd_vmcore_set_supply_pcb (gdbarch, mipsfbsd_supply_pcb);
fbsd_vmcore_set_cpu_pcb_addr (gdbarch, kgdb_trgt_stop_pcb);
diff --git a/devel/gdb/files/kgdb/ppcfbsd-kern.c b/devel/gdb/files/kgdb/ppcfbsd-kern.c
--- a/devel/gdb/files/kgdb/ppcfbsd-kern.c
+++ b/devel/gdb/files/kgdb/ppcfbsd-kern.c
@@ -64,7 +64,7 @@
static void
ppcfbsd_supply_pcb(struct regcache *regcache, CORE_ADDR pcb_addr)
{
- ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (regcache->arch ());
+ ppc_gdbarch_tdep *tdep = gdbarch_tdep<ppc_gdbarch_tdep> (regcache->arch ());
gdb_byte buf[24 * tdep->wordsize];
int i;
@@ -118,10 +118,10 @@
#endif
static struct trad_frame_cache *
-ppcfbsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
+ppcfbsd_trapframe_cache (frame_info_ptr this_frame, void **this_cache)
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
- ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+ ppc_gdbarch_tdep *tdep = gdbarch_tdep<ppc_gdbarch_tdep> (gdbarch);
struct trad_frame_cache *cache;
CORE_ADDR base;
int i;
@@ -160,8 +160,8 @@
}
static void
-ppcfbsd_trapframe_this_id (struct frame_info *this_frame,
- void **this_cache, struct frame_id *this_id)
+ppcfbsd_trapframe_this_id (frame_info_ptr this_frame,
+ void **this_cache, struct frame_id *this_id)
{
struct trad_frame_cache *cache =
ppcfbsd_trapframe_cache (this_frame, this_cache);
@@ -170,8 +170,8 @@
}
static struct value *
-ppcfbsd_trapframe_prev_register (struct frame_info *this_frame,
- void **this_cache, int regnum)
+ppcfbsd_trapframe_prev_register (frame_info_ptr this_frame,
+ void **this_cache, int regnum)
{
struct trad_frame_cache *cache =
ppcfbsd_trapframe_cache (this_frame, this_cache);
@@ -181,8 +181,8 @@
static int
ppcfbsd_trapframe_sniffer (const struct frame_unwind *self,
- struct frame_info *this_frame,
- void **this_cache)
+ frame_info_ptr this_frame,
+ void **this_cache)
{
CORE_ADDR pc;
const char *name;
@@ -211,11 +211,11 @@
static void
ppcfbsd_kernel_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
{
- ppc_gdbarch_tdep *tdep = (ppc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
+ ppc_gdbarch_tdep *tdep = gdbarch_tdep<ppc_gdbarch_tdep> (gdbarch);
frame_unwind_prepend_unwinder(gdbarch, &ppcfbsd_trapframe_unwind);
- set_solib_ops(gdbarch, &kld_so_ops);
+ set_gdbarch_so_ops(gdbarch, &kld_so_ops);
fbsd_vmcore_set_supply_pcb(gdbarch, ppcfbsd_supply_pcb);
fbsd_vmcore_set_cpu_pcb_addr(gdbarch, kgdb_trgt_stop_pcb);
diff --git a/devel/gdb/files/kgdb/riscv-fbsd-kern.c b/devel/gdb/files/kgdb/riscv-fbsd-kern.c
--- a/devel/gdb/files/kgdb/riscv-fbsd-kern.c
+++ b/devel/gdb/files/kgdb/riscv-fbsd-kern.c
@@ -96,7 +96,7 @@
};
static struct trad_frame_cache *
-riscv_fbsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
+riscv_fbsd_trapframe_cache (frame_info_ptr this_frame, void **this_cache)
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -136,8 +136,8 @@
}
static void
-riscv_fbsd_trapframe_this_id (struct frame_info *this_frame,
- void **this_cache, struct frame_id *this_id)
+riscv_fbsd_trapframe_this_id (frame_info_ptr this_frame,
+ void **this_cache, struct frame_id *this_id)
{
struct trad_frame_cache *cache =
riscv_fbsd_trapframe_cache (this_frame, this_cache);
@@ -146,8 +146,8 @@
}
static struct value *
-riscv_fbsd_trapframe_prev_register (struct frame_info *this_frame,
- void **this_cache, int regnum)
+riscv_fbsd_trapframe_prev_register (frame_info_ptr this_frame,
+ void **this_cache, int regnum)
{
struct trad_frame_cache *cache =
riscv_fbsd_trapframe_cache (this_frame, this_cache);
@@ -157,8 +157,8 @@
static int
riscv_fbsd_trapframe_sniffer (const struct frame_unwind *self,
- struct frame_info *this_frame,
- void **this_prologue_cache)
+ frame_info_ptr this_frame,
+ void **this_prologue_cache)
{
const char *name;
@@ -185,7 +185,7 @@
{
frame_unwind_prepend_unwinder (gdbarch, &riscv_fbsd_trapframe_unwind);
- set_solib_ops (gdbarch, &kld_so_ops);
+ set_gdbarch_so_ops (gdbarch, &kld_so_ops);
set_gdbarch_software_single_step (gdbarch, riscv_software_single_step);
diff --git a/devel/gdb/files/kgdb/sparc64fbsd-kern.c b/devel/gdb/files/kgdb/sparc64fbsd-kern.c
--- a/devel/gdb/files/kgdb/sparc64fbsd-kern.c
+++ b/devel/gdb/files/kgdb/sparc64fbsd-kern.c
@@ -79,7 +79,7 @@
#endif
static struct sparc_frame_cache *
-sparc64fbsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
+sparc64fbsd_trapframe_cache (frame_info_ptr this_frame, void **this_cache)
{
struct sparc_frame_cache *cache;
CORE_ADDR fp, sp, trapframe_addr;
@@ -115,7 +115,7 @@
}
static void
-sparc64fbsd_trapframe_this_id (struct frame_info *this_frame,
+sparc64fbsd_trapframe_this_id (frame_info_ptr this_frame,
void **this_cache, struct frame_id *this_id)
{
struct sparc_frame_cache *cache =
@@ -125,7 +125,7 @@
}
static struct value *
-sparc64fbsd_trapframe_prev_register (struct frame_info *this_frame,
+sparc64fbsd_trapframe_prev_register (frame_info_ptr this_frame,
void **this_cache, int regnum)
{
struct sparc_frame_cache *cache =
@@ -136,7 +136,7 @@
static int
sparc64fbsd_trapframe_sniffer (const struct frame_unwind *self,
- struct frame_info *this_frame,
+ frame_info_ptr this_frame,
void **this_cache)
{
CORE_ADDR pc;
@@ -294,7 +294,7 @@
frame_unwind_prepend_unwinder(gdbarch, &sparc64fbsd_trapframe_unwind);
- set_solib_ops(gdbarch, &kld_so_ops);
+ set_gdbarch_so_ops(gdbarch, &kld_so_ops);
#ifdef __sparc64__
fbsd_vmcore_set_supply_pcb(gdbarch, sparc64fbsd_supply_pcb);
diff --git a/devel/gdb/files/patch-gdb-completer.c b/devel/gdb/files/patch-gdb-completer.c
deleted file mode 100644
--- a/devel/gdb/files/patch-gdb-completer.c
+++ /dev/null
@@ -1,11 +0,0 @@
---- gdb/completer.c.orig 2022-10-18 21:49:26.647324000 +0200
-+++ gdb/completer.c 2022-10-18 22:07:35.218698000 +0200
-@@ -2011,7 +2011,7 @@
- rl_basic_quote_characters = NULL;
- }
-
-- return rl_completer_word_break_characters;
-+ return (char *)rl_completer_word_break_characters;
- }
-
- char *
diff --git a/devel/gdb/files/patch-gnulib_import_stddef.in.h b/devel/gdb/files/patch-gnulib_import_stddef.in.h
--- a/devel/gdb/files/patch-gnulib_import_stddef.in.h
+++ b/devel/gdb/files/patch-gnulib_import_stddef.in.h
@@ -1,10 +1,10 @@
---- gnulib/import/stddef.in.h.orig 2020-09-13 04:33:41.000000000 +0200
-+++ gnulib/import/stddef.in.h 2020-11-01 15:46:55.395133000 +0100
-@@ -90,7 +90,7 @@
- #if defined _MSC_VER && defined __cplusplus
+--- gnulib/import/stddef.in.h.orig 2023-02-01 20:45:52.000000000 -0800
++++ gnulib/import/stddef.in.h 2023-02-24 09:49:57.368290000 -0800
+@@ -116,7 +116,7 @@
+ && defined __cplusplus
# include <cstddef>
#else
--# if ! (@HAVE_MAX_ALIGN_T@ || defined _GCC_MAX_ALIGN_T)
+-# if ! (@HAVE_MAX_ALIGN_T@ || (defined _GCC_MAX_ALIGN_T && !defined __clang__))
+# if 0
# if !GNULIB_defined_max_align_t
/* On the x86, the maximum storage alignment of double, long, etc. is 4,
diff --git a/devel/gdb/pkg-plist b/devel/gdb/pkg-plist
--- a/devel/gdb/pkg-plist
+++ b/devel/gdb/pkg-plist
@@ -15,6 +15,8 @@
%%PYTHON%%%%DATADIR%%/python/gdb/FrameDecorator.pyc
%%PYTHON%%%%DATADIR%%/python/gdb/FrameIterator.py
%%PYTHON%%%%DATADIR%%/python/gdb/FrameIterator.pyc
+%%PYTHON%%%%DATADIR%%/python/gdb/disassembler.py
+%%PYTHON%%%%DATADIR%%/python/gdb/disassembler.pyc
%%PYTHON%%%%DATADIR%%/python/gdb/frames.py
%%PYTHON%%%%DATADIR%%/python/gdb/frames.pyc
%%PYTHON%%%%DATADIR%%/python/gdb/printing.py

File Metadata

Mime Type
text/plain
Expires
Mon, Dec 2, 2:31 AM (21 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14974989
Default Alt Text
D38759.diff (229 KB)

Event Timeline