public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Pedro Alves <pedro@palves.net>
To: gdb-patches@sourceware.org
Subject: Re: [PATCH] gdb+gdbserver/Linux: Remove USE_SIGTRAP_SIGINFO fallback
Date: Wed, 17 Apr 2024 17:40:30 +0100	[thread overview]
Message-ID: <93b4f656-a10c-4bda-8c85-6cb41fecc7fe@palves.net> (raw)
In-Reply-To: <20220627211045.2339994-1-pedro@palves.net>

On 2022-06-27 22:10, Pedro Alves wrote:
> It's been over 7 years (since commit faf09f0119da) since Linux GDB and
> GDBserver started relying on SIGTRAP si_code to tell whether a
> breakpoint triggered, which is important for non-stop mode.  When that
> then-new code was added, I had left the then-old code as fallback, in
> case some architectured still needed it.  Given AFAIK there haven't
> been complaints since, this commit finally removes the fallback code,
> along with USE_SIGTRAP_SIGINFO.
> 
> Change-Id: I140a5333a9fe70e90dbd186aca1f081549b2e63d

W00t.  I was looking at linux-nat.c today, and noticed the USE_SIGTRAP_SIGINFO
code was still around, which made me go like "but hadn't I removed this before??".
Well, turns out I forgot to merge this.

I'm going to merge it, after I download the patch from the list and
update that "7 years".  :-)

Pedro Alves

> ---
>  gdb/linux-nat.c        | 53 ++----------------------------------------
>  gdb/nat/linux-ptrace.h | 11 ++++-----
>  gdbserver/linux-low.cc | 39 ++-----------------------------
>  3 files changed, 8 insertions(+), 95 deletions(-)
> 
> diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
> index b9164e621db..008791c12dc 100644
> --- a/gdb/linux-nat.c
> +++ b/gdb/linux-nat.c
> @@ -2439,17 +2439,6 @@ status_callback (struct lwp_info *lp)
>  	  discard = 1;
>  	}
>  
> -#if !USE_SIGTRAP_SIGINFO
> -      else if (!breakpoint_inserted_here_p (regcache->aspace (), pc))
> -	{
> -	  linux_nat_debug_printf ("previous breakpoint of %s, at %s gone",
> -				  lp->ptid.to_string ().c_str (),
> -				  paddress (target_gdbarch (), lp->stop_pc));
> -
> -	  discard = 1;
> -	}
> -#endif
> -
>        if (discard)
>  	{
>  	  linux_nat_debug_printf ("pending event of %s cancelled.",
> @@ -2529,9 +2518,7 @@ save_stop_reason (struct lwp_info *lp)
>    struct gdbarch *gdbarch;
>    CORE_ADDR pc;
>    CORE_ADDR sw_bp_pc;
> -#if USE_SIGTRAP_SIGINFO
>    siginfo_t siginfo;
> -#endif
>  
>    gdb_assert (lp->stop_reason == TARGET_STOPPED_BY_NO_REASON);
>    gdb_assert (lp->status != 0);
> @@ -2545,7 +2532,6 @@ save_stop_reason (struct lwp_info *lp)
>    pc = regcache_read_pc (regcache);
>    sw_bp_pc = pc - gdbarch_decr_pc_after_break (gdbarch);
>  
> -#if USE_SIGTRAP_SIGINFO
>    if (linux_nat_get_siginfo (lp->ptid, &siginfo))
>      {
>        if (siginfo.si_signo == SIGTRAP)
> @@ -2588,22 +2574,6 @@ save_stop_reason (struct lwp_info *lp)
>  	    }
>  	}
>      }
> -#else
> -  if ((!lp->step || lp->stop_pc == sw_bp_pc)
> -      && software_breakpoint_inserted_here_p (regcache->aspace (),
> -					      sw_bp_pc))
> -    {
> -      /* The LWP was either continued, or stepped a software
> -	 breakpoint instruction.  */
> -      lp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT;
> -    }
> -
> -  if (hardware_breakpoint_inserted_here_p (regcache->aspace (), pc))
> -    lp->stop_reason = TARGET_STOPPED_BY_HW_BREAKPOINT;
> -
> -  if (lp->stop_reason == TARGET_STOPPED_BY_NO_REASON)
> -    check_stopped_by_watchpoint (lp);
> -#endif
>  
>    if (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT)
>      {
> @@ -2649,7 +2619,7 @@ linux_nat_target::stopped_by_sw_breakpoint ()
>  bool
>  linux_nat_target::supports_stopped_by_sw_breakpoint ()
>  {
> -  return USE_SIGTRAP_SIGINFO;
> +  return true;
>  }
>  
>  /* Returns true if the LWP had stopped for a hardware
> @@ -2670,7 +2640,7 @@ linux_nat_target::stopped_by_hw_breakpoint ()
>  bool
>  linux_nat_target::supports_stopped_by_hw_breakpoint ()
>  {
> -  return USE_SIGTRAP_SIGINFO;
> +  return true;
>  }
>  
>  /* Select one LWP out of those that have events pending.  */
> @@ -3252,25 +3222,6 @@ linux_nat_wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus,
>  
>    gdb_assert (lp != NULL);
>  
> -  /* Now that we've selected our final event LWP, un-adjust its PC if
> -     it was a software breakpoint, and we can't reliably support the
> -     "stopped by software breakpoint" stop reason.  */
> -  if (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT
> -      && !USE_SIGTRAP_SIGINFO)
> -    {
> -      struct regcache *regcache = get_thread_regcache (linux_target, lp->ptid);
> -      struct gdbarch *gdbarch = regcache->arch ();
> -      int decr_pc = gdbarch_decr_pc_after_break (gdbarch);
> -
> -      if (decr_pc != 0)
> -	{
> -	  CORE_ADDR pc;
> -
> -	  pc = regcache_read_pc (regcache);
> -	  regcache_write_pc (regcache, pc + decr_pc);
> -	}
> -    }
> -
>    /* We'll need this to determine whether to report a SIGSTOP as
>       GDB_SIGNAL_0.  Need to take a copy because resume_clear_callback
>       clears it.  */
> diff --git a/gdb/nat/linux-ptrace.h b/gdb/nat/linux-ptrace.h
> index 4694046e1e8..3edc2363aa2 100644
> --- a/gdb/nat/linux-ptrace.h
> +++ b/gdb/nat/linux-ptrace.h
> @@ -97,9 +97,9 @@ struct buffer;
>  #define __WALL          0x40000000 /* Wait for any child.  */
>  #endif
>  
> -/* True if whether a breakpoint/watchpoint triggered can be determined
> -   from the si_code of SIGTRAP's siginfo_t (TRAP_BRKPT/TRAP_HWBKPT).
> -   That is, if the kernel can tell us whether the thread executed a
> +/* Whether a breakpoint/watchpoint triggered can be determined from
> +   the si_code of SIGTRAP's siginfo_t (TRAP_BRKPT/TRAP_HWBKPT).  That
> +   is, since the kernel can tell us whether the thread executed a
>     software breakpoint, we trust it.  The kernel will be determining
>     that from the hardware (e.g., from which exception was raised in
>     the CPU).  Relying on whether a breakpoint is planted in memory at
> @@ -112,10 +112,7 @@ struct buffer;
>     architectures.  The moribund location mechanism helps with that
>     somewhat but it is an heuristic, and can well fail.  Getting that
>     information out of the kernel and ultimately out of the CPU is the
> -   way to go.  That said, some architecture may get the si_code wrong,
> -   and as such we're leaving fallback code in place.  We'll remove
> -   this after a while if no problem is reported.  */
> -#define USE_SIGTRAP_SIGINFO 1
> +   way to go.  */
>  
>  /* The x86 kernel gets some of the si_code values backwards, like
>     this:
> diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc
> index 8b8614f6ed4..9305928bbbf 100644
> --- a/gdbserver/linux-low.cc
> +++ b/gdbserver/linux-low.cc
> @@ -790,9 +790,7 @@ linux_process_target::save_stop_reason (lwp_info *lwp)
>  {
>    CORE_ADDR pc;
>    CORE_ADDR sw_breakpoint_pc;
> -#if USE_SIGTRAP_SIGINFO
>    siginfo_t siginfo;
> -#endif
>  
>    if (!low_supports_breakpoints ())
>      return false;
> @@ -804,7 +802,6 @@ linux_process_target::save_stop_reason (lwp_info *lwp)
>    scoped_restore_current_thread restore_thread;
>    switch_to_thread (get_lwp_thread (lwp));
>  
> -#if USE_SIGTRAP_SIGINFO
>    if (ptrace (PTRACE_GETSIGINFO, lwpid_of (current_thread),
>  	      (PTRACE_TYPE_ARG3) 0, &siginfo) == 0)
>      {
> @@ -846,21 +843,6 @@ linux_process_target::save_stop_reason (lwp_info *lwp)
>  	    }
>  	}
>      }
> -#else
> -  /* We may have just stepped a breakpoint instruction.  E.g., in
> -     non-stop mode, GDB first tells the thread A to step a range, and
> -     then the user inserts a breakpoint inside the range.  In that
> -     case we need to report the breakpoint PC.  */
> -  if ((!lwp->stepping || lwp->stop_pc == sw_breakpoint_pc)
> -      && low_breakpoint_at (sw_breakpoint_pc))
> -    lwp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT;
> -
> -  if (hardware_breakpoint_inserted_here (pc))
> -    lwp->stop_reason = TARGET_STOPPED_BY_HW_BREAKPOINT;
> -
> -  if (lwp->stop_reason == TARGET_STOPPED_BY_NO_REASON)
> -    check_stopped_by_watchpoint (lwp);
> -#endif
>  
>    if (lwp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT)
>      {
> @@ -1648,23 +1630,6 @@ linux_process_target::thread_still_has_status_pending (thread_info *thread)
>  	  discard = 1;
>  	}
>  
> -#if !USE_SIGTRAP_SIGINFO
> -      else if (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT
> -	       && !low_breakpoint_at (pc))
> -	{
> -	  threads_debug_printf ("previous SW breakpoint of %ld gone",
> -				lwpid_of (thread));
> -	  discard = 1;
> -	}
> -      else if (lp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT
> -	       && !hardware_breakpoint_inserted_here (pc))
> -	{
> -	  threads_debug_printf ("previous HW breakpoint of %ld gone",
> -				lwpid_of (thread));
> -	  discard = 1;
> -	}
> -#endif
> -
>        if (discard)
>  	{
>  	  threads_debug_printf ("discarding pending breakpoint status");
> @@ -5555,7 +5520,7 @@ linux_process_target::stopped_by_sw_breakpoint ()
>  bool
>  linux_process_target::supports_stopped_by_sw_breakpoint ()
>  {
> -  return USE_SIGTRAP_SIGINFO;
> +  return true;
>  }
>  
>  /* Implement the stopped_by_hw_breakpoint target_ops
> @@ -5575,7 +5540,7 @@ linux_process_target::stopped_by_hw_breakpoint ()
>  bool
>  linux_process_target::supports_stopped_by_hw_breakpoint ()
>  {
> -  return USE_SIGTRAP_SIGINFO;
> +  return true;
>  }
>  
>  /* Implement the supports_hardware_single_step target_ops method.  */
> 
> base-commit: f18acc9c4e5d18f4783f3a7d59e3ec95d7af0199

      reply	other threads:[~2024-04-17 16:40 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-27 21:10 Pedro Alves
2024-04-17 16:40 ` Pedro Alves [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=93b4f656-a10c-4bda-8c85-6cb41fecc7fe@palves.net \
    --to=pedro@palves.net \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).