Andreas,
This is the patch I concluded this week to have support for gdb single step
in thumb2. In the past the kind of breakpoint defined for gdb match with
the size of breakpoint, however with the new kind defined in the protocol,
thumb 32 bits breakpoint we can not consider the kind as the same as the
size of breakpoint.
This is what this patch is doing for cortex-a8, it's mapping the right size
of breakpoint considering the value of kind sent by the gdb client.
It's working very well for me using in a beaglebone board to trace the
kernel. Even the special instruction "ITF" it's working perfectly in single
step.
diff --git a/src/target/breakpoints.c b/src/target/breakpoints.c
index 3b516d0..51ed842 100644
--- a/src/target/breakpoints.c
+++ b/src/target/breakpoints.c
@@ -73,7 +73,22 @@ int breakpoint_add_internal(struct target *target,
(*breakpoint_p) = malloc(sizeof(struct breakpoint));
(*breakpoint_p)->address = address;
(*breakpoint_p)->asid = 0;
- (*breakpoint_p)->length = length;
+
+ switch (length) {
+ case 2:
+ (*breakpoint_p)->kind = BPK_THUMB_16;
+ (*breakpoint_p)->length = 2;
+ break;
+ case 3:
+ (*breakpoint_p)->kind = BPK_THUMB_32;
+ (*breakpoint_p)->length = 2;
+ break;
+ case 4:
+ (*breakpoint_p)->kind = BPK_ARM_32;
+ (*breakpoint_p)->length = 4;
+ break;
+ }
+
(*breakpoint_p)->type = type;
(*breakpoint_p)->set = 0;
(*breakpoint_p)->orig_instr = malloc(length);
@@ -137,7 +152,22 @@ int context_breakpoint_add_internal(struct target
*target,
(*breakpoint_p) = malloc(sizeof(struct breakpoint));
(*breakpoint_p)->address = 0;
(*breakpoint_p)->asid = asid;
- (*breakpoint_p)->length = length;
+
+ switch (length) {
+ case 2:
+ (*breakpoint_p)->kind = BPK_THUMB_16;
+ (*breakpoint_p)->length = 2;
+ break;
+ case 3:
+ (*breakpoint_p)->kind = BPK_THUMB_32;
+ (*breakpoint_p)->length = 2;
+ break;
+ case 4:
+ (*breakpoint_p)->kind = BPK_ARM_32;
+ (*breakpoint_p)->length = 4;
+ break;
+ }
+
(*breakpoint_p)->type = type;
(*breakpoint_p)->set = 0;
(*breakpoint_p)->orig_instr = malloc(length);
@@ -193,7 +223,22 @@ int hybrid_breakpoint_add_internal(struct target
*target,
(*breakpoint_p) = malloc(sizeof(struct breakpoint));
(*breakpoint_p)->address = address;
(*breakpoint_p)->asid = asid;
- (*breakpoint_p)->length = length;
+
+ switch (length) {
+ case 2:
+ (*breakpoint_p)->kind = BPK_THUMB_16;
+ (*breakpoint_p)->length = 2;
+ break;
+ case 3:
+ (*breakpoint_p)->kind = BPK_THUMB_32;
+ (*breakpoint_p)->length = 2;
+ break;
+ case 4:
+ (*breakpoint_p)->kind = BPK_ARM_32;
+ (*breakpoint_p)->length = 4;
+ break;
+ }
+
(*breakpoint_p)->type = type;
(*breakpoint_p)->set = 0;
(*breakpoint_p)->orig_instr = malloc(length);
diff --git a/src/target/breakpoints.h b/src/target/breakpoints.h
index a019e96..0cfcd7b 100644
--- a/src/target/breakpoints.h
+++ b/src/target/breakpoints.h
@@ -23,6 +23,18 @@
struct target;
+/*
+ * These breakpoint kinds are defined for the
+ * 'Z0' and 'Z1' packets in gdb remote serial protocol.
+ *
+ */
+enum breakpoint_kind {
+ BPK_THUMB_16 = 2,
+ BPK_THUMB_32 = 3,
+ BPK_ARM_32 = 4
+};
+
+
enum breakpoint_type {
BKPT_HARD,
BKPT_SOFT,
@@ -37,6 +49,7 @@ struct breakpoint {
uint32_t asid;
int length;
enum breakpoint_type type;
+ enum breakpoint_kind kind;
int set;
uint8_t *orig_instr;
struct breakpoint *next;
diff --git a/src/target/cortex_a.c b/src/target/cortex_a.c
index e1c4c9c..29c568d 100644
--- a/src/target/cortex_a.c
+++ b/src/target/cortex_a.c
@@ -1393,10 +1393,19 @@ static int cortex_a8_set_breakpoint(struct target
*target,
brp_list[brp_i].value);
} else if (breakpoint->type == BKPT_SOFT) {
uint8_t code[4];
- if (breakpoint->length == 2)
- buf_set_u32(code, 0, 32, ARMV5_T_BKPT(0x11));
- else
- buf_set_u32(code, 0, 32, ARMV5_BKPT(0x11));
+
+ switch (breakpoint->kind) {
+ case BPK_THUMB_16:
+ case BPK_THUMB_32:
+ buf_set_u32(code, 0, 32, ARMV5_T_BKPT(0x11));
+ break;
+
+ case BPK_ARM_32:
+ buf_set_u32(code, 0, 32, ARMV5_BKPT(0x11));
+ break;
+ }
+
+
retval = target->type->read_memory(target,
breakpoint->address & 0xFFFFFFFE,
breakpoint->length, 1,
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel