void mon_disassemble_lines(MON_ADDR start_addr, MON_ADDR end_addr) { MEMSPACE mem; long len, i, bytes; len = mon_evaluate_address_range(&start_addr, &end_addr, FALSE, DEFAULT_DISASSEMBLY_SIZE); if (len < 0) { log_error(LOG_ERR, "Invalid address range"); return; } mem = addr_memspace(start_addr); dot_addr[mem] = start_addr; i = 0; while (i <= len) { bytes = mon_disassemble_instr(dot_addr[mem]); i += bytes; mon_inc_addr_location(&(dot_addr[mem]), bytes); if (mon_stop_output != 0) { break; } } }
bool monitor_breakpoint_check_checkpoint(MEMSPACE mem, WORD addr, break_list_t *list) { break_list_t *ptr; breakpoint_t *bp; bool result = FALSE; MON_ADDR temp; const char *type; ptr = search_checkpoint_list(list, addr); while (ptr && mon_is_in_range(ptr->brkpt->start_addr, ptr->brkpt->end_addr, addr)) { bp = ptr->brkpt; ptr = ptr->next; if (bp && bp->enabled==e_ON) { /* If condition test fails, skip this checkpoint */ if (bp->condition) { if (!mon_evaluate_conditional(bp->condition)) { continue; } } /* Check if the user specified some ignores */ if (bp->ignore_count) { bp->ignore_count--; continue; } bp->hit_count++; result = TRUE; temp = new_addr(mem, (monitor_cpu_type.mon_register_get_val)(mem, e_PC)); if (bp->trace) { type = "Trace"; result = FALSE; } else if (bp->watch_load) type = "Watch-load"; else if (bp->watch_store) type = "Watch-store"; else type = "Break"; /*archdep_open_monitor_console(&mon_input, &mon_output);*/ mon_out("#%d (%s) ", bp->brknum, type); mon_disassemble_instr(temp); if (bp->command) { mon_out("Executing: %s\n", bp->command); parse_and_execute_line(bp->command); } if (bp->temporary) mon_breakpoint_delete_checkpoint(bp->brknum); } } return result; }