From 657f9cde9d531c9929bef9e02a8064101d568f50 Mon Sep 17 00:00:00 2001 From: Wei-cheng Wang Date: Sun, 28 Jun 2015 00:21:39 +0800 Subject: [PATCH] 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 * 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. --- gdb/gdbserver/ChangeLog | 7 +++++ gdb/gdbserver/linux-ppc-low.c | 69 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 326c769..8c4dab4 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,10 @@ +2016-02-24 Wei-cheng Wang + + * 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. + 2016-02-17 Marcin Kościelnicki * linux-s390-low.c (s390_supports_z_point_type): New function. 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, -- 2.7.4