int main(int argc, char **argv) { unsigned long long vaddr; char *endp; addrxlat_ctx *ctx; addrxlat_pgt_t *pgt; int opt; addrxlat_status status; unsigned long refcnt; int rc; pgt = NULL; ctx = NULL; pgt = addrxlat_pgt_new(); if (!pgt) { perror("Cannot initialize page table translation"); rc = TEST_ERR; goto out; } while ((opt = getopt_long(argc, argv, "he:f:l:pr:", opts, NULL)) != -1) { switch (opt) { case 'f': rc = set_paging_form(optarg); if (rc != TEST_OK) return rc; break; case 'r': rc = set_root(optarg, pgt); if (rc != TEST_OK) return rc; break; case 'e': rc = add_entry(optarg); if (rc != TEST_OK) return rc; break; case 'l': rc = set_linear(optarg); if (rc != TEST_OK) return rc; break; case 'p': xlatdef.method = ADDRXLAT_PGT; xlatdef.pgt = pgt; break; case 'h': default: usage(argv[0]); rc = (opt == 'h') ? TEST_OK : TEST_ERR; goto out; } } if (argc - optind != 1 || !*argv[optind]) { fprintf(stderr, "Usage: %s <addr>\n", argv[0]); return TEST_ERR; } vaddr = strtoull(argv[optind], &endp, 0); if (*endp) { fprintf(stderr, "Invalid address: %s\n", argv[optind]); return TEST_ERR; } ctx = addrxlat_new(); if (!ctx) { perror("Cannot initialize address translation context"); rc = TEST_ERR; goto out; } status = addrxlat_pgt_set_form(pgt, &paging_form); if (status != addrxlat_ok) { fprintf(stderr, "Cannot set paging form\n"); rc = TEST_ERR; goto out; } addrxlat_cb_read32(ctx, read32); addrxlat_cb_read64(ctx, read64); rc = do_xlat(ctx, vaddr); out: if (pgt && (refcnt = addrxlat_pgt_decref(pgt)) != 0) fprintf(stderr, "WARNING: Leaked %lu pgt references\n", refcnt); if (ctx && (refcnt = addrxlat_decref(ctx)) != 0) fprintf(stderr, "WARNING: Leaked %lu addrxlat references\n", refcnt); return rc; }
int main(int argc, char **argv) { unsigned long long vaddr; char *endp; addrxlat_ctx_t *ctx; addrxlat_cb_t cb = { .read32 = read32, .read64 = read64, .read_caps = (ADDRXLAT_CAPS(ADDRXLAT_MACHPHYSADDR) | ADDRXLAT_CAPS(ADDRXLAT_KVADDR)) }; addrxlat_meth_t pgt, linear, lookup, memarr, *meth; int opt; unsigned long refcnt; int rc; ctx = NULL; meth = NULL; pgt.kind = ADDRXLAT_PGT; pgt.target_as = ADDRXLAT_MACHPHYSADDR; pgt.param.pgt.root.as = ADDRXLAT_NOADDR; pgt.param.pgt.root.addr = 0; linear.kind = ADDRXLAT_LINEAR; linear.target_as = ADDRXLAT_MACHPHYSADDR; linear.param.linear.off = 0; lookup.kind = ADDRXLAT_LOOKUP; lookup.target_as = ADDRXLAT_MACHPHYSADDR; lookup.param.lookup.endoff = 0; memarr.kind = ADDRXLAT_MEMARR; memarr.target_as = ADDRXLAT_MACHPHYSADDR; memarr.param.memarr.base.as = ADDRXLAT_NOADDR; while ((opt = getopt_long(argc, argv, "he:f:l:m:pr:t:", opts, NULL)) != -1) { switch (opt) { case 'f': meth = &pgt; rc = set_paging_form(&meth->param.pgt.pf, optarg); if (rc != TEST_OK) return rc; break; case 'r': meth = &pgt; rc = set_root(&meth->param.pgt.root, optarg); if (rc != TEST_OK) return rc; break; case 'e': rc = add_entry(optarg); if (rc != TEST_OK) return rc; break; case 'l': meth = &linear; rc = set_linear(&meth->param.linear.off, optarg); if (rc != TEST_OK) return rc; break; case 'm': meth = &memarr; rc = set_memarr(&meth->param.memarr, optarg); if (rc != TEST_OK) return rc; break; case 'p': meth = &pgt; break; case 't': meth = &lookup; rc = set_lookup(&meth->param.lookup.endoff, optarg); if (rc != TEST_OK) return rc; break; case 'h': default: usage(argv[0]); rc = (opt == 'h') ? TEST_OK : TEST_ERR; goto out; } } if (meth == NULL) { fputs("No translation method specified\n", stderr); return TEST_ERR; } if (argc - optind != 1 || !*argv[optind]) { fprintf(stderr, "Usage: %s <addr>\n", argv[0]); return TEST_ERR; } vaddr = strtoull(argv[optind], &endp, 0); if (*endp) { fprintf(stderr, "Invalid address: %s\n", argv[optind]); return TEST_ERR; } lookup.param.lookup.nelem = nentries; lookup.param.lookup.tbl = entries; ctx = addrxlat_ctx_new(); if (!ctx) { perror("Cannot initialize address translation context"); rc = TEST_ERR; goto out; } cb.data = ctx; addrxlat_ctx_set_cb(ctx, &cb); rc = do_xlat(ctx, meth, vaddr); out: if (ctx && (refcnt = addrxlat_ctx_decref(ctx)) != 0) fprintf(stderr, "WARNING: Leaked %lu addrxlat references\n", refcnt); return rc; }