static void dump_domain(uint32_t *dwords, uint32_t sizedwords, int level, const char *name) { struct rnndomain *dom; int i; init(); dom = rnn_finddomain(db, name); if (!dom) return; for (i = 0; i < sizedwords; i++) { struct rnndecaddrinfo *info = rnndec_decodeaddr(vc, dom, i, 0); char *decoded; if (!(info && info->typeinfo)) break; decoded = rnndec_decodeval(vc, info->typeinfo, dwords[i], info->width); printf("%s%s\n", levels[level], decoded); free(decoded); free(info->name); free(info); } }
void decode_tic(uint32_t tic, int idx, uint32_t *data) { struct rnndecaddrinfo *ai = rnndec_decodeaddr(g80_texture_ctx, tic_domain, idx * 4, 1); char *dec_addr = ai->name; char *dec_val = rnndec_decodeval(g80_texture_ctx, ai->typeinfo, data[idx], ai->width); fprintf(stdout, "TIC[%d]: 0x%08x %s = %s\n", tic, data[idx], dec_addr, dec_val); free(ai); free(dec_val); free(dec_addr); }
void decode_tsc(struct rnndeccontext *texture_ctx, uint32_t tsc, uint32_t *data) { int idx; for (idx = 0; idx < 8; idx++) { struct rnndecaddrinfo *ai = rnndec_decodeaddr(texture_ctx, tsc_domain, idx * 4, 1); char *dec_val = rnndec_decodeval(texture_ctx, ai->typeinfo, data[idx], ai->width); mmt_printf("TSC[%d]: 0x%08x %s = %s\n", tsc, data[idx], ai->name, dec_val); rnndec_free_decaddrinfo(ai); free(dec_val); } }
static const char *regname(uint32_t regbase, int color) { static char buf[1024]; struct rnndecaddrinfo *info; init(); info = rnndec_decodeaddr(color ? vc : vc_nocolor, finddom(regbase), regbase, 0); if (info) { strncpy(buf, info->name, sizeof(buf)); free(info->name); free(info); return buf; } return NULL; }
static void dump_register_val(uint32_t regbase, uint32_t dword, int level) { struct rnndecaddrinfo *info = rnndec_decodeaddr(vc, finddom(regbase), regbase, 0); if (info && info->typeinfo) { char *decoded = rnndec_decodeval(vc, info->typeinfo, dword, info->width); printf("%s%s: %s\n", levels[level], info->name, decoded); free(decoded); } else if (info) { printf("%s%s: %08x\n", levels[level], info->name, dword); } else { printf("%s<%04x>: %08x\n", levels[level], regbase, dword); } if (info) { free(info->name); free(info); } }
int main(int argc, char **argv) { char *file = "nv_mmio.xml"; char *name = "NV_MMIO"; char *variant = NULL; char c, mode = 'd'; uint64_t reg, colors=1, val = 0; struct rnndeccontext *vc; rnn_init(); if (argc < 2) { usage(); } struct rnndb *db = rnn_newdb(); /* Arguments parsing */ while ((c = getopt (argc, argv, "f:a:d:e:b:c")) != -1) { switch (c) { case 'f': file = strdup(optarg); break; case 'e': mode = 'e'; name = strdup(optarg); break; case 'b': mode = 'b'; name = strdup(optarg); break; case 'd': mode = 'd'; name = strdup(optarg); break; case 'a': if (!strncasecmp(optarg, "NV", 2)) variant = strdup(optarg); else asprintf(&variant, "NV%s", optarg); break; case 'c': colors = 0; break; default: usage(); } } rnn_parsefile (db, file); rnn_prepdb (db); vc = rnndec_newcontext(db); if(colors) vc->colors = &rnndec_colorsterm; if (variant) rnndec_varadd(vc, "chipset", variant); /* Parse extra arguments */ while (!strcmp (argv[optind], "-v")) { rnndec_varadd(vc, argv[optind+1], argv[optind+2]); optind+=3; } if (optind >= argc) { fprintf (stderr, "No address specified.\n"); return 1; } reg = strtoull(argv[optind], 0, 16); if (optind + 1 < argc) val = strtoull(argv[optind + 1], 0, 16); if (mode == 'e') { struct rnnenum *en = rnn_findenum (db, name); if (en) { int i; int dec = 0; for (i = 0; i < en->valsnum; i++) if (en->vals[i]->valvalid && en->vals[i]->value == reg) { printf ("%s\n", en->vals[i]->name); dec = 1; break; } if (!dec) printf ("%#"PRIx64"\n", reg); return 0; } else { fprintf(stderr, "Not an enum: '%s'\n", name); return 1; } } else if (mode == 'b') { struct rnnbitset *bs = rnn_findbitset (db, name); if (bs) { printf("TODO\n"); return 0; } else { fprintf(stderr, "Not a bitset: '%s'\n", name); return 1; } } else if (mode == 'd') { struct rnndomain *dom = rnn_finddomain (db, name); if (dom) { struct rnndecaddrinfo *info = rnndec_decodeaddr(vc, dom, reg, 0); if (info && info->typeinfo) printf ("%s => %s\n", info->name, rnndec_decodeval(vc, info->typeinfo, val, info->width)); else if (info) printf ("%s\n", info->name); else return 1; return 0; } else { fprintf(stderr, "Not a domain: '%s'\n", name); return 1; } } else { return 1; } }