xref: /onnv-gate/usr/src/cmd/mdb/common/modules/genunix/damap.c (revision 10696:cd0f390dd9e2)
1*10696SDavid.Hollister@Sun.COM /*
2*10696SDavid.Hollister@Sun.COM  * CDDL HEADER START
3*10696SDavid.Hollister@Sun.COM  *
4*10696SDavid.Hollister@Sun.COM  * The contents of this file are subject to the terms of the
5*10696SDavid.Hollister@Sun.COM  * Common Development and Distribution License (the "License").
6*10696SDavid.Hollister@Sun.COM  * You may not use this file except in compliance with the License.
7*10696SDavid.Hollister@Sun.COM  *
8*10696SDavid.Hollister@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10696SDavid.Hollister@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*10696SDavid.Hollister@Sun.COM  * See the License for the specific language governing permissions
11*10696SDavid.Hollister@Sun.COM  * and limitations under the License.
12*10696SDavid.Hollister@Sun.COM  *
13*10696SDavid.Hollister@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*10696SDavid.Hollister@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10696SDavid.Hollister@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*10696SDavid.Hollister@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*10696SDavid.Hollister@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*10696SDavid.Hollister@Sun.COM  *
19*10696SDavid.Hollister@Sun.COM  * CDDL HEADER END
20*10696SDavid.Hollister@Sun.COM  */
21*10696SDavid.Hollister@Sun.COM /*
22*10696SDavid.Hollister@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23*10696SDavid.Hollister@Sun.COM  * Use is subject to license terms.
24*10696SDavid.Hollister@Sun.COM  */
25*10696SDavid.Hollister@Sun.COM 
26*10696SDavid.Hollister@Sun.COM #include <mdb/mdb_modapi.h>
27*10696SDavid.Hollister@Sun.COM #include <sys/sysmacros.h>
28*10696SDavid.Hollister@Sun.COM #include <sys/sunddi.h>
29*10696SDavid.Hollister@Sun.COM #include <sys/damap_impl.h>
30*10696SDavid.Hollister@Sun.COM 
31*10696SDavid.Hollister@Sun.COM #include "damap.h"
32*10696SDavid.Hollister@Sun.COM 
33*10696SDavid.Hollister@Sun.COM void
34*10696SDavid.Hollister@Sun.COM damap_help(void)
35*10696SDavid.Hollister@Sun.COM {
36*10696SDavid.Hollister@Sun.COM 	mdb_printf("Print the damap at the address given.\n");
37*10696SDavid.Hollister@Sun.COM 	mdb_printf("\n");
38*10696SDavid.Hollister@Sun.COM 	mdb_printf("EXAMPLE: SCSI: To display the SCSI tgtmap damaps ");
39*10696SDavid.Hollister@Sun.COM 	mdb_printf("associated with a scsi HBA driver iport dip:\n");
40*10696SDavid.Hollister@Sun.COM 	mdb_printf("\n");
41*10696SDavid.Hollister@Sun.COM 	mdb_printf("::devbindings -q <driver_name>\n");
42*10696SDavid.Hollister@Sun.COM 	mdb_printf("\n");
43*10696SDavid.Hollister@Sun.COM 	mdb_printf("<iport-dip>::print struct dev_info devi_driver_data|");
44*10696SDavid.Hollister@Sun.COM 	mdb_printf("::print scsi_hba_tran_t tran_tgtmap|");
45*10696SDavid.Hollister@Sun.COM 	mdb_printf("::print impl_scsi_tgtmap_t ");
46*10696SDavid.Hollister@Sun.COM 	mdb_printf("tgtmap_dam[0] tgtmap_dam[1]|::damap\n");
47*10696SDavid.Hollister@Sun.COM }
48*10696SDavid.Hollister@Sun.COM 
49*10696SDavid.Hollister@Sun.COM static char *
50*10696SDavid.Hollister@Sun.COM local_strdup(const char *s)
51*10696SDavid.Hollister@Sun.COM {
52*10696SDavid.Hollister@Sun.COM 	if (s)
53*10696SDavid.Hollister@Sun.COM 		return (strcpy(mdb_alloc(strlen(s) + 1, UM_SLEEP), s));
54*10696SDavid.Hollister@Sun.COM 	else
55*10696SDavid.Hollister@Sun.COM 		return (NULL);
56*10696SDavid.Hollister@Sun.COM }
57*10696SDavid.Hollister@Sun.COM 
58*10696SDavid.Hollister@Sun.COM static void
59*10696SDavid.Hollister@Sun.COM local_strfree(const char *s)
60*10696SDavid.Hollister@Sun.COM {
61*10696SDavid.Hollister@Sun.COM 	if (s)
62*10696SDavid.Hollister@Sun.COM 		mdb_free((void *)s, strlen(s) + 1);
63*10696SDavid.Hollister@Sun.COM }
64*10696SDavid.Hollister@Sun.COM 
65*10696SDavid.Hollister@Sun.COM static void
66*10696SDavid.Hollister@Sun.COM bitset_free(bitset_t *bs, int embedded)
67*10696SDavid.Hollister@Sun.COM {
68*10696SDavid.Hollister@Sun.COM 	if (bs == NULL)
69*10696SDavid.Hollister@Sun.COM 		return;
70*10696SDavid.Hollister@Sun.COM 	if (bs->bs_set && bs->bs_words)
71*10696SDavid.Hollister@Sun.COM 		mdb_free(bs->bs_set, bs->bs_words * sizeof (ulong_t));
72*10696SDavid.Hollister@Sun.COM 	if (!embedded)
73*10696SDavid.Hollister@Sun.COM 		mdb_free(bs, sizeof (*bs));	/* not embedded, free */
74*10696SDavid.Hollister@Sun.COM }
75*10696SDavid.Hollister@Sun.COM 
76*10696SDavid.Hollister@Sun.COM static bitset_t *
77*10696SDavid.Hollister@Sun.COM bitset_get(uintptr_t bsaddr)
78*10696SDavid.Hollister@Sun.COM {
79*10696SDavid.Hollister@Sun.COM 	bitset_t	*bs;
80*10696SDavid.Hollister@Sun.COM 
81*10696SDavid.Hollister@Sun.COM 	bs = mdb_zalloc(sizeof (*bs), UM_SLEEP);
82*10696SDavid.Hollister@Sun.COM 	if (mdb_vread(bs, sizeof (*bs), bsaddr) == -1) {
83*10696SDavid.Hollister@Sun.COM 		mdb_warn("couldn't read bitset 0x%p", bsaddr);
84*10696SDavid.Hollister@Sun.COM 		bitset_free(bs, 0);
85*10696SDavid.Hollister@Sun.COM 		return (NULL);
86*10696SDavid.Hollister@Sun.COM 	}
87*10696SDavid.Hollister@Sun.COM 
88*10696SDavid.Hollister@Sun.COM 	bsaddr = (uintptr_t)bs->bs_set;
89*10696SDavid.Hollister@Sun.COM 	bs->bs_set = mdb_alloc(bs->bs_words * sizeof (ulong_t), UM_SLEEP);
90*10696SDavid.Hollister@Sun.COM 	if (mdb_vread(bs->bs_set,
91*10696SDavid.Hollister@Sun.COM 	    bs->bs_words * sizeof (ulong_t), bsaddr) == -1) {
92*10696SDavid.Hollister@Sun.COM 		mdb_warn("couldn't read bitset bs_set 0x%p", bsaddr);
93*10696SDavid.Hollister@Sun.COM 		bitset_free(bs, 0);
94*10696SDavid.Hollister@Sun.COM 		return (NULL);
95*10696SDavid.Hollister@Sun.COM 	}
96*10696SDavid.Hollister@Sun.COM 	return (bs);
97*10696SDavid.Hollister@Sun.COM 
98*10696SDavid.Hollister@Sun.COM }
99*10696SDavid.Hollister@Sun.COM 
100*10696SDavid.Hollister@Sun.COM static void
101*10696SDavid.Hollister@Sun.COM damap_free(struct dam *dam, void **kdamda, int kdamda_n)
102*10696SDavid.Hollister@Sun.COM {
103*10696SDavid.Hollister@Sun.COM 	int			i;
104*10696SDavid.Hollister@Sun.COM 	struct i_ddi_soft_state *ss;
105*10696SDavid.Hollister@Sun.COM 	dam_da_t		*da;
106*10696SDavid.Hollister@Sun.COM 
107*10696SDavid.Hollister@Sun.COM 	if (dam) {
108*10696SDavid.Hollister@Sun.COM 		/* free in dam_da_t softstate */
109*10696SDavid.Hollister@Sun.COM 		ss = (struct i_ddi_soft_state *)dam->dam_da;
110*10696SDavid.Hollister@Sun.COM 		if (ss) {
111*10696SDavid.Hollister@Sun.COM 			if (ss->n_items && ss->array) {
112*10696SDavid.Hollister@Sun.COM 				for (i = 0; i < ss->n_items; i++) {
113*10696SDavid.Hollister@Sun.COM 					da = ss->array[i];
114*10696SDavid.Hollister@Sun.COM 					if (da == NULL)
115*10696SDavid.Hollister@Sun.COM 						continue;
116*10696SDavid.Hollister@Sun.COM 					local_strfree(da->da_addr);
117*10696SDavid.Hollister@Sun.COM 					mdb_free(da, sizeof (*da));
118*10696SDavid.Hollister@Sun.COM 				}
119*10696SDavid.Hollister@Sun.COM 			}
120*10696SDavid.Hollister@Sun.COM 
121*10696SDavid.Hollister@Sun.COM 			mdb_free(ss, sizeof (*ss));
122*10696SDavid.Hollister@Sun.COM 		}
123*10696SDavid.Hollister@Sun.COM 
124*10696SDavid.Hollister@Sun.COM 		/* free dam_active/stable/report_set embedded in dam */
125*10696SDavid.Hollister@Sun.COM 		bitset_free(&dam->dam_report_set, 1);
126*10696SDavid.Hollister@Sun.COM 		bitset_free(&dam->dam_stable_set, 1);
127*10696SDavid.Hollister@Sun.COM 		bitset_free(&dam->dam_active_set, 1);
128*10696SDavid.Hollister@Sun.COM 
129*10696SDavid.Hollister@Sun.COM 		/* free dam_name */
130*10696SDavid.Hollister@Sun.COM 		local_strfree(dam->dam_name);
131*10696SDavid.Hollister@Sun.COM 
132*10696SDavid.Hollister@Sun.COM 		/* free dam */
133*10696SDavid.Hollister@Sun.COM 		mdb_free(dam, sizeof (*dam));
134*10696SDavid.Hollister@Sun.COM 	}
135*10696SDavid.Hollister@Sun.COM 
136*10696SDavid.Hollister@Sun.COM 	if (kdamda)
137*10696SDavid.Hollister@Sun.COM 		mdb_free(kdamda, kdamda_n * sizeof (void *));
138*10696SDavid.Hollister@Sun.COM }
139*10696SDavid.Hollister@Sun.COM 
140*10696SDavid.Hollister@Sun.COM /*
141*10696SDavid.Hollister@Sun.COM  * The dam implementation uses a number of different abstractions. Given a
142*10696SDavid.Hollister@Sun.COM  * pointer to a damap_t, this function make an mdb instantiation of the dam -
143*10696SDavid.Hollister@Sun.COM  * many, but not all, of the different abstractions used in the dam
144*10696SDavid.Hollister@Sun.COM  * implementation are also instantiated in mdb. This means that callers of
145*10696SDavid.Hollister@Sun.COM  * damap_get can perform some (but not all) types of structure pointer
146*10696SDavid.Hollister@Sun.COM  * traversals.
147*10696SDavid.Hollister@Sun.COM  */
148*10696SDavid.Hollister@Sun.COM struct dam *
149*10696SDavid.Hollister@Sun.COM damap_get(uintptr_t damaddr, void ***pkdamda, int *pkdamda_n)
150*10696SDavid.Hollister@Sun.COM {
151*10696SDavid.Hollister@Sun.COM 	/* variables that hold instantiation read from kernel */
152*10696SDavid.Hollister@Sun.COM 	struct dam		kdam;
153*10696SDavid.Hollister@Sun.COM 	char			kstring[MAXPATHLEN];
154*10696SDavid.Hollister@Sun.COM 	struct i_ddi_soft_state kss;
155*10696SDavid.Hollister@Sun.COM 	void			**kssarray = NULL;
156*10696SDavid.Hollister@Sun.COM 	int			array_sz = 0;
157*10696SDavid.Hollister@Sun.COM 
158*10696SDavid.Hollister@Sun.COM 	/* variables that hold mdb instantiation */
159*10696SDavid.Hollister@Sun.COM 	struct dam		*dam = NULL;
160*10696SDavid.Hollister@Sun.COM 	struct i_ddi_soft_state *ss;
161*10696SDavid.Hollister@Sun.COM 	bitset_t		*bs;
162*10696SDavid.Hollister@Sun.COM 	dam_da_t		*da;
163*10696SDavid.Hollister@Sun.COM 
164*10696SDavid.Hollister@Sun.COM 	int			i;
165*10696SDavid.Hollister@Sun.COM 
166*10696SDavid.Hollister@Sun.COM 	/* read kernel: dam */
167*10696SDavid.Hollister@Sun.COM 	if (mdb_vread(&kdam, sizeof (kdam), damaddr) == -1) {
168*10696SDavid.Hollister@Sun.COM 		mdb_warn("couldn't read dam 0x%p", damaddr);
169*10696SDavid.Hollister@Sun.COM 		goto err;
170*10696SDavid.Hollister@Sun.COM 	}
171*10696SDavid.Hollister@Sun.COM 
172*10696SDavid.Hollister@Sun.COM 	/* read kernel: dam->dam_name */
173*10696SDavid.Hollister@Sun.COM 	mdb_readstr(kstring, sizeof (kstring), (uintptr_t)kdam.dam_name);
174*10696SDavid.Hollister@Sun.COM 
175*10696SDavid.Hollister@Sun.COM 	/* read kernel: dam->dam_da (softstate) */
176*10696SDavid.Hollister@Sun.COM 	if (mdb_vread(&kss, sizeof (kss), (uintptr_t)kdam.dam_da) == -1) {
177*10696SDavid.Hollister@Sun.COM 		mdb_warn("couldn't read dam dam_da 0x%p",
178*10696SDavid.Hollister@Sun.COM 		    (uintptr_t)kdam.dam_da);
179*10696SDavid.Hollister@Sun.COM 		goto err;
180*10696SDavid.Hollister@Sun.COM 	}
181*10696SDavid.Hollister@Sun.COM 
182*10696SDavid.Hollister@Sun.COM 	/* read kernel ((struct i_ddi_soft_state *)dam->dam_da)->array */
183*10696SDavid.Hollister@Sun.COM 	array_sz = kss.n_items * sizeof (void *);
184*10696SDavid.Hollister@Sun.COM 	kssarray = mdb_alloc(array_sz, UM_SLEEP);
185*10696SDavid.Hollister@Sun.COM 	if (mdb_vread(kssarray, array_sz, (uintptr_t)kss.array) == -1) {
186*10696SDavid.Hollister@Sun.COM 		mdb_warn("couldn't read dam dam_da array 0x%p",
187*10696SDavid.Hollister@Sun.COM 		    (uintptr_t)kss.array);
188*10696SDavid.Hollister@Sun.COM 		goto err;
189*10696SDavid.Hollister@Sun.COM 	}
190*10696SDavid.Hollister@Sun.COM 
191*10696SDavid.Hollister@Sun.COM 	/*
192*10696SDavid.Hollister@Sun.COM 	 * Produce mdb instantiation of kernel data structures.
193*10696SDavid.Hollister@Sun.COM 	 *
194*10696SDavid.Hollister@Sun.COM 	 * Structure copy kdam to dam, then clear out pointers in dam (some
195*10696SDavid.Hollister@Sun.COM 	 * will be filled in by mdb instantiation code below).
196*10696SDavid.Hollister@Sun.COM 	 */
197*10696SDavid.Hollister@Sun.COM 	dam = mdb_zalloc(sizeof (*dam), UM_SLEEP);
198*10696SDavid.Hollister@Sun.COM 	*dam = kdam;
199*10696SDavid.Hollister@Sun.COM 	dam->dam_name = NULL;
200*10696SDavid.Hollister@Sun.COM 
201*10696SDavid.Hollister@Sun.COM 	dam->dam_active_set.bs_set = NULL;
202*10696SDavid.Hollister@Sun.COM 	dam->dam_stable_set.bs_set = NULL;
203*10696SDavid.Hollister@Sun.COM 	dam->dam_report_set.bs_set = NULL;
204*10696SDavid.Hollister@Sun.COM 
205*10696SDavid.Hollister@Sun.COM 	dam->dam_da = NULL;
206*10696SDavid.Hollister@Sun.COM 	/* dam_addr_hash, dam_taskqp, dam_kstatp left as kernel addresses */
207*10696SDavid.Hollister@Sun.COM 
208*10696SDavid.Hollister@Sun.COM 	/* fill in dam_name */
209*10696SDavid.Hollister@Sun.COM 	dam->dam_name = local_strdup(kstring);
210*10696SDavid.Hollister@Sun.COM 
211*10696SDavid.Hollister@Sun.COM 	/* fill in dam_active/stable/report_set embedded in the dam */
212*10696SDavid.Hollister@Sun.COM 	bs = bitset_get(damaddr + (offsetof(struct dam, dam_active_set)));
213*10696SDavid.Hollister@Sun.COM 	if (bs) {
214*10696SDavid.Hollister@Sun.COM 		dam->dam_active_set = *bs;
215*10696SDavid.Hollister@Sun.COM 		mdb_free(bs, sizeof (*bs));
216*10696SDavid.Hollister@Sun.COM 	}
217*10696SDavid.Hollister@Sun.COM 	bs = bitset_get(damaddr + (offsetof(struct dam, dam_stable_set)));
218*10696SDavid.Hollister@Sun.COM 	if (bs) {
219*10696SDavid.Hollister@Sun.COM 		dam->dam_stable_set = *bs;
220*10696SDavid.Hollister@Sun.COM 		mdb_free(bs, sizeof (*bs));
221*10696SDavid.Hollister@Sun.COM 	}
222*10696SDavid.Hollister@Sun.COM 	bs = bitset_get(damaddr + (offsetof(struct dam, dam_report_set)));
223*10696SDavid.Hollister@Sun.COM 	if (bs) {
224*10696SDavid.Hollister@Sun.COM 		dam->dam_report_set = *bs;
225*10696SDavid.Hollister@Sun.COM 		mdb_free(bs, sizeof (*bs));
226*10696SDavid.Hollister@Sun.COM 	}
227*10696SDavid.Hollister@Sun.COM 
228*10696SDavid.Hollister@Sun.COM 	/* fill in dam_da_t softstate */
229*10696SDavid.Hollister@Sun.COM 	ss = mdb_zalloc(sizeof (struct i_ddi_soft_state), UM_SLEEP);
230*10696SDavid.Hollister@Sun.COM 	*ss = kss;
231*10696SDavid.Hollister@Sun.COM 	ss->next = NULL;
232*10696SDavid.Hollister@Sun.COM 	ss->array = mdb_zalloc(array_sz, UM_SLEEP);
233*10696SDavid.Hollister@Sun.COM 	dam->dam_da = ss;
234*10696SDavid.Hollister@Sun.COM 	for (i = 0; i < kss.n_items; i++) {
235*10696SDavid.Hollister@Sun.COM 		if (kssarray[i] == NULL)
236*10696SDavid.Hollister@Sun.COM 			continue;
237*10696SDavid.Hollister@Sun.COM 		da = ss->array[i] = mdb_zalloc(sizeof (*da), UM_SLEEP);
238*10696SDavid.Hollister@Sun.COM 		if (mdb_vread(da, sizeof (*da), (uintptr_t)kssarray[i]) == -1) {
239*10696SDavid.Hollister@Sun.COM 			mdb_warn("couldn't read dam dam_da %d 0x%p", i,
240*10696SDavid.Hollister@Sun.COM 			    (uintptr_t)kss.array);
241*10696SDavid.Hollister@Sun.COM 			goto err;
242*10696SDavid.Hollister@Sun.COM 		}
243*10696SDavid.Hollister@Sun.COM 		/* da_nvl, da_ppriv_rpt, da_nvl_rpt left as kernel addresses */
244*10696SDavid.Hollister@Sun.COM 
245*10696SDavid.Hollister@Sun.COM 		/* read kernel: da->da_addr */
246*10696SDavid.Hollister@Sun.COM 		mdb_readstr(kstring, sizeof (kstring), (uintptr_t)da->da_addr);
247*10696SDavid.Hollister@Sun.COM 		da->da_addr = local_strdup(kstring);
248*10696SDavid.Hollister@Sun.COM 	}
249*10696SDavid.Hollister@Sun.COM 
250*10696SDavid.Hollister@Sun.COM 	/* return array of kernel dam_da_t pointers associated with each id */
251*10696SDavid.Hollister@Sun.COM 	*pkdamda = kssarray;
252*10696SDavid.Hollister@Sun.COM 	*pkdamda_n = array_sz / sizeof (void *);
253*10696SDavid.Hollister@Sun.COM 
254*10696SDavid.Hollister@Sun.COM 	/* return pointer to mdb instantiation of the dam */
255*10696SDavid.Hollister@Sun.COM 	return (dam);
256*10696SDavid.Hollister@Sun.COM 
257*10696SDavid.Hollister@Sun.COM err:	damap_free(dam, kssarray, array_sz / sizeof (void *));
258*10696SDavid.Hollister@Sun.COM 	*pkdamda = NULL;
259*10696SDavid.Hollister@Sun.COM 	*pkdamda_n = 0;
260*10696SDavid.Hollister@Sun.COM 	return (NULL);
261*10696SDavid.Hollister@Sun.COM }
262*10696SDavid.Hollister@Sun.COM 
263*10696SDavid.Hollister@Sun.COM /*ARGSUSED*/
264*10696SDavid.Hollister@Sun.COM static void
265*10696SDavid.Hollister@Sun.COM damap_print(struct dam *dam, void **kdamda, int kdamda_n)
266*10696SDavid.Hollister@Sun.COM {
267*10696SDavid.Hollister@Sun.COM 	struct i_ddi_soft_state	*ss;
268*10696SDavid.Hollister@Sun.COM 	dam_da_t		*da;
269*10696SDavid.Hollister@Sun.COM 	int			i;
270*10696SDavid.Hollister@Sun.COM 
271*10696SDavid.Hollister@Sun.COM 	mdb_printf("%s:\n", dam->dam_name);
272*10696SDavid.Hollister@Sun.COM 
273*10696SDavid.Hollister@Sun.COM 	ss = (struct i_ddi_soft_state *)dam->dam_da;
274*10696SDavid.Hollister@Sun.COM 	if (ss == NULL)
275*10696SDavid.Hollister@Sun.COM 		return;
276*10696SDavid.Hollister@Sun.COM 
277*10696SDavid.Hollister@Sun.COM 	if ((ss->n_items == 0) || (ss->array == NULL))
278*10696SDavid.Hollister@Sun.COM 		return;
279*10696SDavid.Hollister@Sun.COM 
280*10696SDavid.Hollister@Sun.COM 	for (i = 0; i < ss->n_items; i++) {
281*10696SDavid.Hollister@Sun.COM 		da = ss->array[i];
282*10696SDavid.Hollister@Sun.COM 		if (da == NULL)
283*10696SDavid.Hollister@Sun.COM 			continue;
284*10696SDavid.Hollister@Sun.COM 
285*10696SDavid.Hollister@Sun.COM 		/* Print index and address. */
286*10696SDavid.Hollister@Sun.COM 		mdb_printf("  %3d: %s [", i, da->da_addr);
287*10696SDavid.Hollister@Sun.COM 
288*10696SDavid.Hollister@Sun.COM 		/* Print shorthand of Active/Stable/Report set membership */
289*10696SDavid.Hollister@Sun.COM 		if (BT_TEST(dam->dam_active_set.bs_set, i))
290*10696SDavid.Hollister@Sun.COM 			mdb_printf("A");
291*10696SDavid.Hollister@Sun.COM 		else
292*10696SDavid.Hollister@Sun.COM 			mdb_printf(".");
293*10696SDavid.Hollister@Sun.COM 		if (BT_TEST(dam->dam_stable_set.bs_set, i))
294*10696SDavid.Hollister@Sun.COM 			mdb_printf("S");
295*10696SDavid.Hollister@Sun.COM 		else
296*10696SDavid.Hollister@Sun.COM 			mdb_printf(".");
297*10696SDavid.Hollister@Sun.COM 		if (BT_TEST(dam->dam_report_set.bs_set, i))
298*10696SDavid.Hollister@Sun.COM 			mdb_printf("R");
299*10696SDavid.Hollister@Sun.COM 		else
300*10696SDavid.Hollister@Sun.COM 			mdb_printf(".");
301*10696SDavid.Hollister@Sun.COM 
302*10696SDavid.Hollister@Sun.COM 		/* Print the reference count and priv */
303*10696SDavid.Hollister@Sun.COM 		mdb_printf("] %2d %0?lx %0?lx\n",
304*10696SDavid.Hollister@Sun.COM 		    da->da_ref, da->da_cfg_priv, da->da_ppriv);
305*10696SDavid.Hollister@Sun.COM 
306*10696SDavid.Hollister@Sun.COM 		mdb_printf("\t\t\t\t%p::print -ta dam_da_t\n", kdamda[i]);
307*10696SDavid.Hollister@Sun.COM 	}
308*10696SDavid.Hollister@Sun.COM }
309*10696SDavid.Hollister@Sun.COM 
310*10696SDavid.Hollister@Sun.COM /*ARGSUSED*/
311*10696SDavid.Hollister@Sun.COM int
312*10696SDavid.Hollister@Sun.COM damap(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
313*10696SDavid.Hollister@Sun.COM {
314*10696SDavid.Hollister@Sun.COM 	struct dam	*dam;
315*10696SDavid.Hollister@Sun.COM 	void		**kdamda;
316*10696SDavid.Hollister@Sun.COM 	int		kdamda_n;
317*10696SDavid.Hollister@Sun.COM 
318*10696SDavid.Hollister@Sun.COM 	dam = damap_get(addr, &kdamda, &kdamda_n);
319*10696SDavid.Hollister@Sun.COM 	if (dam == NULL)
320*10696SDavid.Hollister@Sun.COM 		return (DCMD_ERR);
321*10696SDavid.Hollister@Sun.COM 
322*10696SDavid.Hollister@Sun.COM 	damap_print(dam, kdamda, kdamda_n);
323*10696SDavid.Hollister@Sun.COM 	damap_free(dam, kdamda, kdamda_n);
324*10696SDavid.Hollister@Sun.COM 	return (DCMD_OK);
325*10696SDavid.Hollister@Sun.COM }
326