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