1*0Sstevel@tonic-gate /* 2*0Sstevel@tonic-gate * CDDL HEADER START 3*0Sstevel@tonic-gate * 4*0Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*0Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*0Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*0Sstevel@tonic-gate * with the License. 8*0Sstevel@tonic-gate * 9*0Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*0Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*0Sstevel@tonic-gate * See the License for the specific language governing permissions 12*0Sstevel@tonic-gate * and limitations under the License. 13*0Sstevel@tonic-gate * 14*0Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*0Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*0Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*0Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*0Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*0Sstevel@tonic-gate * 20*0Sstevel@tonic-gate * CDDL HEADER END 21*0Sstevel@tonic-gate */ 22*0Sstevel@tonic-gate /* 23*0Sstevel@tonic-gate * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24*0Sstevel@tonic-gate * Use is subject to license terms. 25*0Sstevel@tonic-gate */ 26*0Sstevel@tonic-gate 27*0Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 28*0Sstevel@tonic-gate 29*0Sstevel@tonic-gate #include "mdinclude.h" 30*0Sstevel@tonic-gate #include <sys/lvm/md_names.h> 31*0Sstevel@tonic-gate 32*0Sstevel@tonic-gate /* 33*0Sstevel@tonic-gate * work out the offset size 34*0Sstevel@tonic-gate */ 35*0Sstevel@tonic-gate #define MY_DID_SHR_NAMSIZ(n) \ 36*0Sstevel@tonic-gate (((sizeof (struct did_shr_name) - 1) + \ 37*0Sstevel@tonic-gate n + (sizeof (uint_t) - 1)) & ~(sizeof (uint_t) - 1)) 38*0Sstevel@tonic-gate #define MY_SHR_NAMSIZ(n) \ 39*0Sstevel@tonic-gate (((sizeof (struct nm_shared_name) - 1) + \ 40*0Sstevel@tonic-gate n + (sizeof (uint_t) - 1)) & ~(sizeof (uint_t) - 1)) 41*0Sstevel@tonic-gate #define MY_DID_NAMSIZ(n) \ 42*0Sstevel@tonic-gate (((sizeof (struct did_min_name) - 1) + \ 43*0Sstevel@tonic-gate n + (sizeof (uint_t) - 1)) & ~(sizeof (uint_t) - 1)) 44*0Sstevel@tonic-gate #define MY_NAMSIZ(n) \ 45*0Sstevel@tonic-gate (((sizeof (struct nm_name) - 1) + \ 46*0Sstevel@tonic-gate n + (sizeof (uint_t) - 1)) & ~(sizeof (uint_t) - 1)) 47*0Sstevel@tonic-gate 48*0Sstevel@tonic-gate static uintptr_t 49*0Sstevel@tonic-gate print_did_shared_name(uintptr_t addr, int i) 50*0Sstevel@tonic-gate { 51*0Sstevel@tonic-gate struct did_shr_name shn; 52*0Sstevel@tonic-gate uintptr_t sn_name_addr; 53*0Sstevel@tonic-gate void *sn_name; 54*0Sstevel@tonic-gate uintptr_t next_addr = addr; 55*0Sstevel@tonic-gate 56*0Sstevel@tonic-gate if (mdb_vread(&shn, sizeof (struct did_shr_name), addr) != 57*0Sstevel@tonic-gate sizeof (struct did_shr_name)) { 58*0Sstevel@tonic-gate mdb_warn("failed to read did_shr_name at %p\n", addr); 59*0Sstevel@tonic-gate return (NULL); 60*0Sstevel@tonic-gate } 61*0Sstevel@tonic-gate if (shn.did_size == 0) 62*0Sstevel@tonic-gate return (NULL); 63*0Sstevel@tonic-gate mdb_printf("device_id[%d] at %p\n", i, addr); 64*0Sstevel@tonic-gate mdb_inc_indent(2); 65*0Sstevel@tonic-gate mdb_printf("did_key: %d\n", shn.did_key); 66*0Sstevel@tonic-gate mdb_printf("did_count: %u\n", shn.did_count); 67*0Sstevel@tonic-gate mdb_printf("did_data: 0x%x \n", shn.did_data); 68*0Sstevel@tonic-gate mdb_printf("did_size: %u\n", shn.did_size); 69*0Sstevel@tonic-gate sn_name_addr = addr + ((uintptr_t)&shn.did_devid - (uintptr_t)&shn); 70*0Sstevel@tonic-gate if (shn.did_size > 0) { 71*0Sstevel@tonic-gate sn_name = mdb_alloc(shn.did_size + 1, UM_SLEEP | UM_GC); 72*0Sstevel@tonic-gate if (mdb_readstr((char *)sn_name, shn.did_size + 1, 73*0Sstevel@tonic-gate sn_name_addr) <= 0) { 74*0Sstevel@tonic-gate mdb_warn("failed to read sn_name at %p\n", 75*0Sstevel@tonic-gate sn_name_addr); 76*0Sstevel@tonic-gate return (NULL); 77*0Sstevel@tonic-gate } 78*0Sstevel@tonic-gate mdb_printf("did_devid: %s at %p\n", (char *)sn_name, 79*0Sstevel@tonic-gate sn_name_addr); 80*0Sstevel@tonic-gate next_addr = addr + MY_DID_SHR_NAMSIZ(shn.did_size); 81*0Sstevel@tonic-gate } 82*0Sstevel@tonic-gate mdb_dec_indent(2); 83*0Sstevel@tonic-gate return (next_addr); 84*0Sstevel@tonic-gate } 85*0Sstevel@tonic-gate 86*0Sstevel@tonic-gate static uintptr_t 87*0Sstevel@tonic-gate print_nm_shared_name(uintptr_t addr, int i) 88*0Sstevel@tonic-gate { 89*0Sstevel@tonic-gate struct nm_shared_name shn; 90*0Sstevel@tonic-gate uintptr_t sn_name_addr; 91*0Sstevel@tonic-gate void *sn_name; 92*0Sstevel@tonic-gate uintptr_t next_addr = addr; 93*0Sstevel@tonic-gate 94*0Sstevel@tonic-gate if (mdb_vread(&shn, sizeof (struct nm_shared_name), addr) != 95*0Sstevel@tonic-gate sizeof (struct nm_shared_name)) { 96*0Sstevel@tonic-gate mdb_warn("failed to read nm_shared_name at %p\n", addr); 97*0Sstevel@tonic-gate return (NULL); 98*0Sstevel@tonic-gate } 99*0Sstevel@tonic-gate if (shn.sn_namlen == 0) 100*0Sstevel@tonic-gate return (NULL); 101*0Sstevel@tonic-gate mdb_printf("sr_name[%d] at %p\n", i, addr); 102*0Sstevel@tonic-gate mdb_inc_indent(2); 103*0Sstevel@tonic-gate mdb_printf("sn_key: %d \n", shn.sn_key); 104*0Sstevel@tonic-gate mdb_printf("sn_count: %u\n", shn.sn_count); 105*0Sstevel@tonic-gate mdb_printf("sn_data: 0x%x \n", shn.sn_data); 106*0Sstevel@tonic-gate mdb_printf("sn_namlen: %u\n", shn.sn_namlen); 107*0Sstevel@tonic-gate sn_name_addr = addr + ((uintptr_t)&shn.sn_name - (uintptr_t)&shn); 108*0Sstevel@tonic-gate if (shn.sn_namlen > 0) { 109*0Sstevel@tonic-gate sn_name = mdb_alloc(shn.sn_namlen + 1, UM_SLEEP | UM_GC); 110*0Sstevel@tonic-gate if (mdb_readstr((char *)sn_name, shn.sn_namlen + 1, 111*0Sstevel@tonic-gate sn_name_addr) <= 0) { 112*0Sstevel@tonic-gate mdb_warn("failed to read sn_name at %p\n", 113*0Sstevel@tonic-gate sn_name_addr); 114*0Sstevel@tonic-gate } 115*0Sstevel@tonic-gate mdb_printf("sn_name: %s at %p\n", (char *)sn_name, 116*0Sstevel@tonic-gate sn_name_addr); 117*0Sstevel@tonic-gate next_addr = addr + MY_SHR_NAMSIZ(shn.sn_namlen); 118*0Sstevel@tonic-gate } 119*0Sstevel@tonic-gate mdb_dec_indent(2); 120*0Sstevel@tonic-gate return (next_addr); 121*0Sstevel@tonic-gate } 122*0Sstevel@tonic-gate 123*0Sstevel@tonic-gate static uintptr_t 124*0Sstevel@tonic-gate print_devid_name(uintptr_t addr, int i) 125*0Sstevel@tonic-gate { 126*0Sstevel@tonic-gate struct did_min_name didmn; 127*0Sstevel@tonic-gate uintptr_t did_name_addr; 128*0Sstevel@tonic-gate void *min_name; 129*0Sstevel@tonic-gate uintptr_t next_addr = addr; 130*0Sstevel@tonic-gate 131*0Sstevel@tonic-gate if (mdb_vread(&didmn, sizeof (struct did_min_name), addr) != 132*0Sstevel@tonic-gate sizeof (struct did_min_name)) { 133*0Sstevel@tonic-gate mdb_warn("failed to read did_min_name at %p\n", addr); 134*0Sstevel@tonic-gate return (NULL); 135*0Sstevel@tonic-gate } 136*0Sstevel@tonic-gate if (didmn.min_namlen == 0) 137*0Sstevel@tonic-gate return (NULL); 138*0Sstevel@tonic-gate mdb_printf("minor_name[%d] at %p\n", i, addr); 139*0Sstevel@tonic-gate mdb_inc_indent(2); 140*0Sstevel@tonic-gate mdb_printf("min_key: %d \n", didmn.min_key); 141*0Sstevel@tonic-gate mdb_printf("min_count: %u\n", didmn.min_count); 142*0Sstevel@tonic-gate mdb_printf("min_devid_key: %d \n", didmn.min_devid_key); 143*0Sstevel@tonic-gate mdb_printf("min_namlen: %u\n", didmn.min_namlen); 144*0Sstevel@tonic-gate did_name_addr = addr + ((uintptr_t)&didmn.min_name - (uintptr_t)&didmn); 145*0Sstevel@tonic-gate if (didmn.min_namlen > 0) { 146*0Sstevel@tonic-gate min_name = mdb_alloc(didmn.min_namlen + 1, UM_SLEEP | UM_GC); 147*0Sstevel@tonic-gate if (mdb_readstr((char *)min_name, didmn.min_namlen + 1, 148*0Sstevel@tonic-gate did_name_addr) <= 0) { 149*0Sstevel@tonic-gate mdb_warn("failed to read min_name at %p\n", 150*0Sstevel@tonic-gate did_name_addr); 151*0Sstevel@tonic-gate } 152*0Sstevel@tonic-gate mdb_printf("min_name: %s at %p\n", (char *)min_name, 153*0Sstevel@tonic-gate did_name_addr); 154*0Sstevel@tonic-gate next_addr = addr + MY_DID_NAMSIZ(didmn.min_namlen); 155*0Sstevel@tonic-gate } 156*0Sstevel@tonic-gate mdb_dec_indent(2); 157*0Sstevel@tonic-gate return (next_addr); 158*0Sstevel@tonic-gate } 159*0Sstevel@tonic-gate 160*0Sstevel@tonic-gate static uintptr_t 161*0Sstevel@tonic-gate print_nm_name(uintptr_t addr, int i) 162*0Sstevel@tonic-gate { 163*0Sstevel@tonic-gate struct nm_name nm; 164*0Sstevel@tonic-gate uintptr_t nm_name_addr; 165*0Sstevel@tonic-gate void *n_name; 166*0Sstevel@tonic-gate uintptr_t next_addr = addr; 167*0Sstevel@tonic-gate 168*0Sstevel@tonic-gate if (mdb_vread(&nm, sizeof (struct nm_name), addr) != 169*0Sstevel@tonic-gate sizeof (struct nm_name)) { 170*0Sstevel@tonic-gate mdb_warn("failed to read nm_name at %p\n", addr); 171*0Sstevel@tonic-gate return (NULL); 172*0Sstevel@tonic-gate } 173*0Sstevel@tonic-gate if (nm.n_namlen == 0) 174*0Sstevel@tonic-gate return (NULL); 175*0Sstevel@tonic-gate mdb_printf("r_name[%d] at %p\n", i, addr); 176*0Sstevel@tonic-gate mdb_inc_indent(2); 177*0Sstevel@tonic-gate mdb_printf("n_key: %d \n", nm.n_key); 178*0Sstevel@tonic-gate mdb_printf("n_count: %u\n", nm.n_count); 179*0Sstevel@tonic-gate mdb_printf("n_minor: %x\n", nm.n_minor); 180*0Sstevel@tonic-gate mdb_printf("n_drv_key: %d \n", nm.n_drv_key); 181*0Sstevel@tonic-gate mdb_printf("n_dir_key: %d \n", nm.n_dir_key); 182*0Sstevel@tonic-gate mdb_printf("n_namlen: %u\n", nm.n_namlen); 183*0Sstevel@tonic-gate nm_name_addr = addr + ((uintptr_t)&nm.n_name - (uintptr_t)&nm); 184*0Sstevel@tonic-gate if (nm.n_namlen > 0) { 185*0Sstevel@tonic-gate n_name = mdb_alloc(nm.n_namlen + 1, UM_SLEEP | UM_GC); 186*0Sstevel@tonic-gate if (mdb_readstr((char *)n_name, nm.n_namlen + 1, 187*0Sstevel@tonic-gate nm_name_addr) <= 0) { 188*0Sstevel@tonic-gate mdb_warn("failed to read n_name at %p\n", nm_name_addr); 189*0Sstevel@tonic-gate } 190*0Sstevel@tonic-gate mdb_printf("n_name: %s at %p\n", (char *)n_name, 191*0Sstevel@tonic-gate nm_name_addr); 192*0Sstevel@tonic-gate next_addr = addr + MY_NAMSIZ(nm.n_namlen); 193*0Sstevel@tonic-gate } 194*0Sstevel@tonic-gate 195*0Sstevel@tonic-gate mdb_dec_indent(2); 196*0Sstevel@tonic-gate return (next_addr); 197*0Sstevel@tonic-gate } 198*0Sstevel@tonic-gate 199*0Sstevel@tonic-gate static uint_t 200*0Sstevel@tonic-gate process_nmn_record_hdr(uintptr_t addr) 201*0Sstevel@tonic-gate { 202*0Sstevel@tonic-gate struct nm_rec_hdr rhdr; 203*0Sstevel@tonic-gate 204*0Sstevel@tonic-gate /* 205*0Sstevel@tonic-gate * we read this anyway as the first part of nm_rec, devid_min_rec, 206*0Sstevel@tonic-gate * nm_shr_rec, and devid_shr_rec record is a nm_rec_hdr 207*0Sstevel@tonic-gate */ 208*0Sstevel@tonic-gate if (mdb_vread(&rhdr, sizeof (struct nm_rec_hdr), addr) != 209*0Sstevel@tonic-gate sizeof (struct nm_rec_hdr)) { 210*0Sstevel@tonic-gate mdb_warn("failed to read nm_rec_hdr at %p\n", addr); 211*0Sstevel@tonic-gate return (0); 212*0Sstevel@tonic-gate } 213*0Sstevel@tonic-gate 214*0Sstevel@tonic-gate mdb_printf("nmn_record: %p\n", addr); 215*0Sstevel@tonic-gate mdb_inc_indent(2); 216*0Sstevel@tonic-gate mdb_printf("r_revision: %4u\n", rhdr.r_revision); 217*0Sstevel@tonic-gate mdb_printf("r_alloc_size: %4u\n", rhdr.r_alloc_size); 218*0Sstevel@tonic-gate mdb_printf("r_used_size: %4u\n", rhdr.r_used_size); 219*0Sstevel@tonic-gate mdb_printf("r_next_recid: %4x\n", rhdr.r_next_recid); 220*0Sstevel@tonic-gate mdb_printf("xr_next_rec: %4u\n", rhdr.xr_next_rec); 221*0Sstevel@tonic-gate mdb_printf("r_next_key: %4d\n", rhdr.r_next_key); 222*0Sstevel@tonic-gate mdb_dec_indent(2); 223*0Sstevel@tonic-gate return (rhdr.r_used_size); 224*0Sstevel@tonic-gate } 225*0Sstevel@tonic-gate 226*0Sstevel@tonic-gate static void 227*0Sstevel@tonic-gate process_nmn_record(uintptr_t addr, int shared, int devid) 228*0Sstevel@tonic-gate { 229*0Sstevel@tonic-gate struct nm_shr_rec srhdr; 230*0Sstevel@tonic-gate struct devid_shr_rec didsrhdr; 231*0Sstevel@tonic-gate struct nm_rec nm_record; 232*0Sstevel@tonic-gate struct devid_min_rec devid_record; 233*0Sstevel@tonic-gate uintptr_t shn_addr; 234*0Sstevel@tonic-gate int i; 235*0Sstevel@tonic-gate uintptr_t next_addr, start_addr; 236*0Sstevel@tonic-gate uint_t used_size; 237*0Sstevel@tonic-gate 238*0Sstevel@tonic-gate used_size = process_nmn_record_hdr(addr); 239*0Sstevel@tonic-gate 240*0Sstevel@tonic-gate if (devid) { 241*0Sstevel@tonic-gate if (shared) { 242*0Sstevel@tonic-gate if (mdb_vread(&didsrhdr, sizeof (struct devid_shr_rec), 243*0Sstevel@tonic-gate addr) != sizeof (struct devid_shr_rec)) { 244*0Sstevel@tonic-gate mdb_warn("failed to read devid_shr_rec at %p\n", 245*0Sstevel@tonic-gate addr); 246*0Sstevel@tonic-gate return; 247*0Sstevel@tonic-gate } 248*0Sstevel@tonic-gate } else { 249*0Sstevel@tonic-gate if (mdb_vread(&devid_record, 250*0Sstevel@tonic-gate sizeof (struct devid_min_rec), addr) 251*0Sstevel@tonic-gate != sizeof (struct devid_min_rec)) { 252*0Sstevel@tonic-gate mdb_warn("failed to read devid_min_rec at %p\n", 253*0Sstevel@tonic-gate addr); 254*0Sstevel@tonic-gate return; 255*0Sstevel@tonic-gate } 256*0Sstevel@tonic-gate } 257*0Sstevel@tonic-gate } else { 258*0Sstevel@tonic-gate if (shared) { 259*0Sstevel@tonic-gate if (mdb_vread(&srhdr, sizeof (struct nm_shr_rec), addr) 260*0Sstevel@tonic-gate != sizeof (struct nm_shr_rec)) { 261*0Sstevel@tonic-gate mdb_warn("failed to read nm_shr_rec at %p\n", 262*0Sstevel@tonic-gate addr); 263*0Sstevel@tonic-gate return; 264*0Sstevel@tonic-gate } 265*0Sstevel@tonic-gate } else { 266*0Sstevel@tonic-gate if (mdb_vread(&nm_record, sizeof (struct nm_rec), addr) 267*0Sstevel@tonic-gate != sizeof (struct nm_rec)) { 268*0Sstevel@tonic-gate mdb_warn("failed to read nm_rec at %p\n", addr); 269*0Sstevel@tonic-gate return; 270*0Sstevel@tonic-gate } 271*0Sstevel@tonic-gate } 272*0Sstevel@tonic-gate } 273*0Sstevel@tonic-gate mdb_inc_indent(2); 274*0Sstevel@tonic-gate if (devid) { 275*0Sstevel@tonic-gate if (shared) { 276*0Sstevel@tonic-gate /* 277*0Sstevel@tonic-gate * Do the rest of the device_id records. 278*0Sstevel@tonic-gate */ 279*0Sstevel@tonic-gate next_addr = addr + ((uintptr_t)&didsrhdr.device_id[0] - 280*0Sstevel@tonic-gate (uintptr_t)&didsrhdr); 281*0Sstevel@tonic-gate start_addr = next_addr; 282*0Sstevel@tonic-gate for (i = 0; ; i++) { 283*0Sstevel@tonic-gate shn_addr = next_addr; 284*0Sstevel@tonic-gate next_addr = print_did_shared_name(shn_addr, i); 285*0Sstevel@tonic-gate if (next_addr == NULL) { 286*0Sstevel@tonic-gate mdb_dec_indent(2); 287*0Sstevel@tonic-gate return; 288*0Sstevel@tonic-gate } 289*0Sstevel@tonic-gate /* 290*0Sstevel@tonic-gate * Causes us to print one extra record. 291*0Sstevel@tonic-gate */ 292*0Sstevel@tonic-gate if ((next_addr - start_addr > used_size) || 293*0Sstevel@tonic-gate (next_addr == shn_addr)) { 294*0Sstevel@tonic-gate break; 295*0Sstevel@tonic-gate } 296*0Sstevel@tonic-gate } 297*0Sstevel@tonic-gate } else { 298*0Sstevel@tonic-gate /* 299*0Sstevel@tonic-gate * Now do the rest of the record. 300*0Sstevel@tonic-gate */ 301*0Sstevel@tonic-gate next_addr = addr + 302*0Sstevel@tonic-gate ((uintptr_t)&devid_record.minor_name[0] - 303*0Sstevel@tonic-gate (uintptr_t)&devid_record); 304*0Sstevel@tonic-gate start_addr = next_addr; 305*0Sstevel@tonic-gate for (i = 0; ; i++) { 306*0Sstevel@tonic-gate shn_addr = next_addr; 307*0Sstevel@tonic-gate next_addr = print_devid_name(shn_addr, i); 308*0Sstevel@tonic-gate if (next_addr == NULL) { 309*0Sstevel@tonic-gate mdb_dec_indent(2); 310*0Sstevel@tonic-gate return; 311*0Sstevel@tonic-gate } 312*0Sstevel@tonic-gate if ((next_addr - start_addr > used_size) || 313*0Sstevel@tonic-gate (next_addr == shn_addr)) { 314*0Sstevel@tonic-gate break; 315*0Sstevel@tonic-gate } 316*0Sstevel@tonic-gate } 317*0Sstevel@tonic-gate } 318*0Sstevel@tonic-gate } else { 319*0Sstevel@tonic-gate if (shared) { 320*0Sstevel@tonic-gate /* 321*0Sstevel@tonic-gate * Now do the rest of the sr_name records. 322*0Sstevel@tonic-gate */ 323*0Sstevel@tonic-gate next_addr = addr + ((uintptr_t)&srhdr.sr_name[0] - 324*0Sstevel@tonic-gate (uintptr_t)&srhdr); 325*0Sstevel@tonic-gate start_addr = next_addr; 326*0Sstevel@tonic-gate for (i = 0; ; i++) { 327*0Sstevel@tonic-gate shn_addr = next_addr; 328*0Sstevel@tonic-gate next_addr = print_nm_shared_name(shn_addr, i); 329*0Sstevel@tonic-gate if (next_addr == NULL) { 330*0Sstevel@tonic-gate mdb_dec_indent(2); 331*0Sstevel@tonic-gate return; 332*0Sstevel@tonic-gate } 333*0Sstevel@tonic-gate /* 334*0Sstevel@tonic-gate * Causes us to print one extra record 335*0Sstevel@tonic-gate */ 336*0Sstevel@tonic-gate if ((next_addr - start_addr > used_size) || 337*0Sstevel@tonic-gate (next_addr == shn_addr)) { 338*0Sstevel@tonic-gate break; 339*0Sstevel@tonic-gate } 340*0Sstevel@tonic-gate } 341*0Sstevel@tonic-gate } else { 342*0Sstevel@tonic-gate /* 343*0Sstevel@tonic-gate * Now do the rest of the record 344*0Sstevel@tonic-gate */ 345*0Sstevel@tonic-gate next_addr = addr + ((uintptr_t)&nm_record.r_name[0] - 346*0Sstevel@tonic-gate (uintptr_t)&nm_record); 347*0Sstevel@tonic-gate start_addr = next_addr; 348*0Sstevel@tonic-gate for (i = 0; ; i++) { 349*0Sstevel@tonic-gate shn_addr = next_addr; 350*0Sstevel@tonic-gate next_addr = print_nm_name(shn_addr, i); 351*0Sstevel@tonic-gate if (next_addr == NULL) { 352*0Sstevel@tonic-gate mdb_dec_indent(2); 353*0Sstevel@tonic-gate return; 354*0Sstevel@tonic-gate } 355*0Sstevel@tonic-gate if ((next_addr - start_addr > used_size) || 356*0Sstevel@tonic-gate (next_addr == shn_addr)) { 357*0Sstevel@tonic-gate break; 358*0Sstevel@tonic-gate } 359*0Sstevel@tonic-gate } 360*0Sstevel@tonic-gate } 361*0Sstevel@tonic-gate } 362*0Sstevel@tonic-gate mdb_dec_indent(2); 363*0Sstevel@tonic-gate } 364*0Sstevel@tonic-gate 365*0Sstevel@tonic-gate static void 366*0Sstevel@tonic-gate process_nm_next_hdr(uintptr_t addr, int shared, int devid) 367*0Sstevel@tonic-gate { 368*0Sstevel@tonic-gate uintptr_t next = addr; 369*0Sstevel@tonic-gate struct nm_next_hdr nhdr; 370*0Sstevel@tonic-gate 371*0Sstevel@tonic-gate mdb_inc_indent(2); 372*0Sstevel@tonic-gate mdb_printf("%p\n", next); 373*0Sstevel@tonic-gate if (mdb_vread(&nhdr, sizeof (struct nm_next_hdr), next) != 374*0Sstevel@tonic-gate sizeof (struct nm_next_hdr)) { 375*0Sstevel@tonic-gate mdb_warn("failed to read nm_next_hdr at %p", next); 376*0Sstevel@tonic-gate return; 377*0Sstevel@tonic-gate } 378*0Sstevel@tonic-gate (void) process_nmn_record_hdr((uintptr_t)nhdr.nmn_record); 379*0Sstevel@tonic-gate next = (uintptr_t)nhdr.nmn_nextp; 380*0Sstevel@tonic-gate while (next != (uintptr_t)0) { 381*0Sstevel@tonic-gate 382*0Sstevel@tonic-gate mdb_printf("\n"); 383*0Sstevel@tonic-gate mdb_printf("nmn_nextp %p\n", nhdr.nmn_nextp); 384*0Sstevel@tonic-gate if (mdb_vread(&nhdr, sizeof (struct nm_next_hdr), next) != 385*0Sstevel@tonic-gate sizeof (struct nm_next_hdr)) { 386*0Sstevel@tonic-gate mdb_warn("failed to read nm_next_hdr at %p\n", next); 387*0Sstevel@tonic-gate break; 388*0Sstevel@tonic-gate } 389*0Sstevel@tonic-gate process_nmn_record((uintptr_t)nhdr.nmn_record, shared, devid); 390*0Sstevel@tonic-gate next = (uintptr_t)nhdr.nmn_nextp; 391*0Sstevel@tonic-gate } 392*0Sstevel@tonic-gate mdb_printf("\n"); 393*0Sstevel@tonic-gate mdb_dec_indent(2); 394*0Sstevel@tonic-gate } 395*0Sstevel@tonic-gate /* 396*0Sstevel@tonic-gate * Start the processing of a nominated set 397*0Sstevel@tonic-gate */ 398*0Sstevel@tonic-gate static void 399*0Sstevel@tonic-gate process_set(int setno) 400*0Sstevel@tonic-gate { 401*0Sstevel@tonic-gate uintptr_t addr = (uintptr_t)mdset[setno].s_nm; 402*0Sstevel@tonic-gate uintptr_t did_addr = (uintptr_t)mdset[setno].s_did_nm; 403*0Sstevel@tonic-gate uintptr_t shared_addr, names_addr; 404*0Sstevel@tonic-gate uintptr_t did_names_addr, did_shared_addr; 405*0Sstevel@tonic-gate struct nm_header_hdr hdr, did_hdr; 406*0Sstevel@tonic-gate 407*0Sstevel@tonic-gate mdb_printf("------ Name Space for setno %d ------\n", setno); 408*0Sstevel@tonic-gate 409*0Sstevel@tonic-gate if (mdb_vread(&hdr, sizeof (struct nm_header_hdr), addr) != 410*0Sstevel@tonic-gate sizeof (struct nm_header_hdr)) { 411*0Sstevel@tonic-gate mdb_warn("failed to read nm_header_hdr at %p\n", addr); 412*0Sstevel@tonic-gate return; 413*0Sstevel@tonic-gate } 414*0Sstevel@tonic-gate mdb_printf("hh_header: %p \n", hdr.hh_header); 415*0Sstevel@tonic-gate if (did_addr != NULL) { /* device id's exist */ 416*0Sstevel@tonic-gate if (mdb_vread(&did_hdr, sizeof (struct nm_header_hdr), 417*0Sstevel@tonic-gate did_addr) != sizeof (struct nm_header_hdr)) { 418*0Sstevel@tonic-gate mdb_warn("failed to read nm_header_hdr at %p\n", 419*0Sstevel@tonic-gate did_addr); 420*0Sstevel@tonic-gate return; 421*0Sstevel@tonic-gate } 422*0Sstevel@tonic-gate mdb_printf("did hh_header: %p \n", did_hdr.hh_header); 423*0Sstevel@tonic-gate did_names_addr = 424*0Sstevel@tonic-gate (uintptr_t)&(((struct nm_header_hdr *)did_addr)->hh_names); 425*0Sstevel@tonic-gate did_shared_addr = 426*0Sstevel@tonic-gate (uintptr_t)&(((struct nm_header_hdr *)did_addr)->hh_shared); 427*0Sstevel@tonic-gate } 428*0Sstevel@tonic-gate 429*0Sstevel@tonic-gate names_addr = (uintptr_t)&(((struct nm_header_hdr *)addr)->hh_names); 430*0Sstevel@tonic-gate shared_addr = (uintptr_t)&(((struct nm_header_hdr *)addr)->hh_shared); 431*0Sstevel@tonic-gate mdb_printf("hh_names: %p \n", names_addr); 432*0Sstevel@tonic-gate mdb_printf("hh_shared: %p\n", shared_addr); 433*0Sstevel@tonic-gate 434*0Sstevel@tonic-gate if (did_addr != NULL) { 435*0Sstevel@tonic-gate mdb_printf("did hh_names: %p \n", did_names_addr); 436*0Sstevel@tonic-gate mdb_printf("did hh_shared: %p\n", did_shared_addr); 437*0Sstevel@tonic-gate } 438*0Sstevel@tonic-gate 439*0Sstevel@tonic-gate mdb_printf("hh_names:"); 440*0Sstevel@tonic-gate process_nm_next_hdr(names_addr, 0, 0); 441*0Sstevel@tonic-gate mdb_printf("\nhh_shared:"); 442*0Sstevel@tonic-gate process_nm_next_hdr(shared_addr, 1, 0); 443*0Sstevel@tonic-gate 444*0Sstevel@tonic-gate if (did_addr != NULL) { 445*0Sstevel@tonic-gate mdb_printf("did hh_names:"); 446*0Sstevel@tonic-gate process_nm_next_hdr(did_names_addr, 0, 1); 447*0Sstevel@tonic-gate mdb_printf("\ndid hh_shared:"); 448*0Sstevel@tonic-gate process_nm_next_hdr(did_shared_addr, 1, 1); 449*0Sstevel@tonic-gate } 450*0Sstevel@tonic-gate } 451*0Sstevel@tonic-gate /* 452*0Sstevel@tonic-gate * Dump the name space for all sets or specified set (-s option) 453*0Sstevel@tonic-gate * usage: ::dumpnamespace [-s setname] 454*0Sstevel@tonic-gate */ 455*0Sstevel@tonic-gate /* ARGSUSED */ 456*0Sstevel@tonic-gate int 457*0Sstevel@tonic-gate dumpnamespace(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 458*0Sstevel@tonic-gate { 459*0Sstevel@tonic-gate char *s_opt = NULL; 460*0Sstevel@tonic-gate int j; 461*0Sstevel@tonic-gate int setno; 462*0Sstevel@tonic-gate 463*0Sstevel@tonic-gate if (mdb_getopts(argc, argv, 's', MDB_OPT_STR, &s_opt, 464*0Sstevel@tonic-gate NULL) != argc) { 465*0Sstevel@tonic-gate /* left over arguments ?? */ 466*0Sstevel@tonic-gate return (DCMD_USAGE); 467*0Sstevel@tonic-gate } 468*0Sstevel@tonic-gate 469*0Sstevel@tonic-gate snarf_sets(); 470*0Sstevel@tonic-gate 471*0Sstevel@tonic-gate if (argc == 0) { 472*0Sstevel@tonic-gate for (j = 0; j < md_nsets; j++) { 473*0Sstevel@tonic-gate if (mdset[j].s_status & MD_SET_NM_LOADED) { 474*0Sstevel@tonic-gate process_set(j); 475*0Sstevel@tonic-gate } 476*0Sstevel@tonic-gate } 477*0Sstevel@tonic-gate } else { 478*0Sstevel@tonic-gate setno = findset(s_opt); 479*0Sstevel@tonic-gate if (setno == -1) { 480*0Sstevel@tonic-gate mdb_warn("no such set: %s\n", s_opt); 481*0Sstevel@tonic-gate return (DCMD_ERR); 482*0Sstevel@tonic-gate } 483*0Sstevel@tonic-gate if (mdset[setno].s_status & MD_SET_NM_LOADED) { 484*0Sstevel@tonic-gate process_set(setno); 485*0Sstevel@tonic-gate } 486*0Sstevel@tonic-gate } 487*0Sstevel@tonic-gate return (DCMD_OK); 488*0Sstevel@tonic-gate } 489