Home | History | Annotate | Download | only in mdb
      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 (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 /*
     27  * Libkvm Kernel Target
     28  *
     29  * The libkvm kernel target provides access to both crash dumps and live
     30  * kernels through /dev/ksyms and /dev/kmem, using the facilities provided by
     31  * the libkvm.so library.  The target-specific data structures are shared
     32  * between this file (common code) and the ISA-dependent parts of the target,
     33  * and so they are defined in the mdb_kvm.h header.  The target processes an
     34  * "executable" (/dev/ksyms or the unix.X file) which contains a primary
     35  * .symtab and .dynsym, and then also iterates over the krtld module chain in
     36  * the kernel in order to obtain a list of loaded modules and per-module symbol
     37  * tables.  To improve startup performance, the per-module symbol tables are
     38  * instantiated on-the-fly whenever an address lookup falls within the text
     39  * section of a given module.  The target also relies on services from the
     40  * mdb_ks (kernel support) module, which contains pieces of the implementation
     41  * that must be compiled against the kernel implementation.
     42  */
     43 
     44 #include <sys/modctl.h>
     45 #include <sys/kobj.h>
     46 #include <sys/kobj_impl.h>
     47 #include <sys/utsname.h>
     48 #include <sys/panic.h>
     49 #include <sys/dumphdr.h>
     50 #include <sys/dumpadm.h>
     51 
     52 #include <dlfcn.h>
     53 #include <libctf.h>
     54 #include <string.h>
     55 #include <fcntl.h>
     56 #include <errno.h>
     57 
     58 #include <mdb/mdb_target_impl.h>
     59 #include <mdb/mdb_err.h>
     60 #include <mdb/mdb_debug.h>
     61 #include <mdb/mdb_string.h>
     62 #include <mdb/mdb_modapi.h>
     63 #include <mdb/mdb_io_impl.h>
     64 #include <mdb/mdb_ctf.h>
     65 #include <mdb/mdb_kvm.h>
     66 #include <mdb/mdb_module.h>
     67 #include <mdb/mdb_kb.h>
     68 #include <mdb/mdb.h>
     69 
     70 #define	KT_RELOC_BUF(buf, obase, nbase) \
     71 	((uintptr_t)(buf) - (uintptr_t)(obase) + (uintptr_t)(nbase))
     72 
     73 #define	KT_BAD_BUF(buf, base, size) \
     74 	((uintptr_t)(buf) < (uintptr_t)(base) || \
     75 	((uintptr_t)(buf) >= (uintptr_t)(base) + (uintptr_t)(size)))
     76 
     77 typedef struct kt_symarg {
     78 	mdb_tgt_sym_f *sym_cb;		/* Caller's callback function */
     79 	void *sym_data;			/* Callback function argument */
     80 	uint_t sym_type;		/* Symbol type/binding filter */
     81 	mdb_syminfo_t sym_info;		/* Symbol id and table id */
     82 	const char *sym_obj;		/* Containing object */
     83 } kt_symarg_t;
     84 
     85 typedef struct kt_maparg {
     86 	mdb_tgt_t *map_target;		/* Target used for mapping iter */
     87 	mdb_tgt_map_f *map_cb;		/* Caller's callback function */
     88 	void *map_data;			/* Callback function argument */
     89 } kt_maparg_t;
     90 
     91 static const char KT_MODULE[] = "mdb_ks";
     92 static const char KT_CTFPARENT[] = "genunix";
     93 
     94 static void
     95 kt_load_module(kt_data_t *kt, mdb_tgt_t *t, kt_module_t *km)
     96 {
     97 	km->km_data = mdb_alloc(km->km_datasz, UM_SLEEP);
     98 
     99 	(void) mdb_tgt_vread(t, km->km_data, km->km_datasz, km->km_symspace_va);
    100 
    101 	km->km_symbuf = (void *)
    102 	    KT_RELOC_BUF(km->km_symtab_va, km->km_symspace_va, km->km_data);
    103 
    104 	km->km_strtab = (char *)
    105 	    KT_RELOC_BUF(km->km_strtab_va, km->km_symspace_va, km->km_data);
    106 
    107 	km->km_symtab = mdb_gelf_symtab_create_raw(&kt->k_file->gf_ehdr,
    108 	    &km->km_symtab_hdr, km->km_symbuf,
    109 	    &km->km_strtab_hdr, km->km_strtab, MDB_TGT_SYMTAB);
    110 }
    111 
    112 static void
    113 kt_load_modules(kt_data_t *kt, mdb_tgt_t *t)
    114 {
    115 	char name[MAXNAMELEN];
    116 	uintptr_t addr, head;
    117 
    118 	struct module kmod;
    119 	struct modctl ctl;
    120 	Shdr symhdr, strhdr;
    121 	GElf_Sym sym;
    122 
    123 	kt_module_t *km;
    124 
    125 	if (mdb_tgt_lookup_by_name(t, MDB_TGT_OBJ_EXEC,
    126 	    "modules", &sym, NULL) == -1) {
    127 		warn("failed to get 'modules' symbol");
    128 		return;
    129 	}
    130 
    131 	if (mdb_tgt_readsym(t, MDB_TGT_AS_VIRT, &ctl, sizeof (ctl),
    132 	    MDB_TGT_OBJ_EXEC, "modules") != sizeof (ctl)) {
    133 		warn("failed to read 'modules' struct");
    134 		return;
    135 	}
    136 
    137 	addr = head = (uintptr_t)sym.st_value;
    138 
    139 	do {
    140 		if (addr == NULL)
    141 			break; /* Avoid spurious NULL pointers in list */
    142 
    143 		if (mdb_tgt_vread(t, &ctl, sizeof (ctl), addr) == -1) {
    144 			warn("failed to read modctl at %p", (void *)addr);
    145 			return;
    146 		}
    147 
    148 		if (ctl.mod_mp == NULL)
    149 			continue; /* No associated krtld structure */
    150 
    151 		if (mdb_tgt_readstr(t, MDB_TGT_AS_VIRT, name, MAXNAMELEN,
    152 		    (uintptr_t)ctl.mod_modname) <= 0) {
    153 			warn("failed to read module name at %p",
    154 			    (void *)ctl.mod_modname);
    155 			continue;
    156 		}
    157 
    158 		mdb_dprintf(MDB_DBG_KMOD, "reading mod %s (%p)\n",
    159 		    name, (void *)addr);
    160 
    161 		if (mdb_nv_lookup(&kt->k_modules, name) != NULL) {
    162 			warn("skipping duplicate module '%s', id=%d\n",
    163 			    name, ctl.mod_id);
    164 			continue;
    165 		}
    166 
    167 		if (mdb_tgt_vread(t, &kmod, sizeof (kmod),
    168 		    (uintptr_t)ctl.mod_mp) == -1) {
    169 			warn("failed to read module at %p\n",
    170 			    (void *)ctl.mod_mp);
    171 			continue;
    172 		}
    173 
    174 		if (kmod.symspace == NULL || kmod.symhdr == NULL ||
    175 		    kmod.strhdr == NULL) {
    176 			/*
    177 			 * If no buffer for the symbols has been allocated,
    178 			 * or the shdrs for .symtab and .strtab are missing,
    179 			 * then we're out of luck.
    180 			 */
    181 			continue;
    182 		}
    183 
    184 		if (mdb_tgt_vread(t, &symhdr, sizeof (Shdr),
    185 		    (uintptr_t)kmod.symhdr) == -1) {
    186 			warn("failed to read .symtab header for '%s', id=%d",
    187 			    name, ctl.mod_id);
    188 			continue;
    189 		}
    190 
    191 		if (mdb_tgt_vread(t, &strhdr, sizeof (Shdr),
    192 		    (uintptr_t)kmod.strhdr) == -1) {
    193 			warn("failed to read .strtab header for '%s', id=%d",
    194 			    name, ctl.mod_id);
    195 			continue;
    196 		}
    197 
    198 		/*
    199 		 * Now get clever: f(*^ing krtld didn't used to bother updating
    200 		 * its own kmod.symsize value.  We know that prior to this bug
    201 		 * being fixed, symspace was a contiguous buffer containing
    202 		 * .symtab, .strtab, and the symbol hash table in that order.
    203 		 * So if symsize is zero, recompute it as the size of .symtab
    204 		 * plus the size of .strtab.  We don't need to load the hash
    205 		 * table anyway since we re-hash all the symbols internally.
    206 		 */
    207 		if (kmod.symsize == 0)
    208 			kmod.symsize = symhdr.sh_size + strhdr.sh_size;
    209 
    210 		/*
    211 		 * Similar logic can be used to make educated guesses
    212 		 * at the values of kmod.symtbl and kmod.strings.
    213 		 */
    214 		if (kmod.symtbl == NULL)
    215 			kmod.symtbl = kmod.symspace;
    216 		if (kmod.strings == NULL)
    217 			kmod.strings = kmod.symspace + symhdr.sh_size;
    218 
    219 		/*
    220 		 * Make sure things seem reasonable before we proceed
    221 		 * to actually read and decipher the symspace.
    222 		 */
    223 		if (KT_BAD_BUF(kmod.symtbl, kmod.symspace, kmod.symsize) ||
    224 		    KT_BAD_BUF(kmod.strings, kmod.symspace, kmod.symsize)) {
    225 			warn("skipping module '%s', id=%d (corrupt symspace)\n",
    226 			    name, ctl.mod_id);
    227 			continue;
    228 		}
    229 
    230 		km = mdb_zalloc(sizeof (kt_module_t), UM_SLEEP);
    231 		km->km_name = strdup(name);
    232 
    233 		(void) mdb_nv_insert(&kt->k_modules, km->km_name, NULL,
    234 		    (uintptr_t)km, MDB_NV_EXTNAME);
    235 
    236 		km->km_datasz = kmod.symsize;
    237 		km->km_symspace_va = (uintptr_t)kmod.symspace;
    238 		km->km_symtab_va = (uintptr_t)kmod.symtbl;
    239 		km->km_strtab_va = (uintptr_t)kmod.strings;
    240 		km->km_symtab_hdr = symhdr;
    241 		km->km_strtab_hdr = strhdr;
    242 		km->km_text_va = (uintptr_t)kmod.text;
    243 		km->km_text_size = kmod.text_size;
    244 		km->km_data_va = (uintptr_t)kmod.data;
    245 		km->km_data_size = kmod.data_size;
    246 		km->km_bss_va = (uintptr_t)kmod.bss;
    247 		km->km_bss_size = kmod.bss_size;
    248 
    249 		if (kt->k_ctfvalid) {
    250 			km->km_ctf_va = (uintptr_t)kmod.ctfdata;
    251 			km->km_ctf_size = kmod.ctfsize;
    252 		}
    253 
    254 		/*
    255 		 * Add the module to the end of the list of modules in load-
    256 		 * dependency order.  This is needed to load the corresponding
    257 		 * debugger modules in the same order for layering purposes.
    258 		 */
    259 		mdb_list_append(&kt->k_modlist, km);
    260 
    261 		if (t->t_flags & MDB_TGT_F_PRELOAD) {
    262 			mdb_iob_printf(mdb.m_out, " %s", name);
    263 			mdb_iob_flush(mdb.m_out);
    264 			kt_load_module(kt, t, km);
    265 		}
    266 
    267 	} while ((addr = (uintptr_t)ctl.mod_next) != head);
    268 }
    269 
    270 int
    271 kt_setflags(mdb_tgt_t *t, int flags)
    272 {
    273 	int iochg = ((flags ^ t->t_flags) & MDB_TGT_F_ALLOWIO) &&
    274 	    !mdb_prop_postmortem;
    275 	int rwchg = (flags ^ t->t_flags) & MDB_TGT_F_RDWR;
    276 	kt_data_t *kt = t->t_data;
    277 	const char *kvmfile;
    278 	void *cookie;
    279 	int mode;
    280 
    281 	if (!iochg && !rwchg)
    282 		return (0);
    283 
    284 	if (kt->k_xpv_domu) {
    285 		warn("read-only target");
    286 		return (-1);
    287 	}
    288 
    289 	if (iochg) {
    290 		kvmfile = (flags & MDB_TGT_F_ALLOWIO) ? "/dev/allkmem" :
    291 		    "/dev/kmem";
    292 	} else {
    293 		kvmfile = kt->k_kvmfile;
    294 	}
    295 
    296 	mode = (flags & MDB_TGT_F_RDWR) ? O_RDWR : O_RDONLY;
    297 
    298 	if ((cookie = kt->k_kb_ops->kb_open(kt->k_symfile, kvmfile, NULL, mode,
    299 	    mdb.m_pname)) == NULL) {
    300 		/* We failed to re-open, so don't change t_flags */
    301 		warn("failed to re-open target");
    302 		return (-1);
    303 	}
    304 
    305 	/*
    306 	 * We successfully reopened the target, so update k_kvmfile.  Also set
    307 	 * the RDWR and ALLOWIO bits in t_flags to match those in flags.
    308 	 */
    309 	(void) kt->k_kb_ops->kb_close(kt->k_cookie);
    310 	kt->k_cookie = cookie;
    311 
    312 	if (kvmfile != kt->k_kvmfile) {
    313 		strfree(kt->k_kvmfile);
    314 		kt->k_kvmfile = strdup(kvmfile);
    315 	}
    316 
    317 	t->t_flags = (t->t_flags & ~(MDB_TGT_F_RDWR | MDB_TGT_F_ALLOWIO)) |
    318 	    (flags & (MDB_TGT_F_RDWR | MDB_TGT_F_ALLOWIO));
    319 
    320 	return (0);
    321 }
    322 
    323 /*
    324  * Determine which PIDs (if any) have their pages saved in the dump.  We
    325  * do this by looking for content flags in dump_flags in the header.  These
    326  * flags, which won't be set in older dumps, tell us whether a single process
    327  * has had its pages included in the dump.  If a single process has been
    328  * included, we need to get the PID for that process from the dump_pids
    329  * array in the dump.
    330  */
    331 static int
    332 kt_find_dump_contents(kt_data_t *kt)
    333 {
    334 	dumphdr_t *dh = kt->k_dumphdr;
    335 	pid_t pid = -1;
    336 
    337 	if (dh->dump_flags & DF_ALL)
    338 		return (KT_DUMPCONTENT_ALL);
    339 
    340 	if (dh->dump_flags & DF_CURPROC) {
    341 		if ((pid = kt->k_dump_find_curproc()) == -1)
    342 			return (KT_DUMPCONTENT_INVALID);
    343 		else
    344 			return (pid);
    345 	} else {
    346 		return (KT_DUMPCONTENT_KERNEL);
    347 	}
    348 }
    349 
    350 static int
    351 kt_dump_contains_proc(mdb_tgt_t *t, void *context)
    352 {
    353 	kt_data_t *kt = t->t_data;
    354 	pid_t (*f_pid)(uintptr_t);
    355 	pid_t reqpid;
    356 
    357 	switch (kt->k_dumpcontent) {
    358 	case KT_DUMPCONTENT_KERNEL:
    359 		return (0);
    360 	case KT_DUMPCONTENT_ALL:
    361 		return (1);
    362 	case KT_DUMPCONTENT_INVALID:
    363 		goto procnotfound;
    364 	default:
    365 		f_pid = (pid_t (*)()) dlsym(RTLD_NEXT, "mdb_kproc_pid");
    366 		if (f_pid == NULL)
    367 			goto procnotfound;
    368 
    369 		reqpid = f_pid((uintptr_t)context);
    370 		if (reqpid == -1)
    371 			goto procnotfound;
    372 
    373 		return (kt->k_dumpcontent == reqpid);
    374 	}
    375 
    376 procnotfound:
    377 	warn("unable to determine whether dump contains proc %p\n", context);
    378 	return (1);
    379 }
    380 
    381 int
    382 kt_setcontext(mdb_tgt_t *t, void *context)
    383 {
    384 	if (context != NULL) {
    385 		const char *argv[2];
    386 		int argc = 0;
    387 		mdb_tgt_t *ct;
    388 		kt_data_t *kt = t->t_data;
    389 
    390 		argv[argc++] = (const char *)context;
    391 		argv[argc] = NULL;
    392 
    393 		if (kt->k_dumphdr != NULL &&
    394 		    !kt_dump_contains_proc(t, context)) {
    395 			warn("dump does not contain pages for proc %p\n",
    396 			    context);
    397 			return (-1);
    398 		}
    399 
    400 		if ((ct = mdb_tgt_create(mdb_kproc_tgt_create,
    401 		    t->t_flags, argc, argv)) == NULL)
    402 			return (-1);
    403 
    404 		mdb_printf("debugger context set to proc %p\n", context);
    405 		mdb_tgt_activate(ct);
    406 	} else
    407 		mdb_printf("debugger context set to kernel\n");
    408 
    409 	return (0);
    410 }
    411 
    412 static int
    413 kt_stack(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
    414 {
    415 	kt_data_t *kt = mdb.m_target->t_data;
    416 	return (kt->k_dcmd_stack(addr, flags, argc, argv));
    417 }
    418 
    419 static int
    420 kt_stackv(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
    421 {
    422 	kt_data_t *kt = mdb.m_target->t_data;
    423 	return (kt->k_dcmd_stackv(addr, flags, argc, argv));
    424 }
    425 
    426 static int
    427 kt_stackr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
    428 {
    429 	kt_data_t *kt = mdb.m_target->t_data;
    430 	return (kt->k_dcmd_stackr(addr, flags, argc, argv));
    431 }
    432 
    433 static int
    434 kt_regs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
    435 {
    436 	kt_data_t *kt = mdb.m_target->t_data;
    437 
    438 	if (argc != 0 || (flags & DCMD_ADDRSPEC))
    439 		return (DCMD_USAGE);
    440 
    441 	addr = (uintptr_t)kt->k_regs;
    442 
    443 	return (kt->k_dcmd_regs(addr, flags, argc, argv));
    444 }
    445 
    446 #ifdef __x86
    447 static int
    448 kt_cpustack(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
    449 {
    450 	kt_data_t *kt = mdb.m_target->t_data;
    451 	return (kt->k_dcmd_cpustack(addr, flags, argc, argv));
    452 }
    453 
    454 static int
    455 kt_cpuregs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
    456 {
    457 	kt_data_t *kt = mdb.m_target->t_data;
    458 	return (kt->k_dcmd_cpuregs(addr, flags, argc, argv));
    459 }
    460 #endif /* __x86 */
    461 
    462 /*ARGSUSED*/
    463 static int
    464 kt_status_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
    465 {
    466 	kt_data_t *kt = mdb.m_target->t_data;
    467 	struct utsname uts;
    468 
    469 	bzero(&uts, sizeof (uts));
    470 	(void) strcpy(uts.nodename, "unknown machine");
    471 	(void) kt_uname(mdb.m_target, &uts);
    472 
    473 	if (mdb_prop_postmortem) {
    474 		mdb_printf("debugging %scrash dump %s (%d-bit) from %s\n",
    475 		    kt->k_xpv_domu ? "domain " : "", kt->k_kvmfile,
    476 		    (int)(sizeof (void *) * NBBY), uts.nodename);
    477 	} else {
    478 		mdb_printf("debugging live kernel (%d-bit) on %s\n",
    479 		    (int)(sizeof (void *) * NBBY), uts.nodename);
    480 	}
    481 
    482 	mdb_printf("operating system: %s %s (%s)\n",
    483 	    uts.release, uts.version, uts.machine);
    484 
    485 	if (kt->k_dumphdr) {
    486 		dumphdr_t *dh = kt->k_dumphdr;
    487 
    488 		mdb_printf("panic message: %s\n", dh->dump_panicstring);
    489 
    490 		kt->k_dump_print_content(dh, kt->k_dumpcontent);
    491 	}
    492 
    493 	return (DCMD_OK);
    494 }
    495 
    496 static const mdb_dcmd_t kt_dcmds[] = {
    497 	{ "$c", "?[cnt]", "print stack backtrace", kt_stack },
    498 	{ "$C", "?[cnt]", "print stack backtrace", kt_stackv },
    499 	{ "$r", NULL, "print general-purpose registers", kt_regs },
    500 	{ "$?", NULL, "print status and registers", kt_regs },
    501 	{ "regs", NULL, "print general-purpose registers", kt_regs },
    502 	{ "stack", "?[cnt]", "print stack backtrace", kt_stack },
    503 	{ "stackregs", "?", "print stack backtrace and registers", kt_stackr },
    504 #ifdef __x86
    505 	{ "cpustack", "?[-v] [-c cpuid] [cnt]", "print stack backtrace for a "
    506 	    "specific CPU", kt_cpustack },
    507 	{ "cpuregs", "?[-c cpuid]", "print general-purpose registers for a "
    508 	    "specific CPU", kt_cpuregs },
    509 #endif
    510 	{ "status", NULL, "print summary of current target", kt_status_dcmd },
    511 	{ NULL }
    512 };
    513 
    514 static uintmax_t
    515 reg_disc_get(const mdb_var_t *v)
    516 {
    517 	mdb_tgt_t *t = MDB_NV_COOKIE(v);
    518 	kt_data_t *kt = t->t_data;
    519 	mdb_tgt_reg_t r = 0;
    520 
    521 	(void) mdb_tgt_getareg(t, kt->k_tid, mdb_nv_get_name(v), &r);
    522 	return (r);
    523 }
    524 
    525 static kt_module_t *
    526 kt_module_by_name(kt_data_t *kt, const char *name)
    527 {
    528 	kt_module_t *km;
    529 
    530 	for (km = mdb_list_next(&kt->k_modlist); km; km = mdb_list_next(km)) {
    531 		if (strcmp(name, km->km_name) == 0)
    532 			return (km);
    533 	}
    534 
    535 	return (NULL);
    536 }
    537 
    538 void
    539 kt_activate(mdb_tgt_t *t)
    540 {
    541 	static const mdb_nv_disc_t reg_disc = { NULL, reg_disc_get };
    542 	kt_data_t *kt = t->t_data;
    543 	void *sym;
    544 
    545 	int oflag;
    546 
    547 	mdb_prop_postmortem = kt->k_xpv_domu || (kt->k_dumphdr != NULL);
    548 	mdb_prop_kernel = TRUE;
    549 	mdb_prop_datamodel = MDB_TGT_MODEL_NATIVE;
    550 
    551 	if (kt->k_activated == FALSE) {
    552 		struct utsname u1, u2;
    553 		/*
    554 		 * If we're examining a crash dump, root is /, and uname(2)
    555 		 * does not match the utsname in the dump, issue a warning.
    556 		 * Note that we are assuming that the modules and macros in
    557 		 * /usr/lib are compiled against the kernel from uname -rv.
    558 		 */
    559 		if (mdb_prop_postmortem && strcmp(mdb.m_root, "/") == 0 &&
    560 		    uname(&u1) >= 0 && kt_uname(t, &u2) >= 0 &&
    561 		    (strcmp(u1.release, u2.release) ||
    562 		    strcmp(u1.version, u2.version))) {
    563 			mdb_warn("warning: dump is from %s %s %s; dcmds and "
    564 			    "macros may not match kernel implementation\n",
    565 			    u2.sysname, u2.release, u2.version);
    566 		}
    567 
    568 		if (mdb_module_load(KT_MODULE, MDB_MOD_GLOBAL) < 0) {
    569 			warn("failed to load kernel support module -- "
    570 			    "some modules may not load\n");
    571 		}
    572 
    573 		if (mdb_prop_postmortem && kt->k_dumphdr != NULL) {
    574 			sym = dlsym(RTLD_NEXT, "mdb_dump_print_content");
    575 			if (sym != NULL)
    576 				kt->k_dump_print_content = (void (*)())sym;
    577 
    578 			sym = dlsym(RTLD_NEXT, "mdb_dump_find_curproc");
    579 			if (sym != NULL)
    580 				kt->k_dump_find_curproc = (int (*)())sym;
    581 
    582 			kt->k_dumpcontent = kt_find_dump_contents(kt);
    583 		}
    584 
    585 		if (t->t_flags & MDB_TGT_F_PRELOAD) {
    586 			oflag = mdb_iob_getflags(mdb.m_out) & MDB_IOB_PGENABLE;
    587 
    588 			mdb_iob_clrflags(mdb.m_out, oflag);
    589 			mdb_iob_puts(mdb.m_out, "Preloading module symbols: [");
    590 			mdb_iob_flush(mdb.m_out);
    591 		}
    592 
    593 		if (!(t->t_flags & MDB_TGT_F_NOLOAD)) {
    594 			kt_load_modules(kt, t);
    595 
    596 			/*
    597 			 * Determine where the CTF data for krtld is. If krtld
    598 			 * is rolled into unix, force load the MDB krtld
    599 			 * module.
    600 			 */
    601 			kt->k_rtld_name = "krtld";
    602 
    603 			if (kt_module_by_name(kt, "krtld") == NULL) {
    604 				(void) mdb_module_load("krtld", MDB_MOD_SILENT);
    605 				kt->k_rtld_name = "unix";
    606 			}
    607 		}
    608 
    609 
    610 		if (t->t_flags & MDB_TGT_F_PRELOAD) {
    611 			mdb_iob_puts(mdb.m_out, " ]\n");
    612 			mdb_iob_setflags(mdb.m_out, oflag);
    613 		}
    614 
    615 		kt->k_activated = TRUE;
    616 	}
    617 
    618 	(void) mdb_tgt_register_dcmds(t, &kt_dcmds[0], MDB_MOD_FORCE);
    619 
    620 	/* Export some of our registers as named variables */
    621 	mdb_tgt_register_regvars(t, kt->k_rds, &reg_disc, MDB_NV_RDONLY);
    622 
    623 	mdb_tgt_elf_export(kt->k_file);
    624 }
    625 
    626 void
    627 kt_deactivate(mdb_tgt_t *t)
    628 {
    629 	kt_data_t *kt = t->t_data;
    630 
    631 	const mdb_tgt_regdesc_t *rdp;
    632 	const mdb_dcmd_t *dcp;
    633 
    634 	for (rdp = kt->k_rds; rdp->rd_name != NULL; rdp++) {
    635 		mdb_var_t *v;
    636 
    637 		if (!(rdp->rd_flags & MDB_TGT_R_EXPORT))
    638 			continue; /* Didn't export register as a variable */
    639 
    640 		if ((v = mdb_nv_lookup(&mdb.m_nv, rdp->rd_name)) != NULL) {
    641 			v->v_flags &= ~MDB_NV_PERSIST;
    642 			mdb_nv_remove(&mdb.m_nv, v);
    643 		}
    644 	}
    645 
    646 	for (dcp = &kt_dcmds[0]; dcp->dc_name != NULL; dcp++) {
    647 		if (mdb_module_remove_dcmd(t->t_module, dcp->dc_name) == -1)
    648 			warn("failed to remove dcmd %s", dcp->dc_name);
    649 	}
    650 
    651 	mdb_prop_postmortem = FALSE;
    652 	mdb_prop_kernel = FALSE;
    653 	mdb_prop_datamodel = MDB_TGT_MODEL_UNKNOWN;
    654 }
    655 
    656 /*ARGSUSED*/
    657 const char *
    658 kt_name(mdb_tgt_t *t)
    659 {
    660 	return ("kvm");
    661 }
    662 
    663 const char *
    664 kt_platform(mdb_tgt_t *t)
    665 {
    666 	kt_data_t *kt = t->t_data;
    667 	return (kt->k_platform);
    668 }
    669 
    670 int
    671 kt_uname(mdb_tgt_t *t, struct utsname *utsp)
    672 {
    673 	return (mdb_tgt_readsym(t, MDB_TGT_AS_VIRT, utsp,
    674 	    sizeof (struct utsname), MDB_TGT_OBJ_EXEC, "utsname"));
    675 }
    676 
    677 /*ARGSUSED*/
    678 int
    679 kt_dmodel(mdb_tgt_t *t)
    680 {
    681 	return (MDB_TGT_MODEL_NATIVE);
    682 }
    683 
    684 ssize_t
    685 kt_aread(mdb_tgt_t *t, mdb_tgt_as_t as, void *buf,
    686     size_t nbytes, mdb_tgt_addr_t addr)
    687 {
    688 	kt_data_t *kt = t->t_data;
    689 	ssize_t rval;
    690 
    691 	if ((rval = kt->k_kb_ops->kb_aread(kt->k_cookie, addr, buf,
    692 	    nbytes, as)) == -1)
    693 		return (set_errno(EMDB_NOMAP));
    694 
    695 	return (rval);
    696 }
    697 
    698 ssize_t
    699 kt_awrite(mdb_tgt_t *t, mdb_tgt_as_t as, const void *buf,
    700     size_t nbytes, mdb_tgt_addr_t addr)
    701 {
    702 	kt_data_t *kt = t->t_data;
    703 	ssize_t rval;
    704 
    705 	if ((rval = kt->k_kb_ops->kb_awrite(kt->k_cookie, addr, buf,
    706 	    nbytes, as)) == -1)
    707 		return (set_errno(EMDB_NOMAP));
    708 
    709 	return (rval);
    710 }
    711 
    712 ssize_t
    713 kt_vread(mdb_tgt_t *t, void *buf, size_t nbytes, uintptr_t addr)
    714 {
    715 	kt_data_t *kt = t->t_data;
    716 	ssize_t rval;
    717 
    718 	if ((rval = kt->k_kb_ops->kb_kread(kt->k_cookie, addr, buf,
    719 	    nbytes)) == -1)
    720 		return (set_errno(EMDB_NOMAP));
    721 
    722 	return (rval);
    723 }
    724 
    725 ssize_t
    726 kt_vwrite(mdb_tgt_t *t, const void *buf, size_t nbytes, uintptr_t addr)
    727 {
    728 	kt_data_t *kt = t->t_data;
    729 	ssize_t rval;
    730 
    731 	if ((rval = kt->k_kb_ops->kb_kwrite(kt->k_cookie, addr, buf,
    732 	    nbytes)) == -1)
    733 		return (set_errno(EMDB_NOMAP));
    734 
    735 	return (rval);
    736 }
    737 
    738 ssize_t
    739 kt_fread(mdb_tgt_t *t, void *buf, size_t nbytes, uintptr_t addr)
    740 {
    741 	return (kt_vread(t, buf, nbytes, addr));
    742 }
    743 
    744 ssize_t
    745 kt_fwrite(mdb_tgt_t *t, const void *buf, size_t nbytes, uintptr_t addr)
    746 {
    747 	return (kt_vwrite(t, buf, nbytes, addr));
    748 }
    749 
    750 ssize_t
    751 kt_pread(mdb_tgt_t *t, void *buf, size_t nbytes, physaddr_t addr)
    752 {
    753 	kt_data_t *kt = t->t_data;
    754 	ssize_t rval;
    755 
    756 	if ((rval = kt->k_kb_ops->kb_pread(kt->k_cookie, addr, buf,
    757 	    nbytes)) == -1)
    758 		return (set_errno(EMDB_NOMAP));
    759 
    760 	return (rval);
    761 }
    762 
    763 ssize_t
    764 kt_pwrite(mdb_tgt_t *t, const void *buf, size_t nbytes, physaddr_t addr)
    765 {
    766 	kt_data_t *kt = t->t_data;
    767 	ssize_t rval;
    768 
    769 	if ((rval = kt->k_kb_ops->kb_pwrite(kt->k_cookie, addr, buf,
    770 	    nbytes)) == -1)
    771 		return (set_errno(EMDB_NOMAP));
    772 
    773 	return (rval);
    774 }
    775 
    776 int
    777 kt_vtop(mdb_tgt_t *t, mdb_tgt_as_t as, uintptr_t va, physaddr_t *pap)
    778 {
    779 	kt_data_t *kt = t->t_data;
    780 
    781 	struct as *asp;
    782 	physaddr_t pa;
    783 	mdb_module_t *mod;
    784 	mdb_var_t *v;
    785 	int (*fptr)(uintptr_t, struct as *, physaddr_t *);
    786 
    787 	switch ((uintptr_t)as) {
    788 	case (uintptr_t)MDB_TGT_AS_PHYS:
    789 	case (uintptr_t)MDB_TGT_AS_FILE:
    790 	case (uintptr_t)MDB_TGT_AS_IO:
    791 		return (set_errno(EINVAL));
    792 	case (uintptr_t)MDB_TGT_AS_VIRT:
    793 		asp = kt->k_as;
    794 		break;
    795 	default:
    796 		asp = (struct as *)as;
    797 	}
    798 
    799 	if ((pa = kt->k_kb_ops->kb_vtop(kt->k_cookie, asp, va)) != -1ULL) {
    800 		*pap = pa;
    801 		return (0);
    802 	}
    803 
    804 	if ((v = mdb_nv_lookup(&mdb.m_modules, "unix")) != NULL &&
    805 	    (mod = mdb_nv_get_cookie(v)) != NULL) {
    806 
    807 		fptr = (int (*)(uintptr_t, struct as *, physaddr_t *))
    808 		    dlsym(mod->mod_hdl, "platform_vtop");
    809 
    810 		if ((fptr != NULL) && ((*fptr)(va, asp, pap) == 0))
    811 			return (0);
    812 	}
    813 
    814 	return (set_errno(EMDB_NOMAP));
    815 }
    816 
    817 int
    818 kt_lookup_by_name(mdb_tgt_t *t, const char *obj, const char *name,
    819     GElf_Sym *symp, mdb_syminfo_t *sip)
    820 {
    821 	kt_data_t *kt = t->t_data;
    822 	kt_module_t *km, kmod;
    823 	mdb_var_t *v;
    824 	int n;
    825 
    826 	/*
    827 	 * To simplify the implementation, we create a fake module on the stack
    828 	 * which is "prepended" to k_modlist and whose symtab is kt->k_symtab.
    829 	 */
    830 	kmod.km_symtab = kt->k_symtab;
    831 	kmod.km_list.ml_next = mdb_list_next(&kt->k_modlist);
    832 
    833 	switch ((uintptr_t)obj) {
    834 	case (uintptr_t)MDB_TGT_OBJ_EXEC:
    835 		km = &kmod;
    836 		n = 1;
    837 		break;
    838 
    839 	case (uintptr_t)MDB_TGT_OBJ_EVERY:
    840 		km = &kmod;
    841 		n = mdb_nv_size(&kt->k_modules) + 1;
    842 		break;
    843 
    844 	case (uintptr_t)MDB_TGT_OBJ_RTLD:
    845 		obj = kt->k_rtld_name;
    846 		/*FALLTHRU*/
    847 
    848 	default:
    849 		if ((v = mdb_nv_lookup(&kt->k_modules, obj)) == NULL)
    850 			return (set_errno(EMDB_NOOBJ));
    851 
    852 		km = mdb_nv_get_cookie(v);
    853 		n = 1;
    854 
    855 		if (km->km_symtab == NULL)
    856 			kt_load_module(kt, t, km);
    857 	}
    858 
    859 	for (; n > 0; n--, km = mdb_list_next(km)) {
    860 		if (mdb_gelf_symtab_lookup_by_name(km->km_symtab, name,
    861 		    symp, &sip->sym_id) == 0) {
    862 			sip->sym_table = MDB_TGT_SYMTAB;
    863 			return (0);
    864 		}
    865 	}
    866 
    867 	return (set_errno(EMDB_NOSYM));
    868 }
    869 
    870 int
    871 kt_lookup_by_addr(mdb_tgt_t *t, uintptr_t addr, uint_t flags,
    872     char *buf, size_t nbytes, GElf_Sym *symp, mdb_syminfo_t *sip)
    873 {
    874 	kt_data_t *kt = t->t_data;
    875 	kt_module_t kmods[3], *kmods_begin = &kmods[0], *kmods_end;
    876 	const char *name;
    877 
    878 	kt_module_t *km = &kmods[0];	/* Point km at first fake module */
    879 	kt_module_t *sym_km = NULL;	/* Module associated with best sym */
    880 	GElf_Sym sym;			/* Best symbol found so far if !exact */
    881 	uint_t symid;			/* ID of best symbol found so far */
    882 
    883 	/*
    884 	 * To simplify the implementation, we create fake modules on the stack
    885 	 * that are "prepended" to k_modlist and whose symtab is set to
    886 	 * each of three special symbol tables, in order of precedence.
    887 	 */
    888 	km->km_symtab = mdb.m_prsym;
    889 
    890 	if (kt->k_symtab != NULL) {
    891 		km->km_list.ml_next = (mdb_list_t *)(km + 1);
    892 		km = mdb_list_next(km);
    893 		km->km_symtab = kt->k_symtab;
    894 	}
    895 
    896 	if (kt->k_dynsym != NULL) {
    897 		km->km_list.ml_next = (mdb_list_t *)(km + 1);
    898 		km = mdb_list_next(km);
    899 		km->km_symtab = kt->k_dynsym;
    900 	}
    901 
    902 	km->km_list.ml_next = mdb_list_next(&kt->k_modlist);
    903 	kmods_end = km;
    904 
    905 	/*
    906 	 * Now iterate over the list of fake and real modules.  If the module
    907 	 * has no symbol table and the address is in the text section,
    908 	 * instantiate the module's symbol table.  In exact mode, we can
    909 	 * jump to 'found' immediately if we match.  Otherwise we continue
    910 	 * looking and improve our choice if we find a closer symbol.
    911 	 */
    912 	for (km = &kmods[0]; km != NULL; km = mdb_list_next(km)) {
    913 		if (km->km_symtab == NULL && addr >= km->km_text_va &&
    914 		    addr < km->km_text_va + km->km_text_size)
    915 			kt_load_module(kt, t, km);
    916 
    917 		if (mdb_gelf_symtab_lookup_by_addr(km->km_symtab, addr,
    918 		    flags, buf, nbytes, symp, &sip->sym_id) != 0 ||
    919 		    symp->st_value == 0)
    920 			continue;
    921 
    922 		if (flags & MDB_TGT_SYM_EXACT) {
    923 			sym_km = km;
    924 			goto found;
    925 		}
    926 
    927 		if (sym_km == NULL || mdb_gelf_sym_closer(symp, &sym, addr)) {
    928 			sym_km = km;
    929 			sym = *symp;
    930 			symid = sip->sym_id;
    931 		}
    932 	}
    933 
    934 	if (sym_km == NULL)
    935 		return (set_errno(EMDB_NOSYMADDR));
    936 
    937 	*symp = sym; /* Copy our best symbol into the caller's symbol */
    938 	sip->sym_id = symid;
    939 found:
    940 	/*
    941 	 * Once we've found something, copy the final name into the caller's
    942 	 * buffer and prefix it with the load object name if appropriate.
    943 	 */
    944 	if (sym_km != NULL) {
    945 		name = mdb_gelf_sym_name(sym_km->km_symtab, symp);
    946 
    947 		if (sym_km < kmods_begin || sym_km > kmods_end) {
    948 			(void) mdb_snprintf(buf, nbytes, "%s`%s",
    949 			    sym_km->km_name, name);
    950 		} else if (nbytes > 0) {
    951 			(void) strncpy(buf, name, nbytes);
    952 			buf[nbytes - 1] = '\0';
    953 		}
    954 
    955 		if (sym_km->km_symtab == mdb.m_prsym)
    956 			sip->sym_table = MDB_TGT_PRVSYM;
    957 		else
    958 			sip->sym_table = MDB_TGT_SYMTAB;
    959 	} else {
    960 		sip->sym_table = MDB_TGT_SYMTAB;
    961 	}
    962 
    963 	return (0);
    964 }
    965 
    966 static int
    967 kt_symtab_func(void *data, const GElf_Sym *sym, const char *name, uint_t id)
    968 {
    969 	kt_symarg_t *argp = data;
    970 
    971 	if (mdb_tgt_sym_match(sym, argp->sym_type)) {
    972 		argp->sym_info.sym_id = id;
    973 
    974 		return (argp->sym_cb(argp->sym_data, sym, name,
    975 		    &argp->sym_info, argp->sym_obj));
    976 	}
    977 
    978 	return (0);
    979 }
    980 
    981 static void
    982 kt_symtab_iter(mdb_gelf_symtab_t *gst, uint_t type, const char *obj,
    983     mdb_tgt_sym_f *cb, void *p)
    984 {
    985 	kt_symarg_t arg;
    986 
    987 	arg.sym_cb = cb;
    988 	arg.sym_data = p;
    989 	arg.sym_type = type;
    990 	arg.sym_info.sym_table = gst->gst_tabid;
    991 	arg.sym_obj = obj;
    992 
    993 	mdb_gelf_symtab_iter(gst, kt_symtab_func, &arg);
    994 }
    995 
    996 int
    997 kt_symbol_iter(mdb_tgt_t *t, const char *obj, uint_t which, uint_t type,
    998     mdb_tgt_sym_f *cb, void *data)
    999 {
   1000 	kt_data_t *kt = t->t_data;
   1001 	kt_module_t *km;
   1002 
   1003 	mdb_gelf_symtab_t *symtab = NULL;
   1004 	mdb_var_t *v;
   1005 
   1006 	switch ((uintptr_t)obj) {
   1007 	case (uintptr_t)MDB_TGT_OBJ_EXEC:
   1008 		if (which == MDB_TGT_SYMTAB)
   1009 			symtab = kt->k_symtab;
   1010 		else
   1011 			symtab = kt->k_dynsym;
   1012 		break;
   1013 
   1014 	case (uintptr_t)MDB_TGT_OBJ_EVERY:
   1015 		if (which == MDB_TGT_DYNSYM) {
   1016 			symtab = kt->k_dynsym;
   1017 			obj = MDB_TGT_OBJ_EXEC;
   1018 			break;
   1019 		}
   1020 
   1021 		mdb_nv_rewind(&kt->k_modules);
   1022 		while ((v = mdb_nv_advance(&kt->k_modules)) != NULL) {
   1023 			km = mdb_nv_get_cookie(v);
   1024 
   1025 			if (km->km_symtab == NULL)
   1026 				kt_load_module(kt, t, km);
   1027 
   1028 			if (km->km_symtab != NULL)
   1029 				kt_symtab_iter(km->km_symtab, type,
   1030 				    km->km_name, cb, data);
   1031 		}
   1032 		break;
   1033 
   1034 	case (uintptr_t)MDB_TGT_OBJ_RTLD:
   1035 		obj = kt->k_rtld_name;
   1036 		/*FALLTHRU*/
   1037 
   1038 	default:
   1039 		v = mdb_nv_lookup(&kt->k_modules, obj);
   1040 
   1041 		if (v == NULL)
   1042 			return (set_errno(EMDB_NOOBJ));
   1043 
   1044 		km = mdb_nv_get_cookie(v);
   1045 
   1046 		if (km->km_symtab == NULL)
   1047 			kt_load_module(kt, t, km);
   1048 
   1049 		symtab = km->km_symtab;
   1050 	}
   1051 
   1052 	if (symtab)
   1053 		kt_symtab_iter(symtab, type, obj, cb, data);
   1054 
   1055 	return (0);
   1056 }
   1057 
   1058 static int
   1059 kt_mapping_walk(uintptr_t addr, const void *data, kt_maparg_t *marg)
   1060 {
   1061 	/*
   1062 	 * This is a bit sketchy but avoids problematic compilation of this
   1063 	 * target against the current VM implementation.  Now that we have
   1064 	 * vmem, we can make this less broken and more informative by changing
   1065 	 * this code to invoke the vmem walker in the near future.
   1066 	 */
   1067 	const struct kt_seg {
   1068 		caddr_t s_base;
   1069 		size_t s_size;
   1070 	} *segp = (const struct kt_seg *)data;
   1071 
   1072 	mdb_map_t map;
   1073 	GElf_Sym sym;
   1074 	mdb_syminfo_t info;
   1075 
   1076 	map.map_base = (uintptr_t)segp->s_base;
   1077 	map.map_size = segp->s_size;
   1078 	map.map_flags = MDB_TGT_MAP_R | MDB_TGT_MAP_W | MDB_TGT_MAP_X;
   1079 
   1080 	if (kt_lookup_by_addr(marg->map_target, addr, MDB_TGT_SYM_EXACT,
   1081 	    map.map_name, MDB_TGT_MAPSZ, &sym, &info) == -1) {
   1082 
   1083 		(void) mdb_iob_snprintf(map.map_name, MDB_TGT_MAPSZ,
   1084 		    "%lr", addr);
   1085 	}
   1086 
   1087 	return (marg->map_cb(marg->map_data, &map, map.map_name));
   1088 }
   1089 
   1090 int
   1091 kt_mapping_iter(mdb_tgt_t *t, mdb_tgt_map_f *func, void *private)
   1092 {
   1093 	kt_data_t *kt = t->t_data;
   1094 	kt_maparg_t m;
   1095 
   1096 	m.map_target = t;
   1097 	m.map_cb = func;
   1098 	m.map_data = private;
   1099 
   1100 	return (mdb_pwalk("seg", (mdb_walk_cb_t)kt_mapping_walk, &m,
   1101 	    (uintptr_t)kt->k_as));
   1102 }
   1103 
   1104 static const mdb_map_t *
   1105 kt_module_to_map(kt_module_t *km, mdb_map_t *map)
   1106 {
   1107 	(void) strncpy(map->map_name, km->km_name, MDB_TGT_MAPSZ);
   1108 	map->map_name[MDB_TGT_MAPSZ - 1] = '\0';
   1109 	map->map_base = km->km_text_va;
   1110 	map->map_size = km->km_text_size;
   1111 	map->map_flags = MDB_TGT_MAP_R | MDB_TGT_MAP_W | MDB_TGT_MAP_X;
   1112 
   1113 	return (map);
   1114 }
   1115 
   1116 int
   1117 kt_object_iter(mdb_tgt_t *t, mdb_tgt_map_f *func, void *private)
   1118 {
   1119 	kt_data_t *kt = t->t_data;
   1120 	kt_module_t *km;
   1121 	mdb_map_t m;
   1122 
   1123 	for (km = mdb_list_next(&kt->k_modlist); km; km = mdb_list_next(km)) {
   1124 		if (func(private, kt_module_to_map(km, &m), km->km_name) == -1)
   1125 			break;
   1126 	}
   1127 
   1128 	return (0);
   1129 }
   1130 
   1131 const mdb_map_t *
   1132 kt_addr_to_map(mdb_tgt_t *t, uintptr_t addr)
   1133 {
   1134 	kt_data_t *kt = t->t_data;
   1135 	kt_module_t *km;
   1136 
   1137 	for (km = mdb_list_next(&kt->k_modlist); km; km = mdb_list_next(km)) {
   1138 		if (addr - km->km_text_va < km->km_text_size ||
   1139 		    addr - km->km_data_va < km->km_data_size ||
   1140 		    addr - km->km_bss_va < km->km_bss_size)
   1141 			return (kt_module_to_map(km, &kt->k_map));
   1142 	}
   1143 
   1144 	(void) set_errno(EMDB_NOMAP);
   1145 	return (NULL);
   1146 }
   1147 
   1148 const mdb_map_t *
   1149 kt_name_to_map(mdb_tgt_t *t, const char *name)
   1150 {
   1151 	kt_data_t *kt = t->t_data;
   1152 	kt_module_t *km;
   1153 	mdb_map_t m;
   1154 
   1155 	/*
   1156 	 * If name is MDB_TGT_OBJ_EXEC, return the first module on the list,
   1157 	 * which will be unix since we keep k_modlist in load order.
   1158 	 */
   1159 	if (name == MDB_TGT_OBJ_EXEC)
   1160 		return (kt_module_to_map(mdb_list_next(&kt->k_modlist), &m));
   1161 
   1162 	if (name == MDB_TGT_OBJ_RTLD)
   1163 		name = kt->k_rtld_name;
   1164 
   1165 	if ((km = kt_module_by_name(kt, name)) != NULL)
   1166 		return (kt_module_to_map(km, &m));
   1167 
   1168 	(void) set_errno(EMDB_NOOBJ);
   1169 	return (NULL);
   1170 }
   1171 
   1172 static ctf_file_t *
   1173 kt_load_ctfdata(mdb_tgt_t *t, kt_module_t *km)
   1174 {
   1175 	kt_data_t *kt = t->t_data;
   1176 	int err;
   1177 
   1178 	if (km->km_ctfp != NULL)
   1179 		return (km->km_ctfp);
   1180 
   1181 	if (km->km_ctf_va == NULL) {
   1182 		(void) set_errno(EMDB_NOCTF);
   1183 		return (NULL);
   1184 	}
   1185 
   1186 	if (km->km_symtab == NULL)
   1187 		kt_load_module(t->t_data, t, km);
   1188 
   1189 	if ((km->km_ctf_buf = mdb_alloc(km->km_ctf_size, UM_NOSLEEP)) == NULL) {
   1190 		warn("failed to allocate memory to load %s debugging "
   1191 		    "information", km->km_name);
   1192 		return (NULL);
   1193 	}
   1194 
   1195 	if (mdb_tgt_vread(t, km->km_ctf_buf, km->km_ctf_size,
   1196 	    km->km_ctf_va) != km->km_ctf_size) {
   1197 		warn("failed to read %lu bytes of debug data for %s at %p",
   1198 		    (ulong_t)km->km_ctf_size, km->km_name,
   1199 		    (void *)km->km_ctf_va);
   1200 		mdb_free(km->km_ctf_buf, km->km_ctf_size);
   1201 		km->km_ctf_buf = NULL;
   1202 		return (NULL);
   1203 	}
   1204 
   1205 	if ((km->km_ctfp = mdb_ctf_bufopen((const void *)km->km_ctf_buf,
   1206 	    km->km_ctf_size, km->km_symbuf, &km->km_symtab_hdr,
   1207 	    km->km_strtab, &km->km_strtab_hdr, &err)) == NULL) {
   1208 		mdb_free(km->km_ctf_buf, km->km_ctf_size);
   1209 		km->km_ctf_buf = NULL;
   1210 		(void) set_errno(ctf_to_errno(err));
   1211 		return (NULL);
   1212 	}
   1213 
   1214 	mdb_dprintf(MDB_DBG_KMOD, "loaded %lu bytes of CTF data for %s\n",
   1215 	    (ulong_t)km->km_ctf_size, km->km_name);
   1216 
   1217 	if (ctf_parent_name(km->km_ctfp) != NULL) {
   1218 		mdb_var_t *v;
   1219 
   1220 		if ((v = mdb_nv_lookup(&kt->k_modules,
   1221 		    ctf_parent_name(km->km_ctfp))) == NULL) {
   1222 			warn("failed to load CTF data for %s - parent %s not "
   1223 			    "loaded\n", km->km_name,
   1224 			    ctf_parent_name(km->km_ctfp));
   1225 		}
   1226 
   1227 		if (v != NULL) {
   1228 			kt_module_t *pm = mdb_nv_get_cookie(v);
   1229 
   1230 			if (pm->km_ctfp == NULL)
   1231 				(void) kt_load_ctfdata(t, pm);
   1232 
   1233 			if (pm->km_ctfp != NULL && ctf_import(km->km_ctfp,
   1234 			    pm->km_ctfp) == CTF_ERR) {
   1235 				warn("failed to import parent types into "
   1236 				    "%s: %s\n", km->km_name,
   1237 				    ctf_errmsg(ctf_errno(km->km_ctfp)));
   1238 			}
   1239 		}
   1240 	}
   1241 
   1242 	return (km->km_ctfp);
   1243 }
   1244 
   1245 ctf_file_t *
   1246 kt_addr_to_ctf(mdb_tgt_t *t, uintptr_t addr)
   1247 {
   1248 	kt_data_t *kt = t->t_data;
   1249 	kt_module_t *km;
   1250 
   1251 	for (km = mdb_list_next(&kt->k_modlist); km; km = mdb_list_next(km)) {
   1252 		if (addr - km->km_text_va < km->km_text_size ||
   1253 		    addr - km->km_data_va < km->km_data_size ||
   1254 		    addr - km->km_bss_va < km->km_bss_size)
   1255 			return (kt_load_ctfdata(t, km));
   1256 	}
   1257 
   1258 	(void) set_errno(EMDB_NOMAP);
   1259 	return (NULL);
   1260 }
   1261 
   1262 ctf_file_t *
   1263 kt_name_to_ctf(mdb_tgt_t *t, const char *name)
   1264 {
   1265 	kt_data_t *kt = t->t_data;
   1266 	kt_module_t *km;
   1267 
   1268 	if (name == MDB_TGT_OBJ_EXEC)
   1269 		name = KT_CTFPARENT;
   1270 	else if (name == MDB_TGT_OBJ_RTLD)
   1271 		name = kt->k_rtld_name;
   1272 
   1273 	if ((km = kt_module_by_name(kt, name)) != NULL)
   1274 		return (kt_load_ctfdata(t, km));
   1275 
   1276 	(void) set_errno(EMDB_NOOBJ);
   1277 	return (NULL);
   1278 }
   1279 
   1280 /*ARGSUSED*/
   1281 int
   1282 kt_status(mdb_tgt_t *t, mdb_tgt_status_t *tsp)
   1283 {
   1284 	kt_data_t *kt = t->t_data;
   1285 	bzero(tsp, sizeof (mdb_tgt_status_t));
   1286 	tsp->st_state = (kt->k_xpv_domu || (kt->k_dumphdr != NULL)) ?
   1287 	    MDB_TGT_DEAD : MDB_TGT_RUNNING;
   1288 	return (0);
   1289 }
   1290 
   1291 static ssize_t
   1292 kt_xd_dumphdr(mdb_tgt_t *t, void *buf, size_t nbytes)
   1293 {
   1294 	kt_data_t *kt = t->t_data;
   1295 
   1296 	if (buf == NULL && nbytes == 0)
   1297 		return (sizeof (dumphdr_t));
   1298 
   1299 	if (kt->k_dumphdr == NULL)
   1300 		return (set_errno(ENODATA));
   1301 
   1302 	nbytes = MIN(nbytes, sizeof (dumphdr_t));
   1303 	bcopy(kt->k_dumphdr, buf, nbytes);
   1304 
   1305 	return (nbytes);
   1306 }
   1307 
   1308 void
   1309 kt_destroy(mdb_tgt_t *t)
   1310 {
   1311 	kt_data_t *kt = t->t_data;
   1312 	kt_module_t *km, *nkm;
   1313 
   1314 	(void) mdb_module_unload(KT_MODULE, 0);
   1315 
   1316 	if (kt->k_regs != NULL)
   1317 		mdb_free(kt->k_regs, kt->k_regsize);
   1318 
   1319 	if (kt->k_symtab != NULL)
   1320 		mdb_gelf_symtab_destroy(kt->k_symtab);
   1321 
   1322 	if (kt->k_dynsym != NULL)
   1323 		mdb_gelf_symtab_destroy(kt->k_dynsym);
   1324 
   1325 	if (kt->k_dumphdr != NULL)
   1326 		mdb_free(kt->k_dumphdr, sizeof (dumphdr_t));
   1327 
   1328 	mdb_gelf_destroy(kt->k_file);
   1329 
   1330 	(void) kt->k_kb_ops->kb_close(kt->k_cookie);
   1331 
   1332 	for (km = mdb_list_next(&kt->k_modlist); km; km = nkm) {
   1333 		if (km->km_symtab)
   1334 			mdb_gelf_symtab_destroy(km->km_symtab);
   1335 
   1336 		if (km->km_data)
   1337 			mdb_free(km->km_data, km->km_datasz);
   1338 
   1339 		if (km->km_ctfp)
   1340 			ctf_close(km->km_ctfp);
   1341 
   1342 		if (km->km_ctf_buf != NULL)
   1343 			mdb_free(km->km_ctf_buf, km->km_ctf_size);
   1344 
   1345 		nkm = mdb_list_next(km);
   1346 		strfree(km->km_name);
   1347 		mdb_free(km, sizeof (kt_module_t));
   1348 	}
   1349 
   1350 	mdb_nv_destroy(&kt->k_modules);
   1351 
   1352 	strfree(kt->k_kvmfile);
   1353 	if (kt->k_symfile != NULL)
   1354 		strfree(kt->k_symfile);
   1355 
   1356 	mdb_free(kt, sizeof (kt_data_t));
   1357 }
   1358 
   1359 static int
   1360 kt_data_stub(void)
   1361 {
   1362 	return (-1);
   1363 }
   1364 
   1365 int
   1366 mdb_kvm_tgt_create(mdb_tgt_t *t, int argc, const char *argv[])
   1367 {
   1368 	kt_data_t *kt = mdb_zalloc(sizeof (kt_data_t), UM_SLEEP);
   1369 	mdb_kb_ops_t *kvm_kb_ops = libkvm_kb_ops();
   1370 	int oflag = (t->t_flags & MDB_TGT_F_RDWR) ? O_RDWR : O_RDONLY;
   1371 	struct utsname uts;
   1372 	GElf_Sym sym;
   1373 	pgcnt_t pmem;
   1374 
   1375 
   1376 	if (argc == 2) {
   1377 		kt->k_symfile = strdup(argv[0]);
   1378 		kt->k_kvmfile = strdup(argv[1]);
   1379 
   1380 		kt->k_cookie = kvm_kb_ops->kb_open(kt->k_symfile,
   1381 		    kt->k_kvmfile, NULL, oflag, (char *)mdb.m_pname);
   1382 
   1383 		if (kt->k_cookie == NULL)
   1384 			goto err;
   1385 
   1386 		kt->k_xpv_domu = 0;
   1387 		kt->k_kb_ops = kvm_kb_ops;
   1388 	} else {
   1389 #ifndef __x86
   1390 		return (set_errno(EINVAL));
   1391 #else
   1392 		mdb_kb_ops_t *(*getops)(void);
   1393 
   1394 		kt->k_symfile = NULL;
   1395 		kt->k_kvmfile = strdup(argv[0]);
   1396 
   1397 		getops = (mdb_kb_ops_t *(*)())dlsym(RTLD_NEXT, "mdb_kb_ops");
   1398 
   1399 		/*
   1400 		 * Load mdb_kb if it's not already loaded during
   1401 		 * identification.
   1402 		 */
   1403 		if (getops == NULL) {
   1404 			(void) mdb_module_load("mdb_kb",
   1405 			    MDB_MOD_GLOBAL | MDB_MOD_SILENT);
   1406 			getops = (mdb_kb_ops_t *(*)())
   1407 			    dlsym(RTLD_NEXT, "mdb_kb_ops");
   1408 		}
   1409 
   1410 		if (getops == NULL || (kt->k_kb_ops = getops()) == NULL) {
   1411 			warn("failed to load KVM backend ops\n");
   1412 			goto err;
   1413 		}
   1414 
   1415 		kt->k_cookie = kt->k_kb_ops->kb_open(NULL, kt->k_kvmfile, NULL,
   1416 		    oflag, (char *)mdb.m_pname);
   1417 
   1418 		if (kt->k_cookie == NULL)
   1419 			goto err;
   1420 
   1421 		kt->k_xpv_domu = 1;
   1422 #endif
   1423 	}
   1424 
   1425 	if ((kt->k_fio = kt->k_kb_ops->kb_sym_io(kt->k_cookie,
   1426 	    kt->k_symfile)) == NULL)
   1427 		goto err;
   1428 
   1429 	if ((kt->k_file = mdb_gelf_create(kt->k_fio,
   1430 	    ET_EXEC, GF_FILE)) == NULL) {
   1431 		mdb_io_destroy(kt->k_fio);
   1432 		goto err;
   1433 	}
   1434 
   1435 	kt->k_symtab =
   1436 	    mdb_gelf_symtab_create_file(kt->k_file, SHT_SYMTAB, MDB_TGT_SYMTAB);
   1437 
   1438 	kt->k_dynsym =
   1439 	    mdb_gelf_symtab_create_file(kt->k_file, SHT_DYNSYM, MDB_TGT_DYNSYM);
   1440 
   1441 	if (mdb_gelf_symtab_lookup_by_name(kt->k_symtab, "kas",
   1442 	    &sym, NULL) == -1) {
   1443 		warn("'kas' symbol is missing from kernel\n");
   1444 		goto err;
   1445 	}
   1446 
   1447 	kt->k_as = (struct as *)(uintptr_t)sym.st_value;
   1448 
   1449 	if (mdb_gelf_symtab_lookup_by_name(kt->k_symtab, "platform",
   1450 	    &sym, NULL) == -1) {
   1451 		warn("'platform' symbol is missing from kernel\n");
   1452 		goto err;
   1453 	}
   1454 
   1455 	if (kt->k_kb_ops->kb_kread(kt->k_cookie, sym.st_value,
   1456 	    kt->k_platform, MAXNAMELEN) <= 0) {
   1457 		warn("failed to read 'platform' string from kernel");
   1458 		goto err;
   1459 	}
   1460 
   1461 	if (mdb_gelf_symtab_lookup_by_name(kt->k_symtab, "utsname",
   1462 	    &sym, NULL) == -1) {
   1463 		warn("'utsname' symbol is missing from kernel\n");
   1464 		goto err;
   1465 	}
   1466 
   1467 	if (kt->k_kb_ops->kb_kread(kt->k_cookie, sym.st_value, &uts,
   1468 	    sizeof (uts)) <= 0) {
   1469 		warn("failed to read 'utsname' struct from kernel");
   1470 		goto err;
   1471 	}
   1472 
   1473 	kt->k_dump_print_content = (void (*)())kt_data_stub;
   1474 	kt->k_dump_find_curproc = kt_data_stub;
   1475 
   1476 	/*
   1477 	 * We set k_ctfvalid based on the presence of the CTF vmem arena
   1478 	 * symbol.  The CTF members were added to the end of struct module at
   1479 	 * the same time, so this allows us to know whether we can use them.
   1480 	 */
   1481 	if (mdb_gelf_symtab_lookup_by_name(kt->k_symtab, "ctf_arena", &sym,
   1482 	    NULL) == 0 && !(mdb.m_flags & MDB_FL_NOCTF))
   1483 		kt->k_ctfvalid = 1;
   1484 
   1485 	(void) mdb_nv_create(&kt->k_modules, UM_SLEEP);
   1486 	t->t_pshandle = kt->k_cookie;
   1487 	t->t_data = kt;
   1488 
   1489 #if defined(__sparc)
   1490 #if defined(__sparcv9)
   1491 	kt_sparcv9_init(t);
   1492 #else
   1493 	kt_sparcv7_init(t);
   1494 #endif
   1495 #elif defined(__amd64)
   1496 	kt_amd64_init(t);
   1497 #elif defined(__i386)
   1498 	kt_ia32_init(t);
   1499 #else
   1500 #error	"unknown ISA"
   1501 #endif
   1502 
   1503 	/*
   1504 	 * We read our representative thread ID (address) from the kernel's
   1505 	 * global panic_thread.  It will remain 0 if this is a live kernel.
   1506 	 */
   1507 	(void) mdb_tgt_readsym(t, MDB_TGT_AS_VIRT, &kt->k_tid, sizeof (void *),
   1508 	    MDB_TGT_OBJ_EXEC, "panic_thread");
   1509 
   1510 	if ((mdb.m_flags & MDB_FL_ADB) && mdb_tgt_readsym(t, MDB_TGT_AS_VIRT,
   1511 	    &pmem, sizeof (pmem), MDB_TGT_OBJ_EXEC, "physmem") == sizeof (pmem))
   1512 		mdb_printf("physmem %lx\n", (ulong_t)pmem);
   1513 
   1514 	/*
   1515 	 * If this is not a live kernel or a hypervisor dump, read the dump
   1516 	 * header.  We don't have to sanity-check the header, as the open would
   1517 	 * not have succeeded otherwise.
   1518 	 */
   1519 	if (!kt->k_xpv_domu && strcmp(kt->k_symfile, "/dev/ksyms") != 0) {
   1520 		mdb_io_t *vmcore;
   1521 
   1522 		kt->k_dumphdr = mdb_alloc(sizeof (dumphdr_t), UM_SLEEP);
   1523 
   1524 		if ((vmcore = mdb_fdio_create_path(NULL, kt->k_kvmfile,
   1525 		    O_RDONLY, 0)) == NULL) {
   1526 			mdb_warn("failed to open %s", kt->k_kvmfile);
   1527 			goto err;
   1528 		}
   1529 
   1530 		if (IOP_READ(vmcore, kt->k_dumphdr, sizeof (dumphdr_t)) !=
   1531 		    sizeof (dumphdr_t)) {
   1532 			mdb_warn("failed to read dump header");
   1533 			mdb_io_destroy(vmcore);
   1534 			goto err;
   1535 		}
   1536 
   1537 		mdb_io_destroy(vmcore);
   1538 
   1539 		(void) mdb_tgt_xdata_insert(t, "dumphdr",
   1540 		    "dump header structure", kt_xd_dumphdr);
   1541 	}
   1542 
   1543 	return (0);
   1544 
   1545 err:
   1546 	if (kt->k_dumphdr != NULL)
   1547 		mdb_free(kt->k_dumphdr, sizeof (dumphdr_t));
   1548 
   1549 	if (kt->k_symtab != NULL)
   1550 		mdb_gelf_symtab_destroy(kt->k_symtab);
   1551 
   1552 	if (kt->k_dynsym != NULL)
   1553 		mdb_gelf_symtab_destroy(kt->k_dynsym);
   1554 
   1555 	if (kt->k_file != NULL)
   1556 		mdb_gelf_destroy(kt->k_file);
   1557 
   1558 	if (kt->k_cookie != NULL)
   1559 		(void) kt->k_kb_ops->kb_close(kt->k_cookie);
   1560 
   1561 	mdb_free(kt, sizeof (kt_data_t));
   1562 	return (-1);
   1563 }
   1564 
   1565 int
   1566 mdb_kvm_is_compressed_dump(mdb_io_t *io)
   1567 {
   1568 	dumphdr_t h;
   1569 
   1570 	return (IOP_READ(io, &h, sizeof (dumphdr_t)) == sizeof (dumphdr_t) &&
   1571 	    h.dump_magic == DUMP_MAGIC &&
   1572 	    (h.dump_flags & DF_COMPRESSED) != 0);
   1573 }
   1574