void db_set_breakpoint(db_addr_t addr, int count) { db_breakpoint_t bkpt; if (db_find_breakpoint(addr)) { db_printf("Already set.\n"); return; } #ifdef DB_VALID_BREAKPOINT if (!DB_VALID_BREAKPOINT(addr)) { db_printf("Not a valid address for a breakpoint.\n"); return; } #endif bkpt = db_breakpoint_alloc(); if (bkpt == 0) { db_printf("Too many breakpoints.\n"); return; } bkpt->address = addr; bkpt->flags = 0; bkpt->init_count = count; bkpt->count = count; bkpt->link = db_breakpoint_list; db_breakpoint_list = bkpt; }
void db_set_breakpoint( task_t task, db_addr_t addr, int count, thread_act_t thr_act, boolean_t task_bpt) { register db_breakpoint_t bkpt; db_breakpoint_t alloc_bkpt = 0; vm_offset_t task_thd; bkpt = db_find_breakpoint(task, addr); if (bkpt) { if (thr_act == THR_ACT_NULL || db_find_thread_breakpoint(bkpt, thr_act)) { db_printf("Already set.\n"); return; } } else { if (!DB_CHECK_ACCESS(addr, BKPT_SIZE, task)) { if (task) { db_printf("Warning: non-resident page for breakpoint at %lX", addr); db_printf(" in task %lX.\n", task); } else { db_printf("Cannot set breakpoint at %lX in kernel space.\n", addr); return; } } alloc_bkpt = bkpt = db_breakpoint_alloc(); if (bkpt == 0) { db_printf("Too many breakpoints.\n"); return; } bkpt->task = task; bkpt->flags = (task && thr_act == THR_ACT_NULL)? (BKPT_USR_GLOBAL|BKPT_1ST_SET): 0; bkpt->address = addr; bkpt->threads = 0; } if (db_breakpoint_list == 0) db_breakpoint_number = 0; task_thd = (task_bpt) ? (vm_offset_t)(thr_act->task) : (vm_offset_t)thr_act; if (db_add_thread_breakpoint(bkpt, task_thd, count, task_bpt) < 0) { if (alloc_bkpt) db_breakpoint_free(alloc_bkpt); db_printf("Too many thread_breakpoints.\n"); } else { db_printf("set breakpoint #%x\n", db_breakpoint_number); if (alloc_bkpt) { bkpt->link = db_breakpoint_list; db_breakpoint_list = bkpt; } } }
db_thread_breakpoint_t db_find_thread_breakpoint_here( task_t task, db_addr_t addr) { db_breakpoint_t bkpt; bkpt = db_find_breakpoint(task, (db_addr_t)addr); if (bkpt == 0) return(0); return(db_find_thread_breakpoint(bkpt, current_act())); }