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> 29*11363SReed.Liu@Sun.COM #include <sys/damap.h> 3010696SDavid.Hollister@Sun.COM #include <sys/damap_impl.h> 3110696SDavid.Hollister@Sun.COM 3210696SDavid.Hollister@Sun.COM #include "damap.h" 3310696SDavid.Hollister@Sun.COM 3410696SDavid.Hollister@Sun.COM void 3510696SDavid.Hollister@Sun.COM damap_help(void) 3610696SDavid.Hollister@Sun.COM { 3710696SDavid.Hollister@Sun.COM mdb_printf("Print the damap at the address given.\n"); 3810696SDavid.Hollister@Sun.COM mdb_printf("\n"); 3910696SDavid.Hollister@Sun.COM mdb_printf("EXAMPLE: SCSI: To display the SCSI tgtmap damaps "); 4010696SDavid.Hollister@Sun.COM mdb_printf("associated with a scsi HBA driver iport dip:\n"); 4110696SDavid.Hollister@Sun.COM mdb_printf("\n"); 4210696SDavid.Hollister@Sun.COM mdb_printf("::devbindings -q <driver_name>\n"); 4310696SDavid.Hollister@Sun.COM mdb_printf("\n"); 4410696SDavid.Hollister@Sun.COM mdb_printf("<iport-dip>::print struct dev_info devi_driver_data|"); 4510696SDavid.Hollister@Sun.COM mdb_printf("::print scsi_hba_tran_t tran_tgtmap|"); 4610696SDavid.Hollister@Sun.COM mdb_printf("::print impl_scsi_tgtmap_t "); 4710696SDavid.Hollister@Sun.COM mdb_printf("tgtmap_dam[0] tgtmap_dam[1]|::damap\n"); 4810696SDavid.Hollister@Sun.COM } 4910696SDavid.Hollister@Sun.COM 5010696SDavid.Hollister@Sun.COM static char * 5110696SDavid.Hollister@Sun.COM local_strdup(const char *s) 5210696SDavid.Hollister@Sun.COM { 5310696SDavid.Hollister@Sun.COM if (s) 5410696SDavid.Hollister@Sun.COM return (strcpy(mdb_alloc(strlen(s) + 1, UM_SLEEP), s)); 5510696SDavid.Hollister@Sun.COM else 5610696SDavid.Hollister@Sun.COM return (NULL); 5710696SDavid.Hollister@Sun.COM } 5810696SDavid.Hollister@Sun.COM 5910696SDavid.Hollister@Sun.COM static void 6010696SDavid.Hollister@Sun.COM local_strfree(const char *s) 6110696SDavid.Hollister@Sun.COM { 6210696SDavid.Hollister@Sun.COM if (s) 6310696SDavid.Hollister@Sun.COM mdb_free((void *)s, strlen(s) + 1); 6410696SDavid.Hollister@Sun.COM } 6510696SDavid.Hollister@Sun.COM 6610696SDavid.Hollister@Sun.COM static void 6710696SDavid.Hollister@Sun.COM bitset_free(bitset_t *bs, int embedded) 6810696SDavid.Hollister@Sun.COM { 6910696SDavid.Hollister@Sun.COM if (bs == NULL) 7010696SDavid.Hollister@Sun.COM return; 7110696SDavid.Hollister@Sun.COM if (bs->bs_set && bs->bs_words) 7210696SDavid.Hollister@Sun.COM mdb_free(bs->bs_set, bs->bs_words * sizeof (ulong_t)); 7310696SDavid.Hollister@Sun.COM if (!embedded) 7410696SDavid.Hollister@Sun.COM mdb_free(bs, sizeof (*bs)); /* not embedded, free */ 7510696SDavid.Hollister@Sun.COM } 7610696SDavid.Hollister@Sun.COM 7710696SDavid.Hollister@Sun.COM static bitset_t * 7810696SDavid.Hollister@Sun.COM bitset_get(uintptr_t bsaddr) 7910696SDavid.Hollister@Sun.COM { 8010696SDavid.Hollister@Sun.COM bitset_t *bs; 8110696SDavid.Hollister@Sun.COM 8210696SDavid.Hollister@Sun.COM bs = mdb_zalloc(sizeof (*bs), UM_SLEEP); 8310696SDavid.Hollister@Sun.COM if (mdb_vread(bs, sizeof (*bs), bsaddr) == -1) { 8410696SDavid.Hollister@Sun.COM mdb_warn("couldn't read bitset 0x%p", bsaddr); 8510696SDavid.Hollister@Sun.COM bitset_free(bs, 0); 8610696SDavid.Hollister@Sun.COM return (NULL); 8710696SDavid.Hollister@Sun.COM } 8810696SDavid.Hollister@Sun.COM 8910696SDavid.Hollister@Sun.COM bsaddr = (uintptr_t)bs->bs_set; 9010696SDavid.Hollister@Sun.COM bs->bs_set = mdb_alloc(bs->bs_words * sizeof (ulong_t), UM_SLEEP); 9110696SDavid.Hollister@Sun.COM if (mdb_vread(bs->bs_set, 9210696SDavid.Hollister@Sun.COM bs->bs_words * sizeof (ulong_t), bsaddr) == -1) { 9310696SDavid.Hollister@Sun.COM mdb_warn("couldn't read bitset bs_set 0x%p", bsaddr); 9410696SDavid.Hollister@Sun.COM bitset_free(bs, 0); 9510696SDavid.Hollister@Sun.COM return (NULL); 9610696SDavid.Hollister@Sun.COM } 9710696SDavid.Hollister@Sun.COM return (bs); 9810696SDavid.Hollister@Sun.COM 9910696SDavid.Hollister@Sun.COM } 10010696SDavid.Hollister@Sun.COM 10110696SDavid.Hollister@Sun.COM static void 10210696SDavid.Hollister@Sun.COM damap_free(struct dam *dam, void **kdamda, int kdamda_n) 10310696SDavid.Hollister@Sun.COM { 10410696SDavid.Hollister@Sun.COM int i; 10510696SDavid.Hollister@Sun.COM struct i_ddi_soft_state *ss; 10610696SDavid.Hollister@Sun.COM dam_da_t *da; 10710696SDavid.Hollister@Sun.COM 10810696SDavid.Hollister@Sun.COM if (dam) { 10910696SDavid.Hollister@Sun.COM /* free in dam_da_t softstate */ 11010696SDavid.Hollister@Sun.COM ss = (struct i_ddi_soft_state *)dam->dam_da; 11110696SDavid.Hollister@Sun.COM if (ss) { 11210696SDavid.Hollister@Sun.COM if (ss->n_items && ss->array) { 11310696SDavid.Hollister@Sun.COM for (i = 0; i < ss->n_items; i++) { 11410696SDavid.Hollister@Sun.COM da = ss->array[i]; 11510696SDavid.Hollister@Sun.COM if (da == NULL) 11610696SDavid.Hollister@Sun.COM continue; 11710696SDavid.Hollister@Sun.COM local_strfree(da->da_addr); 11810696SDavid.Hollister@Sun.COM mdb_free(da, sizeof (*da)); 11910696SDavid.Hollister@Sun.COM } 12010696SDavid.Hollister@Sun.COM } 12110696SDavid.Hollister@Sun.COM 12210696SDavid.Hollister@Sun.COM mdb_free(ss, sizeof (*ss)); 12310696SDavid.Hollister@Sun.COM } 12410696SDavid.Hollister@Sun.COM 12510696SDavid.Hollister@Sun.COM /* free dam_active/stable/report_set embedded in dam */ 12610696SDavid.Hollister@Sun.COM bitset_free(&dam->dam_report_set, 1); 12710696SDavid.Hollister@Sun.COM bitset_free(&dam->dam_stable_set, 1); 12810696SDavid.Hollister@Sun.COM bitset_free(&dam->dam_active_set, 1); 12910696SDavid.Hollister@Sun.COM 13010696SDavid.Hollister@Sun.COM /* free dam_name */ 13110696SDavid.Hollister@Sun.COM local_strfree(dam->dam_name); 13210696SDavid.Hollister@Sun.COM 13310696SDavid.Hollister@Sun.COM /* free dam */ 13410696SDavid.Hollister@Sun.COM mdb_free(dam, sizeof (*dam)); 13510696SDavid.Hollister@Sun.COM } 13610696SDavid.Hollister@Sun.COM 13710696SDavid.Hollister@Sun.COM if (kdamda) 13810696SDavid.Hollister@Sun.COM mdb_free(kdamda, kdamda_n * sizeof (void *)); 13910696SDavid.Hollister@Sun.COM } 14010696SDavid.Hollister@Sun.COM 14110696SDavid.Hollister@Sun.COM /* 14210696SDavid.Hollister@Sun.COM * The dam implementation uses a number of different abstractions. Given a 14310696SDavid.Hollister@Sun.COM * pointer to a damap_t, this function make an mdb instantiation of the dam - 14410696SDavid.Hollister@Sun.COM * many, but not all, of the different abstractions used in the dam 14510696SDavid.Hollister@Sun.COM * implementation are also instantiated in mdb. This means that callers of 14610696SDavid.Hollister@Sun.COM * damap_get can perform some (but not all) types of structure pointer 14710696SDavid.Hollister@Sun.COM * traversals. 14810696SDavid.Hollister@Sun.COM */ 14910696SDavid.Hollister@Sun.COM struct dam * 15010696SDavid.Hollister@Sun.COM damap_get(uintptr_t damaddr, void ***pkdamda, int *pkdamda_n) 15110696SDavid.Hollister@Sun.COM { 15210696SDavid.Hollister@Sun.COM /* variables that hold instantiation read from kernel */ 15310696SDavid.Hollister@Sun.COM struct dam kdam; 15410696SDavid.Hollister@Sun.COM char kstring[MAXPATHLEN]; 15510696SDavid.Hollister@Sun.COM struct i_ddi_soft_state kss; 15610696SDavid.Hollister@Sun.COM void **kssarray = NULL; 15710696SDavid.Hollister@Sun.COM int array_sz = 0; 15810696SDavid.Hollister@Sun.COM 15910696SDavid.Hollister@Sun.COM /* variables that hold mdb instantiation */ 16010696SDavid.Hollister@Sun.COM struct dam *dam = NULL; 16110696SDavid.Hollister@Sun.COM struct i_ddi_soft_state *ss; 16210696SDavid.Hollister@Sun.COM bitset_t *bs; 16310696SDavid.Hollister@Sun.COM dam_da_t *da; 16410696SDavid.Hollister@Sun.COM 16510696SDavid.Hollister@Sun.COM int i; 16610696SDavid.Hollister@Sun.COM 16710696SDavid.Hollister@Sun.COM /* read kernel: dam */ 16810696SDavid.Hollister@Sun.COM if (mdb_vread(&kdam, sizeof (kdam), damaddr) == -1) { 16910696SDavid.Hollister@Sun.COM mdb_warn("couldn't read dam 0x%p", damaddr); 17010696SDavid.Hollister@Sun.COM goto err; 17110696SDavid.Hollister@Sun.COM } 17210696SDavid.Hollister@Sun.COM 17310696SDavid.Hollister@Sun.COM /* read kernel: dam->dam_name */ 17410696SDavid.Hollister@Sun.COM mdb_readstr(kstring, sizeof (kstring), (uintptr_t)kdam.dam_name); 17510696SDavid.Hollister@Sun.COM 17610696SDavid.Hollister@Sun.COM /* read kernel: dam->dam_da (softstate) */ 17710696SDavid.Hollister@Sun.COM if (mdb_vread(&kss, sizeof (kss), (uintptr_t)kdam.dam_da) == -1) { 17810696SDavid.Hollister@Sun.COM mdb_warn("couldn't read dam dam_da 0x%p", 17910696SDavid.Hollister@Sun.COM (uintptr_t)kdam.dam_da); 18010696SDavid.Hollister@Sun.COM goto err; 18110696SDavid.Hollister@Sun.COM } 18210696SDavid.Hollister@Sun.COM 18310696SDavid.Hollister@Sun.COM /* read kernel ((struct i_ddi_soft_state *)dam->dam_da)->array */ 18410696SDavid.Hollister@Sun.COM array_sz = kss.n_items * sizeof (void *); 18510696SDavid.Hollister@Sun.COM kssarray = mdb_alloc(array_sz, UM_SLEEP); 18610696SDavid.Hollister@Sun.COM if (mdb_vread(kssarray, array_sz, (uintptr_t)kss.array) == -1) { 18710696SDavid.Hollister@Sun.COM mdb_warn("couldn't read dam dam_da array 0x%p", 18810696SDavid.Hollister@Sun.COM (uintptr_t)kss.array); 18910696SDavid.Hollister@Sun.COM goto err; 19010696SDavid.Hollister@Sun.COM } 19110696SDavid.Hollister@Sun.COM 19210696SDavid.Hollister@Sun.COM /* 19310696SDavid.Hollister@Sun.COM * Produce mdb instantiation of kernel data structures. 19410696SDavid.Hollister@Sun.COM * 19510696SDavid.Hollister@Sun.COM * Structure copy kdam to dam, then clear out pointers in dam (some 19610696SDavid.Hollister@Sun.COM * will be filled in by mdb instantiation code below). 19710696SDavid.Hollister@Sun.COM */ 19810696SDavid.Hollister@Sun.COM dam = mdb_zalloc(sizeof (*dam), UM_SLEEP); 19910696SDavid.Hollister@Sun.COM *dam = kdam; 20010696SDavid.Hollister@Sun.COM dam->dam_name = NULL; 20110696SDavid.Hollister@Sun.COM 20210696SDavid.Hollister@Sun.COM dam->dam_active_set.bs_set = NULL; 20310696SDavid.Hollister@Sun.COM dam->dam_stable_set.bs_set = NULL; 20410696SDavid.Hollister@Sun.COM dam->dam_report_set.bs_set = NULL; 20510696SDavid.Hollister@Sun.COM 20610696SDavid.Hollister@Sun.COM dam->dam_da = NULL; 20710696SDavid.Hollister@Sun.COM /* dam_addr_hash, dam_taskqp, dam_kstatp left as kernel addresses */ 20810696SDavid.Hollister@Sun.COM 20910696SDavid.Hollister@Sun.COM /* fill in dam_name */ 21010696SDavid.Hollister@Sun.COM dam->dam_name = local_strdup(kstring); 21110696SDavid.Hollister@Sun.COM 21210696SDavid.Hollister@Sun.COM /* fill in dam_active/stable/report_set embedded in the dam */ 21310696SDavid.Hollister@Sun.COM bs = bitset_get(damaddr + (offsetof(struct dam, dam_active_set))); 21410696SDavid.Hollister@Sun.COM if (bs) { 21510696SDavid.Hollister@Sun.COM dam->dam_active_set = *bs; 21610696SDavid.Hollister@Sun.COM mdb_free(bs, sizeof (*bs)); 21710696SDavid.Hollister@Sun.COM } 21810696SDavid.Hollister@Sun.COM bs = bitset_get(damaddr + (offsetof(struct dam, dam_stable_set))); 21910696SDavid.Hollister@Sun.COM if (bs) { 22010696SDavid.Hollister@Sun.COM dam->dam_stable_set = *bs; 22110696SDavid.Hollister@Sun.COM mdb_free(bs, sizeof (*bs)); 22210696SDavid.Hollister@Sun.COM } 22310696SDavid.Hollister@Sun.COM bs = bitset_get(damaddr + (offsetof(struct dam, dam_report_set))); 22410696SDavid.Hollister@Sun.COM if (bs) { 22510696SDavid.Hollister@Sun.COM dam->dam_report_set = *bs; 22610696SDavid.Hollister@Sun.COM mdb_free(bs, sizeof (*bs)); 22710696SDavid.Hollister@Sun.COM } 22810696SDavid.Hollister@Sun.COM 22910696SDavid.Hollister@Sun.COM /* fill in dam_da_t softstate */ 23010696SDavid.Hollister@Sun.COM ss = mdb_zalloc(sizeof (struct i_ddi_soft_state), UM_SLEEP); 23110696SDavid.Hollister@Sun.COM *ss = kss; 23210696SDavid.Hollister@Sun.COM ss->next = NULL; 23310696SDavid.Hollister@Sun.COM ss->array = mdb_zalloc(array_sz, UM_SLEEP); 23410696SDavid.Hollister@Sun.COM dam->dam_da = ss; 23510696SDavid.Hollister@Sun.COM for (i = 0; i < kss.n_items; i++) { 23610696SDavid.Hollister@Sun.COM if (kssarray[i] == NULL) 23710696SDavid.Hollister@Sun.COM continue; 23810696SDavid.Hollister@Sun.COM da = ss->array[i] = mdb_zalloc(sizeof (*da), UM_SLEEP); 23910696SDavid.Hollister@Sun.COM if (mdb_vread(da, sizeof (*da), (uintptr_t)kssarray[i]) == -1) { 24010696SDavid.Hollister@Sun.COM mdb_warn("couldn't read dam dam_da %d 0x%p", i, 24110696SDavid.Hollister@Sun.COM (uintptr_t)kss.array); 24210696SDavid.Hollister@Sun.COM goto err; 24310696SDavid.Hollister@Sun.COM } 24410696SDavid.Hollister@Sun.COM /* da_nvl, da_ppriv_rpt, da_nvl_rpt left as kernel addresses */ 24510696SDavid.Hollister@Sun.COM 24610696SDavid.Hollister@Sun.COM /* read kernel: da->da_addr */ 24710696SDavid.Hollister@Sun.COM mdb_readstr(kstring, sizeof (kstring), (uintptr_t)da->da_addr); 24810696SDavid.Hollister@Sun.COM da->da_addr = local_strdup(kstring); 24910696SDavid.Hollister@Sun.COM } 25010696SDavid.Hollister@Sun.COM 25110696SDavid.Hollister@Sun.COM /* return array of kernel dam_da_t pointers associated with each id */ 25210696SDavid.Hollister@Sun.COM *pkdamda = kssarray; 25310696SDavid.Hollister@Sun.COM *pkdamda_n = array_sz / sizeof (void *); 25410696SDavid.Hollister@Sun.COM 25510696SDavid.Hollister@Sun.COM /* return pointer to mdb instantiation of the dam */ 25610696SDavid.Hollister@Sun.COM return (dam); 25710696SDavid.Hollister@Sun.COM 25810696SDavid.Hollister@Sun.COM err: damap_free(dam, kssarray, array_sz / sizeof (void *)); 25910696SDavid.Hollister@Sun.COM *pkdamda = NULL; 26010696SDavid.Hollister@Sun.COM *pkdamda_n = 0; 26110696SDavid.Hollister@Sun.COM return (NULL); 26210696SDavid.Hollister@Sun.COM } 26310696SDavid.Hollister@Sun.COM 26410696SDavid.Hollister@Sun.COM /*ARGSUSED*/ 26510696SDavid.Hollister@Sun.COM static void 26610696SDavid.Hollister@Sun.COM damap_print(struct dam *dam, void **kdamda, int kdamda_n) 26710696SDavid.Hollister@Sun.COM { 26810696SDavid.Hollister@Sun.COM struct i_ddi_soft_state *ss; 26910696SDavid.Hollister@Sun.COM dam_da_t *da; 27010696SDavid.Hollister@Sun.COM int i; 27110696SDavid.Hollister@Sun.COM 27210696SDavid.Hollister@Sun.COM mdb_printf("%s:\n", dam->dam_name); 27310696SDavid.Hollister@Sun.COM 27410696SDavid.Hollister@Sun.COM ss = (struct i_ddi_soft_state *)dam->dam_da; 27510696SDavid.Hollister@Sun.COM if (ss == NULL) 27610696SDavid.Hollister@Sun.COM return; 27710696SDavid.Hollister@Sun.COM 27810696SDavid.Hollister@Sun.COM if ((ss->n_items == 0) || (ss->array == NULL)) 27910696SDavid.Hollister@Sun.COM return; 28010696SDavid.Hollister@Sun.COM 28111334SReed.Liu@Sun.COM mdb_printf("\t#: target-port [ASR] ref lunmap::damap " 28211334SReed.Liu@Sun.COM "hba-private\n"); 28310696SDavid.Hollister@Sun.COM for (i = 0; i < ss->n_items; i++) { 28410696SDavid.Hollister@Sun.COM da = ss->array[i]; 28510696SDavid.Hollister@Sun.COM if (da == NULL) 28610696SDavid.Hollister@Sun.COM continue; 28710696SDavid.Hollister@Sun.COM 28810696SDavid.Hollister@Sun.COM /* Print index and address. */ 28910696SDavid.Hollister@Sun.COM mdb_printf(" %3d: %s [", i, da->da_addr); 29010696SDavid.Hollister@Sun.COM 29110696SDavid.Hollister@Sun.COM /* Print shorthand of Active/Stable/Report set membership */ 29210696SDavid.Hollister@Sun.COM if (BT_TEST(dam->dam_active_set.bs_set, i)) 29310696SDavid.Hollister@Sun.COM mdb_printf("A"); 29410696SDavid.Hollister@Sun.COM else 29510696SDavid.Hollister@Sun.COM mdb_printf("."); 29610696SDavid.Hollister@Sun.COM if (BT_TEST(dam->dam_stable_set.bs_set, i)) 29710696SDavid.Hollister@Sun.COM mdb_printf("S"); 29810696SDavid.Hollister@Sun.COM else 29910696SDavid.Hollister@Sun.COM mdb_printf("."); 30010696SDavid.Hollister@Sun.COM if (BT_TEST(dam->dam_report_set.bs_set, i)) 30110696SDavid.Hollister@Sun.COM mdb_printf("R"); 30210696SDavid.Hollister@Sun.COM else 30310696SDavid.Hollister@Sun.COM mdb_printf("."); 30410696SDavid.Hollister@Sun.COM 30510696SDavid.Hollister@Sun.COM /* Print the reference count and priv */ 30610696SDavid.Hollister@Sun.COM mdb_printf("] %2d %0?lx %0?lx\n", 30710696SDavid.Hollister@Sun.COM da->da_ref, da->da_cfg_priv, da->da_ppriv); 30810696SDavid.Hollister@Sun.COM 30911334SReed.Liu@Sun.COM mdb_printf("\t\t\t\t %p::print -ta dam_da_t\n", kdamda[i]); 31010696SDavid.Hollister@Sun.COM } 31110696SDavid.Hollister@Sun.COM } 31210696SDavid.Hollister@Sun.COM 31310696SDavid.Hollister@Sun.COM /*ARGSUSED*/ 31410696SDavid.Hollister@Sun.COM int 31510696SDavid.Hollister@Sun.COM damap(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 31610696SDavid.Hollister@Sun.COM { 31710696SDavid.Hollister@Sun.COM struct dam *dam; 31810696SDavid.Hollister@Sun.COM void **kdamda; 31910696SDavid.Hollister@Sun.COM int kdamda_n; 32010696SDavid.Hollister@Sun.COM 32110696SDavid.Hollister@Sun.COM dam = damap_get(addr, &kdamda, &kdamda_n); 32210696SDavid.Hollister@Sun.COM if (dam == NULL) 32310696SDavid.Hollister@Sun.COM return (DCMD_ERR); 32410696SDavid.Hollister@Sun.COM 32510696SDavid.Hollister@Sun.COM damap_print(dam, kdamda, kdamda_n); 32610696SDavid.Hollister@Sun.COM damap_free(dam, kdamda, kdamda_n); 32710696SDavid.Hollister@Sun.COM return (DCMD_OK); 32810696SDavid.Hollister@Sun.COM } 329