static int breakpoint_add_checkpoint(MON_ADDR start_addr, MON_ADDR end_addr, bool stop, MEMORY_OP memory_op, bool is_temp, bool do_print) { checkpoint_t *new_cp; MEMSPACE mem; mon_evaluate_address_range(&start_addr, &end_addr, FALSE, 0); new_cp = lib_malloc(sizeof(checkpoint_t)); new_cp->checknum = breakpoint_count++; new_cp->start_addr = start_addr; new_cp->end_addr = end_addr; new_cp->stop = stop; new_cp->enabled = e_ON; new_cp->hit_count = 0; new_cp->ignore_count = 0; new_cp->condition = NULL; new_cp->command = NULL; new_cp->check_load = memory_op & e_load; new_cp->check_store = memory_op & e_store; new_cp->check_exec = memory_op & e_exec; new_cp->temporary = is_temp; mem = addr_memspace(start_addr); if (new_cp->check_exec) { add_to_checkpoint_list(&(breakpoints[mem]), new_cp); } if (new_cp->check_load) { add_to_checkpoint_list(&(watchpoints_load[mem]), new_cp); } if (new_cp->check_store) { add_to_checkpoint_list(&(watchpoints_store[mem]), new_cp); } update_checkpoint_state(mem); if (is_temp) { exit_mon = 1; } if (do_print) { print_checkpoint_info(new_cp); } return new_cp->checknum; }
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); }