void kdb_id1(unsigned long pc) { char *mode; int diag; kdb_di.fprintf_func = kdb_dis_fprintf; kdba_id_init(&kdb_di); /* * Allow the user to specify that this instruction * should be treated differently. */ mode = kdbgetenv("IDMODE"); diag = kdba_id_parsemode(mode, &kdb_di); if (diag) { kdb_printf("kdb_id: bad value in 'IDMODE' environment variable ignored\n"); } (void) kdba_id_printinsn(pc, &kdb_di); kdb_printf("\n"); }
void __init kdb_id_init(void) { kdb_di.stream = NULL; kdb_di.application_data = NULL; kdb_di.symbols = NULL; kdb_di.num_symbols = 0; kdb_di.flags = 0; kdb_di.private_data = NULL; kdb_di.buffer = NULL; kdb_di.buffer_vma = 0; kdb_di.buffer_length = 0; kdb_di.bytes_per_line = 0; kdb_di.bytes_per_chunk = 0; kdb_di.insn_info_valid = 0; kdb_di.branch_delay_insns = 0; kdb_di.data_size = 0; kdb_di.insn_type = 0; kdb_di.target = 0; kdb_di.target2 = 0; kdb_di.fprintf_func = kdb_dis_fprintf; kdba_id_init(&kdb_di); }
int kdb_id(int argc, const char **argv) { kdb_machreg_t pc; int icount; int diag; int i; char *mode; int nextarg; long offset = 0; static kdb_machreg_t lastpc; struct disassemble_info *dip = &kdb_di; char lastbuf[50]; unsigned long word; kdb_di.fprintf_func = kdb_dis_fprintf; kdba_id_init(&kdb_di); if (argc != 1) { if (lastpc == 0) { return KDB_ARGCOUNT; } else { sprintf(lastbuf, "0x%lx", lastpc); argv[1] = lastbuf; argc = 1; } } /* * Fetch PC. First, check to see if it is a symbol, if not, * try address. */ nextarg = 1; diag = kdbgetaddrarg(argc, argv, &nextarg, &pc, &offset, NULL); if (diag) return diag; kdba_check_pc(&pc); if (kdb_getarea(word, pc)) return(0); /* * Number of lines to display */ diag = kdbgetintenv("IDCOUNT", &icount); if (diag) return diag; mode = kdbgetenv("IDMODE"); diag = kdba_id_parsemode(mode, dip); if (diag) { return diag; } for(i=0; i<icount; i++) { pc += kdba_id_printinsn(pc, &kdb_di); kdb_printf("\n"); } lastpc = pc; return 0; }