From 51be092155cd24ce1fb648ebaf7f5bd4fbd99a6f Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 14 Jun 2024 17:49:16 +0100 Subject: [PATCH] [gdb/tdep] Fix gdb.base/watchpoint-running on {arm, ppc64le}-linux --- gdb/aarch64-linux-nat.c | 30 ++++++------------------------ gdb/arm-linux-nat.c | 7 +++++++ gdb/linux-nat.c | 6 ++++++ gdb/linux-nat.h | 6 ++++++ gdb/ppc-linux-nat.c | 8 ++++++++ 5 files changed, 33 insertions(+), 24 deletions(-) diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c index 4b2a0ba9f7b..8bab594f1b3 100644 --- a/gdb/aarch64-linux-nat.c +++ b/gdb/aarch64-linux-nat.c @@ -78,12 +78,6 @@ class aarch64_linux_nat_target final int can_do_single_step () override; - /* Override the GNU/Linux inferior startup hook. */ - void post_startup_inferior (ptid_t) override; - - /* Override the GNU/Linux post attach hook. */ - void post_attach (int pid) override; - /* These three defer to common nat/ code. */ void low_new_thread (struct lwp_info *lp) override { aarch64_linux_new_thread (lp); } @@ -93,6 +87,7 @@ class aarch64_linux_nat_target final { aarch64_linux_prepare_to_resume (lp); } void low_new_fork (struct lwp_info *parent, pid_t child_pid) override; + void low_init_process (pid_t pid) override; void low_forget_process (pid_t pid) override; /* Add our siginfo layout converter. */ @@ -844,29 +839,16 @@ ps_get_thread_area (struct ps_prochandle *ph, } -/* Implement the virtual inf_ptrace_target::post_startup_inferior method. */ - -void -aarch64_linux_nat_target::post_startup_inferior (ptid_t ptid) -{ - low_forget_process (ptid.pid ()); - aarch64_linux_get_debug_reg_capacity (ptid.pid ()); - linux_nat_target::post_startup_inferior (ptid); -} - -/* Implement the "post_attach" target_ops method. */ +/* Implement the "low_init_process" target_ops method. */ void -aarch64_linux_nat_target::post_attach (int pid) +aarch64_linux_nat_target::low_init_process (pid_t pid) { low_forget_process (pid); - /* Set the hardware debug register capacity. If - aarch64_linux_get_debug_reg_capacity is not called - (as it is in aarch64_linux_child_post_startup_inferior) then - software watchpoints will be used instead of hardware - watchpoints when attaching to a target. */ + /* Set the hardware debug register capacity. If this is not called + then software watchpoints will be used instead of hardware + watchpoints. */ aarch64_linux_get_debug_reg_capacity (pid); - linux_nat_target::post_attach (pid); } /* Implement the "read_description" target_ops method. */ diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c index 50c24ecfcd2..531d555474a 100644 --- a/gdb/arm-linux-nat.c +++ b/gdb/arm-linux-nat.c @@ -103,6 +103,7 @@ class arm_linux_nat_target final : public linux_nat_target /* Handle process creation and exit. */ void low_new_fork (struct lwp_info *parent, pid_t child_pid) override; + void low_init_process (pid_t pid) override; void low_forget_process (pid_t pid) override; }; @@ -805,6 +806,12 @@ arm_linux_process_info_get (pid_t pid) return proc; } +void +arm_linux_nat_target::low_init_process (pid_t pid) +{ + arm_linux_get_hwbp_cap (); +} + /* Called whenever GDB is no longer debugging process PID. It deletes data structures that keep track of debug register state. */ diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index c0fe08a2a8b..3f252370c7b 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -454,6 +454,12 @@ linux_init_ptrace_procfs (pid_t pid, int attached) linux_ptrace_init_warnings (); linux_proc_init_warnings (); proc_mem_file_is_writable (); + + /* Let the arch-specific native code do any needed initialization. + Some architectures need to call ptrace to check for hardware + watchpoints support, etc. Call it now, when we know the tracee + is ptrace-stopped. */ + linux_target->low_init_process (pid); } linux_nat_target::~linux_nat_target () diff --git a/gdb/linux-nat.h b/gdb/linux-nat.h index f30a5f90e2a..ee8603743f6 100644 --- a/gdb/linux-nat.h +++ b/gdb/linux-nat.h @@ -164,6 +164,12 @@ class linux_nat_target : public inf_ptrace_target virtual void low_new_clone (struct lwp_info *parent, pid_t child_lwp) {} + /* The method to call, if any, when we have a new (from run/attach, + not fork) process to debug. The process is ptrace-stopped when + this is called. */ + virtual void low_init_process (pid_t pid) + {} + /* The method to call, if any, when a process is no longer attached. */ virtual void low_forget_process (pid_t pid) diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c index c73c7c90b4c..ebd222b896e 100644 --- a/gdb/ppc-linux-nat.c +++ b/gdb/ppc-linux-nat.c @@ -545,6 +545,8 @@ struct ppc_linux_nat_target final : public linux_nat_target void low_new_clone (struct lwp_info *, pid_t) override; + void low_init_process (pid_t pid) override; + void low_forget_process (pid_t pid) override; void low_prepare_to_resume (struct lwp_info *) override; @@ -2705,6 +2707,12 @@ ppc_linux_nat_target::remove_watchpoint (CORE_ADDR addr, int len, return 0; } +void +ppc_linux_nat_target::low_init_process (pid_t pid) +{ + m_dreg_interface.detect (ptid_t (pid, pid)); +} + /* Clean up the per-process info associated with PID. When using the HWDEBUG interface, we also erase the per-thread state of installed debug registers for all the threads that belong to the group of PID. base-commit: c3d23f753daaac52ee6c788090845ff0f359cf27 -- 2.35.3