/* Remove hardware break-/watchpoint. */ static int arm_remove_point (enum raw_bkpt_type type, CORE_ADDR addr, int len, struct raw_breakpoint *bp) { struct process_info *proc = current_process (); struct arm_linux_hw_breakpoint p, *pts; int watch, i, count; watch = arm_linux_hw_point_initialize (type, addr, len, &p); if (watch < 0) { /* Unsupported. */ return -1; } if (watch) { count = arm_linux_get_hw_watchpoint_count (); pts = proc->priv->arch_private->wpts; } else { count = arm_linux_get_hw_breakpoint_count (); pts = proc->priv->arch_private->bpts; } for (i = 0; i < count; i++) if (arm_linux_hw_breakpoint_equal (&p, pts + i)) { pts[i].control = arm_hwbp_control_disable (pts[i].control); /* Only update the threads of the current process. */ for_each_thread (current_thread->id.pid (), [&] (thread_info *thread) { update_registers_callback (thread, watch, i); }); return 0; } /* No watchpoint matched. */ return -1; }
/* Remove hardware break-/watchpoint. */ static int arm_remove_point (enum raw_bkpt_type type, CORE_ADDR addr, int len, struct raw_breakpoint *bp) { struct process_info *proc = current_process (); struct arm_linux_hw_breakpoint p, *pts; int watch, i, count; watch = arm_linux_hw_point_initialize (type, addr, len, &p); if (watch < 0) { /* Unsupported. */ return -1; } if (watch) { count = arm_linux_get_hw_watchpoint_count (); pts = proc->priv->arch_private->wpts; } else { count = arm_linux_get_hw_breakpoint_count (); pts = proc->priv->arch_private->bpts; } for (i = 0; i < count; i++) if (arm_linux_hw_breakpoint_equal (&p, pts + i)) { struct update_registers_data data = { watch, i }; pts[i].control = arm_hwbp_control_disable (pts[i].control); find_inferior (&all_threads, update_registers_callback, &data); return 0; } /* No watchpoint matched. */ return -1; }