/*ARGSUSED*/ void db_write_cmd(db_expr_t address, bool have_addr, db_expr_t count, const char *modif) { db_addr_t addr; db_expr_t old_value; db_expr_t new_value; int size; bool wrote_one; bool show_old_val; addr = (db_addr_t) address; wrote_one = false; show_old_val = islower((unsigned char)modif[0]); switch (tolower((unsigned char)modif[0])) { case 'b': size = 1; break; case 'h': size = 2; break; case 'l': case '\0': size = 4; break; default: size = -1; db_error("Unknown size\n"); /*NOTREACHED*/ } while (db_expression(&new_value)) { db_printsym(addr, DB_STGY_ANY, db_printf); if (show_old_val) { old_value = db_get_value(addr, size, false); db_printf("\t\t%s = ", db_num_to_str(old_value)); db_printf("%s\n", db_num_to_str(new_value)); } else db_printf("\t\t= %s\n", db_num_to_str(new_value)); db_put_value(addr, size, new_value); addr += size; wrote_one = true; } if (!wrote_one) { db_error("Nothing written.\n"); /*NOTREACHED*/ } db_next = addr; db_prev = addr - size; db_skip_to_eol(); }
/*ARGSUSED*/ void db_write_cmd(db_expr_t address, boolean_t have_addr, db_expr_t count, char *modif) { db_addr_t addr; db_expr_t old_value; db_expr_t new_value; int size; boolean_t wrote_one = FALSE; addr = (db_addr_t) address; switch (modif[0]) { case 'b': size = 1; break; case 'h': size = 2; break; case 'l': case '\0': size = 4; break; default: db_error("Unknown size\n"); return; } while (db_expression(&new_value)) { old_value = db_get_value(addr, size, FALSE); db_printsym(addr, DB_STGY_ANY); db_printf("\t\t%s = ", db_num_to_str(old_value)); db_printf("%s\n", db_num_to_str(new_value)); db_put_value(addr, size, new_value); addr += size; wrote_one = TRUE; } if (!wrote_one) db_error("Nothing written.\n"); db_next = addr; db_prev = addr - size; db_skip_to_eol(); }
void db_printsym(db_expr_t off, db_strategy_t strategy, void (*pr)(const char *, ...)) { const char *name; #ifdef _KERNEL const char *mod; unsigned long uval; long val; #endif #ifdef notyet char *filename; int linenum; #endif #ifndef _KERNEL if (!use_ksyms) { db_expr_t d; char *filename; db_expr_t value; int linenum; db_sym_t cursym; cursym = db_search_symbol(off, strategy, &d); db_symbol_values(cursym, &name, &value); if (name != NULL && ((unsigned int)d < db_maxoff) && value != 0) { (*pr)("%s", name); if (d) { char tbuf[24]; db_format_radix(tbuf, 24, d, true); (*pr)("+%s", tbuf); } if (strategy == DB_STGY_PROC) { if ((*db_symformat->sym_line_at_pc) (NULL, cursym, &filename, &linenum, off)) (*pr)(" [%s:%d]", filename, linenum); } return; } (*pr)("%s", db_num_to_str(off)); return; } #endif #ifdef _KERNEL if (ksyms_getname(&mod, &name, (vaddr_t)off, strategy|KSYMS_CLOSEST) == 0) { (void)ksyms_getval_unlocked(mod, name, &uval, KSYMS_ANY); val = (long) uval; if (((off - val) < db_maxoff) && val) { (*pr)("%s:%s", mod, name); if (off - val) { char tbuf[24]; db_format_radix(tbuf, 24, off - val, true); (*pr)("+%s", tbuf); } #ifdef notyet if (strategy & KSYMS_PROC) { if (ksyms_fmaddr(off, &filename, &linenum) == 0) (*pr)(" [%s:%d]", filename, linenum); } #endif return; } } #endif (*pr)("%s", db_num_to_str(off)); return; }
void db_symstr(char *buf, size_t buflen, db_expr_t off, db_strategy_t strategy) { const char *name; #ifdef _KERNEL const char *mod; unsigned long val; #endif #ifndef _KERNEL if (!use_ksyms) { db_expr_t d; char *filename; db_expr_t value; int linenum; db_sym_t cursym; cursym = db_search_symbol(off, strategy, &d); db_symbol_values(cursym, &name, &value); if (name != NULL && ((unsigned int)d < db_maxoff) && value != 0) { strlcpy(buf, name, buflen); if (d) { strlcat(buf, "+", buflen); db_format_radix(buf + strlen(buf), 24, d, true); } if (strategy == DB_STGY_PROC) { if ((*db_symformat->sym_line_at_pc) (NULL, cursym, &filename, &linenum, off)) { size_t len = strlen(buf); snprintf(buf + len, buflen - len, " [%s:%d]", filename, linenum); } } return; } strlcpy(buf, db_num_to_str(off), buflen); return; } #endif #ifdef _KERNEL if (ksyms_getname(&mod, &name, (vaddr_t)off, strategy|KSYMS_CLOSEST) == 0) { (void)ksyms_getval_unlocked(mod, name, &val, KSYMS_ANY); if (((off - val) < db_maxoff) && val) { snprintf(buf, buflen, "%s:%s", mod, name); if (off - val) { strlcat(buf, "+", buflen); db_format_radix(buf+strlen(buf), 24, off - val, true); } #ifdef notyet if (strategy & KSYMS_PROC) { if (ksyms_fmaddr(off, &filename, &linenum) == 0) snprintf(buf + strlen(buf), buflen - strlen(buf), " [%s:%d]", filename, linenum); } #endif return; } } strlcpy(buf, db_num_to_str(off), buflen); #endif }