void load_symbols(kvm_t *kd) { int rc, i, mib[2]; size_t sz; rc = kvm_nlist(kd, &ksyms[0]); if (rc != 0) { for (i = 0; ksyms[i].n_name != NULL; i++) if (ksyms[i].n_value == 0) warnx("symbol %s: not found", ksyms[i].n_name); exit(1); } uvm_vnodeops = (void*)ksyms[NL_UVM_VNODEOPS].n_value; uvm_deviceops = (void*)ksyms[NL_UVM_DEVICEOPS].n_value; aobj_pager = (void*)ksyms[NL_AOBJ_PAGER].n_value; ubc_pager = (void*)ksyms[NL_UBC_PAGER].n_value; nchash_addr = ksyms[NL_NCHASH].n_value; _KDEREF(kd, ksyms[NL_MAXSSIZ].n_value, &maxssiz, sizeof(maxssiz)); _KDEREF(kd, ksyms[NL_NCHASHTBL].n_value, &nchashtbl_addr, sizeof(nchashtbl_addr)); _KDEREF(kd, ksyms[NL_KERNEL_MAP].n_value, &kernel_map_addr, sizeof(kernel_map_addr)); /* * Some of these may be missing from some platforms, for * example sparc, sh3, and most powerpc platforms don't * have a "phys_map", etc. */ (void)kvm_nlist(kd, &kmaps[0]); #define get_map_address(m) do {\ if (kmaps[__CONCAT(NL_,m)].n_value != 0) \ _KDEREF(kd, kmaps[__CONCAT(NL_,m)].n_value, &m, sizeof(m)); \ } while (0/*CONSTCOND*/) get_map_address(kmem_map); get_map_address(mb_map); get_map_address(phys_map); get_map_address(exec_map); get_map_address(pager_map); get_map_address(st_map); get_map_address(pt_map); get_map_address(lkm_map); get_map_address(buf_map); mib[0] = CTL_HW; mib[1] = HW_PAGESIZE; sz = sizeof(page_size); if (sysctl(&mib[0], 2, &page_size, &sz, NULL, 0) == -1) err(1, "sysctl: hw.pagesize"); }
void load_symbols(kvm_t *kd) { int rc, i; rc = kvm_nlist(kd, &nl[0]); if (rc == -1) errx(1, "%s == %d", kvm_geterr(kd), rc); for (i = 0; i < sizeof(nl)/sizeof(nl[0]); i++) if (nl[i].n_value == 0 && nl[i].n_name) printf("%s not found\n", nl[i].n_name); uvm_vnodeops = (void*)nl[NL_UVM_VNODEOPS].n_value; uvm_deviceops = (void*)nl[NL_UVM_DEVICEOPS].n_value; aobj_pager = (void*)nl[NL_AOBJ_PAGER].n_value; _KDEREF(kd, nl[NL_MAXSSIZ].n_value, &maxssiz, sizeof(maxssiz)); _KDEREF(kd, nl[NL_KERNEL_MAP].n_value, &kernel_map_addr, sizeof(kernel_map_addr)); }
void load_name_cache(kvm_t *kd) { struct namecache _ncp, *ncp, *oncp; struct nchashhead _ncpp, *ncpp; u_long lnchash; size_t nchash, i; LIST_INIT(&lcache); _KDEREF(kd, nchash_addr, &lnchash, sizeof(lnchash)); nchash = (size_t)lnchash + 1; nchashtbl = ecalloc(nchash, sizeof(*nchashtbl)); _KDEREF(kd, nchashtbl_addr, nchashtbl, sizeof(*nchashtbl) * nchash); ncpp = &_ncpp; for (i = 0; i < nchash; i++) { ncpp = &nchashtbl[i]; oncp = NULL; LIST_FOREACH(ncp, ncpp, nc_hash) { if (ncp == oncp || ncp == (void*)0xdeadbeef) break; oncp = ncp; _KDEREF(kd, (u_long)ncp, &_ncp, sizeof(*ncp)); ncp = &_ncp; if (ncp->nc_nlen > 0) { if (ncp->nc_nlen > 2 || ncp->nc_name[0] != '.' || (ncp->nc_name[1] != '.' && ncp->nc_nlen != 1)) cache_enter(i, ncp); } } } }