diff options
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/gdbserver/linux-arm-low.c | 16 |
2 files changed, 21 insertions, 1 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 0c9a47c..ec1e152 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2005-11-13 Daniel Jacobowitz <dan@codesourcery.com> + + * linux-arm-low.c (arm_eabi_breakpoint): New variable. + (arm_breakpoint_at): Recognize both breakpoints. + (the_low_target): Use the correct breakpoint instruction. + 2005-11-02 Daniel Jacobowitz <dan@codesourcery.com> * configure.srv (x86_64-*-linux*): Turn on thread_db support. diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c index 7c23b17..643da08 100644 --- a/gdb/gdbserver/linux-arm-low.c +++ b/gdb/gdbserver/linux-arm-low.c @@ -70,6 +70,12 @@ arm_set_pc (CORE_ADDR pc) static const unsigned long arm_breakpoint = 0xef9f0001; #define arm_breakpoint_len 4 +/* For new EABI binaries. We recognize it regardless of which ABI + is used for gdbserver, so single threaded debugging should work + OK, but for multi-threaded debugging we only insert the current + ABI's breakpoint instruction. For now at least. */ +static const unsigned long arm_eabi_breakpoint = 0xe7f001f0; + static int arm_breakpoint_at (CORE_ADDR where) { @@ -79,8 +85,12 @@ arm_breakpoint_at (CORE_ADDR where) if (insn == arm_breakpoint) return 1; + if (insn == arm_eabi_breakpoint) + return 1; + /* If necessary, recognize more trap instructions here. GDB only uses the - one. */ + two. */ + return 0; } @@ -102,7 +112,11 @@ struct linux_target_ops the_low_target = { arm_cannot_store_register, arm_get_pc, arm_set_pc, +#ifndef __ARM_EABI__ (const unsigned char *) &arm_breakpoint, +#else + (const unsigned char *) &arm_eabi_breakpoint, +#endif arm_breakpoint_len, arm_reinsert_addr, 0, |