diff options
author | Wei-cheng Wang <cole945@gmail.com> | 2015-06-28 00:21:39 +0800 |
---|---|---|
committer | Marcin KoĆcielnicki <koriakin@0x04.net> | 2016-02-24 18:38:42 +0100 |
commit | 657f9cde9d531c9929bef9e02a8064101d568f50 (patch) | |
tree | 4f17de24a44d3475c5bd72433c783cfaca1103e9 /gdb/gdbserver/linux-ppc-low.c | |
parent | 92d77487b3dbfd934c5565bab09e0f3051e0b08d (diff) | |
download | gdb-657f9cde9d531c9929bef9e02a8064101d568f50.zip gdb-657f9cde9d531c9929bef9e02a8064101d568f50.tar.gz gdb-657f9cde9d531c9929bef9e02a8064101d568f50.tar.bz2 |
powerpc: Support z-point type in gdbserver.
Support z-point, so tracepoints and breakpoints can be inserted at the same
location.
gdb/gdbserver/ChangeLog:
2016-02-24 Wei-cheng Wang <cole945@gmail.com>
* linux-ppc-low.c (ppc_supports_z_point_type): New function:
(ppc_insert_point, ppc_remove_point): Insert/remove z-packet breakpoints.
(ppc64_emit_ops_vector): Add target ops - ppc_supports_z_point_type,
ppc_insert_point, ppc_remove_point.
Diffstat (limited to 'gdb/gdbserver/linux-ppc-low.c')
-rw-r--r-- | gdb/gdbserver/linux-ppc-low.c | 69 |
1 files changed, 66 insertions, 3 deletions
diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c index 2145c50..61a1693 100644 --- a/gdb/gdbserver/linux-ppc-low.c +++ b/gdb/gdbserver/linux-ppc-low.c @@ -423,6 +423,69 @@ ppc_breakpoint_at (CORE_ADDR where) return 0; } +/* Implement supports_z_point_type target-ops. + Returns true if type Z_TYPE breakpoint is supported. + + Handling software breakpoint at server side, so tracepoints + and breakpoints can be inserted at the same location. */ + +static int +ppc_supports_z_point_type (char z_type) +{ + switch (z_type) + { + case Z_PACKET_SW_BP: + return 1; + case Z_PACKET_HW_BP: + case Z_PACKET_WRITE_WP: + case Z_PACKET_ACCESS_WP: + default: + return 0; + } +} + +/* Implement insert_point target-ops. + Returns 0 on success, -1 on failure and 1 on unsupported. */ + +static int +ppc_insert_point (enum raw_bkpt_type type, CORE_ADDR addr, + int size, struct raw_breakpoint *bp) +{ + switch (type) + { + case raw_bkpt_type_sw: + return insert_memory_breakpoint (bp); + + case raw_bkpt_type_hw: + case raw_bkpt_type_write_wp: + case raw_bkpt_type_access_wp: + default: + /* Unsupported. */ + return 1; + } +} + +/* Implement remove_point target-ops. + Returns 0 on success, -1 on failure and 1 on unsupported. */ + +static int +ppc_remove_point (enum raw_bkpt_type type, CORE_ADDR addr, + int size, struct raw_breakpoint *bp) +{ + switch (type) + { + case raw_bkpt_type_sw: + return remove_memory_breakpoint (bp); + + case raw_bkpt_type_hw: + case raw_bkpt_type_write_wp: + case raw_bkpt_type_access_wp: + default: + /* Unsupported. */ + return 1; + } +} + /* Provide only a fill function for the general register set. ps_lgetregs will use this for NPTL support. */ @@ -706,9 +769,9 @@ struct linux_target_ops the_low_target = { NULL, 0, ppc_breakpoint_at, - NULL, /* supports_z_point_type */ - NULL, - NULL, + ppc_supports_z_point_type, + ppc_insert_point, + ppc_remove_point, NULL, NULL, ppc_collect_ptrace_register, |