int main(int argc, char **argv) { char** argp; rnn_init(); struct rnndb *db = rnn_newdb(); rnn_parsefile (db, argv[1]); rnn_prepdb (db); struct rnndeccontext *vc = rnndec_newcontext(db); vc->colors = &rnndec_colorsterm; argp = argv + 2; while (*argp && !strcmp (*argp, "-v")) { ++argp; if(!argp[0] || !argp[1]) fprintf(stderr, "error: -v option lacking VARSET and VARIANT arguments following it\n"); else { rnndec_varadd(vc, argp[0], argp[1]); argp += 2; } } int i, j; for(i = 0; i < db->domainsnum; ++i) for (j = 0; j < db->domains[i]->subelemsnum; ++j) expand (db->domains[i]->name, db->domains[i]->subelems[j], 0, db->domains[i]->width, vc); for(i = 0; i < db->enumsnum; ++i) for (j = 0; j < db->enums[i]->valsnum; ++j) if (db->enums[i]->vals[j]->valvalid) printf("e %s %"PRIx64" %s\n", db->enums[i]->name, db->enums[i]->vals[j]->value, db->enums[i]->vals[j]->name); return 0; }
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 = "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; } }
int main(int argc, char **argv) { struct rnndb *db; int i, j; if (argc < 2) { fprintf(stderr, "Usage:\n\theadergen database-file\n"); exit(1); } rnn_init(); db = rnn_newdb(); rnn_parsefile (db, argv[1]); rnn_prepdb (db); for(i = 0; i < db->filesnum; ++i) { char *dstname = malloc(strlen(db->files[i]) + 3); char *pretty; strcpy(dstname, db->files[i]); strcat(dstname, ".h"); struct fout f = { db->files[i], fopen(dstname, "w") }; if (!f.file) { perror(dstname); exit(1); } free(dstname); pretty = strrchr(f.name, '/'); if (pretty) pretty += 1; else pretty = f.name; f.guard = strdup(pretty); for (j = 0; j < strlen(f.guard); j++) if (isalnum(f.guard[j])) f.guard[j] = toupper(f.guard[j]); else f.guard[j] = '_'; ADDARRAY(fouts, f); printhead(f, db); } for (i = 0; i < db->enumsnum; i++) { if (db->enums[i]->isinline) continue; int j; for (j = 0; j < db->enums[i]->valsnum; j++) printvalue (db->enums[i]->vals[j], 0); } for (i = 0; i < db->bitsetsnum; i++) { if (db->bitsets[i]->isinline) continue; int j; for (j = 0; j < db->bitsets[i]->bitfieldsnum; j++) printbitfield (db->bitsets[i]->bitfields[j], 0); } for (i = 0; i < db->domainsnum; i++) { if (db->domains[i]->size) printdef (db->domains[i]->fullname, "SIZE", 0, db->domains[i]->size, db->domains[i]->file); int j; for (j = 0; j < db->domains[i]->subelemsnum; j++) { printdelem(db->domains[i]->subelems[j], 0); } } for(i = 0; i < foutsnum; ++i) { fprintf (fouts[i].file, "\n#endif /* %s */\n", fouts[i].guard); } return db->estatus; }