1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  * Copyright 2018 Joyent, Inc.
29  */
30 
31 #include <mdb/mdb.h>
32 #include <mdb/mdb_conf.h>
33 #include <mdb/mdb_module.h>
34 
35 #include <sys/types.h>
36 #include <limits.h>
37 
38 #include <dirent.h>
39 
40 void
mdb_create_builtin_tgts(void)41 mdb_create_builtin_tgts(void)
42 {
43 	mdb_module_t *mp;
44 
45 	if ((mp = mdb_module_load_builtin("mdb_kvm")) != NULL)
46 		mp->mod_tgt_ctor = mdb_kvm_tgt_create;
47 
48 	if ((mp = mdb_module_load_builtin("mdb_proc")) != NULL)
49 		mp->mod_tgt_ctor = mdb_proc_tgt_create;
50 
51 	if ((mp = mdb_module_load_builtin("mdb_kproc")) != NULL)
52 		mp->mod_tgt_ctor = mdb_kproc_tgt_create;
53 
54 	if ((mp = mdb_module_load_builtin("mdb_raw")) != NULL)
55 		mp->mod_tgt_ctor = mdb_rawfile_tgt_create;
56 
57 #ifdef __amd64
58 	if ((mp = mdb_module_load_builtin("mdb_bhyve")) != NULL)
59 		mp->mod_tgt_ctor = mdb_bhyve_tgt_create;
60 #endif
61 }
62 
63 void
mdb_create_loadable_disasms(void)64 mdb_create_loadable_disasms(void)
65 {
66 	DIR *dir;
67 	struct dirent *dp;
68 	char buf[PATH_MAX], *p, *q;
69 	size_t len;
70 
71 #ifdef _LP64
72 	len = mdb_snprintf(buf, sizeof (buf), "%s/usr/lib/mdb/disasm/%s",
73 	    mdb.m_root, mdb_conf_isa());
74 #else
75 	len = mdb_snprintf(buf, sizeof (buf), "%s/usr/lib/mdb/disasm",
76 	    mdb.m_root);
77 #endif
78 	p = &buf[len];
79 
80 	if ((dir = opendir(buf)) == NULL)
81 		return;
82 
83 	while ((dp = readdir(dir)) != NULL) {
84 		if (dp->d_name[0] == '.')
85 			continue; /* skip "." and ".." */
86 		if ((q = strrchr(dp->d_name, '.')) == NULL ||
87 		    strcmp(q, ".so") != 0)
88 			continue;
89 
90 		(void) mdb_snprintf(p, sizeof (buf) - len, "/%s", dp->d_name);
91 
92 		(void) mdb_module_load(buf, MDB_MOD_SILENT);
93 	}
94 
95 	(void) closedir(dir);
96 }
97