17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
55aefb655Srie  * Common Development and Distribution License (the "License").
65aefb655Srie  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
215aefb655Srie 
227c478bd9Sstevel@tonic-gate /*
232020b2b6SRod Evans  * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate #include <msg.h>
277c478bd9Sstevel@tonic-gate #include <_rtld.h>
287c478bd9Sstevel@tonic-gate #include <conv.h>
297c478bd9Sstevel@tonic-gate #include <sys/mdb_modapi.h>
307c478bd9Sstevel@tonic-gate #include <sys/param.h>
317c478bd9Sstevel@tonic-gate #include <stdlib.h>
327c478bd9Sstevel@tonic-gate 
337c478bd9Sstevel@tonic-gate /*
347c478bd9Sstevel@tonic-gate  * Data structure for walkers.
357c478bd9Sstevel@tonic-gate  */
367c478bd9Sstevel@tonic-gate typedef struct {
377c478bd9Sstevel@tonic-gate 	uint_t	w_flags;
387c478bd9Sstevel@tonic-gate } W_desc;
397c478bd9Sstevel@tonic-gate 
407c478bd9Sstevel@tonic-gate /*
417c478bd9Sstevel@tonic-gate  * Flags values for dcmds
427c478bd9Sstevel@tonic-gate  */
437c478bd9Sstevel@tonic-gate 
447c478bd9Sstevel@tonic-gate #define	RTLD_FLG_VERBOSE	0x0001		/* verbose output */
457c478bd9Sstevel@tonic-gate 
467c478bd9Sstevel@tonic-gate static const mdb_bitmask_t rtflags_bits[] = {
477c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_ISMAIN), FLG_RT_ISMAIN, FLG_RT_ISMAIN},
487c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_IMGALLOC), FLG_RT_IMGALLOC, FLG_RT_IMGALLOC},
497c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_RELOCED), FLG_RT_RELOCED, FLG_RT_RELOCED},
507c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_SETGROUP), FLG_RT_SETGROUP, FLG_RT_SETGROUP},
5108278a5eSRod Evans 	{ MSG_ORIG(MSG_FLG_CAP), FLG_RT_CAP, FLG_RT_CAP},
527c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_OBJECT), FLG_RT_OBJECT, FLG_RT_OBJECT},
53dde769a2SRod Evans 	{ MSG_ORIG(MSG_FLG_NEWLOAD), FLG_RT_NEWLOAD, FLG_RT_NEWLOAD},
547c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_NODUMP), FLG_RT_NODUMP, FLG_RT_NODUMP},
557c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_DELETE), FLG_RT_DELETE, FLG_RT_DELETE},
567c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_ANALYZED), FLG_RT_ANALYZED, FLG_RT_ANALYZED},
577c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_INITDONE), FLG_RT_INITDONE, FLG_RT_INITDONE},
587c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_TRANS), FLG_RT_TRANS, FLG_RT_TRANS},
597c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_FIXED), FLG_RT_FIXED, FLG_RT_FIXED},
607c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_PRELOAD), FLG_RT_PRELOAD, FLG_RT_PRELOAD},
617c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_ALTER), FLG_RT_ALTER, FLG_RT_ALTER},
627c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_LOADFLTR), FLG_RT_LOADFLTR, FLG_RT_LOADFLTR},
637c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_AUDIT), FLG_RT_AUDIT, FLG_RT_AUDIT},
647c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_MODESET), FLG_RT_MODESET, FLG_RT_MODESET},
657c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_ANALZING), FLG_RT_ANALZING, FLG_RT_ANALZING},
667c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_INITFRST), FLG_RT_INITFRST, FLG_RT_INITFRST},
677c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_NOOPEN), FLG_RT_NOOPEN, FLG_RT_NOOPEN},
687c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_FINICLCT), FLG_RT_FINICLCT, FLG_RT_FINICLCT},
697c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_INITCALL), FLG_RT_INITCALL, FLG_RT_INITCALL},
709a411307Srie 	{ MSG_ORIG(MSG_FLG_OBJINTPO), FLG_RT_OBJINTPO, FLG_RT_OBJINTPO},
719a411307Srie 	{ MSG_ORIG(MSG_FLG_SYMINTPO), FLG_RT_SYMINTPO, FLG_RT_SYMINTPO},
727c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_MOVE), FLG_RT_MOVE, FLG_RT_MOVE},
732017c965SRod Evans 	{ MSG_ORIG(MSG_FLG_RELOCING), FLG_RT_RELOCING, FLG_RT_RELOCING},
747c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_REGSYMS), FLG_RT_REGSYMS, FLG_RT_REGSYMS},
757c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FLG_INITCLCT), FLG_RT_INITCLCT, FLG_RT_INITCLCT},
762017c965SRod Evans 	{ MSG_ORIG(MSG_FLG_PUBHDL), FLG_RT_PUBHDL, FLG_RT_PUBHDL},
772017c965SRod Evans 	{ MSG_ORIG(MSG_FLG_PRIHDL), FLG_RT_PRIHDL, FLG_RT_PRIHDL},
787c478bd9Sstevel@tonic-gate 	{ NULL, 0, 0}
797c478bd9Sstevel@tonic-gate };
807c478bd9Sstevel@tonic-gate 
817c478bd9Sstevel@tonic-gate static const mdb_bitmask_t rtflags1_bits[] = {
827c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_COPYTOOK), FL1_RT_COPYTOOK, FL1_RT_COPYTOOK},
8308278a5eSRod Evans 	{ MSG_ORIG(MSG_FL1_ALTCHECK), FL1_RT_ALTCHECK, FL1_RT_ALTCHECK},
8408278a5eSRod Evans 	{ MSG_ORIG(MSG_FL1_ALTCAP), FL1_RT_ALTCAP, FL1_RT_ALTCAP},
857c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_CONFSET), FL1_RT_CONFSET, FL1_RT_CONFSET },
867c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_NODEFLIB), FL1_RT_NODEFLIB, FL1_RT_NODEFLIB },
877c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_ENDFILTE), FL1_RT_ENDFILTE, FL1_RT_ENDFILTE },
887c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_DISPREL), FL1_RT_DISPREL, FL1_RT_DISPREL },
8956deab07SRod Evans 	{ MSG_ORIG(MSG_FL1_DTFLAGS), FL1_RT_DTFLAGS, FL1_RT_DTFLAGS},
907c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_LDDSTUB), FL1_RT_LDDSTUB, FL1_RT_LDDSTUB},
917c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_NOINIFIN), FL1_RT_NOINIFIN, FL1_RT_NOINIFIN },
927c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_USED), FL1_RT_USED, FL1_RT_USED },
937c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_SYMBOLIC), FL1_RT_SYMBOLIC, FL1_RT_SYMBOLIC },
947c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_OBJSFLTR), FL1_RT_OBJSFLTR, FL1_RT_OBJSFLTR },
957c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_OBJAFLTR), FL1_RT_OBJAFLTR, FL1_RT_OBJAFLTR },
967c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_SYMSFLTR), FL1_RT_SYMSFLTR, FL1_RT_SYMSFLTR },
977c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_FL1_SYMAFLTR), FL1_RT_SYMAFLTR, FL1_RT_SYMAFLTR },
989a411307Srie 	{ MSG_ORIG(MSG_FL1_TLSADD), FL1_RT_TLSADD, FL1_RT_TLSADD },
999a411307Srie 	{ MSG_ORIG(MSG_FL1_TLSSTAT), FL1_RT_TLSSTAT, FL1_RT_TLSSTAT },
1009a411307Srie 	{ MSG_ORIG(MSG_FL1_DIRECT), FL1_RT_DIRECT, FL1_RT_DIRECT},
1017247f888Srie 	{ MSG_ORIG(MSG_FL1_GLOBAUD), FL1_RT_GLOBAUD, FL1_RT_GLOBAUD},
102b533f56bSRobert Mustacchi 	{ MSG_ORIG(MSG_FL1_DEPAUD), FL1_RT_DEPAUD, FL1_RT_DEPAUD},
10356deab07SRod Evans 	{ NULL, 0, 0}
10456deab07SRod Evans };
1057c478bd9Sstevel@tonic-gate 
10656deab07SRod Evans static const mdb_bitmask_t rtaflags_bits[] = {
1077c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_PREINIT), LML_TFLG_AUD_PREINIT,
1087c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_PREINIT },
1097c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_OBJSEARCH), LML_TFLG_AUD_OBJSEARCH,
1107c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_OBJSEARCH },
1117c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_OBJOPEN), LML_TFLG_AUD_OBJOPEN,
1127c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_OBJOPEN },
1137c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_OBJFILTER), LML_TFLG_AUD_OBJFILTER,
1147c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_OBJFILTER },
1157c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_OBJCLOSE), LML_TFLG_AUD_OBJCLOSE,
1167c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_OBJCLOSE },
1177c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_SYMBIND), LML_TFLG_AUD_SYMBIND,
1187c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_SYMBIND },
1197c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_PLTENTER), LML_TFLG_AUD_PLTENTER,
1207c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_PLTENTER },
1217c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_PLTEXIT), LML_TFLG_AUD_PLTEXIT,
1227c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_PLTEXIT },
1237c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_ACTIVITY), LML_TFLG_AUD_ACTIVITY,
1247c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_ACTIVITY },
1257c478bd9Sstevel@tonic-gate 	{ NULL, 0, 0}
1267c478bd9Sstevel@tonic-gate };
1277c478bd9Sstevel@tonic-gate 
1287c478bd9Sstevel@tonic-gate static const mdb_bitmask_t rtmode_bits[] = {
1297c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_MODE_LAZY), RTLD_LAZY, RTLD_LAZY },
1307c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_MODE_NOW), RTLD_NOW, RTLD_NOW },
1317c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_MODE_NOLOAD), RTLD_NOLOAD, RTLD_NOLOAD },
1327c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_MODE_GLOBAL), RTLD_GLOBAL, RTLD_GLOBAL },
1337c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_MODE_PARENT), RTLD_PARENT, RTLD_PARENT },
1347c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_MODE_GROUP), RTLD_GROUP, RTLD_GROUP },
1357c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_MODE_WORLD), RTLD_WORLD, RTLD_WORLD },
1367c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_MODE_NODELETE), RTLD_NODELETE, RTLD_NODELETE },
1377c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_MODE_FIRST), RTLD_FIRST, RTLD_FIRST },
1387c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_MODE_CONFGEN), RTLD_CONFGEN, RTLD_CONFGEN },
1397c478bd9Sstevel@tonic-gate 	{ NULL, 0, 0}
1407c478bd9Sstevel@tonic-gate };
1417c478bd9Sstevel@tonic-gate 
1427c478bd9Sstevel@tonic-gate static const mdb_bitmask_t bndflags_bits[] = {
1437c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_BFL_NEEDED), BND_NEEDED, BND_NEEDED },
1447c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_BFL_REFER), BND_REFER, BND_REFER },
145dffec89cSrie 	{ MSG_ORIG(MSG_BFL_FILTER), BND_FILTER, BND_FILTER },
1467c478bd9Sstevel@tonic-gate 	{ NULL, 0, 0}
1477c478bd9Sstevel@tonic-gate };
1487c478bd9Sstevel@tonic-gate 
1497c478bd9Sstevel@tonic-gate static const mdb_bitmask_t grhflags_bits[] = {
1502017c965SRod Evans 	{ MSG_ORIG(MSG_GPH_PUBLIC), GPH_PUBLIC, GPH_PUBLIC },
1512017c965SRod Evans 	{ MSG_ORIG(MSG_GPH_PRIVATE), GPH_PRIVATE, GPH_PRIVATE },
1527c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_GPH_ZERO), GPH_ZERO, GPH_ZERO },
1537c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_GPH_LDSO), GPH_LDSO, GPH_LDSO },
1547c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_GPH_FIRST), GPH_FIRST, GPH_FIRST },
1557c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_GPH_FILTEE), GPH_FILTEE, GPH_FILTEE },
1567c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_GPH_INITIAL), GPH_INITIAL, GPH_INITIAL },
1577c478bd9Sstevel@tonic-gate 	{ NULL, 0, 0}
1587c478bd9Sstevel@tonic-gate };
1597c478bd9Sstevel@tonic-gate 
1607c478bd9Sstevel@tonic-gate static const mdb_bitmask_t grdflags_bits[] = {
161efb9e8b8Srie 	{ MSG_ORIG(MSG_GPD_DLSYM), GPD_DLSYM, GPD_DLSYM },
162efb9e8b8Srie 	{ MSG_ORIG(MSG_GPD_RELOC), GPD_RELOC, GPD_RELOC },
1637c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_GPD_ADDEPS), GPD_ADDEPS, GPD_ADDEPS },
1647c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_GPD_PARENT), GPD_PARENT, GPD_PARENT },
1657c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_GPD_FILTER), GPD_FILTER, GPD_FILTER },
1667c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_GPD_REMOVE), GPD_REMOVE, GPD_REMOVE },
1677c478bd9Sstevel@tonic-gate 	{ NULL, 0, 0}
1687c478bd9Sstevel@tonic-gate };
1697c478bd9Sstevel@tonic-gate 
1707c478bd9Sstevel@tonic-gate static const mdb_bitmask_t lmc_bits[] = {
1717c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LMC_ANALYZING), LMC_FLG_ANALYZING, LMC_FLG_ANALYZING},
1727c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LMC_RELOCATING), LMC_FLG_RELOCATING, LMC_FLG_RELOCATING},
1737c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LMC_REANALYZE), LMC_FLG_REANALYZE, LMC_FLG_REANALYZE},
1747c478bd9Sstevel@tonic-gate 	{ NULL, 0, 0}
1757c478bd9Sstevel@tonic-gate };
1767c478bd9Sstevel@tonic-gate 
1777c478bd9Sstevel@tonic-gate /*
1787c478bd9Sstevel@tonic-gate  * Obtain a string - typically a link-map name.
1797c478bd9Sstevel@tonic-gate  */
1807c478bd9Sstevel@tonic-gate static char *
String(uintptr_t addr,const char * name)1817c478bd9Sstevel@tonic-gate String(uintptr_t addr, const char *name)
1827c478bd9Sstevel@tonic-gate {
1837c478bd9Sstevel@tonic-gate 	static char	str[MAXPATHLEN];
1847c478bd9Sstevel@tonic-gate 
1857c478bd9Sstevel@tonic-gate 	if (addr) {
1867c478bd9Sstevel@tonic-gate 		if (mdb_readstr(str, MAXPATHLEN, addr) == -1) {
1877c478bd9Sstevel@tonic-gate 			mdb_warn(MSG_ORIG(MSG_ERR_READ), name, addr);
1887c478bd9Sstevel@tonic-gate 			return (0);
1897c478bd9Sstevel@tonic-gate 		}
1907c478bd9Sstevel@tonic-gate 		return (str);
1917c478bd9Sstevel@tonic-gate 	}
1927c478bd9Sstevel@tonic-gate 	return ((char *)MSG_ORIG(MSG_STR_EMPTY));
1937c478bd9Sstevel@tonic-gate }
1947c478bd9Sstevel@tonic-gate 
1957c478bd9Sstevel@tonic-gate /*
1967c478bd9Sstevel@tonic-gate  * Obtain a link-map name.
1977c478bd9Sstevel@tonic-gate  */
1987c478bd9Sstevel@tonic-gate static char *
Rtmap_Name(uintptr_t addr)1997c478bd9Sstevel@tonic-gate Rtmap_Name(uintptr_t addr)
2007c478bd9Sstevel@tonic-gate {
2017c478bd9Sstevel@tonic-gate 	Rt_map	rtmap;
2027c478bd9Sstevel@tonic-gate 
2037c478bd9Sstevel@tonic-gate 	if (addr) {
2047c478bd9Sstevel@tonic-gate 		if (mdb_vread(&rtmap, sizeof (Rt_map), addr) == -1) {
2057c478bd9Sstevel@tonic-gate 			mdb_warn(MSG_ORIG(MSG_ERR_READ),
2067c478bd9Sstevel@tonic-gate 			    MSG_ORIG(MSG_RTMAP_STR), addr);
2077c478bd9Sstevel@tonic-gate 			return (0);
2087c478bd9Sstevel@tonic-gate 		}
2097c478bd9Sstevel@tonic-gate 		return (String((uintptr_t)NAME(&rtmap),
2107c478bd9Sstevel@tonic-gate 		    MSG_ORIG(MSG_STR_NAME)));
2117c478bd9Sstevel@tonic-gate 	}
2127c478bd9Sstevel@tonic-gate 	return ((char *)MSG_ORIG(MSG_STR_EMPTY));
2137c478bd9Sstevel@tonic-gate }
2147c478bd9Sstevel@tonic-gate 
2157c478bd9Sstevel@tonic-gate void
dcmd_Bind_help(void)2167c478bd9Sstevel@tonic-gate dcmd_Bind_help(void)
2177c478bd9Sstevel@tonic-gate {
2187c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_BND_HELP));
2197c478bd9Sstevel@tonic-gate }
2207c478bd9Sstevel@tonic-gate 
2217c478bd9Sstevel@tonic-gate static int
2227c478bd9Sstevel@tonic-gate /* ARGSUSED2 */
dcmd_Bind(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)2237c478bd9Sstevel@tonic-gate dcmd_Bind(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
2247c478bd9Sstevel@tonic-gate {
2257c478bd9Sstevel@tonic-gate 	Bnd_desc	bnd;
2267c478bd9Sstevel@tonic-gate 	char		*str;
2277c478bd9Sstevel@tonic-gate 
2287c478bd9Sstevel@tonic-gate 	/*
2297c478bd9Sstevel@tonic-gate 	 * Insure we have a valid address.
2307c478bd9Sstevel@tonic-gate 	 */
2317c478bd9Sstevel@tonic-gate 	if ((flags & DCMD_ADDRSPEC) == 0) {
2327c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_BND_STR));
2337c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
2347c478bd9Sstevel@tonic-gate 	}
2357c478bd9Sstevel@tonic-gate 
2367c478bd9Sstevel@tonic-gate 	/*
2377c478bd9Sstevel@tonic-gate 	 * Obtain the binding descriptor.
2387c478bd9Sstevel@tonic-gate 	 */
2397c478bd9Sstevel@tonic-gate 	if (mdb_vread(&bnd, sizeof (Bnd_desc), addr) == -1) {
2407c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_BND_STR), addr);
2417c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
2427c478bd9Sstevel@tonic-gate 	}
2437c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_BND_TITLE), addr);
2447c478bd9Sstevel@tonic-gate 
2457c478bd9Sstevel@tonic-gate 	/*
2467c478bd9Sstevel@tonic-gate 	 * Establish the identity of the caller.
2477c478bd9Sstevel@tonic-gate 	 */
2487c478bd9Sstevel@tonic-gate 	if ((str = Rtmap_Name((uintptr_t)bnd.b_caller)) == 0)
2497c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
2507c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_BND_LINE1), bnd.b_caller, str);
2517c478bd9Sstevel@tonic-gate 
2527c478bd9Sstevel@tonic-gate 	/*
2537c478bd9Sstevel@tonic-gate 	 * Establish the identity of the dependency.
2547c478bd9Sstevel@tonic-gate 	 */
2557c478bd9Sstevel@tonic-gate 	if ((str = Rtmap_Name((uintptr_t)bnd.b_depend)) == 0)
2567c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
2577c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_BND_LINE2), bnd.b_depend, str);
2587c478bd9Sstevel@tonic-gate 
2597c478bd9Sstevel@tonic-gate 	/*
2607c478bd9Sstevel@tonic-gate 	 * Display any flags.
2617c478bd9Sstevel@tonic-gate 	 */
2627c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_BND_LINE3), bnd.b_flags, bnd.b_flags,
2637c478bd9Sstevel@tonic-gate 	    bndflags_bits);
2647c478bd9Sstevel@tonic-gate 
2657c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
2667c478bd9Sstevel@tonic-gate }
2677c478bd9Sstevel@tonic-gate 
2687c478bd9Sstevel@tonic-gate static void
dcmd_Depends_help(void)2697c478bd9Sstevel@tonic-gate dcmd_Depends_help(void)
2707c478bd9Sstevel@tonic-gate {
2717c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_DEPENDS_HELP));
2727c478bd9Sstevel@tonic-gate }
2737c478bd9Sstevel@tonic-gate 
2747c478bd9Sstevel@tonic-gate static int
Depends(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv,uint_t flg,const char * msg)2757c478bd9Sstevel@tonic-gate Depends(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv,
2767c478bd9Sstevel@tonic-gate     uint_t flg, const char *msg)
2777c478bd9Sstevel@tonic-gate {
278cce0e03bSab 	APlist		apl;
27957ef7aa9SRod Evans 	uintptr_t	datap, nitems;
28056deab07SRod Evans 	Bnd_desc	*bdp;
2817c478bd9Sstevel@tonic-gate 
2827c478bd9Sstevel@tonic-gate 	/*
283cce0e03bSab 	 * Obtain the APlist and determine its number of elements and those
2847c478bd9Sstevel@tonic-gate 	 * that are in use.
2857c478bd9Sstevel@tonic-gate 	 */
286cce0e03bSab 	if (mdb_vread(&apl, sizeof (APlist), addr) == -1) {
287cce0e03bSab 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST),
288cce0e03bSab 		    addr);
2897247f888Srie 		return (DCMD_ERR);
2907c478bd9Sstevel@tonic-gate 	}
2917c478bd9Sstevel@tonic-gate 
292cce0e03bSab 	mdb_printf(msg, addr, (size_t)apl.apl_nitems,
293cce0e03bSab 	    (size_t)apl.apl_arritems);
2947c478bd9Sstevel@tonic-gate 
295cce0e03bSab 	if (((flg & RTLD_FLG_VERBOSE) == 0) || (apl.apl_nitems == 0))
2967c478bd9Sstevel@tonic-gate 		return (DCMD_OK);
2977c478bd9Sstevel@tonic-gate 
2987c478bd9Sstevel@tonic-gate 	/*
299cce0e03bSab 	 * Under verbose mode print the name of each dependency.  An APlist can
3007c478bd9Sstevel@tonic-gate 	 * have a variable number of data items, so read each individual entry.
3017c478bd9Sstevel@tonic-gate 	 */
30257ef7aa9SRod Evans 	datap = APLIST_OFF_DATA + (uintptr_t)addr;
30357ef7aa9SRod Evans 	if (mdb_vread(&bdp, sizeof (Bnd_desc *), datap) == -1) {
3047c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ),
30557ef7aa9SRod Evans 		    MSG_ORIG(MSG_BNDDESC_STR), datap);
3067c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
3077c478bd9Sstevel@tonic-gate 	}
3087c478bd9Sstevel@tonic-gate 
30980148899SSurya Prakki 	(void) mdb_inc_indent(4);
3107c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
3117c478bd9Sstevel@tonic-gate 
3127c478bd9Sstevel@tonic-gate 	if (dcmd_Bind((uintptr_t)bdp, flags, argc, argv) == DCMD_ERR) {
31380148899SSurya Prakki 		(void) mdb_dec_indent(4);
3147c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
3157c478bd9Sstevel@tonic-gate 	}
3167c478bd9Sstevel@tonic-gate 
31757ef7aa9SRod Evans 	for (nitems = 1; nitems < apl.apl_nitems; nitems++) {
31857ef7aa9SRod Evans 		datap += sizeof (void *);
31957ef7aa9SRod Evans 		if (mdb_vread(&bdp, sizeof (Bnd_desc *), datap) == -1) {
3207c478bd9Sstevel@tonic-gate 			mdb_warn(MSG_ORIG(MSG_ERR_READ),
32157ef7aa9SRod Evans 			    MSG_ORIG(MSG_BNDDESC_STR), datap);
3227c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
3237c478bd9Sstevel@tonic-gate 		}
3247c478bd9Sstevel@tonic-gate 
3257c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_STR_DASHES));
3267c478bd9Sstevel@tonic-gate 		if (dcmd_Bind((uintptr_t)bdp, flags, argc, argv) == DCMD_ERR) {
32780148899SSurya Prakki 			(void) mdb_dec_indent(4);
3287c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
3297c478bd9Sstevel@tonic-gate 		}
3307c478bd9Sstevel@tonic-gate 	}
33180148899SSurya Prakki 	(void) mdb_dec_indent(4);
3327c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
3337c478bd9Sstevel@tonic-gate }
3347c478bd9Sstevel@tonic-gate 
3357c478bd9Sstevel@tonic-gate static int
dcmd_Depends(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)3367c478bd9Sstevel@tonic-gate dcmd_Depends(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3377c478bd9Sstevel@tonic-gate {
3387c478bd9Sstevel@tonic-gate 	Rt_map		rtmap;
3397c478bd9Sstevel@tonic-gate 	char		*str;
3407c478bd9Sstevel@tonic-gate 	uint_t		flg = 0;
3417c478bd9Sstevel@tonic-gate 
3427c478bd9Sstevel@tonic-gate 	/*
3437c478bd9Sstevel@tonic-gate 	 * Insure we have a valid address, and provide for a -v option.
3447c478bd9Sstevel@tonic-gate 	 */
3457c478bd9Sstevel@tonic-gate 	if ((flags & DCMD_ADDRSPEC) == 0) {
3467c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_DEPENDS_STR));
3477c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
3487c478bd9Sstevel@tonic-gate 	}
3497c478bd9Sstevel@tonic-gate 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE,
3507c478bd9Sstevel@tonic-gate 	    &flg, NULL) != argc)
3517c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
3527c478bd9Sstevel@tonic-gate 
3537c478bd9Sstevel@tonic-gate 	/*
3547c478bd9Sstevel@tonic-gate 	 * Read the Rt_map contents.
3557c478bd9Sstevel@tonic-gate 	 */
3567c478bd9Sstevel@tonic-gate 	if (mdb_vread(&rtmap, sizeof (Rt_map), addr) == -1) {
3577c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_RTMAP_STR), addr);
3587c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
3597c478bd9Sstevel@tonic-gate 	}
3607c478bd9Sstevel@tonic-gate 	if ((str = String((uintptr_t)NAME(&rtmap),
3617c478bd9Sstevel@tonic-gate 	    MSG_ORIG(MSG_STR_NAME))) == 0)
3627c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
3637c478bd9Sstevel@tonic-gate 
3647c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_DEPENDS_LINE1), str);
3657c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
3667c478bd9Sstevel@tonic-gate 
367cce0e03bSab 	if (DEPENDS(&rtmap) == NULL)
3687c478bd9Sstevel@tonic-gate 		return (DCMD_OK);
3697c478bd9Sstevel@tonic-gate 
3707c478bd9Sstevel@tonic-gate 	return (Depends((uintptr_t)DEPENDS(&rtmap), flags, argc, argv, flg,
3717c478bd9Sstevel@tonic-gate 	    MSG_ORIG(MSG_DEPENDS_LINE2)));
3727c478bd9Sstevel@tonic-gate }
3737c478bd9Sstevel@tonic-gate 
3747c478bd9Sstevel@tonic-gate static void
dcmd_Callers_help(void)3757c478bd9Sstevel@tonic-gate dcmd_Callers_help(void)
3767c478bd9Sstevel@tonic-gate {
3777c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_CALLERS_HELP));
3787c478bd9Sstevel@tonic-gate }
3797c478bd9Sstevel@tonic-gate 
3807c478bd9Sstevel@tonic-gate static int
dcmd_Callers(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)3817c478bd9Sstevel@tonic-gate dcmd_Callers(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3827c478bd9Sstevel@tonic-gate {
3837c478bd9Sstevel@tonic-gate 	Rt_map		rtmap;
3847c478bd9Sstevel@tonic-gate 	char		*str;
3857c478bd9Sstevel@tonic-gate 	uint_t		flg = 0;
3867c478bd9Sstevel@tonic-gate 
3877c478bd9Sstevel@tonic-gate 	/*
3887c478bd9Sstevel@tonic-gate 	 * Insure we have a valid address, and provide for a -v option.
3897c478bd9Sstevel@tonic-gate 	 */
3907c478bd9Sstevel@tonic-gate 	if ((flags & DCMD_ADDRSPEC) == 0) {
3917c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_DEPENDS_STR));
3927c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
3937c478bd9Sstevel@tonic-gate 	}
3947c478bd9Sstevel@tonic-gate 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE,
3957c478bd9Sstevel@tonic-gate 	    &flg, NULL) != argc)
3967c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
3977c478bd9Sstevel@tonic-gate 
3987c478bd9Sstevel@tonic-gate 	/*
3997c478bd9Sstevel@tonic-gate 	 * Read the Rt_map contents.
4007c478bd9Sstevel@tonic-gate 	 */
4017c478bd9Sstevel@tonic-gate 	if (mdb_vread(&rtmap, sizeof (Rt_map), addr) == -1) {
4027c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_RTMAP_STR), addr);
4037c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
4047c478bd9Sstevel@tonic-gate 	}
4057c478bd9Sstevel@tonic-gate 	if ((str = String((uintptr_t)NAME(&rtmap),
4067c478bd9Sstevel@tonic-gate 	    MSG_ORIG(MSG_STR_NAME))) == 0)
4077c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
4087c478bd9Sstevel@tonic-gate 
4097c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_CALLERS_LINE1), str);
4107c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
4117c478bd9Sstevel@tonic-gate 
412cce0e03bSab 	if (CALLERS(&rtmap) == NULL)
4137c478bd9Sstevel@tonic-gate 		return (DCMD_OK);
4147c478bd9Sstevel@tonic-gate 
4157c478bd9Sstevel@tonic-gate 	return (Depends((uintptr_t)CALLERS(&rtmap), flags, argc, argv, flg,
4167c478bd9Sstevel@tonic-gate 	    MSG_ORIG(MSG_CALLERS_LINE2)));
4177c478bd9Sstevel@tonic-gate }
4187c478bd9Sstevel@tonic-gate 
4197c478bd9Sstevel@tonic-gate void
dcmd_rtmap_help(void)4207c478bd9Sstevel@tonic-gate dcmd_rtmap_help(void)
4217c478bd9Sstevel@tonic-gate {
4227c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_HELP));
4237c478bd9Sstevel@tonic-gate }
4247c478bd9Sstevel@tonic-gate 
4257c478bd9Sstevel@tonic-gate static int
4267c478bd9Sstevel@tonic-gate /* ARGSUSED2 */
dcmd_rtmap(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)4277c478bd9Sstevel@tonic-gate dcmd_rtmap(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
4287c478bd9Sstevel@tonic-gate {
4297c478bd9Sstevel@tonic-gate 	Rt_map		rtmap;
4307c478bd9Sstevel@tonic-gate 	char		*str;
4317c478bd9Sstevel@tonic-gate 
4327c478bd9Sstevel@tonic-gate 	if ((flags & DCMD_ADDRSPEC) == 0) {
4337c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_RTMAP_STR));
4347c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
4357c478bd9Sstevel@tonic-gate 	}
4367c478bd9Sstevel@tonic-gate 
4377c478bd9Sstevel@tonic-gate 	if (mdb_vread(&rtmap, sizeof (Rt_map), addr) == -1) {
4387c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_RTMAP_STR), addr);
4397c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
4407c478bd9Sstevel@tonic-gate 	}
4417c478bd9Sstevel@tonic-gate 
4427c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_TITLE), addr);
4437c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
4447c478bd9Sstevel@tonic-gate 
4457c478bd9Sstevel@tonic-gate 	/*
4467c478bd9Sstevel@tonic-gate 	 * Determine the objects name.  NAME() is the name by which the object
4477c478bd9Sstevel@tonic-gate 	 * has been opened, typically from adding a search path to a file name.
4487c478bd9Sstevel@tonic-gate 	 * PATHNAME() is the fully resolve name, which is displayed by the proc
4497c478bd9Sstevel@tonic-gate 	 * tools and debuggers.  If the two names differ, print the PATHNAME().
4507c478bd9Sstevel@tonic-gate 	 */
4517c478bd9Sstevel@tonic-gate 	if ((str = String((uintptr_t)NAME(&rtmap),
4527c478bd9Sstevel@tonic-gate 	    MSG_ORIG(MSG_STR_NAME))) == 0)
4537c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
4547c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE1), str);
4557c478bd9Sstevel@tonic-gate 	if (NAME(&rtmap) != PATHNAME(&rtmap)) {
4567c478bd9Sstevel@tonic-gate 		if ((str = String((uintptr_t)PATHNAME(&rtmap),
4577c478bd9Sstevel@tonic-gate 		    MSG_ORIG(MSG_STR_PATHNAME))) == 0)
4587c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
4597c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_RTMAP_LINE2), str);
4607c478bd9Sstevel@tonic-gate 	}
4617c478bd9Sstevel@tonic-gate 
4627c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE3), ADDR(&rtmap), DYN(&rtmap));
4637c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE4), NEXT(&rtmap), PREV(&rtmap));
4647c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE5), rtmap.rt_fct, TLSMODID(&rtmap));
4657c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE6), INIT(&rtmap), FINI(&rtmap));
4667c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE7), GROUPS(&rtmap), HANDLES(&rtmap));
4677c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE8), DEPENDS(&rtmap), CALLERS(&rtmap));
4687c478bd9Sstevel@tonic-gate 
4697c478bd9Sstevel@tonic-gate 	if ((str = String((uintptr_t)REFNAME(&rtmap),
4707c478bd9Sstevel@tonic-gate 	    MSG_ORIG(MSG_STR_REFNAME))) == 0)
4717c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
4727c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE9), DYNINFO(&rtmap), str);
4737c478bd9Sstevel@tonic-gate 
4747c478bd9Sstevel@tonic-gate 	if ((str = String((uintptr_t)RPATH(&rtmap),
4757c478bd9Sstevel@tonic-gate 	    MSG_ORIG(MSG_STR_RPATH))) == 0)
4767c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
4777c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE10), RLIST(&rtmap), str);
4787c478bd9Sstevel@tonic-gate 
4797c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE11), LIST(&rtmap), LIST(&rtmap));
4807c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE12), FLAGS(&rtmap));
4817c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE20), FLAGS(&rtmap), rtflags_bits);
4827c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE13), FLAGS1(&rtmap));
4837c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE20), FLAGS1(&rtmap), rtflags1_bits);
48456deab07SRod Evans 	if (AFLAGS(&rtmap)) {
48556deab07SRod Evans 		mdb_printf(MSG_ORIG(MSG_RTMAP_LINE14), AFLAGS(&rtmap));
48656deab07SRod Evans 		mdb_printf(MSG_ORIG(MSG_RTMAP_LINE20), AFLAGS(&rtmap),
48756deab07SRod Evans 		    rtaflags_bits);
48856deab07SRod Evans 	}
48956deab07SRod Evans 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE15), MODE(&rtmap));
4907c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAP_LINE20), MODE(&rtmap), rtmode_bits);
4917c478bd9Sstevel@tonic-gate 
4927c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
4937c478bd9Sstevel@tonic-gate }
4947c478bd9Sstevel@tonic-gate 
4957c478bd9Sstevel@tonic-gate static int
rtmap_format(uintptr_t addr,const void * data,void * private)49656deab07SRod Evans rtmap_format(uintptr_t addr, const void *data, void *private)
4977c478bd9Sstevel@tonic-gate {
4987c478bd9Sstevel@tonic-gate 	const Rt_map	*lmp = (const Rt_map *)data;
4997c478bd9Sstevel@tonic-gate 	W_desc		*wdp = (W_desc *)private;
5007c478bd9Sstevel@tonic-gate 	char		*str;
5017c478bd9Sstevel@tonic-gate 
5027c478bd9Sstevel@tonic-gate 	if (wdp && (wdp->w_flags & RTLD_FLG_VERBOSE)) {
5037c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_STR_DASHES));
50480148899SSurya Prakki 		(void) mdb_call_dcmd(
505*67d74cc3SToomas Soome 		    MSG_ORIG(MSG_RTMAP_STR), addr, DCMD_ADDRSPEC, 0, NULL);
5067c478bd9Sstevel@tonic-gate 		return (0);
5077c478bd9Sstevel@tonic-gate 	}
5087c478bd9Sstevel@tonic-gate 
5097c478bd9Sstevel@tonic-gate 	if ((str = String((uintptr_t)NAME(lmp),
5107c478bd9Sstevel@tonic-gate 	    MSG_ORIG(MSG_STR_NAME))) == 0)
5117c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
5127c478bd9Sstevel@tonic-gate 
5137c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_FMT_RT), CNTL(lmp), addr, ADDR(lmp), str);
5147c478bd9Sstevel@tonic-gate 	return (0);
5157c478bd9Sstevel@tonic-gate }
5167c478bd9Sstevel@tonic-gate 
5177c478bd9Sstevel@tonic-gate void
dcmd_Rtmaps_help(void)5187c478bd9Sstevel@tonic-gate dcmd_Rtmaps_help(void)
5197c478bd9Sstevel@tonic-gate {
5207c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_RTMAPS_HELP));
5217c478bd9Sstevel@tonic-gate }
5227c478bd9Sstevel@tonic-gate 
5237c478bd9Sstevel@tonic-gate static int
dcmd_Rtmaps(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)5247c478bd9Sstevel@tonic-gate dcmd_Rtmaps(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
5257c478bd9Sstevel@tonic-gate {
5267c478bd9Sstevel@tonic-gate 	uint_t		flg = 0;
5277c478bd9Sstevel@tonic-gate 	GElf_Sym	gsym;
52857ef7aa9SRod Evans 	APlist		*aplp, apl;
52957ef7aa9SRod Evans 	uintptr_t	datap, nitems;
5307c478bd9Sstevel@tonic-gate 	const char	*str;
5317c478bd9Sstevel@tonic-gate 	W_desc		wdesc;
5327c478bd9Sstevel@tonic-gate 
5337c478bd9Sstevel@tonic-gate 	/*
5347c478bd9Sstevel@tonic-gate 	 * '-v' - Verbose output of rtmap
5357c478bd9Sstevel@tonic-gate 	 */
5367c478bd9Sstevel@tonic-gate 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE,
5377c478bd9Sstevel@tonic-gate 	    &flg, NULL) != argc)
5387c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
5397c478bd9Sstevel@tonic-gate 
5407c478bd9Sstevel@tonic-gate 	/*
5417c478bd9Sstevel@tonic-gate 	 * If an address was provided use it.
5427c478bd9Sstevel@tonic-gate 	 */
5437c478bd9Sstevel@tonic-gate 	if (flags & DCMD_ADDRSPEC) {
5447c478bd9Sstevel@tonic-gate 		if (((flags & DCMD_LOOPFIRST) || !(flags & DCMD_LOOP)) &&
5457c478bd9Sstevel@tonic-gate 		    !(flg & RTLD_FLG_VERBOSE)) {
5467c478bd9Sstevel@tonic-gate 			mdb_printf(MSG_ORIG(MSG_RTMAPS_TITLE0));
5477c478bd9Sstevel@tonic-gate 			mdb_printf(MSG_ORIG(MSG_STR_DASHES));
5487c478bd9Sstevel@tonic-gate 		}
5497c478bd9Sstevel@tonic-gate 
5507c478bd9Sstevel@tonic-gate 		wdesc.w_flags = flg;
5517c478bd9Sstevel@tonic-gate 		if (mdb_pwalk(MSG_ORIG(MSG_RTMAPS_STR), rtmap_format,
5527c478bd9Sstevel@tonic-gate 		    (void *)&wdesc, addr) == -1)
5537c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
5547c478bd9Sstevel@tonic-gate 		return (DCMD_OK);
5557c478bd9Sstevel@tonic-gate 	}
5567c478bd9Sstevel@tonic-gate 
5577c478bd9Sstevel@tonic-gate 	/*
5587c478bd9Sstevel@tonic-gate 	 * Otherwise traverse the dynlm_list and display each link-map.
5597c478bd9Sstevel@tonic-gate 	 */
5607c478bd9Sstevel@tonic-gate 	if (mdb_lookup_by_obj(MSG_ORIG(MSG_STR_LDSO1),
5617c478bd9Sstevel@tonic-gate 	    MSG_ORIG(MSG_STR_DYNLMLIST), &gsym) == -1) {
5627c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_SYMFAILED), MSG_ORIG(MSG_STR_LDSO1),
5637c478bd9Sstevel@tonic-gate 		    MSG_ORIG(MSG_STR_DYNLMLIST));
5647c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
5657c478bd9Sstevel@tonic-gate 	}
56657ef7aa9SRod Evans 	if (mdb_vread(&aplp, sizeof (APlist *),
56757ef7aa9SRod Evans 	    (uintptr_t)gsym.st_value) == -1) {
56857ef7aa9SRod Evans 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST),
5697c478bd9Sstevel@tonic-gate 		    gsym.st_value);
5707c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
5717c478bd9Sstevel@tonic-gate 	}
5727c478bd9Sstevel@tonic-gate 
57357ef7aa9SRod Evans 	if (aplp == NULL) {
57457ef7aa9SRod Evans 		mdb_printf(MSG_ORIG(MSG_LMLIST_TITLE0),
57557ef7aa9SRod Evans 		    MSG_ORIG(MSG_STR_DYNLMLIST));
57657ef7aa9SRod Evans 		return (DCMD_OK);
57757ef7aa9SRod Evans 	}
57857ef7aa9SRod Evans 
57957ef7aa9SRod Evans 	if (mdb_vread(&apl, sizeof (APlist), (uintptr_t)aplp) == -1) {
58057ef7aa9SRod Evans 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST),
58157ef7aa9SRod Evans 		    aplp);
58257ef7aa9SRod Evans 	}
5837c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_LMLIST_TITLE1), MSG_ORIG(MSG_STR_DYNLMLIST),
58457ef7aa9SRod Evans 	    aplp, (size_t)apl.apl_nitems, (size_t)apl.apl_arritems);
5857c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
5867c478bd9Sstevel@tonic-gate 
5877c478bd9Sstevel@tonic-gate 	flags |= (DCMD_LOOP | DCMD_LOOPFIRST);
58857ef7aa9SRod Evans 	for (datap = (uintptr_t)aplp + APLIST_OFF_DATA, nitems = 0;
58957ef7aa9SRod Evans 	    nitems < apl.apl_nitems; nitems++, datap += sizeof (void *)) {
59057ef7aa9SRod Evans 		Lm_list	*lml, lm;
5917c478bd9Sstevel@tonic-gate 
59257ef7aa9SRod Evans 		if (mdb_vread(&lml, sizeof (Lm_list *), datap) == -1) {
5937c478bd9Sstevel@tonic-gate 			mdb_warn(MSG_ORIG(MSG_ERR_READ),
59457ef7aa9SRod Evans 			    MSG_ORIG(MSG_LMLIST_STR), datap);
5957c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
5967c478bd9Sstevel@tonic-gate 		}
59757ef7aa9SRod Evans 		if (mdb_vread(&lm, sizeof (Lm_list), (uintptr_t)lml) == -1) {
5987c478bd9Sstevel@tonic-gate 			mdb_warn(MSG_ORIG(MSG_ERR_READ),
59957ef7aa9SRod Evans 			    MSG_ORIG(MSG_LMLIST_STR), lml);
6007c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
6017c478bd9Sstevel@tonic-gate 		}
6027c478bd9Sstevel@tonic-gate 
60380148899SSurya Prakki 		(void) mdb_inc_indent(2);
60457ef7aa9SRod Evans 		if (lm.lm_flags & LML_FLG_BASELM)
6057c478bd9Sstevel@tonic-gate 			str = MSG_ORIG(MSG_LMLIST_BASE);
60657ef7aa9SRod Evans 		else if (lm.lm_flags & LML_FLG_RTLDLM)
6077c478bd9Sstevel@tonic-gate 			str = MSG_ORIG(MSG_LMLIST_LDSO);
6087c478bd9Sstevel@tonic-gate 		else
6097c478bd9Sstevel@tonic-gate 			str = MSG_ORIG(MSG_LMLIST_NEWLM);
6107c478bd9Sstevel@tonic-gate 
6117c478bd9Sstevel@tonic-gate 		if ((flags & DCMD_LOOP) && ((flags & DCMD_LOOPFIRST) == 0))
6127c478bd9Sstevel@tonic-gate 			mdb_printf(MSG_ORIG(MSG_STR_DASHES));
6137c478bd9Sstevel@tonic-gate 
61457ef7aa9SRod Evans 		mdb_printf(MSG_ORIG(MSG_LMLIST_TITLE2), datap, str);
6157c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_STR_DASHES));
6167c478bd9Sstevel@tonic-gate 
61780148899SSurya Prakki 		(void) mdb_inc_indent(2);
6187c478bd9Sstevel@tonic-gate 
6197c478bd9Sstevel@tonic-gate 		if (((flags & DCMD_LOOPFIRST) || !(flags & DCMD_LOOP)) &&
6207c478bd9Sstevel@tonic-gate 		    !(flg & RTLD_FLG_VERBOSE)) {
6217c478bd9Sstevel@tonic-gate 			mdb_printf(MSG_ORIG(MSG_RTMAPS_TITLE0));
6227c478bd9Sstevel@tonic-gate 			mdb_printf(MSG_ORIG(MSG_STR_DASHES));
6237c478bd9Sstevel@tonic-gate 		}
6247c478bd9Sstevel@tonic-gate 
6257c478bd9Sstevel@tonic-gate 		wdesc.w_flags = flg;
6267c478bd9Sstevel@tonic-gate 		if (mdb_pwalk(MSG_ORIG(MSG_RTMAPS_STR), rtmap_format,
62757ef7aa9SRod Evans 		    (void *)&wdesc, (uintptr_t)lm.lm_head) == -1) {
62880148899SSurya Prakki 			(void) mdb_dec_indent(4);
6297c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
6307c478bd9Sstevel@tonic-gate 		}
63180148899SSurya Prakki 		(void) mdb_dec_indent(4);
6327c478bd9Sstevel@tonic-gate 		flags &= ~DCMD_LOOPFIRST;
6337c478bd9Sstevel@tonic-gate 	}
6347c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
6357c478bd9Sstevel@tonic-gate }
6367c478bd9Sstevel@tonic-gate 
6377c478bd9Sstevel@tonic-gate void
dcmd_Setenv_help(void)6387c478bd9Sstevel@tonic-gate dcmd_Setenv_help(void)
6397c478bd9Sstevel@tonic-gate {
6407c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_SETENV_HELP));
6417c478bd9Sstevel@tonic-gate }
6427c478bd9Sstevel@tonic-gate 
6437c478bd9Sstevel@tonic-gate /*
6447c478bd9Sstevel@tonic-gate  * As of s10, mdb provides its own setenv command.  This command allows the
6457c478bd9Sstevel@tonic-gate  * environment of the process being controlled to be changed at any time.
6467c478bd9Sstevel@tonic-gate  * Prior to this, ld.so.1 provided it's own, more primitive implementation.
6477c478bd9Sstevel@tonic-gate  * This allowed for changing mdb's environment only, which if it was changed
6487c478bd9Sstevel@tonic-gate  * before the application ws executed, would be copied to the applications
6497c478bd9Sstevel@tonic-gate  * environment.  Thus, we could start mdb, set an LD_ variable within its
6507c478bd9Sstevel@tonic-gate  * environment (which it's own ld.so.1 had already finished processing), and
6517c478bd9Sstevel@tonic-gate  * have this setting be inherited by the application.
6527c478bd9Sstevel@tonic-gate  */
6537c478bd9Sstevel@tonic-gate static int
6547c478bd9Sstevel@tonic-gate /* ARGSUSED */
dcmd_Setenv(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)6557c478bd9Sstevel@tonic-gate dcmd_Setenv(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
6567c478bd9Sstevel@tonic-gate {
6577c478bd9Sstevel@tonic-gate 	char	*str;
6587c478bd9Sstevel@tonic-gate 
6597c478bd9Sstevel@tonic-gate 	if (mdb_call_dcmd(MSG_ORIG(MSG_STR_SETENV), addr, flags, argc,
6607c478bd9Sstevel@tonic-gate 	    argv) == 0)
6617c478bd9Sstevel@tonic-gate 		return (DCMD_OK);
6627c478bd9Sstevel@tonic-gate 
6637c478bd9Sstevel@tonic-gate 	if (((flags & DCMD_ADDRSPEC) != 0) || (argc == 0) || (argc > 1) ||
6647c478bd9Sstevel@tonic-gate 	    (argv->a_type != MDB_TYPE_STRING))
6657c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
6667c478bd9Sstevel@tonic-gate 
6677c478bd9Sstevel@tonic-gate 	str = mdb_alloc((strlen(argv->a_un.a_str) + 1), UM_NOSLEEP);
6687c478bd9Sstevel@tonic-gate 	if (str == NULL)
6697c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
6707c478bd9Sstevel@tonic-gate 
6717c478bd9Sstevel@tonic-gate 	(void) strcpy(str, argv->a_un.a_str);
6727c478bd9Sstevel@tonic-gate 	(void) putenv(str);
6737c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
6747c478bd9Sstevel@tonic-gate }
6757c478bd9Sstevel@tonic-gate 
6767c478bd9Sstevel@tonic-gate /*
6777c478bd9Sstevel@tonic-gate  * Walk Rt_map lists
6787c478bd9Sstevel@tonic-gate  */
6797c478bd9Sstevel@tonic-gate static int
walk_rtmap_init(mdb_walk_state_t * wsp)6807c478bd9Sstevel@tonic-gate walk_rtmap_init(mdb_walk_state_t *wsp)
6817c478bd9Sstevel@tonic-gate {
682*67d74cc3SToomas Soome 	if (wsp->walk_addr == 0) {
6837c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_RTMAP_STR));
6847c478bd9Sstevel@tonic-gate 		return (WALK_ERR);
6857c478bd9Sstevel@tonic-gate 	}
6867c478bd9Sstevel@tonic-gate 	return (WALK_NEXT);
6877c478bd9Sstevel@tonic-gate }
6887c478bd9Sstevel@tonic-gate 
6897c478bd9Sstevel@tonic-gate static int
walk_rtmap_step(mdb_walk_state_t * wsp)6907c478bd9Sstevel@tonic-gate walk_rtmap_step(mdb_walk_state_t *wsp)
6917c478bd9Sstevel@tonic-gate {
6927c478bd9Sstevel@tonic-gate 	int	status;
6937c478bd9Sstevel@tonic-gate 	Rt_map	lmp;
6947c478bd9Sstevel@tonic-gate 
695*67d74cc3SToomas Soome 	if (wsp->walk_addr == 0)
6967c478bd9Sstevel@tonic-gate 		return (WALK_DONE);
6977c478bd9Sstevel@tonic-gate 	if (mdb_vread(&lmp, sizeof (Rt_map), wsp->walk_addr) == -1) {
6987c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ),
6997c478bd9Sstevel@tonic-gate 		    MSG_ORIG(MSG_RTMAP_STR), wsp->walk_addr);
7007c478bd9Sstevel@tonic-gate 		return (WALK_DONE);
7017c478bd9Sstevel@tonic-gate 	}
7027c478bd9Sstevel@tonic-gate 
7037c478bd9Sstevel@tonic-gate 	status = wsp->walk_callback(wsp->walk_addr, &lmp, wsp->walk_cbdata);
7047c478bd9Sstevel@tonic-gate 	wsp->walk_addr = (uintptr_t)(NEXT(&lmp));
7057c478bd9Sstevel@tonic-gate 	return (status);
7067c478bd9Sstevel@tonic-gate }
7077c478bd9Sstevel@tonic-gate 
7087c478bd9Sstevel@tonic-gate static const mdb_bitmask_t lml_flags_bit[] = {
7097c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_BASELM), LML_FLG_BASELM, LML_FLG_BASELM },
7107c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_RTLDLM), LML_FLG_RTLDLM, LML_FLG_RTLDLM },
7117c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_PLTREL), LML_FLG_PLTREL, LML_FLG_PLTREL },
7127c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_HOLDLOCK), LML_FLG_HOLDLOCK, LML_FLG_HOLDLOCK },
7137c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_ENVIRON), LML_FLG_ENVIRON, LML_FLG_ENVIRON },
7147c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_INTRPOSE), LML_FLG_INTRPOSE, LML_FLG_INTRPOSE },
7157c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_LOCAUDIT), LML_FLG_LOCAUDIT, LML_FLG_LOCAUDIT },
7167c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_LOADAVAIL), LML_FLG_LOADAVAIL, LML_FLG_LOADAVAIL },
7177c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_IGNRELERR), LML_FLG_IGNRELERR, LML_FLG_IGNRELERR },
7187c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_STARTREL), LML_FLG_STARTREL, LML_FLG_STARTREL },
719dffec89cSrie 	{ MSG_ORIG(MSG_LFL_ATEXIT), LML_FLG_ATEXIT, LML_FLG_ATEXIT },
720dffec89cSrie 	{ MSG_ORIG(MSG_LFL_OBJADDED), LML_FLG_OBJADDED, LML_FLG_OBJADDED },
721dffec89cSrie 	{ MSG_ORIG(MSG_LFL_OBJDELETED), LML_FLG_OBJDELETED,
722dffec89cSrie 	    LML_FLG_OBJDELETED },
723dffec89cSrie 	{ MSG_ORIG(MSG_LFL_OBJREEVAL), LML_FLG_OBJREEVAL, LML_FLG_OBJREEVAL },
72456deab07SRod Evans 	{ MSG_ORIG(MSG_LFL_INTRPOSETSORT), LML_FLG_INTRPOSETSORT,
72556deab07SRod Evans 	    LML_FLG_INTRPOSETSORT },
72656deab07SRod Evans 	{ MSG_ORIG(MSG_LFL_AUDITNOTIFY), LML_FLG_AUDITNOTIFY,
72756deab07SRod Evans 	    LML_FLG_AUDITNOTIFY },
72856deab07SRod Evans 	{ MSG_ORIG(MSG_LFL_GROUPSEXIST), LML_FLG_GROUPSEXIST,
72956deab07SRod Evans 	    LML_FLG_GROUPSEXIST },
7307c478bd9Sstevel@tonic-gate 
7317c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_TRC_LDDSTUB), LML_FLG_TRC_LDDSTUB,
7327c478bd9Sstevel@tonic-gate 	    LML_FLG_TRC_LDDSTUB },
7337c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_TRC_ENABLE), LML_FLG_TRC_ENABLE,
7347c478bd9Sstevel@tonic-gate 	    LML_FLG_TRC_ENABLE },
7357c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_TRC_WARN), LML_FLG_TRC_WARN, LML_FLG_TRC_WARN },
7367c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_TRC_VERBOSE), LML_FLG_TRC_VERBOSE,
7377c478bd9Sstevel@tonic-gate 	    LML_FLG_TRC_VERBOSE },
7387c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_TRC_SEARCH), LML_FLG_TRC_SEARCH,
7397c478bd9Sstevel@tonic-gate 	    LML_FLG_TRC_SEARCH },
7407c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_TRC_UNREF), LML_FLG_TRC_UNREF, LML_FLG_TRC_UNREF },
7417c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_TRC_UNUSED), LML_FLG_TRC_UNUSED,
7427c478bd9Sstevel@tonic-gate 	    LML_FLG_TRC_UNUSED },
7437c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LFL_TRC_INIT), LML_FLG_TRC_INIT, LML_FLG_TRC_INIT },
74456deab07SRod Evans 	{ MSG_ORIG(MSG_LFL_TRC_NOUNRESWEAK), LML_FLG_TRC_NOUNRESWEAK,
74556deab07SRod Evans 	    LML_FLG_TRC_NOUNRESWEAK },
74656deab07SRod Evans 	{ MSG_ORIG(MSG_LFL_TRC_NOPAREXT), LML_FLG_TRC_NOPAREXT,
74756deab07SRod Evans 	    LML_FLG_TRC_NOPAREXT },
7487c478bd9Sstevel@tonic-gate 	{ NULL, 0, 0}
7497c478bd9Sstevel@tonic-gate };
7507c478bd9Sstevel@tonic-gate 
7517c478bd9Sstevel@tonic-gate static const mdb_bitmask_t lml_tflags_bit[] = {
7527c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_NOLAZYLD), LML_TFLG_NOLAZYLD, LML_TFLG_NOLAZYLD },
7537c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_NODIRECT), LML_TFLG_NODIRECT, LML_TFLG_NODIRECT },
7542020b2b6SRod Evans 	{ MSG_ORIG(MSG_LTFL_NOAUDIT), LML_TFLG_NOAUDIT, LML_TFLG_NOAUDIT },
7557c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_LOADFLTR), LML_TFLG_LOADFLTR, LML_TFLG_LOADFLTR },
7567c478bd9Sstevel@tonic-gate 
7577c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_PREINIT), LML_TFLG_AUD_PREINIT,
7587c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_PREINIT },
7597c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_OBJSEARCH), LML_TFLG_AUD_OBJSEARCH,
7607c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_OBJSEARCH },
7617c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_OBJOPEN), LML_TFLG_AUD_OBJOPEN,
7627c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_OBJOPEN },
7637c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_OBJFILTER), LML_TFLG_AUD_OBJFILTER,
7647c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_OBJFILTER },
7657c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_OBJCLOSE), LML_TFLG_AUD_OBJCLOSE,
7667c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_OBJCLOSE },
7677c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_SYMBIND), LML_TFLG_AUD_SYMBIND,
7687c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_SYMBIND },
7697c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_PLTENTER), LML_TFLG_AUD_PLTENTER,
7707c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_PLTENTER },
7717c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_PLTEXIT), LML_TFLG_AUD_PLTEXIT,
7727c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_PLTEXIT },
7737c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LTFL_AUD_ACTIVITY), LML_TFLG_AUD_ACTIVITY,
7747c478bd9Sstevel@tonic-gate 	    LML_TFLG_AUD_ACTIVITY },
7757c478bd9Sstevel@tonic-gate 	{ NULL, 0, 0}
7767c478bd9Sstevel@tonic-gate };
7777c478bd9Sstevel@tonic-gate 
7787c478bd9Sstevel@tonic-gate void
dcmd_Lm_list_help(void)7797c478bd9Sstevel@tonic-gate dcmd_Lm_list_help(void)
7807c478bd9Sstevel@tonic-gate {
7817c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_LMLIST_HELP));
7827c478bd9Sstevel@tonic-gate }
7837c478bd9Sstevel@tonic-gate 
7847c478bd9Sstevel@tonic-gate static int
7857c478bd9Sstevel@tonic-gate /* ARGSUSED1 */
_dcmd_Lm_list(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)7867c478bd9Sstevel@tonic-gate _dcmd_Lm_list(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
7877c478bd9Sstevel@tonic-gate {
7887c478bd9Sstevel@tonic-gate 	Lm_list		lml;
7897c478bd9Sstevel@tonic-gate 	const char	*str;
7907c478bd9Sstevel@tonic-gate 	uint_t		flg = 0;
7917c478bd9Sstevel@tonic-gate 
7927c478bd9Sstevel@tonic-gate 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE,
7937c478bd9Sstevel@tonic-gate 	    &flg, NULL) != argc)
7947c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
7957c478bd9Sstevel@tonic-gate 
7967c478bd9Sstevel@tonic-gate 	if (mdb_vread(&lml, sizeof (lml), addr) == -1) {
7977c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_LMLIST_STR),
7987c478bd9Sstevel@tonic-gate 		    addr);
7997c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
8007c478bd9Sstevel@tonic-gate 	}
8017c478bd9Sstevel@tonic-gate 
8027c478bd9Sstevel@tonic-gate 	if (lml.lm_flags & LML_FLG_BASELM)
8037c478bd9Sstevel@tonic-gate 		str = MSG_ORIG(MSG_LMLIST_BASE);
8047c478bd9Sstevel@tonic-gate 	else if (lml.lm_flags & LML_FLG_RTLDLM)
8057c478bd9Sstevel@tonic-gate 		str = MSG_ORIG(MSG_LMLIST_LDSO);
8067c478bd9Sstevel@tonic-gate 	else
8077c478bd9Sstevel@tonic-gate 		str = MSG_ORIG(MSG_LMLIST_NEWLM);
8087c478bd9Sstevel@tonic-gate 
8097c478bd9Sstevel@tonic-gate 	if ((flags & DCMD_LOOP) && ((flags & DCMD_LOOPFIRST) == 0))
8107c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_STR_DASHES));
8117c478bd9Sstevel@tonic-gate 
8127c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_LMLIST_TITLE2), addr, str);
8137c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
8147c478bd9Sstevel@tonic-gate 
8157c478bd9Sstevel@tonic-gate 	if (lml.lm_lists) {
8167c478bd9Sstevel@tonic-gate 		Alist		al;
8177c478bd9Sstevel@tonic-gate 		Lm_cntl		lmc;
81857ef7aa9SRod Evans 		uintptr_t	datap;
8197c478bd9Sstevel@tonic-gate 
8207c478bd9Sstevel@tonic-gate 		addr = (uintptr_t)lml.lm_lists;
8217c478bd9Sstevel@tonic-gate 		if (mdb_vread(&al, sizeof (Alist), addr) == -1) {
8227c478bd9Sstevel@tonic-gate 			mdb_warn(MSG_ORIG(MSG_ERR_READ),
8237c478bd9Sstevel@tonic-gate 			    MSG_ORIG(MSG_STR_ALIST), addr);
8247c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
8257c478bd9Sstevel@tonic-gate 		}
8267c478bd9Sstevel@tonic-gate 
8277c478bd9Sstevel@tonic-gate 		/*
8287c478bd9Sstevel@tonic-gate 		 * Determine whether the Alist has been populated.  Note, the
8297c478bd9Sstevel@tonic-gate 		 * implementation first reserves an alist entry, and initializes
8307c478bd9Sstevel@tonic-gate 		 * this element when the first link-map is processed.  Thus,
831cce0e03bSab 		 * there's a window when nitems is updated, but before the next
8327c478bd9Sstevel@tonic-gate 		 * element has been initialized.
8337c478bd9Sstevel@tonic-gate 		 */
834cce0e03bSab 		if (al.al_nitems && (flg & RTLD_FLG_VERBOSE)) {
83557ef7aa9SRod Evans 			datap = ALIST_OFF_DATA + (uintptr_t)addr;
8367c478bd9Sstevel@tonic-gate 
8377c478bd9Sstevel@tonic-gate 			if (mdb_vread(&lmc, sizeof (Lm_cntl),
83857ef7aa9SRod Evans 			    datap) == -1) {
8397c478bd9Sstevel@tonic-gate 				mdb_warn(MSG_ORIG(MSG_ERR_READ),
84057ef7aa9SRod Evans 				    MSG_ORIG(MSG_LMLIST_STR), datap);
8417c478bd9Sstevel@tonic-gate 				return (DCMD_ERR);
8427c478bd9Sstevel@tonic-gate 			}
8437c478bd9Sstevel@tonic-gate 		}
8447c478bd9Sstevel@tonic-gate 
845cce0e03bSab 		mdb_printf(MSG_ORIG(MSG_LMLIST_LINE0), addr,
846cce0e03bSab 		    (size_t)al.al_nitems, (size_t)al.al_arritems);
84780148899SSurya Prakki 		(void) mdb_inc_indent(2);
8487c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_STR_DASHES));
8497c478bd9Sstevel@tonic-gate 
850cce0e03bSab 		if (al.al_nitems && (flg & RTLD_FLG_VERBOSE)) {
85157ef7aa9SRod Evans 			uintptr_t	nitems;
8527c478bd9Sstevel@tonic-gate 
85380148899SSurya Prakki 			(void) mdb_inc_indent(2);
85457ef7aa9SRod Evans 			mdb_printf(MSG_ORIG(MSG_LMC_LINE1), datap);
8557c478bd9Sstevel@tonic-gate 			mdb_printf(MSG_ORIG(MSG_LMC_LINE2), lmc.lc_head,
8567c478bd9Sstevel@tonic-gate 			    lmc.lc_tail);
8577c478bd9Sstevel@tonic-gate 			mdb_printf(MSG_ORIG(MSG_LMC_LINE3), lmc.lc_flags,
8587c478bd9Sstevel@tonic-gate 			    lmc.lc_now);
8597c478bd9Sstevel@tonic-gate 			mdb_printf(MSG_ORIG(MSG_LMC_LINE4), lmc.lc_flags,
8607c478bd9Sstevel@tonic-gate 			    lmc_bits);
8617c478bd9Sstevel@tonic-gate 			mdb_printf(MSG_ORIG(MSG_STR_DASHES));
8627c478bd9Sstevel@tonic-gate 			mdb_printf(MSG_ORIG(MSG_RTMAPS_TITLE0));
8637c478bd9Sstevel@tonic-gate 			mdb_printf(MSG_ORIG(MSG_STR_DASHES));
8647c478bd9Sstevel@tonic-gate 
8657c478bd9Sstevel@tonic-gate 			if (lmc.lc_head) {
8667c478bd9Sstevel@tonic-gate 				if (mdb_pwalk(MSG_ORIG(MSG_RTMAPS_STR),
8677c478bd9Sstevel@tonic-gate 				    rtmap_format, (void *)0,
8687c478bd9Sstevel@tonic-gate 				    (uintptr_t)lmc.lc_head) == -1) {
86980148899SSurya Prakki 					(void) mdb_dec_indent(4);
8707c478bd9Sstevel@tonic-gate 					return (DCMD_ERR);
8717c478bd9Sstevel@tonic-gate 				}
8727c478bd9Sstevel@tonic-gate 			} else
8737c478bd9Sstevel@tonic-gate 				mdb_printf(MSG_ORIG(MSG_FMT_RT), 0, 0, 0,
8747c478bd9Sstevel@tonic-gate 				    MSG_ORIG(MSG_STR_EMPTY));
8757c478bd9Sstevel@tonic-gate 
8767c478bd9Sstevel@tonic-gate 			mdb_printf(MSG_ORIG(MSG_STR_DASHES));
8777c478bd9Sstevel@tonic-gate 
87857ef7aa9SRod Evans 			for (nitems = 1; nitems < al.al_nitems; nitems++) {
87957ef7aa9SRod Evans 				datap += al.al_size;
8807c478bd9Sstevel@tonic-gate 				if (mdb_vread(&lmc, sizeof (Lm_cntl),
88157ef7aa9SRod Evans 				    datap) == -1) {
8827c478bd9Sstevel@tonic-gate 					mdb_warn(MSG_ORIG(MSG_ERR_READ),
88357ef7aa9SRod Evans 					    MSG_ORIG(MSG_LMLIST_STR), datap);
88480148899SSurya Prakki 					(void) mdb_dec_indent(4);
8857c478bd9Sstevel@tonic-gate 					return (DCMD_ERR);
8867c478bd9Sstevel@tonic-gate 				}
8877c478bd9Sstevel@tonic-gate 
8887c478bd9Sstevel@tonic-gate 				mdb_printf(MSG_ORIG(MSG_STR_DASHES));
88957ef7aa9SRod Evans 				mdb_printf(MSG_ORIG(MSG_LMC_LINE1), datap);
8907c478bd9Sstevel@tonic-gate 				mdb_printf(MSG_ORIG(MSG_LMC_LINE2),
8917c478bd9Sstevel@tonic-gate 				    lmc.lc_head, lmc.lc_tail);
8927c478bd9Sstevel@tonic-gate 				mdb_printf(MSG_ORIG(MSG_LMC_LINE3),
8937c478bd9Sstevel@tonic-gate 				    lmc.lc_flags, lmc.lc_now);
8947c478bd9Sstevel@tonic-gate 				mdb_printf(MSG_ORIG(MSG_LMC_LINE4),
8957c478bd9Sstevel@tonic-gate 				    lmc.lc_flags, lmc_bits);
8967c478bd9Sstevel@tonic-gate 				mdb_printf(MSG_ORIG(MSG_STR_DASHES));
8977c478bd9Sstevel@tonic-gate 				mdb_printf(MSG_ORIG(MSG_RTMAPS_TITLE0));
8987c478bd9Sstevel@tonic-gate 				mdb_printf(MSG_ORIG(MSG_STR_DASHES));
8997c478bd9Sstevel@tonic-gate 
9007c478bd9Sstevel@tonic-gate 				if (lmc.lc_head) {
9017c478bd9Sstevel@tonic-gate 					if (mdb_pwalk(MSG_ORIG(MSG_RTMAPS_STR),
9027c478bd9Sstevel@tonic-gate 					    rtmap_format, (void *)0,
9037c478bd9Sstevel@tonic-gate 					    (uintptr_t)lmc.lc_head) == -1) {
90480148899SSurya Prakki 						(void) mdb_dec_indent(4);
9057c478bd9Sstevel@tonic-gate 						return (DCMD_ERR);
9067c478bd9Sstevel@tonic-gate 					}
9077c478bd9Sstevel@tonic-gate 				} else
9087c478bd9Sstevel@tonic-gate 					mdb_printf(MSG_ORIG(MSG_FMT_RT), 0, 0,
9097c478bd9Sstevel@tonic-gate 					    0, MSG_ORIG(MSG_STR_EMPTY));
9107c478bd9Sstevel@tonic-gate 
9117c478bd9Sstevel@tonic-gate 				mdb_printf(MSG_ORIG(MSG_STR_DASHES));
9127c478bd9Sstevel@tonic-gate 			}
91380148899SSurya Prakki 			(void) mdb_dec_indent(2);
9147c478bd9Sstevel@tonic-gate 		}
91580148899SSurya Prakki 		(void) mdb_dec_indent(2);
9167c478bd9Sstevel@tonic-gate 	}
9177c478bd9Sstevel@tonic-gate 
9187c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_LMLIST_LINE1), lml.lm_head, lml.lm_tail);
91910a4fa49Srie 	mdb_printf(MSG_ORIG(MSG_LMLIST_LINE2), lml.lm_alp, lml.lm_rti);
9207c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_LMLIST_LINE3), lml.lm_handle, lml.lm_obj,
9217c478bd9Sstevel@tonic-gate 	    lml.lm_init, lml.lm_lazy);
9227c478bd9Sstevel@tonic-gate 
9237c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_LMLIST_LINE4), lml.lm_flags);
9247c478bd9Sstevel@tonic-gate 	if (lml.lm_flags)
9257c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_LMLIST_LINE6), lml.lm_flags,
9267c478bd9Sstevel@tonic-gate 		    lml_flags_bit);
9277c478bd9Sstevel@tonic-gate 
9287c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_LMLIST_LINE5), lml.lm_tflags);
9297c478bd9Sstevel@tonic-gate 	if (lml.lm_tflags)
9307c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_LMLIST_LINE6), lml.lm_tflags,
9317c478bd9Sstevel@tonic-gate 		    lml_tflags_bit);
9327c478bd9Sstevel@tonic-gate 
9337c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
9347c478bd9Sstevel@tonic-gate }
9357c478bd9Sstevel@tonic-gate 
9367c478bd9Sstevel@tonic-gate static int
9377c478bd9Sstevel@tonic-gate /* ARGSUSED2 */
dcmd_Lm_list(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)9387c478bd9Sstevel@tonic-gate dcmd_Lm_list(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
9397c478bd9Sstevel@tonic-gate {
9407c478bd9Sstevel@tonic-gate 	GElf_Sym	gsym;
94157ef7aa9SRod Evans 	APlist		*aplp, apl;
94257ef7aa9SRod Evans 	uintptr_t	datap, nitems;
9437c478bd9Sstevel@tonic-gate 
9447c478bd9Sstevel@tonic-gate 	/*
9457c478bd9Sstevel@tonic-gate 	 * If an address was provided us it.
9467c478bd9Sstevel@tonic-gate 	 */
9477c478bd9Sstevel@tonic-gate 	if (flags & DCMD_ADDRSPEC)
9487c478bd9Sstevel@tonic-gate 		return (_dcmd_Lm_list(addr, flags, argc, argv));
9497c478bd9Sstevel@tonic-gate 
9507c478bd9Sstevel@tonic-gate 	/*
9517c478bd9Sstevel@tonic-gate 	 * Otherwise traverse the dynlm_list and display each link-map list.
9527c478bd9Sstevel@tonic-gate 	 */
9537c478bd9Sstevel@tonic-gate 	if (mdb_lookup_by_obj(MSG_ORIG(MSG_STR_LDSO1),
9547c478bd9Sstevel@tonic-gate 	    MSG_ORIG(MSG_STR_DYNLMLIST), &gsym) == -1) {
9557c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_SYMFAILED), MSG_ORIG(MSG_STR_LDSO1),
9567247f888Srie 		    MSG_ORIG(MSG_STR_DYNLMLIST));
9577c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
9587c478bd9Sstevel@tonic-gate 	}
95957ef7aa9SRod Evans 	if (mdb_vread(&aplp, sizeof (APlist *),
96057ef7aa9SRod Evans 	    (uintptr_t)gsym.st_value) == -1) {
96157ef7aa9SRod Evans 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST),
9627c478bd9Sstevel@tonic-gate 		    gsym.st_value);
9637c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
9647c478bd9Sstevel@tonic-gate 	}
96557ef7aa9SRod Evans 	if (aplp == NULL) {
96657ef7aa9SRod Evans 		mdb_printf(MSG_ORIG(MSG_LMLIST_TITLE0),
96757ef7aa9SRod Evans 		    MSG_ORIG(MSG_STR_DYNLMLIST));
96857ef7aa9SRod Evans 		return (DCMD_OK);
96957ef7aa9SRod Evans 	}
97057ef7aa9SRod Evans 
97157ef7aa9SRod Evans 	if (mdb_vread(&apl, sizeof (APlist), (uintptr_t)aplp) == -1) {
97257ef7aa9SRod Evans 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST),
97357ef7aa9SRod Evans 		    aplp);
97457ef7aa9SRod Evans 		return (DCMD_ERR);
97557ef7aa9SRod Evans 	}
9767c478bd9Sstevel@tonic-gate 
9777c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_LMLIST_TITLE1), MSG_ORIG(MSG_STR_DYNLMLIST),
97857ef7aa9SRod Evans 	    aplp, (size_t)apl.apl_nitems, (size_t)apl.apl_arritems);
9797c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
9807c478bd9Sstevel@tonic-gate 
9817c478bd9Sstevel@tonic-gate 	flags |= (DCMD_LOOP | DCMD_LOOPFIRST);
98257ef7aa9SRod Evans 	for (datap = (uintptr_t)aplp + APLIST_OFF_DATA, nitems = 0;
98357ef7aa9SRod Evans 	    nitems < apl.apl_nitems; nitems++, datap += sizeof (void *)) {
98457ef7aa9SRod Evans 		Lm_list	*lml;
98557ef7aa9SRod Evans 
98657ef7aa9SRod Evans 		if (mdb_vread(&lml, sizeof (Lm_list *), datap) == -1) {
9877c478bd9Sstevel@tonic-gate 			mdb_warn(MSG_ORIG(MSG_ERR_READ),
98857ef7aa9SRod Evans 			    MSG_ORIG(MSG_LMLIST_STR), datap);
9897c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
9907c478bd9Sstevel@tonic-gate 		}
9917c478bd9Sstevel@tonic-gate 
99280148899SSurya Prakki 		(void) mdb_inc_indent(2);
99357ef7aa9SRod Evans 		if (_dcmd_Lm_list((uintptr_t)lml, flags, argc,
99457ef7aa9SRod Evans 		    argv) == DCMD_ERR) {
99580148899SSurya Prakki 			(void) mdb_dec_indent(2);
9967c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
9977c478bd9Sstevel@tonic-gate 		}
99880148899SSurya Prakki 		(void) mdb_dec_indent(2);
9997c478bd9Sstevel@tonic-gate 		flags &= ~DCMD_LOOPFIRST;
10007c478bd9Sstevel@tonic-gate 	}
10017c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
10027c478bd9Sstevel@tonic-gate }
10037c478bd9Sstevel@tonic-gate 
10047c478bd9Sstevel@tonic-gate void
dcmd_GrpDesc_help(void)10057c478bd9Sstevel@tonic-gate dcmd_GrpDesc_help(void)
10067c478bd9Sstevel@tonic-gate {
10077c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_GRPDESC_HELP));
10087c478bd9Sstevel@tonic-gate }
10097c478bd9Sstevel@tonic-gate 
10107c478bd9Sstevel@tonic-gate static int
10117c478bd9Sstevel@tonic-gate /* ARGSUSED2 */
dcmd_GrpDesc(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)10127c478bd9Sstevel@tonic-gate dcmd_GrpDesc(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
10137c478bd9Sstevel@tonic-gate {
10147c478bd9Sstevel@tonic-gate 	Grp_desc	gd;
10157c478bd9Sstevel@tonic-gate 	char		*str;
10167c478bd9Sstevel@tonic-gate 
10177c478bd9Sstevel@tonic-gate 	/*
10187c478bd9Sstevel@tonic-gate 	 * Insure we have a valid address.
10197c478bd9Sstevel@tonic-gate 	 */
10207c478bd9Sstevel@tonic-gate 	if ((flags & DCMD_ADDRSPEC) == 0) {
10217c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_GRPDESC_STR));
10227c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
10237c478bd9Sstevel@tonic-gate 	}
10247c478bd9Sstevel@tonic-gate 
10257c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_GRPDESC_LINE1), addr);
10267c478bd9Sstevel@tonic-gate 	if (mdb_vread(&gd, sizeof (Grp_desc), addr) == -1) {
10277c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_GRPDESC_STR),
10287c478bd9Sstevel@tonic-gate 		    addr);
10297c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
10307c478bd9Sstevel@tonic-gate 	}
10317c478bd9Sstevel@tonic-gate 
10327c478bd9Sstevel@tonic-gate 	if ((str = Rtmap_Name((uintptr_t)gd.gd_depend)) == 0)
10337c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
10347c478bd9Sstevel@tonic-gate 
10357c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_GRPDESC_LINE2), gd.gd_depend, str);
10367c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_GRPDESC_LINE3), gd.gd_flags, gd.gd_flags,
10377c478bd9Sstevel@tonic-gate 	    grdflags_bits);
10387c478bd9Sstevel@tonic-gate 
10397c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
10407c478bd9Sstevel@tonic-gate }
10417c478bd9Sstevel@tonic-gate 
10427c478bd9Sstevel@tonic-gate void
dcmd_GrpHdl_help(void)10437c478bd9Sstevel@tonic-gate dcmd_GrpHdl_help(void)
10447c478bd9Sstevel@tonic-gate {
10457c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_GRPHDL_HELP));
10467c478bd9Sstevel@tonic-gate }
10477c478bd9Sstevel@tonic-gate 
10487c478bd9Sstevel@tonic-gate static int
10497c478bd9Sstevel@tonic-gate /* ARGSUSED2 */
dcmd_GrpHdl(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)10507c478bd9Sstevel@tonic-gate dcmd_GrpHdl(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
10517c478bd9Sstevel@tonic-gate {
10527c478bd9Sstevel@tonic-gate 	Grp_hdl		gh;
10537c478bd9Sstevel@tonic-gate 	Alist		al;
105457ef7aa9SRod Evans 	uintptr_t	datap, listidx;
10557c478bd9Sstevel@tonic-gate 	char		*str;
10567c478bd9Sstevel@tonic-gate 	uint_t		flg = 0;
10577c478bd9Sstevel@tonic-gate 
10587c478bd9Sstevel@tonic-gate 	/*
10597c478bd9Sstevel@tonic-gate 	 * Insure we have a valid address, and provide for a -v option.
10607c478bd9Sstevel@tonic-gate 	 */
10617c478bd9Sstevel@tonic-gate 	if ((flags & DCMD_ADDRSPEC) == 0) {
10627c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_GRPHDL_STR));
10637c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
10647c478bd9Sstevel@tonic-gate 	}
10657c478bd9Sstevel@tonic-gate 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE,
10667c478bd9Sstevel@tonic-gate 	    &flg, NULL) != argc)
10677c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
10687c478bd9Sstevel@tonic-gate 
10697c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_GRPHDL_LINE1), addr);
10707c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
10717c478bd9Sstevel@tonic-gate 
10727c478bd9Sstevel@tonic-gate 	if (mdb_vread(&gh, sizeof (Grp_hdl), addr) == -1) {
10737c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_GRPHDL_STR),
10747c478bd9Sstevel@tonic-gate 		    addr);
10757c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
10767c478bd9Sstevel@tonic-gate 	}
10777c478bd9Sstevel@tonic-gate 
10787c478bd9Sstevel@tonic-gate 	/*
10797c478bd9Sstevel@tonic-gate 	 * Determine the handles owner.  Note that an orphaned handle may no
10807c478bd9Sstevel@tonic-gate 	 * longer contain its originating owner.
10817c478bd9Sstevel@tonic-gate 	 */
10825aefb655Srie 	if (gh.gh_ownlmp) {
10835aefb655Srie 		if ((str = Rtmap_Name((uintptr_t)gh.gh_ownlmp)) == 0)
10847c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
10857c478bd9Sstevel@tonic-gate 	} else
10867c478bd9Sstevel@tonic-gate 		str = (char *)MSG_ORIG(MSG_STR_ORPHANED);
10877c478bd9Sstevel@tonic-gate 
10887c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_GRPHDL_LINE2), str);
10897c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_GRPHDL_LINE3), gh.gh_flags, gh.gh_flags,
10907c478bd9Sstevel@tonic-gate 	    grhflags_bits);
10917c478bd9Sstevel@tonic-gate 
10927c478bd9Sstevel@tonic-gate 	if (gh.gh_depends == 0) {
10937c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_GRPHDL_LINE4), gh.gh_refcnt);
10947c478bd9Sstevel@tonic-gate 		return (DCMD_OK);
10957c478bd9Sstevel@tonic-gate 	}
10967c478bd9Sstevel@tonic-gate 
10977c478bd9Sstevel@tonic-gate 	addr = (uintptr_t)gh.gh_depends;
10987c478bd9Sstevel@tonic-gate 	if (mdb_vread(&al, sizeof (Alist), addr) == -1) {
10997247f888Srie 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_ALIST), addr);
11007247f888Srie 		return (DCMD_ERR);
11017c478bd9Sstevel@tonic-gate 	}
11027c478bd9Sstevel@tonic-gate 
1103cce0e03bSab 	mdb_printf(MSG_ORIG(MSG_GRPHDL_LINE5), gh.gh_refcnt, addr,
1104cce0e03bSab 	    (size_t)al.al_nitems, (size_t)al.al_arritems);
11057c478bd9Sstevel@tonic-gate 
1106cce0e03bSab 	if (((flg & RTLD_FLG_VERBOSE) == 0) || (al.al_nitems == 0))
11077c478bd9Sstevel@tonic-gate 		return (DCMD_OK);
11087c478bd9Sstevel@tonic-gate 
110980148899SSurya Prakki 	(void) mdb_inc_indent(4);
11107c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
11117c478bd9Sstevel@tonic-gate 
11127c478bd9Sstevel@tonic-gate 	/*
11137c478bd9Sstevel@tonic-gate 	 * Under verbose mode print the name of each dependency.  An Alist can
11147c478bd9Sstevel@tonic-gate 	 * have a variable number of data items, so read each individual entry.
11157c478bd9Sstevel@tonic-gate 	 */
111657ef7aa9SRod Evans 	datap = ALIST_OFF_DATA + (uintptr_t)addr;
111757ef7aa9SRod Evans 	if (dcmd_GrpDesc(datap, flags, argc, argv) == DCMD_ERR) {
111880148899SSurya Prakki 		(void) mdb_dec_indent(4);
11197c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
11207c478bd9Sstevel@tonic-gate 	}
11217c478bd9Sstevel@tonic-gate 
1122cce0e03bSab 	for (listidx = 1; listidx < al.al_nitems; listidx++) {
112357ef7aa9SRod Evans 		datap += al.al_size;
11247c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_STR_DASHES));
112557ef7aa9SRod Evans 		if (dcmd_GrpDesc(datap, flags, argc, argv) == DCMD_ERR) {
112680148899SSurya Prakki 			(void) mdb_dec_indent(4);
11277c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
11287c478bd9Sstevel@tonic-gate 		}
11297c478bd9Sstevel@tonic-gate 	}
11307c478bd9Sstevel@tonic-gate 
113180148899SSurya Prakki 	(void) mdb_dec_indent(4);
11327c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
11337c478bd9Sstevel@tonic-gate }
11347c478bd9Sstevel@tonic-gate 
11357c478bd9Sstevel@tonic-gate static void
dcmd_Handles_help(void)11367c478bd9Sstevel@tonic-gate dcmd_Handles_help(void)
11377c478bd9Sstevel@tonic-gate {
11387c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_HANDLES_HELP));
11397c478bd9Sstevel@tonic-gate }
11407c478bd9Sstevel@tonic-gate 
11417c478bd9Sstevel@tonic-gate static int
dcmd_Handles(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)11427c478bd9Sstevel@tonic-gate dcmd_Handles(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
11437c478bd9Sstevel@tonic-gate {
11447c478bd9Sstevel@tonic-gate 	Rt_map		rtmap;
11457c478bd9Sstevel@tonic-gate 	char		*str;
11467c478bd9Sstevel@tonic-gate 	uint_t		flg = 0;
1147cce0e03bSab 	APlist		apl;
114857ef7aa9SRod Evans 	uintptr_t	datap, nitems;
114956deab07SRod Evans 	Grp_hdl		*ghp;
11507c478bd9Sstevel@tonic-gate 
11517c478bd9Sstevel@tonic-gate 	/*
11527c478bd9Sstevel@tonic-gate 	 * Insure we have a valid address, and provide for a -v option.
11537c478bd9Sstevel@tonic-gate 	 */
11547c478bd9Sstevel@tonic-gate 	if ((flags & DCMD_ADDRSPEC) == 0) {
11557c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_HANDLES_STR));
11567c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
11577c478bd9Sstevel@tonic-gate 	}
11587c478bd9Sstevel@tonic-gate 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE,
11597c478bd9Sstevel@tonic-gate 	    &flg, NULL) != argc)
11607c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
11617c478bd9Sstevel@tonic-gate 
11627c478bd9Sstevel@tonic-gate 	/*
11637c478bd9Sstevel@tonic-gate 	 * Read the Rt_map contents.
11647c478bd9Sstevel@tonic-gate 	 */
11657c478bd9Sstevel@tonic-gate 	if (mdb_vread(&rtmap, sizeof (Rt_map), addr) == -1) {
11667c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_RTMAP_STR), addr);
11677c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
11687c478bd9Sstevel@tonic-gate 	}
11697c478bd9Sstevel@tonic-gate 	if ((str = String((uintptr_t)NAME(&rtmap),
11707c478bd9Sstevel@tonic-gate 	    MSG_ORIG(MSG_STR_NAME))) == 0)
11717c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
11727c478bd9Sstevel@tonic-gate 
11737c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_HANDLES_LINE1), str);
11747c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
11757c478bd9Sstevel@tonic-gate 
11767c478bd9Sstevel@tonic-gate 	if (HANDLES(&rtmap) == 0)
11777c478bd9Sstevel@tonic-gate 		return (DCMD_OK);
11787c478bd9Sstevel@tonic-gate 
11797c478bd9Sstevel@tonic-gate 	addr = (uintptr_t)HANDLES(&rtmap);
1180cce0e03bSab 	if (mdb_vread(&apl, sizeof (APlist), addr) == -1) {
1181cce0e03bSab 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST),
1182cce0e03bSab 		    addr);
11837c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
11847c478bd9Sstevel@tonic-gate 	}
11857c478bd9Sstevel@tonic-gate 
1186cce0e03bSab 	mdb_printf(MSG_ORIG(MSG_HANDLES_LINE2), addr, (size_t)apl.apl_nitems,
1187cce0e03bSab 	    (size_t)apl.apl_arritems);
11887c478bd9Sstevel@tonic-gate 
1189cce0e03bSab 	if (((flg & RTLD_FLG_VERBOSE) == 0) || (apl.apl_nitems == 0))
11907c478bd9Sstevel@tonic-gate 		return (DCMD_OK);
11917c478bd9Sstevel@tonic-gate 
11927c478bd9Sstevel@tonic-gate 	/*
1193cce0e03bSab 	 * Under verbose mode print the name of each dependency.  An APlist can
11947c478bd9Sstevel@tonic-gate 	 * have a variable number of data items, so read each individual entry.
11957c478bd9Sstevel@tonic-gate 	 */
119657ef7aa9SRod Evans 	datap = addr + APLIST_OFF_DATA;
119757ef7aa9SRod Evans 	if (mdb_vread(&ghp, sizeof (Grp_hdl *), datap) == -1) {
11987c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ),
119957ef7aa9SRod Evans 		    MSG_ORIG(MSG_GRPHDL_STR), datap);
12007c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
12017c478bd9Sstevel@tonic-gate 	}
12027c478bd9Sstevel@tonic-gate 
120380148899SSurya Prakki 	(void) mdb_inc_indent(4);
12047c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
12057c478bd9Sstevel@tonic-gate 
12067c478bd9Sstevel@tonic-gate 	if (dcmd_GrpHdl((uintptr_t)ghp, flags, argc, argv) == DCMD_ERR) {
120780148899SSurya Prakki 		(void) mdb_dec_indent(4);
12087c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
12097c478bd9Sstevel@tonic-gate 	}
12107c478bd9Sstevel@tonic-gate 
121157ef7aa9SRod Evans 	nitems = 1;
121257ef7aa9SRod Evans 	for (nitems = 1; nitems < apl.apl_nitems; nitems++) {
121357ef7aa9SRod Evans 		datap += sizeof (void *);
121457ef7aa9SRod Evans 		if (mdb_vread(&ghp, sizeof (Grp_hdl *), datap) == -1) {
12157c478bd9Sstevel@tonic-gate 			mdb_warn(MSG_ORIG(MSG_ERR_READ),
121657ef7aa9SRod Evans 			    MSG_ORIG(MSG_GRPHDL_STR), datap);
12177c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
12187c478bd9Sstevel@tonic-gate 		}
12197c478bd9Sstevel@tonic-gate 
12207c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_STR_DASHES));
12217c478bd9Sstevel@tonic-gate 		if (dcmd_GrpHdl((uintptr_t)ghp, flags, argc,
12227c478bd9Sstevel@tonic-gate 		    argv) == DCMD_ERR) {
122380148899SSurya Prakki 			(void) mdb_dec_indent(4);
12247c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
12257c478bd9Sstevel@tonic-gate 		}
12267c478bd9Sstevel@tonic-gate 	}
122780148899SSurya Prakki 	(void) mdb_dec_indent(4);
12287c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
12297c478bd9Sstevel@tonic-gate }
12307c478bd9Sstevel@tonic-gate 
12317c478bd9Sstevel@tonic-gate static void
dcmd_Groups_help(void)12327c478bd9Sstevel@tonic-gate dcmd_Groups_help(void)
12337c478bd9Sstevel@tonic-gate {
12347c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_GROUPS_HELP));
12357c478bd9Sstevel@tonic-gate }
12367c478bd9Sstevel@tonic-gate 
12377c478bd9Sstevel@tonic-gate 
12387c478bd9Sstevel@tonic-gate static int
dcmd_Groups(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)12397c478bd9Sstevel@tonic-gate dcmd_Groups(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
12407c478bd9Sstevel@tonic-gate {
12417c478bd9Sstevel@tonic-gate 	Rt_map		rtmap;
12427c478bd9Sstevel@tonic-gate 	char		*str;
1243cce0e03bSab 	APlist		apl;
12447c478bd9Sstevel@tonic-gate 	uint_t		flg = 0;
124557ef7aa9SRod Evans 	uintptr_t	datap, nitems;
124656deab07SRod Evans 	Grp_hdl		*ghp;
12477c478bd9Sstevel@tonic-gate 
12487c478bd9Sstevel@tonic-gate 	/*
12497c478bd9Sstevel@tonic-gate 	 * Insure we have a valid address, and provide for a -v option.
12507c478bd9Sstevel@tonic-gate 	 */
12517c478bd9Sstevel@tonic-gate 	if ((flags & DCMD_ADDRSPEC) == 0) {
12527c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_NAS), MSG_ORIG(MSG_GROUPS_STR));
12537c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
12547c478bd9Sstevel@tonic-gate 	}
12557c478bd9Sstevel@tonic-gate 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, RTLD_FLG_VERBOSE,
12567c478bd9Sstevel@tonic-gate 	    &flg, NULL) != argc)
12577c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
12587c478bd9Sstevel@tonic-gate 
12597c478bd9Sstevel@tonic-gate 	/*
12607c478bd9Sstevel@tonic-gate 	 * Read the Rt_map contents.
12617c478bd9Sstevel@tonic-gate 	 */
12627c478bd9Sstevel@tonic-gate 	if (mdb_vread(&rtmap, sizeof (Rt_map), addr) == -1) {
12637c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_RTMAP_STR), addr);
12647c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
12657c478bd9Sstevel@tonic-gate 	}
12667c478bd9Sstevel@tonic-gate 	if ((str = String((uintptr_t)NAME(&rtmap),
12677c478bd9Sstevel@tonic-gate 	    MSG_ORIG(MSG_STR_NAME))) == 0)
12687c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
12697c478bd9Sstevel@tonic-gate 
12707c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_GROUPS_LINE1), str);
12717c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
12727c478bd9Sstevel@tonic-gate 
12737c478bd9Sstevel@tonic-gate 	if (GROUPS(&rtmap) == 0)
12747c478bd9Sstevel@tonic-gate 		return (DCMD_OK);
12757c478bd9Sstevel@tonic-gate 
12767c478bd9Sstevel@tonic-gate 	addr = (uintptr_t)GROUPS(&rtmap);
1277cce0e03bSab 	if (mdb_vread(&apl, sizeof (APlist), addr) == -1) {
1278cce0e03bSab 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_STR_APLIST),
1279cce0e03bSab 		    addr);
12807247f888Srie 		return (DCMD_ERR);
12817c478bd9Sstevel@tonic-gate 	}
12827c478bd9Sstevel@tonic-gate 
1283cce0e03bSab 	mdb_printf(MSG_ORIG(MSG_GROUPS_LINE2), addr, (size_t)apl.apl_nitems,
1284cce0e03bSab 	    (size_t)apl.apl_arritems);
12857c478bd9Sstevel@tonic-gate 
1286cce0e03bSab 	if (((flg & RTLD_FLG_VERBOSE) == 0) || (apl.apl_nitems == 0))
12877c478bd9Sstevel@tonic-gate 		return (DCMD_OK);
12887c478bd9Sstevel@tonic-gate 
12897c478bd9Sstevel@tonic-gate 	/*
1290cce0e03bSab 	 * Under verbose mode print the name of each dependency.  An APlist can
12917c478bd9Sstevel@tonic-gate 	 * have a variable number of data items, so read each individual entry.
12927c478bd9Sstevel@tonic-gate 	 */
129357ef7aa9SRod Evans 	datap = addr + APLIST_OFF_DATA;
129457ef7aa9SRod Evans 	if (mdb_vread(&ghp, sizeof (Grp_hdl *), datap) == -1) {
12957c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ),
129657ef7aa9SRod Evans 		    MSG_ORIG(MSG_GRPHDL_STR), datap);
12977c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
12987c478bd9Sstevel@tonic-gate 	}
12997c478bd9Sstevel@tonic-gate 
130080148899SSurya Prakki 	(void) mdb_inc_indent(4);
13017c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_STR_DASHES));
13027c478bd9Sstevel@tonic-gate 
13037c478bd9Sstevel@tonic-gate 	if (dcmd_GrpHdl((uintptr_t)ghp, flags, argc, argv) == DCMD_ERR) {
130480148899SSurya Prakki 		(void) mdb_dec_indent(4);
13057c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
13067c478bd9Sstevel@tonic-gate 	}
13077c478bd9Sstevel@tonic-gate 
130857ef7aa9SRod Evans 	for (nitems = 1; nitems < apl.apl_nitems; nitems++) {
130957ef7aa9SRod Evans 		datap += sizeof (void *);
131057ef7aa9SRod Evans 		if (mdb_vread(&ghp, sizeof (Grp_hdl *), datap) == -1) {
13117c478bd9Sstevel@tonic-gate 			mdb_warn(MSG_ORIG(MSG_ERR_READ),
131257ef7aa9SRod Evans 			    MSG_ORIG(MSG_GRPHDL_STR), datap);
13137c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
13147c478bd9Sstevel@tonic-gate 		}
13157c478bd9Sstevel@tonic-gate 
13167c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_STR_DASHES));
13177c478bd9Sstevel@tonic-gate 		if (dcmd_GrpHdl((uintptr_t)ghp, flags, argc,
13187c478bd9Sstevel@tonic-gate 		    argv) == DCMD_ERR) {
131980148899SSurya Prakki 			(void) mdb_dec_indent(4);
13207c478bd9Sstevel@tonic-gate 			return (DCMD_ERR);
13217c478bd9Sstevel@tonic-gate 		}
13227c478bd9Sstevel@tonic-gate 	}
132380148899SSurya Prakki 	(void) mdb_dec_indent(4);
13247c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
13257c478bd9Sstevel@tonic-gate }
13267c478bd9Sstevel@tonic-gate static void
dcmd_ElfDyn_help(void)13277c478bd9Sstevel@tonic-gate dcmd_ElfDyn_help(void)
13287c478bd9Sstevel@tonic-gate {
13297c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_ELFDYN_HELP));
13307c478bd9Sstevel@tonic-gate }
13317c478bd9Sstevel@tonic-gate 
13327c478bd9Sstevel@tonic-gate static int
13337c478bd9Sstevel@tonic-gate /* ARGSUSED2 */
dcmd_ElfDyn(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)13347c478bd9Sstevel@tonic-gate dcmd_ElfDyn(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
13357c478bd9Sstevel@tonic-gate {
13367c478bd9Sstevel@tonic-gate 	Dyn		dyn;
13377c478bd9Sstevel@tonic-gate 	const char	*dynstr;
1338de777a60Sab 	Conv_inv_buf_t	inv_buf;
13397c478bd9Sstevel@tonic-gate 
13407c478bd9Sstevel@tonic-gate 	if ((flags & DCMD_ADDRSPEC) == 0)
13417c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
13427c478bd9Sstevel@tonic-gate 	if (mdb_vread(&dyn, sizeof (dyn), addr) == -1) {
13437c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_ELFDYN_STR),
13447247f888Srie 		    addr);
13457c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
13467c478bd9Sstevel@tonic-gate 	}
13477c478bd9Sstevel@tonic-gate 
13487c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_ELFDYN_TITLE), addr);
13494f680cc6SAli Bahrami 	dynstr = conv_dyn_tag(dyn.d_tag, ELFOSABI_SOLARIS, M_MACH, 0, &inv_buf);
13507c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_ELFDYN_LINE1), addr, dynstr, dyn.d_un.d_ptr);
13517c478bd9Sstevel@tonic-gate 
13527c478bd9Sstevel@tonic-gate 	mdb_set_dot(addr + sizeof (Dyn));
13537c478bd9Sstevel@tonic-gate 
13547c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
13557c478bd9Sstevel@tonic-gate }
13567c478bd9Sstevel@tonic-gate 
13577c478bd9Sstevel@tonic-gate static void
dcmd_ElfEhdr_help(void)13587c478bd9Sstevel@tonic-gate dcmd_ElfEhdr_help(void)
13597c478bd9Sstevel@tonic-gate {
13607c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_EHDR_HELP));
13617c478bd9Sstevel@tonic-gate }
13627c478bd9Sstevel@tonic-gate 
13637c478bd9Sstevel@tonic-gate static int
13647c478bd9Sstevel@tonic-gate /* ARGSUSED2 */
dcmd_ElfEhdr(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)13657c478bd9Sstevel@tonic-gate dcmd_ElfEhdr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
13667c478bd9Sstevel@tonic-gate {
1367de777a60Sab 	Ehdr			ehdr;
1368de777a60Sab 	Byte			*byte;
1369de777a60Sab 	const char		*flgs;
1370de777a60Sab 	Conv_inv_buf_t		inv_buf1, inv_buf2;
1371de777a60Sab 	Conv_ehdr_flags_buf_t	ehdr_flags_buf;
1372de777a60Sab 
13737c478bd9Sstevel@tonic-gate 
13747c478bd9Sstevel@tonic-gate 	if ((flags & DCMD_ADDRSPEC) == 0)
13757c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
13767c478bd9Sstevel@tonic-gate 
13777c478bd9Sstevel@tonic-gate 	if (mdb_vread(&ehdr, sizeof (ehdr), addr) == -1) {
13787c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_EHDR_STR),
13797247f888Srie 		    addr);
13807c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
13817c478bd9Sstevel@tonic-gate 	}
13827c478bd9Sstevel@tonic-gate 
13837c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_EHDR_TITLE), addr);
13847c478bd9Sstevel@tonic-gate 	byte = &ehdr.e_ident[0];
13857c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_EHDR_LINE1), byte[EI_MAG0],
13867c478bd9Sstevel@tonic-gate 	    (byte[EI_MAG1] ? byte[EI_MAG1] : '0'),
13877c478bd9Sstevel@tonic-gate 	    (byte[EI_MAG2] ? byte[EI_MAG2] : '0'),
13887c478bd9Sstevel@tonic-gate 	    (byte[EI_MAG3] ? byte[EI_MAG3] : '0'));
13897c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_EHDR_LINE2),
1390de777a60Sab 	    conv_ehdr_class(ehdr.e_ident[EI_CLASS], 0, &inv_buf1),
1391de777a60Sab 	    conv_ehdr_data(ehdr.e_ident[EI_DATA], 0, &inv_buf2));
13927c478bd9Sstevel@tonic-gate 
13937c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_EHDR_LINE3),
1394de777a60Sab 	    conv_ehdr_mach(ehdr.e_machine, 0, &inv_buf1),
1395de777a60Sab 	    conv_ehdr_vers(ehdr.e_version, 0, &inv_buf2));
1396de777a60Sab 	mdb_printf(MSG_ORIG(MSG_EHDR_LINE4),
13974f680cc6SAli Bahrami 	    conv_ehdr_type(ehdr.e_ident[EI_OSABI], ehdr.e_type, 0, &inv_buf1));
13987c478bd9Sstevel@tonic-gate 
13997c478bd9Sstevel@tonic-gate 	/*
1400c13de8f6Sab 	 * Line up the flags differently depending on whether we
1401c13de8f6Sab 	 * received a numeric (e.g. "0x200") or text representation
1402c13de8f6Sab 	 * (e.g. "[ EF_SPARC_SUN_US1 ]").
14037c478bd9Sstevel@tonic-gate 	 */
1404d29b2c44Sab 	flgs = conv_ehdr_flags(ehdr.e_machine, ehdr.e_flags,
1405d29b2c44Sab 	    0, &ehdr_flags_buf);
14067c478bd9Sstevel@tonic-gate 	if (flgs[0] == '[')
14077c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_EHDR_LINE5), flgs);
14087c478bd9Sstevel@tonic-gate 	else
14097c478bd9Sstevel@tonic-gate 		mdb_printf(MSG_ORIG(MSG_EHDR_LINE6), flgs);
14107c478bd9Sstevel@tonic-gate 
14117c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_EHDR_LINE7), ehdr.e_entry, ehdr.e_ehsize,
14127c478bd9Sstevel@tonic-gate 	    ehdr.e_shstrndx);
14137c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_EHDR_LINE8), ehdr.e_shoff, ehdr.e_shentsize,
14147c478bd9Sstevel@tonic-gate 	    ehdr.e_shnum);
14157c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_EHDR_LINE9), ehdr.e_phoff, ehdr.e_phentsize,
14167c478bd9Sstevel@tonic-gate 	    ehdr.e_phnum);
14177c478bd9Sstevel@tonic-gate 
14187c478bd9Sstevel@tonic-gate 	mdb_set_dot(addr + sizeof (Ehdr));
14197c478bd9Sstevel@tonic-gate 
14207c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
14217c478bd9Sstevel@tonic-gate }
14227c478bd9Sstevel@tonic-gate 
14237c478bd9Sstevel@tonic-gate static void
dcmd_ElfPhdr_help(void)14247c478bd9Sstevel@tonic-gate dcmd_ElfPhdr_help(void)
14257c478bd9Sstevel@tonic-gate {
14267c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_EPHDR_HELP));
14277c478bd9Sstevel@tonic-gate }
14287c478bd9Sstevel@tonic-gate 
14297c478bd9Sstevel@tonic-gate static int
14307c478bd9Sstevel@tonic-gate /* ARGSUSED2 */
dcmd_ElfPhdr(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)14317c478bd9Sstevel@tonic-gate dcmd_ElfPhdr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
14327c478bd9Sstevel@tonic-gate {
1433de777a60Sab 	Phdr			phdr;
1434de777a60Sab 	Conv_inv_buf_t		inv_buf;
1435de777a60Sab 	Conv_phdr_flags_buf_t	phdr_flags_buf;
14367c478bd9Sstevel@tonic-gate 
14377c478bd9Sstevel@tonic-gate 	if ((flags & DCMD_ADDRSPEC) == 0)
14387c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
14397c478bd9Sstevel@tonic-gate 
14407c478bd9Sstevel@tonic-gate 	if (mdb_vread(&phdr, sizeof (phdr), addr) == -1) {
14417c478bd9Sstevel@tonic-gate 		mdb_warn(MSG_ORIG(MSG_ERR_READ), MSG_ORIG(MSG_EPHDR_STR),
14427247f888Srie 		    addr);
14437c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
14447c478bd9Sstevel@tonic-gate 	}
14457c478bd9Sstevel@tonic-gate 
14467c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_EPHDR_TITLE), addr);
14477c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_EPHDR_LINE1), phdr.p_vaddr,
14484f680cc6SAli Bahrami 	    conv_phdr_flags(ELFOSABI_SOLARIS, phdr.p_flags, 0,
14494f680cc6SAli Bahrami 	    &phdr_flags_buf));
14507c478bd9Sstevel@tonic-gate 	mdb_printf(MSG_ORIG(MSG_EPHDR_LINE2), phdr.p_paddr,
14514f680cc6SAli Bahrami 	    conv_phdr_type(ELFOSABI_SOLARIS, M_MACH, phdr.p_type, 0, &inv_buf));
14525aefb655Srie 	mdb_printf(MSG_ORIG(MSG_EPHDR_LINE3), phdr.p_filesz, phdr.p_memsz);
14535aefb655Srie 	mdb_printf(MSG_ORIG(MSG_EPHDR_LINE4), phdr.p_offset, phdr.p_align);
14547c478bd9Sstevel@tonic-gate 
14557c478bd9Sstevel@tonic-gate 	mdb_set_dot(addr + sizeof (Phdr));
14567c478bd9Sstevel@tonic-gate 
14577c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
14587c478bd9Sstevel@tonic-gate }
14597c478bd9Sstevel@tonic-gate 
14607c478bd9Sstevel@tonic-gate 
14617c478bd9Sstevel@tonic-gate static const mdb_dcmd_t dcmds[] = {
14627c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_BND_STR), MSG_ORIG(MSG_USG_ADDREQ_V),
14637c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_BND_DCD),
14647c478bd9Sstevel@tonic-gate 		dcmd_Bind, dcmd_Bind_help},
14657c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_DEPENDS_STR), MSG_ORIG(MSG_USG_ADDREQ_V),
14667c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_DEPENDS_DCD),
14677c478bd9Sstevel@tonic-gate 		dcmd_Depends, dcmd_Depends_help},
14687c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_CALLERS_STR), MSG_ORIG(MSG_USG_ADDREQ_V),
14697c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_CALLERS_DCD),
14707c478bd9Sstevel@tonic-gate 		dcmd_Callers, dcmd_Callers_help},
14717c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_GRPHDL_STR), MSG_ORIG(MSG_USG_ADDREQ_V),
14727c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_GRPHDL_DCD),
14737c478bd9Sstevel@tonic-gate 		dcmd_GrpHdl, dcmd_GrpHdl_help},
14747c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_GRPDESC_STR), MSG_ORIG(MSG_USG_ADDREQ_V),
14757c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_GRPDESC_DCD),
14767c478bd9Sstevel@tonic-gate 		dcmd_GrpDesc, dcmd_GrpDesc_help},
14777c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_HANDLES_STR), MSG_ORIG(MSG_USG_ADDREQ_V),
14787c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_HANDLES_DCD),
14797c478bd9Sstevel@tonic-gate 		dcmd_Handles, dcmd_Handles_help},
14807c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_GROUPS_STR), MSG_ORIG(MSG_USG_ADDREQ_V),
14817c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_GROUPS_DCD),
14827c478bd9Sstevel@tonic-gate 		dcmd_Groups, dcmd_Groups_help},
14837c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_ELFDYN_STR), MSG_ORIG(MSG_USG_ADDREQ),
14847c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_ELFDYN_DCD),
14857c478bd9Sstevel@tonic-gate 		dcmd_ElfDyn, dcmd_ElfDyn_help},
14867c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_EHDR_STR), MSG_ORIG(MSG_USG_ADDREQ),
14877c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_EHDR_DCD),
14887c478bd9Sstevel@tonic-gate 		dcmd_ElfEhdr, dcmd_ElfEhdr_help},
14897c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_EPHDR_STR), MSG_ORIG(MSG_USG_ADDREQ),
14907c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_EPHDR_DCD),
14917c478bd9Sstevel@tonic-gate 		dcmd_ElfPhdr, dcmd_ElfPhdr_help},
14927c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_LMLIST_STR), MSG_ORIG(MSG_USG_ADDREQ_V),
14937c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_LMLIST_DCD),
14947c478bd9Sstevel@tonic-gate 		dcmd_Lm_list, dcmd_Lm_list_help},
14957c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_RTMAPS_STR), MSG_ORIG(MSG_USG_ADDOPT_V),
14967c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_RTMAPS_DCD),
14977c478bd9Sstevel@tonic-gate 		dcmd_Rtmaps, dcmd_Rtmaps_help},
14987c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_RTMAP_STR), MSG_ORIG(MSG_USG_ADDREQ),
14997c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_RTMAP_DCD),
15007c478bd9Sstevel@tonic-gate 		dcmd_rtmap, dcmd_rtmap_help},
15017c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_SETENV_STR), MSG_ORIG(MSG_USG_SETENV),
15027c478bd9Sstevel@tonic-gate 		MSG_ORIG(MSG_SETENV_DCD),
15037c478bd9Sstevel@tonic-gate 		dcmd_Setenv, dcmd_Setenv_help},
15047c478bd9Sstevel@tonic-gate 	{ NULL }
15057c478bd9Sstevel@tonic-gate };
15067c478bd9Sstevel@tonic-gate 
15077c478bd9Sstevel@tonic-gate static const mdb_walker_t walkers[] = {
15087c478bd9Sstevel@tonic-gate 	{ MSG_ORIG(MSG_RTMAPS_STR), MSG_ORIG(MSG_WWD_RTMAP),
15097c478bd9Sstevel@tonic-gate 		walk_rtmap_init, walk_rtmap_step, NULL, NULL },
15107c478bd9Sstevel@tonic-gate 	{ NULL }
15117c478bd9Sstevel@tonic-gate };
15127c478bd9Sstevel@tonic-gate 
15137c478bd9Sstevel@tonic-gate static const mdb_modinfo_t modinfo = {
15147c478bd9Sstevel@tonic-gate 	MDB_API_VERSION, dcmds, walkers
15157c478bd9Sstevel@tonic-gate };
15167c478bd9Sstevel@tonic-gate 
15177c478bd9Sstevel@tonic-gate const	mdb_modinfo_t *
_mdb_init(void)15187c478bd9Sstevel@tonic-gate _mdb_init(void)
15197c478bd9Sstevel@tonic-gate {
15207c478bd9Sstevel@tonic-gate 	return (&modinfo);
15217c478bd9Sstevel@tonic-gate }
1522