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