/*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; char tmpfmt[28]; 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; #ifdef __LP64__ case 'q': size = 8; break; #endif default: size = -1; db_error("Unknown size\n"); /*NOTREACHED*/ } while (db_expression(&new_value)) { old_value = db_get_value(addr, size, FALSE); db_printsym(addr, DB_STGY_ANY, db_printf); db_printf("\t\t%s\t", db_format(tmpfmt, sizeof tmpfmt, old_value, DB_FORMAT_N, 0, 8)); db_printf("=\t%s\n", db_format(tmpfmt, sizeof tmpfmt, new_value, DB_FORMAT_N, 0, 8)); 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_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) { db_expr_t value; char tmpfmt[28]; if (modif[0] != '\0') db_print_format = modif[0]; switch (db_print_format) { case 'a': db_printsym((db_addr_t)addr, DB_STGY_ANY, db_printf); break; case 'r': db_printf("%s", db_format(tmpfmt, sizeof tmpfmt, addr, DB_FORMAT_R, 0, sizeof(db_expr_t) * 2 * 6 / 5)); break; case 'x': db_printf("%*lx", sizeof(db_expr_t) * 2, addr); break; case 'z': db_printf("%s", db_format(tmpfmt, sizeof tmpfmt, addr, DB_FORMAT_Z, 0, sizeof(db_expr_t) * 2)); break; case 'd': db_printf("%*ld", sizeof(db_expr_t) * 2 * 6 / 5, addr); break; case 'u': db_printf("%*lu", sizeof(db_expr_t) * 2 * 6 / 5, addr); break; case 'o': db_printf("%*lo", sizeof(db_expr_t) * 2 * 4 / 3, addr); break; case 'c': value = addr & 0xFF; if (value >= ' ' && value <= '~') db_printf("%c", value); else db_printf("\\%03o", value); break; } db_printf("\n"); }
/*ARGSUSED*/ void db_fncall(db_expr_t addr, int have_addr, db_expr_t count, char *modif) { db_expr_t fn_addr; #define MAXARGS 11 db_expr_t args[MAXARGS]; int nargs = 0; db_expr_t retval; db_expr_t (*func)(db_expr_t, ...); int t; char tmpfmt[28]; if (!db_expression(&fn_addr)) { db_printf("Bad function\n"); db_flush_lex(); return; } func = (db_expr_t (*)(db_expr_t, ...)) fn_addr; t = db_read_token(); if (t == tLPAREN) { if (db_expression(&args[0])) { nargs++; while ((t = db_read_token()) == tCOMMA) { if (nargs == MAXARGS) { db_printf("Too many arguments\n"); db_flush_lex(); return; } if (!db_expression(&args[nargs])) { db_printf("Argument missing\n"); db_flush_lex(); return; } nargs++; } db_unread_token(t); } if (db_read_token() != tRPAREN) { db_printf("?\n"); db_flush_lex(); return; } } db_skip_to_eol(); while (nargs < MAXARGS) { args[nargs++] = 0; } retval = (*func)(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]); db_printf("%s\n", db_format(tmpfmt, sizeof tmpfmt, retval, DB_FORMAT_N, 1, 0)); }
/*ARGSUSED*/ void db_show_regs(db_expr_t addr, int have_addr, db_expr_t count, char *modif) { struct db_variable *regp; db_expr_t value, offset; char * name; char tmpfmt[28]; for (regp = db_regs; regp < db_eregs; regp++) { db_read_variable(regp, &value); db_printf("%-12s%s", regp->name, db_format(tmpfmt, sizeof tmpfmt, (long)value, DB_FORMAT_N, 1, sizeof(long) * 3)); db_find_xtrn_sym_and_offset((db_addr_t)value, &name, &offset); if (name != 0 && offset <= db_maxoff && offset != value) { db_printf("\t%s", name); if (offset != 0) db_printf("+%s", db_format(tmpfmt, sizeof tmpfmt, (long)offset, DB_FORMAT_R, 1, 0)); } db_printf("\n"); } db_print_loc_and_inst(PC_REGS(DDB_REGS)); }
void db_examine(db_addr_t addr, char *fmt, int count) { int c; db_expr_t value; int size; int width; char * fp; char tmpfmt[28]; while (--count >= 0) { fp = fmt; size = 4; width = 12; while ((c = *fp++) != 0) { if (db_print_position() == 0) { /* Always print the address. */ db_printsym(addr, DB_STGY_ANY, db_printf); db_printf(":\t"); db_prev = addr; } switch (c) { case 'b': /* byte */ size = 1; width = 4; break; case 'h': /* half-word */ size = 2; width = 8; break; case 'l': /* long-word */ size = 4; width = 12; break; #ifdef __LP64__ case 'q': /* quad-word */ size = 8; width = 20; break; #endif case 'a': /* address */ db_printf("= 0x%lx\n", (long)addr); break; case 'r': /* signed, current radix */ value = db_get_value(addr, size, TRUE); addr += size; db_format(tmpfmt, sizeof tmpfmt, (long)value, DB_FORMAT_R, 0, width); db_printf("%-*s", width, tmpfmt); break; case 'x': /* unsigned hex */ value = db_get_value(addr, size, FALSE); addr += size; db_printf("%-*lx", width, (long)value); break; case 'z': /* signed hex */ value = db_get_value(addr, size, TRUE); addr += size; db_format(tmpfmt, sizeof tmpfmt, (long)value, DB_FORMAT_Z, 0, width); db_printf("%-*s", width, tmpfmt); break; case 'd': /* signed decimal */ value = db_get_value(addr, size, TRUE); addr += size; db_printf("%-*ld", width, (long)value); break; case 'u': /* unsigned decimal */ value = db_get_value(addr, size, FALSE); addr += size; db_printf("%-*lu", width, (long)value); break; case 'o': /* unsigned octal */ value = db_get_value(addr, size, FALSE); addr += size; db_printf("%-*lo", width, value); break; case 'c': /* character */ value = db_get_value(addr, 1, FALSE); addr += 1; if (value >= ' ' && value <= '~') db_printf("%c", value); else db_printf("\\%03o", value); break; case 's': /* null-terminated string */ for (;;) { value = db_get_value(addr, 1, FALSE); addr += 1; if (value == 0) break; if (value >= ' ' && value <= '~') db_printf("%c", value); else db_printf("\\%03o", value); } break; case 'i': /* instruction */ addr = db_disasm(addr, FALSE); break; case 'I': /* instruction, alternate form */ addr = db_disasm(addr, TRUE); break; default: break; } if (db_print_position() != 0) db_end_line(width); } } db_next = addr; }