[v3,1/3] gdb, gdbserver, zpoint: report z_point support

Message ID 20231114133532.3877-2-mohamed.bouhaouel@intel.com
State New
Headers
Series Check for zpoint support when handling watchpoints |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Testing passed

Commit Message

Bouhaouel, Mohamed Nov. 14, 2023, 1:35 p.m. UTC
  Make gdbserver report which types of breakpoints and watchpoints
are supported when exchanging features.  This is done by replying with
Z<type>+ (Supported) or Z<type>- (unsupported)

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
---
 gdb/NEWS               |  4 ++++
 gdb/doc/gdb.texinfo    | 32 ++++++++++++++++++++++++++++++++
 gdb/remote.c           | 16 ++++++++++++++++
 gdbserver/mem-break.cc |  2 +-
 gdbserver/mem-break.h  |  4 ++++
 gdbserver/server.cc    |  7 +++++++
 6 files changed, 64 insertions(+), 1 deletion(-)
  

Comments

Eli Zaretskii Nov. 14, 2023, 1:45 p.m. UTC | #1
> From: Mohamed Bouhaouel <mohamed.bouhaouel@intel.com>
> Cc: blarsen@redhat.com,
> 	mohamed.bouhaouel@intel.com,
> 	eliz@gnu.org
> Date: Tue, 14 Nov 2023 14:35:30 +0100
> 
> Make gdbserver report which types of breakpoints and watchpoints
> are supported when exchanging features.  This is done by replying with
> Z<type>+ (Supported) or Z<type>- (unsupported)
> 
> Reviewed-By: Eli Zaretskii <eliz@gnu.org>
> ---
>  gdb/NEWS               |  4 ++++
>  gdb/doc/gdb.texinfo    | 32 ++++++++++++++++++++++++++++++++
>  gdb/remote.c           | 16 ++++++++++++++++
>  gdbserver/mem-break.cc |  2 +-
>  gdbserver/mem-break.h  |  4 ++++
>  gdbserver/server.cc    |  7 +++++++
>  6 files changed, 64 insertions(+), 1 deletion(-)

Thanks, the documentation parts are okay.
  
Tom Tromey Nov. 14, 2023, 2:36 p.m. UTC | #2
>>>>> Mohamed Bouhaouel <mohamed.bouhaouel@intel.com> writes:

> Make gdbserver report which types of breakpoints and watchpoints
> are supported when exchanging features.  This is done by replying with
> Z<type>+ (Supported) or Z<type>- (unsupported)

Thanks for the patch.

I suppose the idea is that this work can't really be done on the gdb
side, because gdb creates the watchpoint and such earlier, and only then
tries to communicate with the remote... so errors come too late?

> +@item Z@var{type}
> +The remote stub reports which types of breakpoints and watchpoints are
> +supported.  This is done using flags, @samp{Z@var{type}+} for supported

I think this part of the docs should mention that the 'Z' response
assumes that both of the corresponding 'z' and 'Z' packets are
supported.

> +  return (m_features.packet_support (PACKET_Z0 + packet) != PACKET_DISABLE);

Too many parens.

> +/* Returns true if Z_TYPE is supported by the target.  */
> +
> +int z_type_supported (char z_type);
>  #endif /* GDBSERVER_MEM_BREAK_H */

Should have a newline before the #endif.

Tom
  
Bouhaouel, Mohamed Nov. 15, 2023, 5:31 p.m. UTC | #3
Thanks Tom for the feedback,

> I suppose the idea is that this work can't really be done on the gdb
> side, because gdb creates the watchpoint and such earlier, and only then
> tries to communicate with the remote... so errors come too late?

Yes, and the error messages keep popping up on each resume command
(`continue`, `step`, ...) until the user manually deletes the watchpoint.

> I think this part of the docs should mention that the 'Z' response
> assumes that both of the corresponding 'z' and 'Z' packets are
> supported.

Right, will be added in the next patch update.

> > +  return (m_features.packet_support (PACKET_Z0 + packet) !=
> PACKET_DISABLE);
> 
> Too many parens.

Will be addressed in the next patch update.

> > +int z_type_supported (char z_type);
> >  #endif /* GDBSERVER_MEM_BREAK_H */
> 
> Should have a newline before the #endif.

Will be addressed in the next patch update.

Regards,
Mohamed
Intel Deutschland GmbH
Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de>
Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva  
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
  

Patch

diff --git a/gdb/NEWS b/gdb/NEWS
index 96aba256dbb..6e9f679dd56 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -75,6 +75,10 @@  QThreadOptions in qSupported
   QThreadOptions packet, and the qSupported response can contain the
   set of thread options the remote stub supports.
 
+qSupported
+  Gdbserver now reports which types of breakpoints and watchpoints
+  are supported when exchanging features using Z<type>+, Z<type>-.
+
 *** Changes in GDB 14
 
 * GDB now supports the AArch64 Scalable Matrix Extension 2 (SME2), which
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index e4c00143fd1..ccc513df0cc 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -44631,6 +44631,31 @@  These are the currently defined stub features and their properties:
 @tab @samp{-}
 @tab No
 
+@item @samp{Z0}
+@tab No
+@tab @samp{-}
+@tab No
+
+@item @samp{Z1}
+@tab No
+@tab @samp{-}
+@tab No
+
+@item @samp{Z2}
+@tab No
+@tab @samp{-}
+@tab No
+
+@item @samp{Z3}
+@tab No
+@tab @samp{-}
+@tab No
+
+@item @samp{Z4}
+@tab No
+@tab @samp{-}
+@tab No
+
 @end multitable
 
 These are the currently defined stub features, in more detail:
@@ -44858,6 +44883,13 @@  The remote stub supports and implements the required memory tagging
 functionality and understands the @samp{qMemTags} (@pxref{qMemTags}) and
 @samp{QMemTags} (@pxref{QMemTags}) packets.
 
+@item Z@var{type}
+The remote stub reports which types of breakpoints and watchpoints are
+supported.  This is done using flags, @samp{Z@var{type}+} for supported
+and @samp{Z@var{type}-} for unsupported, where @var{type} is one of
+@samp{0}, @samp{1}, @samp{2}, @samp{3}, @samp{4}
+(@pxref{insert breakpoint or watchpoint packet}).
+
 For AArch64 GNU/Linux systems, this feature also requires access to the
 @file{/proc/@var{pid}/smaps} file so memory mapping page flags can be inspected.
 This is done via the @samp{vFile} requests.
diff --git a/gdb/remote.c b/gdb/remote.c
index ce5addade6f..7aa380a5989 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -808,6 +808,10 @@  class remote_target : public process_stratum_target
   int insert_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
 			 struct expression *) override;
 
+  /* Returns true if GDB Z breakpoint type TYPE is supported,
+     false otherwise.  */
+  bool supports_z_point_type (int type);
+
   int remove_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
 			 struct expression *) override;
 
@@ -5717,6 +5721,11 @@  static const struct protocol_feature remote_protocol_features[] = {
   { "no-resumed", PACKET_DISABLE, remote_supported_packet, PACKET_no_resumed },
   { "memory-tagging", PACKET_DISABLE, remote_supported_packet,
     PACKET_memory_tagging_feature },
+  { "Z0", PACKET_SUPPORT_UNKNOWN, remote_supported_packet, PACKET_Z0 },
+  { "Z1", PACKET_SUPPORT_UNKNOWN, remote_supported_packet, PACKET_Z1 },
+  { "Z2", PACKET_SUPPORT_UNKNOWN, remote_supported_packet, PACKET_Z2 },
+  { "Z3", PACKET_SUPPORT_UNKNOWN, remote_supported_packet, PACKET_Z3 },
+  { "Z4", PACKET_SUPPORT_UNKNOWN, remote_supported_packet, PACKET_Z4 },
 };
 
 static char *remote_support_xml;
@@ -10991,6 +11000,13 @@  watchpoint_to_Z_packet (int type)
     }
 }
 
+bool
+remote_target::supports_z_point_type (int type)
+{
+  Z_packet_type packet = watchpoint_to_Z_packet (type);
+  return (m_features.packet_support (PACKET_Z0 + packet) != PACKET_DISABLE);
+}
+
 int
 remote_target::insert_watchpoint (CORE_ADDR addr, int len,
 				  enum target_hw_bp_type type, struct expression *cond)
diff --git a/gdbserver/mem-break.cc b/gdbserver/mem-break.cc
index 3bee8bc8990..7c3a1d1d47e 100644
--- a/gdbserver/mem-break.cc
+++ b/gdbserver/mem-break.cc
@@ -998,7 +998,7 @@  find_gdb_breakpoint (char z_type, CORE_ADDR addr, int kind)
   return NULL;
 }
 
-static int
+int
 z_type_supported (char z_type)
 {
   return (z_type >= '0' && z_type <= '4'
diff --git a/gdbserver/mem-break.h b/gdbserver/mem-break.h
index 9bf7aa84932..b27f0a23ac2 100644
--- a/gdbserver/mem-break.h
+++ b/gdbserver/mem-break.h
@@ -276,4 +276,8 @@  int remove_memory_breakpoint (struct raw_breakpoint *bp);
 void clone_all_breakpoints (struct thread_info *child_thread,
 			    const struct thread_info *parent_thread);
 
+
+/* Returns true if Z_TYPE is supported by the target.  */
+
+int z_type_supported (char z_type);
 #endif /* GDBSERVER_MEM_BREAK_H */
diff --git a/gdbserver/server.cc b/gdbserver/server.cc
index a8e23561dcb..e727973ad45 100644
--- a/gdbserver/server.cc
+++ b/gdbserver/server.cc
@@ -2613,6 +2613,13 @@  handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
       if (target_supports_memory_tagging ())
 	strcat (own_buf, ";memory-tagging+");
 
+      /* Z points support.  */
+      strcat (own_buf, z_type_supported ('0') ? ";Z0+" : ";Z0-");
+      strcat (own_buf, z_type_supported ('1') ? ";Z1+" : ";Z1-");
+      strcat (own_buf, z_type_supported ('2') ? ";Z2+" : ";Z2-");
+      strcat (own_buf, z_type_supported ('3') ? ";Z3+" : ";Z3-");
+      strcat (own_buf, z_type_supported ('4') ? ";Z4+" : ";Z4-");
+
       /* Reinitialize components as needed for the new connection.  */
       hostio_handle_new_gdb_connection ();
       target_handle_new_gdb_connection ();