mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-20 01:50:24 +08:00
gdb/csky rm csky_memory_insert/remove_breakpoint
Software breakpoints are inserted or removed by the gdb stub via remote protocol, these two functions are no longer needed.
This commit is contained in:
201
gdb/csky-tdep.c
201
gdb/csky-tdep.c
@ -2016,201 +2016,6 @@ csky_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
|
||||
}
|
||||
}
|
||||
|
||||
/* Implement the memory_insert_breakpoint gdbarch method. */
|
||||
|
||||
static int
|
||||
csky_memory_insert_breakpoint (struct gdbarch *gdbarch,
|
||||
struct bp_target_info *bp_tgt)
|
||||
{
|
||||
int val;
|
||||
const unsigned char *bp;
|
||||
gdb_byte bp_write_record1[] = { 0, 0, 0, 0 };
|
||||
gdb_byte bp_write_record2[] = { 0, 0, 0, 0 };
|
||||
gdb_byte bp_record[] = { 0, 0, 0, 0 };
|
||||
|
||||
/* Sanity-check bp_address. */
|
||||
if (bp_tgt->reqstd_address % 2)
|
||||
warning (_("Invalid breakpoint address 0x%x is an odd number."),
|
||||
(unsigned int) bp_tgt->reqstd_address);
|
||||
scoped_restore restore_memory
|
||||
= make_scoped_restore_show_memory_breakpoints (1);
|
||||
|
||||
/* Determine appropriate breakpoint_kind for this address. */
|
||||
bp_tgt->kind = csky_breakpoint_kind_from_pc (gdbarch,
|
||||
&bp_tgt->reqstd_address);
|
||||
|
||||
/* Save the memory contents. */
|
||||
bp_tgt->shadow_len = bp_tgt->kind;
|
||||
|
||||
/* Fill bp_tgt->placed_address. */
|
||||
bp_tgt->placed_address = bp_tgt->reqstd_address;
|
||||
|
||||
if (bp_tgt->kind == CSKY_INSN_SIZE16)
|
||||
{
|
||||
if ((bp_tgt->reqstd_address % 4) == 0)
|
||||
{
|
||||
/* Read two bytes. */
|
||||
val = target_read_memory (bp_tgt->reqstd_address,
|
||||
bp_tgt->shadow_contents, 2);
|
||||
if (val)
|
||||
return val;
|
||||
|
||||
/* Read two bytes. */
|
||||
val = target_read_memory (bp_tgt->reqstd_address + 2,
|
||||
bp_record, 2);
|
||||
if (val)
|
||||
return val;
|
||||
|
||||
/* Write the breakpoint. */
|
||||
bp_write_record1[2] = bp_record[0];
|
||||
bp_write_record1[3] = bp_record[1];
|
||||
bp = bp_write_record1;
|
||||
val = target_write_raw_memory (bp_tgt->reqstd_address, bp,
|
||||
CSKY_WR_BKPT_MODE);
|
||||
}
|
||||
else
|
||||
{
|
||||
val = target_read_memory (bp_tgt->reqstd_address,
|
||||
bp_tgt->shadow_contents, 2);
|
||||
if (val)
|
||||
return val;
|
||||
|
||||
val = target_read_memory (bp_tgt->reqstd_address - 2,
|
||||
bp_record, 2);
|
||||
if (val)
|
||||
return val;
|
||||
|
||||
/* Write the breakpoint. */
|
||||
bp_write_record1[0] = bp_record[0];
|
||||
bp_write_record1[1] = bp_record[1];
|
||||
bp = bp_write_record1;
|
||||
val = target_write_raw_memory (bp_tgt->reqstd_address - 2,
|
||||
bp, CSKY_WR_BKPT_MODE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bp_tgt->placed_address % 4 == 0)
|
||||
{
|
||||
val = target_read_memory (bp_tgt->reqstd_address,
|
||||
bp_tgt->shadow_contents,
|
||||
CSKY_WR_BKPT_MODE);
|
||||
if (val)
|
||||
return val;
|
||||
|
||||
/* Write the breakpoint. */
|
||||
bp = bp_write_record1;
|
||||
val = target_write_raw_memory (bp_tgt->reqstd_address,
|
||||
bp, CSKY_WR_BKPT_MODE);
|
||||
}
|
||||
else
|
||||
{
|
||||
val = target_read_memory (bp_tgt->reqstd_address,
|
||||
bp_tgt->shadow_contents,
|
||||
CSKY_WR_BKPT_MODE);
|
||||
if (val)
|
||||
return val;
|
||||
|
||||
val = target_read_memory (bp_tgt->reqstd_address - 2,
|
||||
bp_record, 2);
|
||||
if (val)
|
||||
return val;
|
||||
|
||||
val = target_read_memory (bp_tgt->reqstd_address + 4,
|
||||
bp_record + 2, 2);
|
||||
if (val)
|
||||
return val;
|
||||
|
||||
bp_write_record1[0] = bp_record[0];
|
||||
bp_write_record1[1] = bp_record[1];
|
||||
bp_write_record2[2] = bp_record[2];
|
||||
bp_write_record2[3] = bp_record[3];
|
||||
|
||||
/* Write the breakpoint. */
|
||||
bp = bp_write_record1;
|
||||
val = target_write_raw_memory (bp_tgt->reqstd_address - 2, bp,
|
||||
CSKY_WR_BKPT_MODE);
|
||||
if (val)
|
||||
return val;
|
||||
|
||||
/* Write the breakpoint. */
|
||||
bp = bp_write_record2;
|
||||
val = target_write_raw_memory (bp_tgt->reqstd_address + 2, bp,
|
||||
CSKY_WR_BKPT_MODE);
|
||||
}
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
/* Restore the breakpoint shadow_contents to the target. */
|
||||
|
||||
static int
|
||||
csky_memory_remove_breakpoint (struct gdbarch *gdbarch,
|
||||
struct bp_target_info *bp_tgt)
|
||||
{
|
||||
int val;
|
||||
gdb_byte bp_record[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
/* Different for shadow_len 2 or 4. */
|
||||
if (bp_tgt->shadow_len == 2)
|
||||
{
|
||||
/* Do word-sized writes on word-aligned boundaries and read
|
||||
padding bytes as necessary. */
|
||||
if (bp_tgt->reqstd_address % 4 == 0)
|
||||
{
|
||||
val = target_read_memory (bp_tgt->reqstd_address + 2,
|
||||
bp_record + 2, 2);
|
||||
if (val)
|
||||
return val;
|
||||
bp_record[0] = bp_tgt->shadow_contents[0];
|
||||
bp_record[1] = bp_tgt->shadow_contents[1];
|
||||
return target_write_raw_memory (bp_tgt->reqstd_address,
|
||||
bp_record, CSKY_WR_BKPT_MODE);
|
||||
}
|
||||
else
|
||||
{
|
||||
val = target_read_memory (bp_tgt->reqstd_address - 2,
|
||||
bp_record, 2);
|
||||
if (val)
|
||||
return val;
|
||||
bp_record[2] = bp_tgt->shadow_contents[0];
|
||||
bp_record[3] = bp_tgt->shadow_contents[1];
|
||||
return target_write_raw_memory (bp_tgt->reqstd_address - 2,
|
||||
bp_record, CSKY_WR_BKPT_MODE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Do word-sized writes on word-aligned boundaries and read
|
||||
padding bytes as necessary. */
|
||||
if (bp_tgt->placed_address % 4 == 0)
|
||||
{
|
||||
return target_write_raw_memory (bp_tgt->reqstd_address,
|
||||
bp_tgt->shadow_contents,
|
||||
CSKY_WR_BKPT_MODE);
|
||||
}
|
||||
else
|
||||
{
|
||||
val = target_read_memory (bp_tgt->reqstd_address - 2,
|
||||
bp_record, 2);
|
||||
if (val)
|
||||
return val;
|
||||
val = target_read_memory (bp_tgt->reqstd_address + 4,
|
||||
bp_record+6, 2);
|
||||
if (val)
|
||||
return val;
|
||||
|
||||
bp_record[2] = bp_tgt->shadow_contents[0];
|
||||
bp_record[3] = bp_tgt->shadow_contents[1];
|
||||
bp_record[4] = bp_tgt->shadow_contents[2];
|
||||
bp_record[5] = bp_tgt->shadow_contents[3];
|
||||
|
||||
return target_write_raw_memory (bp_tgt->reqstd_address - 2,
|
||||
bp_record,
|
||||
CSKY_WR_BKPT_MODE * 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Determine link register type. */
|
||||
|
||||
static lr_type_t
|
||||
@ -3062,12 +2867,6 @@ csky_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
frame_unwind_append_unwinder (gdbarch, &csky_stub_unwind);
|
||||
frame_unwind_append_unwinder (gdbarch, &csky_unwind_cache);
|
||||
|
||||
/* Breakpoints. */
|
||||
set_gdbarch_memory_insert_breakpoint (gdbarch,
|
||||
csky_memory_insert_breakpoint);
|
||||
set_gdbarch_memory_remove_breakpoint (gdbarch,
|
||||
csky_memory_remove_breakpoint);
|
||||
|
||||
/* Hook in ABI-specific overrides, if they have been registered. */
|
||||
gdbarch_init_osabi (info, gdbarch);
|
||||
|
||||
|
Reference in New Issue
Block a user