xref: /onnv-gate/usr/src/cmd/mdb/common/modules/genunix/damap.c (revision 12512:0ea0884542b3)
110696SDavid.Hollister@Sun.COM /*
210696SDavid.Hollister@Sun.COM  * CDDL HEADER START
310696SDavid.Hollister@Sun.COM  *
410696SDavid.Hollister@Sun.COM  * The contents of this file are subject to the terms of the
510696SDavid.Hollister@Sun.COM  * Common Development and Distribution License (the "License").
610696SDavid.Hollister@Sun.COM  * You may not use this file except in compliance with the License.
710696SDavid.Hollister@Sun.COM  *
810696SDavid.Hollister@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910696SDavid.Hollister@Sun.COM  * or http://www.opensolaris.org/os/licensing.
1010696SDavid.Hollister@Sun.COM  * See the License for the specific language governing permissions
1110696SDavid.Hollister@Sun.COM  * and limitations under the License.
1210696SDavid.Hollister@Sun.COM  *
1310696SDavid.Hollister@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
1410696SDavid.Hollister@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510696SDavid.Hollister@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
1610696SDavid.Hollister@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
1710696SDavid.Hollister@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
1810696SDavid.Hollister@Sun.COM  *
1910696SDavid.Hollister@Sun.COM  * CDDL HEADER END
2010696SDavid.Hollister@Sun.COM  */
2110696SDavid.Hollister@Sun.COM /*
22*12512SMilos.Muzik@Sun.COM  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
2310696SDavid.Hollister@Sun.COM  */
2410696SDavid.Hollister@Sun.COM 
2510696SDavid.Hollister@Sun.COM #include <mdb/mdb_modapi.h>
2610696SDavid.Hollister@Sun.COM #include <sys/sysmacros.h>
2710696SDavid.Hollister@Sun.COM #include <sys/sunddi.h>
2811363SReed.Liu@Sun.COM #include <sys/damap.h>
2910696SDavid.Hollister@Sun.COM #include <sys/damap_impl.h>
3010696SDavid.Hollister@Sun.COM 
3110696SDavid.Hollister@Sun.COM #include "damap.h"
3210696SDavid.Hollister@Sun.COM 
3310696SDavid.Hollister@Sun.COM void
damap_help(void)3410696SDavid.Hollister@Sun.COM damap_help(void)
3510696SDavid.Hollister@Sun.COM {
3610696SDavid.Hollister@Sun.COM 	mdb_printf("Print the damap at the address given.\n");
3710696SDavid.Hollister@Sun.COM 	mdb_printf("\n");
3810696SDavid.Hollister@Sun.COM 	mdb_printf("EXAMPLE: SCSI: To display the SCSI tgtmap damaps ");
3910696SDavid.Hollister@Sun.COM 	mdb_printf("associated with a scsi HBA driver iport dip:\n");
4010696SDavid.Hollister@Sun.COM 	mdb_printf("\n");
4110696SDavid.Hollister@Sun.COM 	mdb_printf("::devbindings -q <driver_name>\n");
4210696SDavid.Hollister@Sun.COM 	mdb_printf("\n");
4310696SDavid.Hollister@Sun.COM 	mdb_printf("<iport-dip>::print struct dev_info devi_driver_data|");
4410696SDavid.Hollister@Sun.COM 	mdb_printf("::print scsi_hba_tran_t tran_tgtmap|");
4510696SDavid.Hollister@Sun.COM 	mdb_printf("::print impl_scsi_tgtmap_t ");
4610696SDavid.Hollister@Sun.COM 	mdb_printf("tgtmap_dam[0] tgtmap_dam[1]|::damap\n");
4710696SDavid.Hollister@Sun.COM }
4810696SDavid.Hollister@Sun.COM 
4910696SDavid.Hollister@Sun.COM static char *
local_strdup(const char * s)5010696SDavid.Hollister@Sun.COM local_strdup(const char *s)
5110696SDavid.Hollister@Sun.COM {
5210696SDavid.Hollister@Sun.COM 	if (s)
5310696SDavid.Hollister@Sun.COM 		return (strcpy(mdb_alloc(strlen(s) + 1, UM_SLEEP), s));
5410696SDavid.Hollister@Sun.COM 	else
5510696SDavid.Hollister@Sun.COM 		return (NULL);
5610696SDavid.Hollister@Sun.COM }
5710696SDavid.Hollister@Sun.COM 
5810696SDavid.Hollister@Sun.COM static void
local_strfree(const char * s)5910696SDavid.Hollister@Sun.COM local_strfree(const char *s)
6010696SDavid.Hollister@Sun.COM {
6110696SDavid.Hollister@Sun.COM 	if (s)
6210696SDavid.Hollister@Sun.COM 		mdb_free((void *)s, strlen(s) + 1);
6310696SDavid.Hollister@Sun.COM }
6410696SDavid.Hollister@Sun.COM 
6510696SDavid.Hollister@Sun.COM static void
bitset_free(bitset_t * bs,int embedded)6610696SDavid.Hollister@Sun.COM bitset_free(bitset_t *bs, int embedded)
6710696SDavid.Hollister@Sun.COM {
6810696SDavid.Hollister@Sun.COM 	if (bs == NULL)
6910696SDavid.Hollister@Sun.COM 		return;
7010696SDavid.Hollister@Sun.COM 	if (bs->bs_set && bs->bs_words)
7110696SDavid.Hollister@Sun.COM 		mdb_free(bs->bs_set, bs->bs_words * sizeof (ulong_t));
7210696SDavid.Hollister@Sun.COM 	if (!embedded)
7310696SDavid.Hollister@Sun.COM 		mdb_free(bs, sizeof (*bs));	/* not embedded, free */
7410696SDavid.Hollister@Sun.COM }
7510696SDavid.Hollister@Sun.COM 
7610696SDavid.Hollister@Sun.COM static bitset_t *
bitset_get(uintptr_t bsaddr)7710696SDavid.Hollister@Sun.COM bitset_get(uintptr_t bsaddr)
7810696SDavid.Hollister@Sun.COM {
7910696SDavid.Hollister@Sun.COM 	bitset_t	*bs;
8010696SDavid.Hollister@Sun.COM 
8110696SDavid.Hollister@Sun.COM 	bs = mdb_zalloc(sizeof (*bs), UM_SLEEP);
8210696SDavid.Hollister@Sun.COM 	if (mdb_vread(bs, sizeof (*bs), bsaddr) == -1) {
8310696SDavid.Hollister@Sun.COM 		mdb_warn("couldn't read bitset 0x%p", bsaddr);
8410696SDavid.Hollister@Sun.COM 		bitset_free(bs, 0);
8510696SDavid.Hollister@Sun.COM 		return (NULL);
8610696SDavid.Hollister@Sun.COM 	}
8710696SDavid.Hollister@Sun.COM 
8810696SDavid.Hollister@Sun.COM 	bsaddr = (uintptr_t)bs->bs_set;
8910696SDavid.Hollister@Sun.COM 	bs->bs_set = mdb_alloc(bs->bs_words * sizeof (ulong_t), UM_SLEEP);
9010696SDavid.Hollister@Sun.COM 	if (mdb_vread(bs->bs_set,
9110696SDavid.Hollister@Sun.COM 	    bs->bs_words * sizeof (ulong_t), bsaddr) == -1) {
9210696SDavid.Hollister@Sun.COM 		mdb_warn("couldn't read bitset bs_set 0x%p", bsaddr);
9310696SDavid.Hollister@Sun.COM 		bitset_free(bs, 0);
9410696SDavid.Hollister@Sun.COM 		return (NULL);
9510696SDavid.Hollister@Sun.COM 	}
9610696SDavid.Hollister@Sun.COM 	return (bs);
9710696SDavid.Hollister@Sun.COM 
9810696SDavid.Hollister@Sun.COM }
9910696SDavid.Hollister@Sun.COM 
10010696SDavid.Hollister@Sun.COM static void
damap_free(struct dam * dam,void ** kdamda,int kdamda_n)10110696SDavid.Hollister@Sun.COM damap_free(struct dam *dam, void **kdamda, int kdamda_n)
10210696SDavid.Hollister@Sun.COM {
10310696SDavid.Hollister@Sun.COM 	int			i;
10410696SDavid.Hollister@Sun.COM 	struct i_ddi_soft_state *ss;
10510696SDavid.Hollister@Sun.COM 	dam_da_t		*da;
10610696SDavid.Hollister@Sun.COM 
10710696SDavid.Hollister@Sun.COM 	if (dam) {
10810696SDavid.Hollister@Sun.COM 		/* free in dam_da_t softstate */
10910696SDavid.Hollister@Sun.COM 		ss = (struct i_ddi_soft_state *)dam->dam_da;
11010696SDavid.Hollister@Sun.COM 		if (ss) {
11110696SDavid.Hollister@Sun.COM 			if (ss->n_items && ss->array) {
11210696SDavid.Hollister@Sun.COM 				for (i = 0; i < ss->n_items; i++) {
11310696SDavid.Hollister@Sun.COM 					da = ss->array[i];
11410696SDavid.Hollister@Sun.COM 					if (da == NULL)
11510696SDavid.Hollister@Sun.COM 						continue;
11610696SDavid.Hollister@Sun.COM 					local_strfree(da->da_addr);
11710696SDavid.Hollister@Sun.COM 					mdb_free(da, sizeof (*da));
11810696SDavid.Hollister@Sun.COM 				}
11910696SDavid.Hollister@Sun.COM 			}
12010696SDavid.Hollister@Sun.COM 
12110696SDavid.Hollister@Sun.COM 			mdb_free(ss, sizeof (*ss));
12210696SDavid.Hollister@Sun.COM 		}
12310696SDavid.Hollister@Sun.COM 
12410696SDavid.Hollister@Sun.COM 		/* free dam_active/stable/report_set embedded in dam */
12510696SDavid.Hollister@Sun.COM 		bitset_free(&dam->dam_report_set, 1);
12610696SDavid.Hollister@Sun.COM 		bitset_free(&dam->dam_stable_set, 1);
12710696SDavid.Hollister@Sun.COM 		bitset_free(&dam->dam_active_set, 1);
12810696SDavid.Hollister@Sun.COM 
12910696SDavid.Hollister@Sun.COM 		/* free dam_name */
13010696SDavid.Hollister@Sun.COM 		local_strfree(dam->dam_name);
13110696SDavid.Hollister@Sun.COM 
13210696SDavid.Hollister@Sun.COM 		/* free dam */
13310696SDavid.Hollister@Sun.COM 		mdb_free(dam, sizeof (*dam));
13410696SDavid.Hollister@Sun.COM 	}
13510696SDavid.Hollister@Sun.COM 
13610696SDavid.Hollister@Sun.COM 	if (kdamda)
13710696SDavid.Hollister@Sun.COM 		mdb_free(kdamda, kdamda_n * sizeof (void *));
13810696SDavid.Hollister@Sun.COM }
13910696SDavid.Hollister@Sun.COM 
14010696SDavid.Hollister@Sun.COM /*
14110696SDavid.Hollister@Sun.COM  * The dam implementation uses a number of different abstractions. Given a
14210696SDavid.Hollister@Sun.COM  * pointer to a damap_t, this function make an mdb instantiation of the dam -
14310696SDavid.Hollister@Sun.COM  * many, but not all, of the different abstractions used in the dam
14410696SDavid.Hollister@Sun.COM  * implementation are also instantiated in mdb. This means that callers of
14510696SDavid.Hollister@Sun.COM  * damap_get can perform some (but not all) types of structure pointer
14610696SDavid.Hollister@Sun.COM  * traversals.
14710696SDavid.Hollister@Sun.COM  */
14810696SDavid.Hollister@Sun.COM struct dam *
damap_get(uintptr_t damaddr,void *** pkdamda,int * pkdamda_n)14910696SDavid.Hollister@Sun.COM damap_get(uintptr_t damaddr, void ***pkdamda, int *pkdamda_n)
15010696SDavid.Hollister@Sun.COM {
15110696SDavid.Hollister@Sun.COM 	/* variables that hold instantiation read from kernel */
15210696SDavid.Hollister@Sun.COM 	struct dam		kdam;
15310696SDavid.Hollister@Sun.COM 	char			kstring[MAXPATHLEN];
15410696SDavid.Hollister@Sun.COM 	struct i_ddi_soft_state kss;
15510696SDavid.Hollister@Sun.COM 	void			**kssarray = NULL;
15610696SDavid.Hollister@Sun.COM 	int			array_sz = 0;
15710696SDavid.Hollister@Sun.COM 
15810696SDavid.Hollister@Sun.COM 	/* variables that hold mdb instantiation */
15910696SDavid.Hollister@Sun.COM 	struct dam		*dam = NULL;
16010696SDavid.Hollister@Sun.COM 	struct i_ddi_soft_state *ss;
16110696SDavid.Hollister@Sun.COM 	bitset_t		*bs;
16210696SDavid.Hollister@Sun.COM 	dam_da_t		*da;
16310696SDavid.Hollister@Sun.COM 
16410696SDavid.Hollister@Sun.COM 	int			i;
16510696SDavid.Hollister@Sun.COM 
16610696SDavid.Hollister@Sun.COM 	/* read kernel: dam */
16710696SDavid.Hollister@Sun.COM 	if (mdb_vread(&kdam, sizeof (kdam), damaddr) == -1) {
16810696SDavid.Hollister@Sun.COM 		mdb_warn("couldn't read dam 0x%p", damaddr);
16910696SDavid.Hollister@Sun.COM 		goto err;
17010696SDavid.Hollister@Sun.COM 	}
17110696SDavid.Hollister@Sun.COM 
17210696SDavid.Hollister@Sun.COM 	/* read kernel: dam->dam_name */
17310696SDavid.Hollister@Sun.COM 	mdb_readstr(kstring, sizeof (kstring), (uintptr_t)kdam.dam_name);
17410696SDavid.Hollister@Sun.COM 
17510696SDavid.Hollister@Sun.COM 	/* read kernel: dam->dam_da (softstate) */
17610696SDavid.Hollister@Sun.COM 	if (mdb_vread(&kss, sizeof (kss), (uintptr_t)kdam.dam_da) == -1) {
17710696SDavid.Hollister@Sun.COM 		mdb_warn("couldn't read dam dam_da 0x%p",
17810696SDavid.Hollister@Sun.COM 		    (uintptr_t)kdam.dam_da);
17910696SDavid.Hollister@Sun.COM 		goto err;
18010696SDavid.Hollister@Sun.COM 	}
18110696SDavid.Hollister@Sun.COM 
18210696SDavid.Hollister@Sun.COM 	/* read kernel ((struct i_ddi_soft_state *)dam->dam_da)->array */
18310696SDavid.Hollister@Sun.COM 	array_sz = kss.n_items * sizeof (void *);
18410696SDavid.Hollister@Sun.COM 	kssarray = mdb_alloc(array_sz, UM_SLEEP);
18510696SDavid.Hollister@Sun.COM 	if (mdb_vread(kssarray, array_sz, (uintptr_t)kss.array) == -1) {
18610696SDavid.Hollister@Sun.COM 		mdb_warn("couldn't read dam dam_da array 0x%p",
18710696SDavid.Hollister@Sun.COM 		    (uintptr_t)kss.array);
18810696SDavid.Hollister@Sun.COM 		goto err;
18910696SDavid.Hollister@Sun.COM 	}
19010696SDavid.Hollister@Sun.COM 
19110696SDavid.Hollister@Sun.COM 	/*
19210696SDavid.Hollister@Sun.COM 	 * Produce mdb instantiation of kernel data structures.
19310696SDavid.Hollister@Sun.COM 	 *
19410696SDavid.Hollister@Sun.COM 	 * Structure copy kdam to dam, then clear out pointers in dam (some
19510696SDavid.Hollister@Sun.COM 	 * will be filled in by mdb instantiation code below).
19610696SDavid.Hollister@Sun.COM 	 */
19710696SDavid.Hollister@Sun.COM 	dam = mdb_zalloc(sizeof (*dam), UM_SLEEP);
19810696SDavid.Hollister@Sun.COM 	*dam = kdam;
19910696SDavid.Hollister@Sun.COM 	dam->dam_name = NULL;
20010696SDavid.Hollister@Sun.COM 
20110696SDavid.Hollister@Sun.COM 	dam->dam_active_set.bs_set = NULL;
20210696SDavid.Hollister@Sun.COM 	dam->dam_stable_set.bs_set = NULL;
20310696SDavid.Hollister@Sun.COM 	dam->dam_report_set.bs_set = NULL;
20410696SDavid.Hollister@Sun.COM 
20510696SDavid.Hollister@Sun.COM 	dam->dam_da = NULL;
20610696SDavid.Hollister@Sun.COM 	/* dam_addr_hash, dam_taskqp, dam_kstatp left as kernel addresses */
20710696SDavid.Hollister@Sun.COM 
20810696SDavid.Hollister@Sun.COM 	/* fill in dam_name */
20910696SDavid.Hollister@Sun.COM 	dam->dam_name = local_strdup(kstring);
21010696SDavid.Hollister@Sun.COM 
21110696SDavid.Hollister@Sun.COM 	/* fill in dam_active/stable/report_set embedded in the dam */
21210696SDavid.Hollister@Sun.COM 	bs = bitset_get(damaddr + (offsetof(struct dam, dam_active_set)));
21310696SDavid.Hollister@Sun.COM 	if (bs) {
21410696SDavid.Hollister@Sun.COM 		dam->dam_active_set = *bs;
21510696SDavid.Hollister@Sun.COM 		mdb_free(bs, sizeof (*bs));
21610696SDavid.Hollister@Sun.COM 	}
21710696SDavid.Hollister@Sun.COM 	bs = bitset_get(damaddr + (offsetof(struct dam, dam_stable_set)));
21810696SDavid.Hollister@Sun.COM 	if (bs) {
21910696SDavid.Hollister@Sun.COM 		dam->dam_stable_set = *bs;
22010696SDavid.Hollister@Sun.COM 		mdb_free(bs, sizeof (*bs));
22110696SDavid.Hollister@Sun.COM 	}
22210696SDavid.Hollister@Sun.COM 	bs = bitset_get(damaddr + (offsetof(struct dam, dam_report_set)));
22310696SDavid.Hollister@Sun.COM 	if (bs) {
22410696SDavid.Hollister@Sun.COM 		dam->dam_report_set = *bs;
22510696SDavid.Hollister@Sun.COM 		mdb_free(bs, sizeof (*bs));
22610696SDavid.Hollister@Sun.COM 	}
22710696SDavid.Hollister@Sun.COM 
22810696SDavid.Hollister@Sun.COM 	/* fill in dam_da_t softstate */
22910696SDavid.Hollister@Sun.COM 	ss = mdb_zalloc(sizeof (struct i_ddi_soft_state), UM_SLEEP);
23010696SDavid.Hollister@Sun.COM 	*ss = kss;
23110696SDavid.Hollister@Sun.COM 	ss->next = NULL;
23210696SDavid.Hollister@Sun.COM 	ss->array = mdb_zalloc(array_sz, UM_SLEEP);
23310696SDavid.Hollister@Sun.COM 	dam->dam_da = ss;
23410696SDavid.Hollister@Sun.COM 	for (i = 0; i < kss.n_items; i++) {
23510696SDavid.Hollister@Sun.COM 		if (kssarray[i] == NULL)
23610696SDavid.Hollister@Sun.COM 			continue;
23710696SDavid.Hollister@Sun.COM 		da = ss->array[i] = mdb_zalloc(sizeof (*da), UM_SLEEP);
23810696SDavid.Hollister@Sun.COM 		if (mdb_vread(da, sizeof (*da), (uintptr_t)kssarray[i]) == -1) {
23910696SDavid.Hollister@Sun.COM 			mdb_warn("couldn't read dam dam_da %d 0x%p", i,
24010696SDavid.Hollister@Sun.COM 			    (uintptr_t)kss.array);
24110696SDavid.Hollister@Sun.COM 			goto err;
24210696SDavid.Hollister@Sun.COM 		}
24310696SDavid.Hollister@Sun.COM 		/* da_nvl, da_ppriv_rpt, da_nvl_rpt left as kernel addresses */
24410696SDavid.Hollister@Sun.COM 
24510696SDavid.Hollister@Sun.COM 		/* read kernel: da->da_addr */
24610696SDavid.Hollister@Sun.COM 		mdb_readstr(kstring, sizeof (kstring), (uintptr_t)da->da_addr);
24710696SDavid.Hollister@Sun.COM 		da->da_addr = local_strdup(kstring);
24810696SDavid.Hollister@Sun.COM 	}
24910696SDavid.Hollister@Sun.COM 
25010696SDavid.Hollister@Sun.COM 	/* return array of kernel dam_da_t pointers associated with each id */
25110696SDavid.Hollister@Sun.COM 	*pkdamda = kssarray;
25210696SDavid.Hollister@Sun.COM 	*pkdamda_n = array_sz / sizeof (void *);
25310696SDavid.Hollister@Sun.COM 
25410696SDavid.Hollister@Sun.COM 	/* return pointer to mdb instantiation of the dam */
25510696SDavid.Hollister@Sun.COM 	return (dam);
25610696SDavid.Hollister@Sun.COM 
25710696SDavid.Hollister@Sun.COM err:	damap_free(dam, kssarray, array_sz / sizeof (void *));
25810696SDavid.Hollister@Sun.COM 	*pkdamda = NULL;
25910696SDavid.Hollister@Sun.COM 	*pkdamda_n = 0;
26010696SDavid.Hollister@Sun.COM 	return (NULL);
26110696SDavid.Hollister@Sun.COM }
26210696SDavid.Hollister@Sun.COM 
26310696SDavid.Hollister@Sun.COM /*ARGSUSED*/
26410696SDavid.Hollister@Sun.COM static void
damap_print(struct dam * dam,void ** kdamda,int kdamda_n)26510696SDavid.Hollister@Sun.COM damap_print(struct dam *dam, void **kdamda, int kdamda_n)
26610696SDavid.Hollister@Sun.COM {
26710696SDavid.Hollister@Sun.COM 	struct i_ddi_soft_state	*ss;
26810696SDavid.Hollister@Sun.COM 	dam_da_t		*da;
26910696SDavid.Hollister@Sun.COM 	int			i;
27010696SDavid.Hollister@Sun.COM 
27110696SDavid.Hollister@Sun.COM 	mdb_printf("%s:\n", dam->dam_name);
27210696SDavid.Hollister@Sun.COM 
27310696SDavid.Hollister@Sun.COM 	ss = (struct i_ddi_soft_state *)dam->dam_da;
27410696SDavid.Hollister@Sun.COM 	if (ss == NULL)
27510696SDavid.Hollister@Sun.COM 		return;
27610696SDavid.Hollister@Sun.COM 
27710696SDavid.Hollister@Sun.COM 	if ((ss->n_items == 0) || (ss->array == NULL))
27810696SDavid.Hollister@Sun.COM 		return;
27910696SDavid.Hollister@Sun.COM 
280*12512SMilos.Muzik@Sun.COM 	mdb_printf("    #: %-20s [ASR] ref config-private   provider-private\n",
281*12512SMilos.Muzik@Sun.COM 	    "address");
28210696SDavid.Hollister@Sun.COM 	for (i = 0; i < ss->n_items; i++) {
28310696SDavid.Hollister@Sun.COM 		da = ss->array[i];
28410696SDavid.Hollister@Sun.COM 		if (da == NULL)
28510696SDavid.Hollister@Sun.COM 			continue;
28610696SDavid.Hollister@Sun.COM 
28710696SDavid.Hollister@Sun.COM 		/* Print index and address. */
288*12512SMilos.Muzik@Sun.COM 		mdb_printf("  %3d: %-20s [", i, da->da_addr);
28910696SDavid.Hollister@Sun.COM 
29010696SDavid.Hollister@Sun.COM 		/* Print shorthand of Active/Stable/Report set membership */
29110696SDavid.Hollister@Sun.COM 		if (BT_TEST(dam->dam_active_set.bs_set, i))
29210696SDavid.Hollister@Sun.COM 			mdb_printf("A");
29310696SDavid.Hollister@Sun.COM 		else
29410696SDavid.Hollister@Sun.COM 			mdb_printf(".");
29510696SDavid.Hollister@Sun.COM 		if (BT_TEST(dam->dam_stable_set.bs_set, i))
29610696SDavid.Hollister@Sun.COM 			mdb_printf("S");
29710696SDavid.Hollister@Sun.COM 		else
29810696SDavid.Hollister@Sun.COM 			mdb_printf(".");
29910696SDavid.Hollister@Sun.COM 		if (BT_TEST(dam->dam_report_set.bs_set, i))
30010696SDavid.Hollister@Sun.COM 			mdb_printf("R");
30110696SDavid.Hollister@Sun.COM 		else
30210696SDavid.Hollister@Sun.COM 			mdb_printf(".");
30310696SDavid.Hollister@Sun.COM 
30410696SDavid.Hollister@Sun.COM 		/* Print the reference count and priv */
305*12512SMilos.Muzik@Sun.COM 		mdb_printf("] %-3d %0?lx %0?lx\n",
30610696SDavid.Hollister@Sun.COM 		    da->da_ref, da->da_cfg_priv, da->da_ppriv);
30710696SDavid.Hollister@Sun.COM 
308*12512SMilos.Muzik@Sun.COM 		mdb_printf("       %p::print -ta dam_da_t\n", kdamda[i]);
30910696SDavid.Hollister@Sun.COM 	}
31010696SDavid.Hollister@Sun.COM }
31110696SDavid.Hollister@Sun.COM 
31210696SDavid.Hollister@Sun.COM /*ARGSUSED*/
31310696SDavid.Hollister@Sun.COM int
damap(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)31410696SDavid.Hollister@Sun.COM damap(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
31510696SDavid.Hollister@Sun.COM {
31610696SDavid.Hollister@Sun.COM 	struct dam	*dam;
31710696SDavid.Hollister@Sun.COM 	void		**kdamda;
31810696SDavid.Hollister@Sun.COM 	int		kdamda_n;
31910696SDavid.Hollister@Sun.COM 
320*12512SMilos.Muzik@Sun.COM 	if (!(flags & DCMD_ADDRSPEC)) {
321*12512SMilos.Muzik@Sun.COM 		return (DCMD_ERR);
322*12512SMilos.Muzik@Sun.COM 	}
323*12512SMilos.Muzik@Sun.COM 
32410696SDavid.Hollister@Sun.COM 	dam = damap_get(addr, &kdamda, &kdamda_n);
32510696SDavid.Hollister@Sun.COM 	if (dam == NULL)
32610696SDavid.Hollister@Sun.COM 		return (DCMD_ERR);
32710696SDavid.Hollister@Sun.COM 
32810696SDavid.Hollister@Sun.COM 	damap_print(dam, kdamda, kdamda_n);
32910696SDavid.Hollister@Sun.COM 	damap_free(dam, kdamda, kdamda_n);
33010696SDavid.Hollister@Sun.COM 	return (DCMD_OK);
33110696SDavid.Hollister@Sun.COM }
332