This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH 5/5] Support software breakpoints for ARM linux in GDBServer.
- From: Antoine Tremblay <antoine dot tremblay at ericsson dot com>
- To: <gdb-patches at sourceware dot org>
- Cc: Antoine Tremblay <antoine dot tremblay at ericsson dot com>
- Date: Fri, 18 Sep 2015 08:02:29 -0400
- Subject: [PATCH 5/5] Support software breakpoints for ARM linux in GDBServer.
- Authentication-results: sourceware.org; auth=none
- References: <1442577749-6650-1-git-send-email-antoine dot tremblay at ericsson dot com>
This patch implements the breakpoint_from_length operation introduced
in a previous patch.
The proper breakpoint can then be returned to be inserted in memory.
It also enables Z0 packets on ARM.
No regressions, tested on ubuntu 14.04 ARMv7 and x86.
With gdbserver-{native,extended} / { -marm -mthumb }
gdb/ChangeLog:
* NEWS: Add news for software breakpoints.
gdb/gdbserver/ChangeLog:
* linux-arm-low.c (arm_breakpoint_from_length): New function.
(arm_supports_z_point_type): Add software breakpoint support.
(struct linux_target_ops): Add breakpoint_from_length operation.
---
gdb/NEWS | 2 ++
gdb/gdbserver/linux-arm-low.c | 31 +++++++++++++++++++++++++++++++
2 files changed, 33 insertions(+)
diff --git a/gdb/NEWS b/gdb/NEWS
index f563b8c..85f234e 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -3,6 +3,8 @@
*** Changes since GDB 7.10
+* Support for software breakpoints on ARM linux was added in GDBServer.
+
* Support for tracepoints on aarch64-linux was added in GDBserver.
* The 'record instruction-history' command now indicates speculative execution
diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c
index 15ecb70..9685db5 100644
--- a/gdb/gdbserver/linux-arm-low.c
+++ b/gdb/gdbserver/linux-arm-low.c
@@ -354,6 +354,28 @@ arm_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
}
}
+/* Get the breakpoint from the remote length
+ 2 is thumb-16
+ 3 is thumb2-32
+ 4 is arm
+*/
+static const unsigned char *
+arm_breakpoint_from_length (int *len)
+{
+ switch (*len) {
+ case 2:
+ return (unsigned char *) &thumb_breakpoint;
+ case 3:
+ *len = 4;
+ return (unsigned char *) &thumb2_breakpoint;
+ case 4:
+ return (unsigned char *) &arm_breakpoint;
+ default:
+ return NULL;
+ }
+ return NULL;
+}
+
/* We only place breakpoints in empty marker functions, and thread locking
is outside of the function. So rather than importing software single-step,
we can just run until exit. */
@@ -595,6 +617,7 @@ arm_supports_z_point_type (char z_type)
{
switch (z_type)
{
+ case Z_PACKET_SW_BP:
case Z_PACKET_HW_BP:
case Z_PACKET_WRITE_WP:
case Z_PACKET_READ_WP:
@@ -1006,6 +1029,14 @@ struct linux_target_ops the_low_target = {
arm_new_thread,
arm_new_fork,
arm_prepare_to_resume,
+ NULL, /* process_qsupported */
+ NULL, /* supports_tracepoints */
+ NULL, /* get_thread_area */
+ NULL, /* install_fast_tracepoint_jump_pad */
+ NULL, /* emit_ops */
+ NULL, /* get_min_fast_tracepoint_insn_len */
+ NULL, /* supports_range_stepping */
+ arm_breakpoint_from_length,
};
void
--
1.9.1