void validate_breakpoints (void) { struct process_info *proc = current_process (); struct breakpoint *bp; for (bp = proc->breakpoints; bp != NULL; bp = bp->next) { if (bp->raw->inserted) validate_inserted_breakpoint (bp->raw); } delete_disabled_breakpoints (); }
void validate_breakpoints (void) { struct process_info *proc = current_process (); struct breakpoint *bp; for (bp = proc->breakpoints; bp != NULL; bp = bp->next) { struct raw_breakpoint *raw = bp->raw; if (raw->raw_type == raw_bkpt_type_sw && raw->inserted > 0) validate_inserted_breakpoint (raw); } delete_disabled_breakpoints (); }
void check_mem_write (CORE_ADDR mem_addr, unsigned char *buf, const unsigned char *myaddr, int mem_len) { struct process_info *proc = current_process (); struct raw_breakpoint *bp = proc->raw_breakpoints; struct fast_tracepoint_jump *jp = proc->fast_tracepoint_jumps; CORE_ADDR mem_end = mem_addr + mem_len; int disabled_one = 0; /* First fast tracepoint jumps, then breakpoint traps on top. */ for (; jp != NULL; jp = jp->next) { CORE_ADDR jp_end = jp->pc + jp->length; CORE_ADDR start, end; int copy_offset, copy_len, buf_offset; gdb_assert (fast_tracepoint_jump_shadow (jp) >= myaddr + mem_len || myaddr >= fast_tracepoint_jump_shadow (jp) + (jp)->length); gdb_assert (fast_tracepoint_jump_insn (jp) >= buf + mem_len || buf >= fast_tracepoint_jump_insn (jp) + (jp)->length); if (mem_addr >= jp_end) continue; if (jp->pc >= mem_end) continue; start = jp->pc; if (mem_addr > start) start = mem_addr; end = jp_end; if (end > mem_end) end = mem_end; copy_len = end - start; copy_offset = start - jp->pc; buf_offset = start - mem_addr; memcpy (fast_tracepoint_jump_shadow (jp) + copy_offset, myaddr + buf_offset, copy_len); if (jp->inserted) memcpy (buf + buf_offset, fast_tracepoint_jump_insn (jp) + copy_offset, copy_len); } for (; bp != NULL; bp = bp->next) { CORE_ADDR bp_end = bp->pc + breakpoint_len; CORE_ADDR start, end; int copy_offset, copy_len, buf_offset; gdb_assert (bp->old_data >= myaddr + mem_len || myaddr >= &bp->old_data[sizeof (bp->old_data)]); if (mem_addr >= bp_end) continue; if (bp->pc >= mem_end) continue; start = bp->pc; if (mem_addr > start) start = mem_addr; end = bp_end; if (end > mem_end) end = mem_end; copy_len = end - start; copy_offset = start - bp->pc; buf_offset = start - mem_addr; memcpy (bp->old_data + copy_offset, myaddr + buf_offset, copy_len); if (bp->inserted) { if (validate_inserted_breakpoint (bp)) memcpy (buf + buf_offset, breakpoint_data + copy_offset, copy_len); else disabled_one = 1; } } if (disabled_one) delete_disabled_breakpoints (); }