[v3,1/3] gdb, gdbserver, zpoint: report z_point support
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
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
> 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.
>>>>> 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
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
@@ -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
@@ -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.
@@ -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)
@@ -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'
@@ -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 */
@@ -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 ();