diff options
Diffstat (limited to 'gdb/gdbserver/linux-crisv32-low.c')
-rw-r--r-- | gdb/gdbserver/linux-crisv32-low.c | 63 |
1 files changed, 28 insertions, 35 deletions
diff --git a/gdb/gdbserver/linux-crisv32-low.c b/gdb/gdbserver/linux-crisv32-low.c index a16a656..203b1ba 100644 --- a/gdb/gdbserver/linux-crisv32-low.c +++ b/gdb/gdbserver/linux-crisv32-low.c @@ -143,7 +143,22 @@ cris_write_data_breakpoint (struct regcache *regcache, } static int -cris_insert_point (char type, CORE_ADDR addr, int len) +cris_supports_z_point_type (char z_type) +{ + switch (z_type) + { + case Z_PACKET_WRITE_WP: + case Z_PACKET_READ_WP: + case Z_PACKET_ACCESS_WP: + return 1; + default: + return 0; + } +} + +static int +cris_insert_point (enum raw_bkpt_type type, CORE_ADDR addr, + int len, struct raw_breakpoint *bp) { int bp; unsigned long bp_ctrl; @@ -151,26 +166,12 @@ cris_insert_point (char type, CORE_ADDR addr, int len) unsigned long ccs; struct regcache *regcache; - /* Breakpoint/watchpoint types (GDB terminology): - 0 = memory breakpoint for instructions - (not supported; done via memory write instead) - 1 = hardware breakpoint for instructions (not supported) - 2 = write watchpoint (supported) - 3 = read watchpoint (supported) - 4 = access watchpoint (supported). */ - - if (type < '2' || type > '4') - { - /* Unsupported. */ - return 1; - } - regcache = get_thread_regcache (current_inferior, 1); /* Read watchpoints are set as access watchpoints, because of GDB's inability to deal with pure read watchpoints. */ - if (type == '3') - type = '4'; + if (type == raw_bkpt_type_read_wp) + type = raw_bkpt_type_access_wp; /* Get the configuration register. */ collect_register_by_name (regcache, "s0", &bp_ctrl); @@ -199,12 +200,12 @@ cris_insert_point (char type, CORE_ADDR addr, int len) } /* Configure the control register first. */ - if (type == '3' || type == '4') + if (type == raw_bkpt_type_read_wp || type == raw_bkpt_type_access_wp) { /* Trigger on read. */ bp_ctrl |= (1 << (2 + bp * 4)); } - if (type == '2' || type == '4') + if (type == raw_bkpt_type_write_wp || type == raw_bkpt_type_access_wp) { /* Trigger on write. */ bp_ctrl |= (2 << (2 + bp * 4)); @@ -229,7 +230,8 @@ cris_insert_point (char type, CORE_ADDR addr, int len) } static int -cris_remove_point (char type, CORE_ADDR addr, int len) +cris_remove_point (enum raw_bkpt_type type, CORE_ADDR addr, int len, + struct raw_breakpoint *bp) { int bp; unsigned long bp_ctrl; @@ -237,22 +239,12 @@ cris_remove_point (char type, CORE_ADDR addr, int len) struct regcache *regcache; unsigned long bp_d_regs[12]; - /* Breakpoint/watchpoint types: - 0 = memory breakpoint for instructions - (not supported; done via memory write instead) - 1 = hardware breakpoint for instructions (not supported) - 2 = write watchpoint (supported) - 3 = read watchpoint (supported) - 4 = access watchpoint (supported). */ - if (type < '2' || type > '4') - return -1; - regcache = get_thread_regcache (current_inferior, 1); /* Read watchpoints are set as access watchpoints, because of GDB's inability to deal with pure read watchpoints. */ - if (type == '3') - type = '4'; + if (type == raw_bkpt_type_read_wp) + type = raw_bkpt_type_access_wp; /* Get the configuration register. */ collect_register_by_name (regcache, "s0", &bp_ctrl); @@ -289,9 +281,9 @@ cris_remove_point (char type, CORE_ADDR addr, int len) /* Read/write bits for this BP. */ rw_bits = (bp_ctrl & (0x3 << bitpos)) >> bitpos; - if ((type == '3' && rw_bits == 0x1) - || (type == '2' && rw_bits == 0x2) - || (type == '4' && rw_bits == 0x3)) + if ((type == raw_bkpt_type_read_wp && rw_bits == 0x1) + || (type == raw_bkpt_type_write_wp && rw_bits == 0x2) + || (type == raw_bkpt_type_access_wp && rw_bits == 0x3)) { /* Read/write matched. */ break; @@ -433,6 +425,7 @@ struct linux_target_ops the_low_target = { cris_reinsert_addr, 0, cris_breakpoint_at, + cris_supports_z_point_type, cris_insert_point, cris_remove_point, cris_stopped_by_watchpoint, |