void db_breakpoint_cmd( db_expr_t addr, int have_addr, db_expr_t count, char * modif) { register int n; thread_act_t thr_act; boolean_t user_global = db_option(modif, 'U'); boolean_t task_bpt = db_option(modif, 'T'); boolean_t user_space; if (count == -1) count = 1; if (task_bpt && user_global) db_error("Cannot specify both 'T' and 'U'\n"); user_space = (user_global)? TRUE: db_option(modif, 'u'); if (user_space && db_access_level < DB_ACCESS_CURRENT) db_error("User space break point is not supported\n"); if ((!task_bpt || !user_space) && !DB_VALID_ADDRESS(addr, user_space)) { /* if the user has explicitly specified user space, do not insert a breakpoint into the kernel */ if (user_space) db_error("Invalid user space address\n"); user_space = TRUE; db_printf("%#X is in user space\n", addr); db_printf("kernel is from %#X to %#x\n", VM_MIN_KERNEL_ADDRESS, VM_MAX_KERNEL_ADDRESS); } if (db_option(modif, 't') || task_bpt) { for (n = 0; db_get_next_act(&thr_act, n); n++) { if (thr_act == THR_ACT_NULL) db_error("No active thr_act\n"); if (task_bpt && thr_act->task == TASK_NULL) db_error("No task\n"); if (db_access_level <= DB_ACCESS_CURRENT && user_space && thr_act->task != db_current_space()) db_error("Cannot set break point in inactive user space\n"); db_set_breakpoint(db_target_space(thr_act, user_space), (db_addr_t)addr, count, (user_global)? THR_ACT_NULL: thr_act, task_bpt); } } else { db_set_breakpoint(db_target_space(THR_ACT_NULL, user_space), (db_addr_t)addr, count, THR_ACT_NULL, FALSE); } }
/*ARGSUSED*/ void db_breakpoint_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) { if (count == -1) count = 1; db_set_breakpoint((db_addr_t)addr, count); }