This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH v2 2/7] Add breakpoint_from_kind target_ops for software breakpoints 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: Mon, 5 Oct 2015 12:44:10 -0400
- Subject: [PATCH v2 2/7] Add breakpoint_from_kind target_ops for software breakpoints in GDBServer.
- Authentication-results: sourceware.org; auth=none
- References: <1444063455-31558-1-git-send-email-antoine dot tremblay at ericsson dot com>
This patch is in preparation for software breakpoints on ARM in
GDBServer.
This patch introduces a new target_ops and linux_target_ops called
breakpoint_from_kind that will be used to ask the target for the right
breakpoint for a kind as set in a Z0 packet.
No regressions, tested on ubuntu 14.04 ARMv7 and x86.
With gdbserver-{native,extended} / { -marm -mthumb }
gdb/gdbserver/ChangeLog:
* linux-low.c (linux_breakpoint_from_kind): New function.
(struct target_ops) <breakpoint_from_kind>: Initialize field.
* linux-low.h (struct linux_target_ops)
<breakpoint_from_kind>: New field.
* target.h (struct target_ops) <breakpoint_from_kind>: New field.
---
gdb/gdbserver/linux-low.c | 10 ++++++++++
gdb/gdbserver/linux-low.h | 4 ++++
gdb/gdbserver/target.h | 4 ++++
3 files changed, 18 insertions(+)
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index dc16fe0..5aa2b1d 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -5965,6 +5965,15 @@ linux_supports_range_stepping (void)
return (*the_low_target.supports_range_stepping) ();
}
+static const unsigned char*
+linux_breakpoint_from_kind (int *kind)
+{
+ if (*the_low_target.breakpoint_from_kind != NULL)
+ return (*the_low_target.breakpoint_from_kind) (kind);
+ else
+ return NULL;
+}
+
/* Enumerate spufs IDs for process PID. */
static int
spu_enumerate_spu_ids (long pid, unsigned char *buf, CORE_ADDR offset, int len)
@@ -7040,6 +7049,7 @@ static struct target_ops linux_target_ops = {
linux_mntns_unlink,
linux_mntns_readlink,
linux_breakpoint_from_pc,
+ linux_breakpoint_from_kind
};
static void
diff --git a/gdb/gdbserver/linux-low.h b/gdb/gdbserver/linux-low.h
index a9964ac..cc19b88 100644
--- a/gdb/gdbserver/linux-low.h
+++ b/gdb/gdbserver/linux-low.h
@@ -227,6 +227,10 @@ struct linux_target_ops
/* Returns true if the low target supports range stepping. */
int (*supports_range_stepping) (void);
+
+ /* Returns the proper breakpoint from size, the kind can have target
+ specific meaning like the z0 kind parameter */
+ const unsigned char *(*breakpoint_from_kind) (int *kind);
};
extern struct linux_target_ops the_low_target;
diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h
index 603819e..74fb36d 100644
--- a/gdb/gdbserver/target.h
+++ b/gdb/gdbserver/target.h
@@ -446,6 +446,10 @@ struct target_ops
can be NULL, the default breakpoint for the target should be returned in
this case. */
const unsigned char *(*breakpoint_from_pc) (CORE_ADDR *pcptr, int *lenptr);
+
+ /* Returns a breakpoint from a kind, a kind is a length can have target
+ specific meaning like the z0 kind parameter. */
+ const unsigned char *(*breakpoint_from_kind) (int *kind);
};
extern struct target_ops *the_target;
--
1.9.1