int main(int argc, char *argv[]) { char *filename = read_opts(argc, argv); /* set up an rnn context */ rnn_init(); rnndb = rnn_newdb(); rnn_parsefile(rnndb, "fifo/nv_objects.xml"); if (rnndb->estatus) demmt_abort(); rnn_prepdb(rnndb); domain = rnn_finddomain(rnndb, "SUBCHAN"); if (!domain) demmt_abort(); rnndb_g80_texture = rnn_newdb(); rnn_parsefile(rnndb_g80_texture, "graph/g80_texture.xml"); if (rnndb_g80_texture->estatus) demmt_abort(); rnn_parsefile(rnndb_g80_texture, "graph/gm107_texture.xml"); if (rnndb_g80_texture->estatus) demmt_abort(); rnn_prepdb(rnndb_g80_texture); rnndb_gf100_shaders = rnn_newdb(); rnn_parsefile(rnndb_gf100_shaders, "graph/gf100_shaders.xml"); if (rnndb_gf100_shaders->estatus) demmt_abort(); rnn_prepdb(rnndb_gf100_shaders); gf100_shaders_ctx = rnndec_newcontext(rnndb_gf100_shaders); gf100_shaders_ctx->colors = colors; /* doesn't matter which, just needs to exist to make it * possible to modify later. */ rnndec_varadd(gf100_shaders_ctx, "GF100_SHADER_KIND", "FP"); rnndb_nvrm_object = rnn_newdb(); rnn_parsefile(rnndb_nvrm_object, "../docs/nvrm/rnndb/nvrm_object.xml"); if (rnndb_nvrm_object->estatus) demmt_abort(); rnn_prepdb(rnndb_nvrm_object); tic_domain = rnn_finddomain(rnndb_g80_texture, "TIC"); tic2_domain = rnn_finddomain(rnndb_g80_texture, "TIC2"); tsc_domain = rnn_finddomain(rnndb_g80_texture, "TSC"); gf100_sp_header_domain = rnn_finddomain(rnndb_gf100_shaders, "GF100_SP_HEADER"); gf100_fp_header_domain = rnn_finddomain(rnndb_gf100_shaders, "GF100_FP_HEADER"); if (!gf100_sp_header_domain || !gf100_fp_header_domain) demmt_abort(); gk104_cp_header_domain = rnn_finddomain(rnndb, "GK104_COMPUTE_LAUNCH_DESC"); if (!gk104_cp_header_domain) demmt_abort(); if (filename) { close(0); if (open_input(filename) == NULL) { perror("open"); exit(1); } free(filename); } if (pager_enabled) { int pipe_fds[2]; pid_t pid; if (pipe(pipe_fds) < 0) { perror("pipe"); demmt_abort(); } pid = fork(); if (pid < 0) { perror("fork"); demmt_abort(); } if (pid > 0) { char *less_argv[] = { "less", "-ScR", NULL }; close(pipe_fds[1]); dup2(pipe_fds[0], 0); close(pipe_fds[0]); execvp(less_argv[0], less_argv); perror("exec"); demmt_abort(); } close(pipe_fds[0]); dup2(pipe_fds[1], 1); dup2(pipe_fds[1], 2); close(pipe_fds[1]); } #ifdef LIBSECCOMP_AVAILABLE if (seccomp_level) { int rc; scmp_filter_ctx ctx; if (seccomp_level == 2) ctx = seccomp_init(SCMP_ACT_KILL); else ctx = seccomp_init(SCMP_ACT_TRACE(1234)); if (!ctx) { fprintf(stderr, "seccomp_init failed\n"); exit(1); } rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, SCMP_A0(SCMP_CMP_EQ, 0)); if (rc != 0) exit(1); seccomp_syscall_priority(ctx, SCMP_SYS(read), 254); rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, SCMP_A0(SCMP_CMP_LE, 2)); if (rc != 0) exit(1); seccomp_syscall_priority(ctx, SCMP_SYS(write), 255); rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); if (rc != 0) exit(1); rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fstat), 1, SCMP_A0(SCMP_CMP_EQ, 1)); if (rc != 0) exit(1); rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap), 0); if (rc != 0) exit(1); rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk), 0); if (rc != 0) exit(1); rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(munmap), 0); if (rc != 0) exit(1); rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mremap), 0); if (rc != 0) exit(1); rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); if (rc != 0) exit(1); rc = seccomp_rule_add_exact(ctx, SCMP_ACT_ALLOW, SCMP_SYS(ioctl), 2, SCMP_A0(SCMP_CMP_EQ, 1), SCMP_A1(SCMP_CMP_EQ, 0x5401/*TCGETS*/)); if (rc != 0) exit(1); rc = seccomp_load(ctx); if (rc != 0) { fprintf(stderr, "seccomp_load failed with error: %d\n", rc); exit(1); } seccomp_release(ctx); } #endif mmt_decode(&demmt_funcs.base, NULL); fflush(stdout); fini_macrodis(); demmt_cleanup_isas(); rnndec_freecontext(gf100_shaders_ctx); rnn_freedb(rnndb); rnn_freedb(rnndb_g80_texture); rnn_freedb(rnndb_gf100_shaders); rnn_freedb(rnndb_nvrm_object); rnn_fini(); return 0; }
int main(int argc, char **argv) { char *file = "root.xml"; char *name = "NV_MMIO"; char *variant = NULL; int c, mode = 'd', chip = 0; uint64_t reg, colors=1, val = 0; struct rnndeccontext *vc; int ret; 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': chip = strtoull(optarg, NULL, 16); if (!chip) variant = strdup(optarg); else { free(variant); variant = NULL; } break; case 'c': colors = 0; break; default: usage(); } } rnn_parsefile (db, file); rnn_prepdb (db); vc = rnndec_newcontext(db); if(colors) vc->colors = &envy_def_colors; if (variant) rnndec_varadd(vc, "chipset", variant); else if (chip) rnndec_varaddvalue(vc, "chipset", chip); /* 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); ret = 0; } else { fprintf(stderr, "Not an enum: '%s'\n", name); ret = 1; } } else if (mode == 'b') { struct rnnbitset *bs = rnn_findbitset (db, name); if (bs) { printf("TODO\n"); ret = 0; } else { fprintf(stderr, "Not a bitset: '%s'\n", name); ret = 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) { char *res = rnndec_decodeval(vc, info->typeinfo, val, info->width); printf ("%s => %s\n", info->name, res); free(res); rnndec_free_decaddrinfo(info); ret = 0; } else if (info) { printf ("%s\n", info->name); rnndec_free_decaddrinfo(info); ret = 0; } else ret = 1; } else { fprintf(stderr, "Not a domain: '%s'\n", name); ret = 1; } } else { ret = 1; } rnndec_freecontext(vc); rnn_freedb(db); rnn_fini(); return ret; }