void mon_breakpoint_delete_checkpoint(int brknum) { int i; breakpoint_t *bp = NULL; MEMSPACE mem; if (brknum == -1) { /* Add user confirmation here. */ mon_out("Deleting all breakpoints\n"); for (i = 1; i < breakpoint_count; i++) { bp = find_checkpoint(i); if (bp) mon_breakpoint_delete_checkpoint(i); } } else if (!(bp = find_checkpoint(brknum))) { mon_out("#%d not a valid breakpoint\n", brknum); return; } else { mem = addr_memspace(bp->start_addr); if (!(bp->watch_load) && !(bp->watch_store)) { remove_checkpoint_from_list(&(breakpoints[mem]), bp); if (!any_breakpoints(mem)) { monitor_mask[mem] &= ~MI_BREAK; if (!monitor_mask[mem]) interrupt_monitor_trap_off(mon_interfaces[mem]->int_status); } } else { if (bp->watch_load) remove_checkpoint_from_list(&(watchpoints_load[mem]), bp); if (bp->watch_store) remove_checkpoint_from_list(&(watchpoints_store[mem]), bp); if (!any_watchpoints(mem)) { monitor_mask[mem] &= ~MI_WATCH; mon_interfaces[mem]->toggle_watchpoints_func(0, mon_interfaces[mem]->context); if (!monitor_mask[mem]) interrupt_monitor_trap_off(mon_interfaces[mem]->int_status); } } } if (bp != NULL) { mon_delete_conditional(bp->condition); if (bp->command) lib_free(bp->command); } }
static void remove_checkpoint(checkpoint_t *cp) { MEMSPACE mem; mem = addr_memspace(cp->start_addr); mon_delete_conditional(cp->condition); lib_free(cp->command); cp->command = NULL; if (cp->check_exec) { remove_checkpoint_from_list(&(breakpoints[mem]), cp); } if (cp->check_load) { remove_checkpoint_from_list(&(watchpoints_load[mem]), cp); } if (cp->check_store) { remove_checkpoint_from_list(&(watchpoints_store[mem]), cp); } update_checkpoint_state(mem); }