Home | History | Annotate | Line # | Download | only in pmap
main.c revision 1.6
      1  1.6      he /*	$NetBSD: main.c,v 1.6 2003/03/29 18:01:21 he Exp $ */
      2  1.1  atatat 
      3  1.1  atatat /*
      4  1.1  atatat  * Copyright (c) 2002, 2003 The NetBSD Foundation, Inc.
      5  1.1  atatat  * All rights reserved.
      6  1.1  atatat  *
      7  1.1  atatat  * This code is derived from software contributed to The NetBSD Foundation
      8  1.1  atatat  * by Andrew Brown.
      9  1.1  atatat  *
     10  1.1  atatat  * Redistribution and use in source and binary forms, with or without
     11  1.1  atatat  * modification, are permitted provided that the following conditions
     12  1.1  atatat  * are met:
     13  1.1  atatat  * 1. Redistributions of source code must retain the above copyright
     14  1.1  atatat  *    notice, this list of conditions and the following disclaimer.
     15  1.1  atatat  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1  atatat  *    notice, this list of conditions and the following disclaimer in the
     17  1.1  atatat  *    documentation and/or other materials provided with the distribution.
     18  1.1  atatat  * 3. All advertising materials mentioning features or use of this software
     19  1.1  atatat  *    must display the following acknowledgement:
     20  1.1  atatat  *      This product includes software developed by the NetBSD
     21  1.1  atatat  *      Foundation, Inc. and its contributors.
     22  1.1  atatat  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23  1.1  atatat  *    contributors may be used to endorse or promote products derived
     24  1.1  atatat  *    from this software without specific prior written permission.
     25  1.1  atatat  *
     26  1.1  atatat  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27  1.1  atatat  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28  1.1  atatat  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29  1.1  atatat  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  1.1  atatat  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  1.1  atatat  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  1.1  atatat  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  1.1  atatat  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  1.1  atatat  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  1.1  atatat  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  1.1  atatat  * POSSIBILITY OF SUCH DAMAGE.
     37  1.1  atatat  */
     38  1.1  atatat 
     39  1.1  atatat #include <sys/cdefs.h>
     40  1.1  atatat #ifndef lint
     41  1.6      he __RCSID("$NetBSD: main.c,v 1.6 2003/03/29 18:01:21 he Exp $");
     42  1.1  atatat #endif
     43  1.1  atatat 
     44  1.1  atatat #include <sys/param.h>
     45  1.1  atatat 
     46  1.1  atatat #ifndef __NetBSD_Version__
     47  1.1  atatat #error go away, you fool
     48  1.1  atatat #elif (__NetBSD_Version__ < 105000000)
     49  1.1  atatat #error only works with uvm
     50  1.1  atatat #endif
     51  1.1  atatat 
     52  1.1  atatat #include <fcntl.h>
     53  1.1  atatat #include <errno.h>
     54  1.1  atatat #include <unistd.h>
     55  1.1  atatat #include <limits.h>
     56  1.1  atatat #include <string.h>
     57  1.1  atatat 
     58  1.1  atatat #include "pmap.h"
     59  1.1  atatat #include "main.h"
     60  1.1  atatat 
     61  1.1  atatat /*
     62  1.1  atatat  * strange gyrations to get the prototype for the lockdebug version of
     63  1.1  atatat  * the process_map function
     64  1.1  atatat  */
     65  1.1  atatat #undef VERSION
     66  1.1  atatat #define VERSION lockdebug
     67  1.1  atatat #include "pmap.h"
     68  1.1  atatat #undef VERSION
     69  1.1  atatat #define VERSION regular
     70  1.1  atatat 
     71  1.1  atatat struct cache_head lcache;
     72  1.1  atatat struct nchashhead *nchashtbl;
     73  1.1  atatat void *uvm_vnodeops, *uvm_deviceops, *aobj_pager, *ubc_pager;
     74  1.1  atatat void *kernel_floor;
     75  1.1  atatat struct vm_map *kmem_map, *mb_map, *phys_map, *exec_map, *pager_map;
     76  1.4  atatat struct vm_map *st_map, *pt_map, *lkm_map;
     77  1.1  atatat u_long nchash_addr, nchashtbl_addr, kernel_map_addr;
     78  1.5  atatat int debug, verbose, recurse, page_size;
     79  1.1  atatat int print_all, print_map, print_maps, print_solaris, print_ddb;
     80  1.1  atatat rlim_t maxssiz;
     81  1.1  atatat 
     82  1.1  atatat struct nlist ksyms[] = {
     83  1.1  atatat 	{ "_maxsmap" },
     84  1.1  atatat #define NL_MAXSSIZ		0
     85  1.1  atatat 	{ "_uvm_vnodeops" },
     86  1.1  atatat #define NL_UVM_VNODEOPS		1
     87  1.1  atatat 	{ "_uvm_deviceops" },
     88  1.1  atatat #define NL_UVM_DEVICEOPS	2
     89  1.1  atatat 	{ "_aobj_pager" },
     90  1.1  atatat #define NL_AOBJ_PAGER		3
     91  1.1  atatat 	{ "_ubc_pager" },
     92  1.1  atatat #define NL_UBC_PAGER		4
     93  1.1  atatat 	{ "_kernel_map" },
     94  1.1  atatat #define NL_KERNEL_MAP		5
     95  1.1  atatat 	{ "_nchashtbl" },
     96  1.1  atatat #define NL_NCHASHTBL		6
     97  1.1  atatat 	{ "_nchash" },
     98  1.1  atatat #define NL_NCHASH		7
     99  1.1  atatat 	{ "_kernel_text" },
    100  1.1  atatat #define NL_KENTER		8
    101  1.1  atatat 	{ NULL }
    102  1.1  atatat };
    103  1.1  atatat 
    104  1.1  atatat struct nlist kmaps[] = {
    105  1.1  atatat 	{ "_kmem_map" },
    106  1.4  atatat #define NL_kmem_map		0
    107  1.1  atatat 	{ "_mb_map" },
    108  1.4  atatat #define NL_mb_map		1
    109  1.1  atatat 	{ "_phys_map" },
    110  1.4  atatat #define NL_phys_map		2
    111  1.1  atatat 	{ "_exec_map" },
    112  1.4  atatat #define NL_exec_map		3
    113  1.1  atatat 	{ "_pager_map" },
    114  1.4  atatat #define NL_pager_map		4
    115  1.4  atatat 	{ "_st_map" },
    116  1.4  atatat #define NL_st_map		5
    117  1.4  atatat 	{ "_pt_map" },
    118  1.4  atatat #define NL_pt_map		6
    119  1.4  atatat 	{ "_lkm_map" },
    120  1.4  atatat #define NL_lkm_map		7
    121  1.1  atatat 	{ NULL }
    122  1.1  atatat };
    123  1.1  atatat 
    124  1.1  atatat void check_fd(int);
    125  1.1  atatat int using_lockdebug(kvm_t *);
    126  1.1  atatat void load_symbols(kvm_t *);
    127  1.1  atatat void cache_enter(int, struct namecache *);
    128  1.1  atatat 
    129  1.1  atatat int
    130  1.1  atatat main(int argc, char *argv[])
    131  1.1  atatat {
    132  1.1  atatat 	kvm_t *kd;
    133  1.1  atatat 	pid_t pid;
    134  1.1  atatat 	int many, ch, rc;
    135  1.1  atatat 	char errbuf[_POSIX2_LINE_MAX + 1];
    136  1.1  atatat 	struct kinfo_proc2 *kproc;
    137  1.1  atatat 	char *kmem, *kernel;
    138  1.2  atatat 	gid_t egid;
    139  1.2  atatat 
    140  1.2  atatat 	egid = getegid();
    141  1.2  atatat 	if (setegid(getgid()) == -1)
    142  1.2  atatat 		err(1, "failed to reset privileges");
    143  1.1  atatat 
    144  1.1  atatat 	check_fd(STDIN_FILENO);
    145  1.1  atatat 	check_fd(STDOUT_FILENO);
    146  1.1  atatat 	check_fd(STDERR_FILENO);
    147  1.1  atatat 
    148  1.1  atatat 	pid = -1;
    149  1.1  atatat 	verbose = debug = 0;
    150  1.1  atatat 	print_all = print_map = print_maps = print_solaris = print_ddb = 0;
    151  1.1  atatat 	recurse = 0;
    152  1.1  atatat 	kmem = kernel = NULL;
    153  1.1  atatat 
    154  1.1  atatat 	while ((ch = getopt(argc, argv, "aD:dlmM:N:p:PRrsvx")) != -1) {
    155  1.1  atatat 		switch (ch) {
    156  1.1  atatat 		case 'a':
    157  1.1  atatat 			print_all = 1;
    158  1.1  atatat 			break;
    159  1.1  atatat 		case 'd':
    160  1.1  atatat 			print_ddb = 1;
    161  1.1  atatat 			break;
    162  1.1  atatat 		case 'D':
    163  1.5  atatat 			debug = strtol(optarg, NULL, 0);
    164  1.1  atatat 			break;
    165  1.1  atatat 		case 'l':
    166  1.1  atatat 			print_maps = 1;
    167  1.1  atatat 			break;
    168  1.1  atatat 		case 'm':
    169  1.1  atatat 			print_map = 1;
    170  1.1  atatat 			break;
    171  1.1  atatat 		case 'M':
    172  1.1  atatat 			kmem = optarg;
    173  1.1  atatat 			break;
    174  1.1  atatat 		case 'N':
    175  1.1  atatat 			kernel = optarg;
    176  1.1  atatat 			break;
    177  1.1  atatat 		case 'p':
    178  1.5  atatat 			pid = strtol(optarg, NULL, 0);
    179  1.1  atatat 			break;
    180  1.1  atatat 		case 'P':
    181  1.1  atatat 			pid = getpid();
    182  1.1  atatat 			break;
    183  1.1  atatat 		case 'R':
    184  1.1  atatat 			recurse = 1;
    185  1.1  atatat 			break;
    186  1.1  atatat 		case 's':
    187  1.1  atatat 			print_solaris = 1;
    188  1.1  atatat 			break;
    189  1.1  atatat 		case 'v':
    190  1.1  atatat 			verbose++;
    191  1.1  atatat 			break;
    192  1.1  atatat 		case 'r':
    193  1.1  atatat 		case 'x':
    194  1.1  atatat 			errx(1, "-%c option not implemented, sorry", optopt);
    195  1.1  atatat 			/*NOTREACHED*/
    196  1.1  atatat 		case '?':
    197  1.1  atatat 		default:
    198  1.1  atatat 			fprintf(stderr, "usage: %s [-adlmPsv] [-D number] "
    199  1.1  atatat 				"[-M core] [-N system] [-p pid] [pid ...]\n",
    200  1.1  atatat 				getprogname());
    201  1.1  atatat 			exit(1);
    202  1.1  atatat 		}
    203  1.1  atatat 	}
    204  1.1  atatat 	argc -= optind;
    205  1.1  atatat 	argv += optind;
    206  1.1  atatat 
    207  1.1  atatat 	/* more than one "process" to dump? */
    208  1.1  atatat 	many = (argc > 1 - (pid == -1 ? 0 : 1)) ? 1 : 0;
    209  1.1  atatat 
    210  1.1  atatat 	/* apply default */
    211  1.1  atatat 	if (print_all + print_map + print_maps + print_solaris +
    212  1.1  atatat 	    print_ddb == 0)
    213  1.1  atatat 		print_solaris = 1;
    214  1.2  atatat 
    215  1.2  atatat 	/* get privs back if it appears to be safe, otherwise toss them */
    216  1.2  atatat 	if (kernel == NULL && kmem == NULL)
    217  1.2  atatat 		rc = setegid(egid);
    218  1.2  atatat 	else
    219  1.2  atatat 		rc = setgid(getgid());
    220  1.2  atatat 	if (rc == -1)
    221  1.2  atatat 		err(1, "failed to reset privileges");
    222  1.1  atatat 
    223  1.1  atatat 	/* start by opening libkvm */
    224  1.1  atatat 	kd = kvm_openfiles(kernel, kmem, NULL, O_RDONLY, errbuf);
    225  1.1  atatat 	errbuf[_POSIX2_LINE_MAX] = '\0';
    226  1.1  atatat 	if (kd == NULL)
    227  1.1  atatat 		errx(1, "%s", errbuf);
    228  1.1  atatat 
    229  1.1  atatat 	/* get "bootstrap" addresses from kernel */
    230  1.1  atatat 	load_symbols(kd);
    231  1.1  atatat 
    232  1.1  atatat 	if (! using_lockdebug(kd))
    233  1.1  atatat 		process_map = PMAPFUNC(process_map,regular);
    234  1.1  atatat 	else
    235  1.1  atatat 		process_map = PMAPFUNC(process_map,lockdebug);
    236  1.1  atatat 
    237  1.1  atatat 	do {
    238  1.1  atatat 		if (pid == -1) {
    239  1.1  atatat 			if (argc == 0)
    240  1.1  atatat 				pid = getppid();
    241  1.1  atatat 			else {
    242  1.5  atatat 				pid = strtol(argv[0], NULL, 0);
    243  1.1  atatat 				argv++;
    244  1.1  atatat 				argc--;
    245  1.1  atatat 			}
    246  1.1  atatat 		}
    247  1.1  atatat 
    248  1.1  atatat 		/* find the process id */
    249  1.1  atatat 		if (pid == 0)
    250  1.1  atatat 			kproc = NULL;
    251  1.1  atatat 		else {
    252  1.1  atatat 			kproc = kvm_getproc2(kd, KERN_PROC_PID, pid,
    253  1.1  atatat 					     sizeof(struct kinfo_proc2), &rc);
    254  1.1  atatat 			if (kproc == NULL || rc == 0) {
    255  1.1  atatat 				errno = ESRCH;
    256  1.1  atatat 				warn("%d", pid);
    257  1.1  atatat 				pid = -1;
    258  1.1  atatat 				continue;
    259  1.1  atatat 			}
    260  1.1  atatat 		}
    261  1.1  atatat 
    262  1.1  atatat 		/* dump it */
    263  1.1  atatat 		if (many) {
    264  1.1  atatat 			if (kproc)
    265  1.1  atatat 				printf("process %d:\n", kproc->p_pid);
    266  1.1  atatat 			else
    267  1.1  atatat 				printf("kernel:\n");
    268  1.1  atatat 		}
    269  1.1  atatat 
    270  1.1  atatat 		(*process_map)(kd, pid, kproc);
    271  1.1  atatat 		pid = -1;
    272  1.1  atatat 	} while (argc > 0);
    273  1.1  atatat 
    274  1.1  atatat 	/* done.  go away. */
    275  1.1  atatat 	rc = kvm_close(kd);
    276  1.1  atatat 	if (rc == -1)
    277  1.1  atatat 		err(1, "kvm_close");
    278  1.1  atatat 
    279  1.1  atatat 	return (0);
    280  1.1  atatat }
    281  1.1  atatat 
    282  1.1  atatat void
    283  1.1  atatat check_fd(int fd)
    284  1.1  atatat {
    285  1.1  atatat 	struct stat st;
    286  1.1  atatat 	int n;
    287  1.1  atatat 
    288  1.1  atatat 	if (fstat(fd, &st) == -1) {
    289  1.1  atatat 		(void)close(fd);
    290  1.1  atatat 		n = open("/dev/null", O_RDWR);
    291  1.1  atatat 		if (n == fd || n == -1)
    292  1.1  atatat 			/* we're either done or we can do no more */
    293  1.1  atatat 			return;
    294  1.1  atatat 		/* if either of these fail, there's not much we can do */
    295  1.1  atatat 		(void)dup2(n, fd);
    296  1.1  atatat 		(void)close(n);
    297  1.1  atatat 		/* XXX should we exit if it fails? */
    298  1.1  atatat 	}
    299  1.1  atatat }
    300  1.1  atatat 
    301  1.1  atatat int
    302  1.1  atatat using_lockdebug(kvm_t *kd)
    303  1.1  atatat {
    304  1.1  atatat 	struct kbit kbit[3];
    305  1.1  atatat 	struct kbit *vm_map, *header, *vm_map_entry;
    306  1.1  atatat 
    307  1.1  atatat 	vm_map = &kbit[0];
    308  1.1  atatat 	header = &kbit[1];
    309  1.1  atatat 	vm_map_entry = &kbit[2];
    310  1.1  atatat 
    311  1.1  atatat 	A(vm_map) = kernel_map_addr;
    312  1.1  atatat 	S(vm_map) = sizeof(struct vm_map);
    313  1.1  atatat 	KDEREF(kd, vm_map);
    314  1.1  atatat 
    315  1.1  atatat 	A(header) = A(vm_map) + offsetof(struct vm_map, header);
    316  1.1  atatat 	S(header) = sizeof(struct vm_map_entry);
    317  1.1  atatat 	memcpy(D(header, vm_map_entry), &D(vm_map, vm_map)->header, S(header));
    318  1.1  atatat 
    319  1.1  atatat 	/*
    320  1.1  atatat 	 * the kernel *always* has map entries, but we might see a
    321  1.1  atatat 	 * zero if we're using a lockdebug kernel and haven't noticed
    322  1.1  atatat 	 * yet.
    323  1.1  atatat 	 */
    324  1.1  atatat 	if (D(vm_map, vm_map)->nentries == 0) {
    325  1.1  atatat 
    326  1.1  atatat 		/* no entries -> all pointers must point to the header */
    327  1.1  atatat 		if (P(header) == D(header, vm_map_entry)->next &&
    328  1.1  atatat 		    P(header) == D(header, vm_map_entry)->prev &&
    329  1.1  atatat 		    P(header) == D(vm_map, vm_map)->hint &&
    330  1.1  atatat 		    P(header) == D(vm_map, vm_map)->first_free)
    331  1.1  atatat 			return (0);
    332  1.1  atatat 	}
    333  1.1  atatat 	else {
    334  1.1  atatat 
    335  1.1  atatat 		P(vm_map_entry) = D(header, vm_map_entry)->next;
    336  1.1  atatat 		S(vm_map_entry) = sizeof(struct vm_map_entry);
    337  1.1  atatat 		KDEREF(kd, vm_map_entry);
    338  1.1  atatat 
    339  1.1  atatat 		/* we have entries, so there must be referential integrity */
    340  1.1  atatat 		if (D(vm_map_entry, vm_map_entry)->prev == P(header) &&
    341  1.1  atatat 		    D(header, vm_map_entry)->start <=
    342  1.1  atatat 		    D(vm_map_entry, vm_map_entry)->start &&
    343  1.1  atatat 		    D(vm_map_entry, vm_map_entry)->end <=
    344  1.1  atatat 		    D(header, vm_map_entry)->end)
    345  1.1  atatat 			return (0);
    346  1.1  atatat 	}
    347  1.1  atatat 
    348  1.1  atatat 	return (1);
    349  1.1  atatat }
    350  1.1  atatat 
    351  1.1  atatat void
    352  1.1  atatat load_symbols(kvm_t *kd)
    353  1.1  atatat {
    354  1.5  atatat 	int rc, i, mib[2];
    355  1.6      he 	size_t sz;
    356  1.1  atatat 
    357  1.1  atatat 	rc = kvm_nlist(kd, &ksyms[0]);
    358  1.1  atatat 	if (rc != 0) {
    359  1.1  atatat 		for (i = 0; ksyms[i].n_name != NULL; i++)
    360  1.1  atatat 			if (ksyms[i].n_value == 0)
    361  1.3  atatat 				warnx("symbol %s: not found", ksyms[i].n_name);
    362  1.1  atatat 		exit(1);
    363  1.1  atatat 	}
    364  1.1  atatat 
    365  1.1  atatat 	uvm_vnodeops =	(void*)ksyms[NL_UVM_VNODEOPS].n_value;
    366  1.1  atatat 	uvm_deviceops =	(void*)ksyms[NL_UVM_DEVICEOPS].n_value;
    367  1.1  atatat 	aobj_pager =	(void*)ksyms[NL_AOBJ_PAGER].n_value;
    368  1.1  atatat 	ubc_pager =	(void*)ksyms[NL_UBC_PAGER].n_value;
    369  1.1  atatat 
    370  1.1  atatat 	kernel_floor =	(void*)ksyms[NL_KENTER].n_value;
    371  1.1  atatat 	nchash_addr =	ksyms[NL_NCHASH].n_value;
    372  1.1  atatat 
    373  1.1  atatat 	_KDEREF(kd, ksyms[NL_MAXSSIZ].n_value, &maxssiz,
    374  1.1  atatat 		sizeof(maxssiz));
    375  1.1  atatat 	_KDEREF(kd, ksyms[NL_NCHASHTBL].n_value, &nchashtbl_addr,
    376  1.1  atatat 	       sizeof(nchashtbl_addr));
    377  1.1  atatat 	_KDEREF(kd, ksyms[NL_KERNEL_MAP].n_value, &kernel_map_addr,
    378  1.1  atatat 		sizeof(kernel_map_addr));
    379  1.1  atatat 
    380  1.1  atatat 	/*
    381  1.1  atatat 	 * Some of these may be missing from some platforms, for
    382  1.1  atatat 	 * example sparc, sh3, and most powerpc platforms don't
    383  1.4  atatat 	 * have a "phys_map", etc.
    384  1.1  atatat 	 */
    385  1.1  atatat 	(void)kvm_nlist(kd, &kmaps[0]);
    386  1.4  atatat 
    387  1.4  atatat #define get_map_address(m) \
    388  1.4  atatat 	if (kmaps[CONCAT(NL_,m)].n_value != 0) \
    389  1.4  atatat 		_KDEREF(kd, kmaps[CONCAT(NL_,m)].n_value, &m, sizeof(m))
    390  1.4  atatat 
    391  1.4  atatat 	get_map_address(kmem_map);
    392  1.4  atatat 	get_map_address(mb_map);
    393  1.4  atatat 	get_map_address(phys_map);
    394  1.4  atatat 	get_map_address(exec_map);
    395  1.4  atatat 	get_map_address(pager_map);
    396  1.4  atatat 	get_map_address(st_map);
    397  1.4  atatat 	get_map_address(pt_map);
    398  1.4  atatat 	get_map_address(lkm_map);
    399  1.5  atatat 
    400  1.5  atatat 	mib[0] = CTL_HW;
    401  1.5  atatat 	mib[1] = HW_PAGESIZE;
    402  1.6      he 	sz = sizeof(page_size);
    403  1.6      he 	if (sysctl(&mib[0], 2, &page_size, &sz, NULL, 0) == -1)
    404  1.5  atatat 		err(1, "sysctl: hw.pagesize");
    405  1.4  atatat }
    406  1.4  atatat 
    407  1.4  atatat const char *
    408  1.4  atatat mapname(void *addr)
    409  1.4  atatat {
    410  1.4  atatat 
    411  1.4  atatat 	if (addr == (void*)kernel_map_addr)
    412  1.4  atatat 		return ("kernel_map");
    413  1.4  atatat 	else if (addr == kmem_map)
    414  1.4  atatat 		return ("kmem_map");
    415  1.4  atatat 	else if (addr == mb_map)
    416  1.4  atatat 		return ("mb_map");
    417  1.4  atatat 	else if (addr == phys_map)
    418  1.4  atatat 		return ("phys_map");
    419  1.4  atatat 	else if (addr == exec_map)
    420  1.4  atatat 		return ("exec_map");
    421  1.4  atatat 	else if (addr == pager_map)
    422  1.4  atatat 		return ("pager_map");
    423  1.4  atatat 	else if (addr == st_map)
    424  1.4  atatat 		return ("st_map");
    425  1.4  atatat 	else if (addr == pt_map)
    426  1.4  atatat 		return ("pt_map");
    427  1.4  atatat 	else if (addr == lkm_map)
    428  1.4  atatat 		return ("lkm_map");
    429  1.4  atatat 	else
    430  1.4  atatat 		return (NULL);
    431  1.1  atatat }
    432  1.1  atatat 
    433  1.1  atatat void
    434  1.1  atatat load_name_cache(kvm_t *kd)
    435  1.1  atatat {
    436  1.1  atatat 	struct namecache _ncp, *ncp, *oncp;
    437  1.1  atatat 	struct nchashhead _ncpp, *ncpp;
    438  1.1  atatat 	u_long nchash;
    439  1.1  atatat 	int i;
    440  1.1  atatat 
    441  1.1  atatat 	LIST_INIT(&lcache);
    442  1.1  atatat 
    443  1.1  atatat 	_KDEREF(kd, nchash_addr, &nchash, sizeof(nchash));
    444  1.1  atatat 	nchashtbl = malloc(sizeof(nchashtbl) * (int)nchash);
    445  1.1  atatat 	_KDEREF(kd, nchashtbl_addr, nchashtbl,
    446  1.1  atatat 		sizeof(nchashtbl) * (int)nchash);
    447  1.1  atatat 
    448  1.1  atatat 	ncpp = &_ncpp;
    449  1.1  atatat 
    450  1.1  atatat 	for (i = 0; i <= nchash; i++) {
    451  1.1  atatat 		ncpp = &nchashtbl[i];
    452  1.1  atatat 		oncp = NULL;
    453  1.1  atatat 		LIST_FOREACH(ncp, ncpp, nc_hash) {
    454  1.1  atatat 			if (ncp == oncp ||
    455  1.1  atatat 			    (void*)ncp < kernel_floor ||
    456  1.1  atatat 			    ncp == (void*)0xdeadbeef)
    457  1.1  atatat 				break;
    458  1.1  atatat 			oncp = ncp;
    459  1.1  atatat 			_KDEREF(kd, (u_long)ncp, &_ncp, sizeof(*ncp));
    460  1.1  atatat 			ncp = &_ncp;
    461  1.1  atatat 			if ((void*)ncp->nc_vp > kernel_floor &&
    462  1.1  atatat 			    ncp->nc_nlen > 0) {
    463  1.1  atatat 				if (ncp->nc_nlen > 2 ||
    464  1.1  atatat 				    ncp->nc_name[0] != '.' ||
    465  1.1  atatat 				    (ncp->nc_name[1] != '.' &&
    466  1.1  atatat 				     ncp->nc_nlen != 1))
    467  1.1  atatat 					cache_enter(i, ncp);
    468  1.1  atatat 			}
    469  1.1  atatat 		}
    470  1.1  atatat 	}
    471  1.1  atatat }
    472  1.1  atatat 
    473  1.1  atatat void
    474  1.1  atatat cache_enter(int i, struct namecache *ncp)
    475  1.1  atatat {
    476  1.1  atatat 	struct cache_entry *ce;
    477  1.1  atatat 
    478  1.1  atatat 	if (debug & DUMP_NAMEI_CACHE)
    479  1.1  atatat 		printf("[%d] ncp->nc_vp %10p, ncp->nc_dvp %10p, "
    480  1.1  atatat 		       "ncp->nc_nlen %3d [%.*s] (nc_dvpid=%lu, nc_vpid=%lu)\n",
    481  1.1  atatat 		       i, ncp->nc_vp, ncp->nc_dvp,
    482  1.1  atatat 		       ncp->nc_nlen, ncp->nc_nlen, ncp->nc_name,
    483  1.1  atatat 		       ncp->nc_dvpid, ncp->nc_vpid);
    484  1.1  atatat 
    485  1.1  atatat 	ce = malloc(sizeof(struct cache_entry));
    486  1.1  atatat 
    487  1.1  atatat 	ce->ce_vp = ncp->nc_vp;
    488  1.1  atatat 	ce->ce_pvp = ncp->nc_dvp;
    489  1.1  atatat 	ce->ce_cid = ncp->nc_vpid;
    490  1.1  atatat 	ce->ce_pcid = ncp->nc_dvpid;
    491  1.1  atatat 	ce->ce_nlen = ncp->nc_nlen;
    492  1.1  atatat 	strncpy(ce->ce_name, ncp->nc_name, sizeof(ce->ce_name));
    493  1.1  atatat 	ce->ce_name[MIN(ce->ce_nlen, sizeof(ce->ce_name) - 1)] = '\0';
    494  1.1  atatat 
    495  1.1  atatat 	LIST_INSERT_HEAD(&lcache, ce, ce_next);
    496  1.1  atatat }
    497