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 /* 2210696SDavid.Hollister@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 2310696SDavid.Hollister@Sun.COM * Use is subject to license terms. 2410696SDavid.Hollister@Sun.COM */ 2510696SDavid.Hollister@Sun.COM 2610696SDavid.Hollister@Sun.COM #include <mdb/mdb_modapi.h> 2710696SDavid.Hollister@Sun.COM #include <sys/sysmacros.h> 2810696SDavid.Hollister@Sun.COM #include <sys/sunddi.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 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 * 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 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 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 * 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 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 * 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 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*11334SReed.Liu@Sun.COM mdb_printf("\t#: target-port [ASR] ref lunmap::damap " 281*11334SReed.Liu@Sun.COM "hba-private\n"); 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. */ 28810696SDavid.Hollister@Sun.COM mdb_printf(" %3d: %s [", 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 */ 30510696SDavid.Hollister@Sun.COM mdb_printf("] %2d %0?lx %0?lx\n", 30610696SDavid.Hollister@Sun.COM da->da_ref, da->da_cfg_priv, da->da_ppriv); 30710696SDavid.Hollister@Sun.COM 308*11334SReed.Liu@Sun.COM mdb_printf("\t\t\t\t %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 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 32010696SDavid.Hollister@Sun.COM dam = damap_get(addr, &kdamda, &kdamda_n); 32110696SDavid.Hollister@Sun.COM if (dam == NULL) 32210696SDavid.Hollister@Sun.COM return (DCMD_ERR); 32310696SDavid.Hollister@Sun.COM 32410696SDavid.Hollister@Sun.COM damap_print(dam, kdamda, kdamda_n); 32510696SDavid.Hollister@Sun.COM damap_free(dam, kdamda, kdamda_n); 32610696SDavid.Hollister@Sun.COM return (DCMD_OK); 32710696SDavid.Hollister@Sun.COM } 328