xref: /titanic_41/usr/src/cmd/mdb/common/modules/ii/ii.c (revision fcf3ce441efd61da9bb2884968af01cb7c1452cc)
1*fcf3ce44SJohn Forte /*
2*fcf3ce44SJohn Forte  * CDDL HEADER START
3*fcf3ce44SJohn Forte  *
4*fcf3ce44SJohn Forte  * The contents of this file are subject to the terms of the
5*fcf3ce44SJohn Forte  * Common Development and Distribution License (the "License").
6*fcf3ce44SJohn Forte  * You may not use this file except in compliance with the License.
7*fcf3ce44SJohn Forte  *
8*fcf3ce44SJohn Forte  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*fcf3ce44SJohn Forte  * or http://www.opensolaris.org/os/licensing.
10*fcf3ce44SJohn Forte  * See the License for the specific language governing permissions
11*fcf3ce44SJohn Forte  * and limitations under the License.
12*fcf3ce44SJohn Forte  *
13*fcf3ce44SJohn Forte  * When distributing Covered Code, include this CDDL HEADER in each
14*fcf3ce44SJohn Forte  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*fcf3ce44SJohn Forte  * If applicable, add the following below this CDDL HEADER, with the
16*fcf3ce44SJohn Forte  * fields enclosed by brackets "[]" replaced with your own identifying
17*fcf3ce44SJohn Forte  * information: Portions Copyright [yyyy] [name of copyright owner]
18*fcf3ce44SJohn Forte  *
19*fcf3ce44SJohn Forte  * CDDL HEADER END
20*fcf3ce44SJohn Forte  */
21*fcf3ce44SJohn Forte /*
22*fcf3ce44SJohn Forte  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23*fcf3ce44SJohn Forte  * Use is subject to license terms.
24*fcf3ce44SJohn Forte  */
25*fcf3ce44SJohn Forte 
26*fcf3ce44SJohn Forte #include <sys/types.h>
27*fcf3ce44SJohn Forte #include <sys/mdb_modapi.h>
28*fcf3ce44SJohn Forte 
29*fcf3ce44SJohn Forte #include <sys/nsctl/nsctl.h>
30*fcf3ce44SJohn Forte #include <sys/unistat/spcs_s.h>
31*fcf3ce44SJohn Forte #include <sys/unistat/spcs_s_k.h>
32*fcf3ce44SJohn Forte 
33*fcf3ce44SJohn Forte 
34*fcf3ce44SJohn Forte #include <sys/nsctl/dsw.h>
35*fcf3ce44SJohn Forte #include <sys/nsctl/dsw_dev.h>
36*fcf3ce44SJohn Forte 
37*fcf3ce44SJohn Forte #include <sys/nsctl/nsvers.h>
38*fcf3ce44SJohn Forte 
39*fcf3ce44SJohn Forte #define	offsetof(s, m)  ((size_t)(&((s *)0)->m))
40*fcf3ce44SJohn Forte 
41*fcf3ce44SJohn Forte 
42*fcf3ce44SJohn Forte const mdb_bitmask_t bi_flags_bits[] = {
43*fcf3ce44SJohn Forte 	{ "DSW_GOLDEN", DSW_GOLDEN, DSW_GOLDEN },
44*fcf3ce44SJohn Forte 	{ "DSW_COPYINGP", DSW_COPYINGP, DSW_COPYINGP },
45*fcf3ce44SJohn Forte 	{ "DSW_COPYINGM", DSW_COPYINGM, DSW_COPYINGM },
46*fcf3ce44SJohn Forte 	{ "DSW_COPYINGS", DSW_COPYINGS, DSW_COPYINGS },
47*fcf3ce44SJohn Forte 	{ "DSW_COPYINGX", DSW_COPYINGX, DSW_COPYINGX },
48*fcf3ce44SJohn Forte 	{ "DSW_BMPOFFLINE", DSW_BMPOFFLINE, DSW_BMPOFFLINE },
49*fcf3ce44SJohn Forte 	{ "DSW_SHDOFFLINE", DSW_SHDOFFLINE, DSW_SHDOFFLINE },
50*fcf3ce44SJohn Forte 	{ "DSW_MSTOFFLINE", DSW_MSTOFFLINE, DSW_MSTOFFLINE },
51*fcf3ce44SJohn Forte 	{ "DSW_OVROFFLINE", DSW_OVROFFLINE, DSW_OVROFFLINE },
52*fcf3ce44SJohn Forte 	{ "DSW_TREEMAP", DSW_TREEMAP, DSW_TREEMAP },
53*fcf3ce44SJohn Forte 	{ "DSW_OVERFLOW", DSW_OVERFLOW, DSW_OVERFLOW },
54*fcf3ce44SJohn Forte 	{ "DSW_SHDEXPORT", DSW_SHDEXPORT, DSW_SHDEXPORT },
55*fcf3ce44SJohn Forte 	{ "DSW_SHDIMPORT", DSW_SHDIMPORT, DSW_SHDIMPORT },
56*fcf3ce44SJohn Forte 	{ "DSW_VOVERFLOW", DSW_VOVERFLOW, DSW_VOVERFLOW },
57*fcf3ce44SJohn Forte 	{ "DSW_HANGING", DSW_HANGING, DSW_HANGING },
58*fcf3ce44SJohn Forte 	{ "DSW_CFGOFFLINE", DSW_CFGOFFLINE, DSW_CFGOFFLINE },
59*fcf3ce44SJohn Forte 	{ "DSW_OVRHDRDRTY", DSW_OVRHDRDRTY, DSW_OVRHDRDRTY },
60*fcf3ce44SJohn Forte 	{ "DSW_RESIZED", DSW_RESIZED, DSW_RESIZED },
61*fcf3ce44SJohn Forte 	{ "DSW_FRECLAIM", DSW_FRECLAIM, DSW_FRECLAIM },
62*fcf3ce44SJohn Forte 	{ NULL, 0, 0 }
63*fcf3ce44SJohn Forte };
64*fcf3ce44SJohn Forte 
65*fcf3ce44SJohn Forte const mdb_bitmask_t bi_state_bits[] = {
66*fcf3ce44SJohn Forte 	{ "DSW_IOCTL", DSW_IOCTL, DSW_IOCTL },
67*fcf3ce44SJohn Forte 	{ "DSW_CLOSING", DSW_CLOSING, DSW_CLOSING },
68*fcf3ce44SJohn Forte 	{ "DSW_MSTTARGET", DSW_MSTTARGET, DSW_MSTTARGET },
69*fcf3ce44SJohn Forte 	{ "DSW_MULTIMST", DSW_MULTIMST, DSW_MULTIMST },
70*fcf3ce44SJohn Forte 	{ NULL, 0, 0 }
71*fcf3ce44SJohn Forte };
72*fcf3ce44SJohn Forte static uintptr_t nextaddr;
73*fcf3ce44SJohn Forte /*
74*fcf3ce44SJohn Forte  * Display a ii_fd_t
75*fcf3ce44SJohn Forte  * Requires an address.
76*fcf3ce44SJohn Forte  */
77*fcf3ce44SJohn Forte /*ARGSUSED*/
78*fcf3ce44SJohn Forte static int
ii_fd(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)79*fcf3ce44SJohn Forte ii_fd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
80*fcf3ce44SJohn Forte {
81*fcf3ce44SJohn Forte 	ii_fd_t fd;
82*fcf3ce44SJohn Forte 
83*fcf3ce44SJohn Forte 	if (!(flags & DCMD_ADDRSPEC))
84*fcf3ce44SJohn Forte 		return (DCMD_USAGE);
85*fcf3ce44SJohn Forte 
86*fcf3ce44SJohn Forte 	if (mdb_vread(&fd, sizeof (fd), addr) != sizeof (fd)) {
87*fcf3ce44SJohn Forte 		mdb_warn("failed to read ii_fd_t at 0x%p", addr);
88*fcf3ce44SJohn Forte 		return (DCMD_ERR);
89*fcf3ce44SJohn Forte 	}
90*fcf3ce44SJohn Forte 
91*fcf3ce44SJohn Forte 	mdb_inc_indent(4);
92*fcf3ce44SJohn Forte 	mdb_printf("ii_info: 0x%p ii_bmp: %d ii_shd: %d ii_ovr: %d ii_optr: "
93*fcf3ce44SJohn Forte 	    "0x%p\nii_oflags: 0x%x\n", fd.ii_info, fd.ii_bmp, fd.ii_shd,
94*fcf3ce44SJohn Forte 	    fd.ii_ovr, fd.ii_optr, fd.ii_oflags);
95*fcf3ce44SJohn Forte 	mdb_dec_indent(4);
96*fcf3ce44SJohn Forte 
97*fcf3ce44SJohn Forte 	return (DCMD_OK);
98*fcf3ce44SJohn Forte }
99*fcf3ce44SJohn Forte 
100*fcf3ce44SJohn Forte /*
101*fcf3ce44SJohn Forte  * displays a ii_info_dev structure.
102*fcf3ce44SJohn Forte  */
103*fcf3ce44SJohn Forte /*ARGSUSED*/
104*fcf3ce44SJohn Forte static int
ii_info_dev(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)105*fcf3ce44SJohn Forte ii_info_dev(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
106*fcf3ce44SJohn Forte {
107*fcf3ce44SJohn Forte 	_ii_info_dev_t ipdev;
108*fcf3ce44SJohn Forte 
109*fcf3ce44SJohn Forte 	if (!(flags & DCMD_ADDRSPEC))
110*fcf3ce44SJohn Forte 		return (DCMD_USAGE);
111*fcf3ce44SJohn Forte 
112*fcf3ce44SJohn Forte 	if (mdb_vread(&ipdev, sizeof (ipdev), addr) != sizeof (ipdev)) {
113*fcf3ce44SJohn Forte 		mdb_warn("failed to read ii_info_dev_t at 0x%p", addr);
114*fcf3ce44SJohn Forte 		return (DCMD_ERR);
115*fcf3ce44SJohn Forte 	}
116*fcf3ce44SJohn Forte 
117*fcf3ce44SJohn Forte 	mdb_inc_indent(4);
118*fcf3ce44SJohn Forte 	mdb_printf("bi_fd: 0x%p bi_iodev: 0x%p bi_tok: 0x%p\n",
119*fcf3ce44SJohn Forte 	    ipdev.bi_fd, ipdev.bi_iodev, ipdev.bi_tok);
120*fcf3ce44SJohn Forte 	mdb_printf("bi_ref: %d bi_rsrv: %d bi_orsrv: %d\n",
121*fcf3ce44SJohn Forte 	    ipdev.bi_ref, ipdev.bi_rsrv, ipdev.bi_orsrv);
122*fcf3ce44SJohn Forte 
123*fcf3ce44SJohn Forte 	/*
124*fcf3ce44SJohn Forte 	 * use nsc_fd to dump the fd details.... if present.
125*fcf3ce44SJohn Forte 	 */
126*fcf3ce44SJohn Forte 	if (ipdev.bi_fd) {
127*fcf3ce44SJohn Forte 		mdb_printf("nsc_fd structure:\n");
128*fcf3ce44SJohn Forte 		mdb_inc_indent(4);
129*fcf3ce44SJohn Forte 		mdb_call_dcmd("nsc_fd", (uintptr_t)(ipdev.bi_fd),
130*fcf3ce44SJohn Forte 		    flags, 0, NULL);
131*fcf3ce44SJohn Forte 		mdb_dec_indent(4);
132*fcf3ce44SJohn Forte 	}
133*fcf3ce44SJohn Forte 	mdb_dec_indent(4);
134*fcf3ce44SJohn Forte 	return (DCMD_OK);
135*fcf3ce44SJohn Forte }
136*fcf3ce44SJohn Forte 
137*fcf3ce44SJohn Forte /*
138*fcf3ce44SJohn Forte  * Displays an _ii_overflow structure
139*fcf3ce44SJohn Forte  */
140*fcf3ce44SJohn Forte /*ARGSUSED*/
141*fcf3ce44SJohn Forte static int
ii_overflow(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)142*fcf3ce44SJohn Forte ii_overflow(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
143*fcf3ce44SJohn Forte {
144*fcf3ce44SJohn Forte 	_ii_overflow_t ii_overflow;
145*fcf3ce44SJohn Forte 
146*fcf3ce44SJohn Forte 	nextaddr = 0;
147*fcf3ce44SJohn Forte 	if (!(flags & DCMD_ADDRSPEC))
148*fcf3ce44SJohn Forte 		return (DCMD_USAGE);
149*fcf3ce44SJohn Forte 
150*fcf3ce44SJohn Forte 	if (mdb_vread(&ii_overflow, sizeof (ii_overflow), addr)
151*fcf3ce44SJohn Forte 		!= sizeof (ii_overflow)) {
152*fcf3ce44SJohn Forte 		mdb_warn("failed to read ii_overflow_t at 0x%p", addr);
153*fcf3ce44SJohn Forte 		return (DCMD_ERR);
154*fcf3ce44SJohn Forte 	}
155*fcf3ce44SJohn Forte 
156*fcf3ce44SJohn Forte 	mdb_inc_indent(4);
157*fcf3ce44SJohn Forte 	mdb_printf("_ii_overflow at 0x%p\n", addr);
158*fcf3ce44SJohn Forte 	mdb_printf("_ii_doverflow_t\n");
159*fcf3ce44SJohn Forte 	mdb_inc_indent(4);
160*fcf3ce44SJohn Forte 	mdb_printf("ii_dvolname: %s\n", ii_overflow.ii_volname);
161*fcf3ce44SJohn Forte 	mdb_printf("ii_dhmagic: %x\n", ii_overflow.ii_hmagic);
162*fcf3ce44SJohn Forte 	mdb_printf("ii_dhversion: %x\n", ii_overflow.ii_hversion);
163*fcf3ce44SJohn Forte 	mdb_printf("ii_ddrefcnt: %x\n", ii_overflow.ii_drefcnt);
164*fcf3ce44SJohn Forte 	mdb_printf("ii_dflags: %x\n", ii_overflow.ii_flags);
165*fcf3ce44SJohn Forte 	mdb_printf("ii_dfreehead: %x\n", ii_overflow.ii_freehead);
166*fcf3ce44SJohn Forte 	mdb_printf("ii_dnchunks: %x\n", ii_overflow.ii_nchunks);
167*fcf3ce44SJohn Forte 	mdb_printf("ii_dunused: %x\n", ii_overflow.ii_unused);
168*fcf3ce44SJohn Forte 	mdb_printf("ii_dused: %x\n", ii_overflow.ii_used);
169*fcf3ce44SJohn Forte 	mdb_printf("ii_urefcnt: %x\n", ii_overflow.ii_urefcnt);
170*fcf3ce44SJohn Forte 	mdb_dec_indent(4);
171*fcf3ce44SJohn Forte 
172*fcf3ce44SJohn Forte 	mdb_printf("ii_mutex: %x\n", ii_overflow.ii_mutex);
173*fcf3ce44SJohn Forte 	mdb_printf("ii_kstat_mutex: %x\n", ii_overflow.ii_kstat_mutex);
174*fcf3ce44SJohn Forte 	mdb_printf("ii_crefcnt: %d\n", ii_overflow.ii_crefcnt);
175*fcf3ce44SJohn Forte 	mdb_printf("ii_detachcnt: %d\n", ii_overflow.ii_detachcnt);
176*fcf3ce44SJohn Forte 	mdb_printf("ii_next: %x\n", ii_overflow.ii_next);
177*fcf3ce44SJohn Forte 
178*fcf3ce44SJohn Forte 	mdb_printf("Overflow volume:\n");
179*fcf3ce44SJohn Forte 	if (ii_overflow.ii_dev)
180*fcf3ce44SJohn Forte 		ii_info_dev((uintptr_t)ii_overflow.ii_dev, flags, 0, NULL);
181*fcf3ce44SJohn Forte 
182*fcf3ce44SJohn Forte 	mdb_printf("  ii_ioname: %s\n", &ii_overflow.ii_ioname);
183*fcf3ce44SJohn Forte 	mdb_dec_indent(4);
184*fcf3ce44SJohn Forte 
185*fcf3ce44SJohn Forte 	nextaddr = (uintptr_t)ii_overflow.ii_next;
186*fcf3ce44SJohn Forte 	return (DCMD_OK);
187*fcf3ce44SJohn Forte }
188*fcf3ce44SJohn Forte /*ARGSUSED*/
189*fcf3ce44SJohn Forte static int
ii_info(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)190*fcf3ce44SJohn Forte ii_info(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
191*fcf3ce44SJohn Forte {
192*fcf3ce44SJohn Forte 	_ii_info_t ii_info = {0};
193*fcf3ce44SJohn Forte 	char string[DSW_NAMELEN];
194*fcf3ce44SJohn Forte 
195*fcf3ce44SJohn Forte 	nextaddr = 0;
196*fcf3ce44SJohn Forte 	if (!(flags & DCMD_ADDRSPEC))
197*fcf3ce44SJohn Forte 		return (DCMD_USAGE);
198*fcf3ce44SJohn Forte 
199*fcf3ce44SJohn Forte 	if (mdb_vread(&ii_info, sizeof (ii_info), addr) != sizeof (ii_info)) {
200*fcf3ce44SJohn Forte 		mdb_warn("failed to read ii_info_t at 0x%p", addr);
201*fcf3ce44SJohn Forte 		return (DCMD_ERR);
202*fcf3ce44SJohn Forte 	}
203*fcf3ce44SJohn Forte 
204*fcf3ce44SJohn Forte 	mdb_printf(
205*fcf3ce44SJohn Forte 		"bi_next: 0x%p\n"
206*fcf3ce44SJohn Forte 		"bi_head: 0x%p\t"
207*fcf3ce44SJohn Forte 		"bi_sibling: 0x%p\n"
208*fcf3ce44SJohn Forte 		"bi_master: 0x%p\t"
209*fcf3ce44SJohn Forte 		"bi_nextmst: 0x%p\n",
210*fcf3ce44SJohn Forte 		ii_info.bi_next, ii_info.bi_head, ii_info.bi_sibling,
211*fcf3ce44SJohn Forte 		ii_info.bi_master, ii_info.bi_nextmst);
212*fcf3ce44SJohn Forte 
213*fcf3ce44SJohn Forte 	mdb_printf("bi_mutex: 0x%p\n", ii_info.bi_mutex);
214*fcf3ce44SJohn Forte 
215*fcf3ce44SJohn Forte 	/*
216*fcf3ce44SJohn Forte 	 * Print out all the fds by using ii_info_dev
217*fcf3ce44SJohn Forte 	 */
218*fcf3ce44SJohn Forte 	mdb_printf("Cache master:\n");
219*fcf3ce44SJohn Forte 	if (ii_info.bi_mstdev)
220*fcf3ce44SJohn Forte 		ii_info_dev((uintptr_t)ii_info.bi_mstdev, flags, 0, NULL);
221*fcf3ce44SJohn Forte 
222*fcf3ce44SJohn Forte 	mdb_printf("Raw master:\n");
223*fcf3ce44SJohn Forte 	if (ii_info.bi_mstrdev)
224*fcf3ce44SJohn Forte 		ii_info_dev((uintptr_t)ii_info.bi_mstrdev, flags, 0, NULL);
225*fcf3ce44SJohn Forte 
226*fcf3ce44SJohn Forte 	mdb_printf("Cache shadow:\n");
227*fcf3ce44SJohn Forte 	ii_info_dev((uintptr_t)(addr + offsetof(_ii_info_t, bi_shddev)),
228*fcf3ce44SJohn Forte 	    flags, 0, NULL);
229*fcf3ce44SJohn Forte 
230*fcf3ce44SJohn Forte 	mdb_printf("Raw shadow:\n");
231*fcf3ce44SJohn Forte 	ii_info_dev((uintptr_t)(addr + offsetof(_ii_info_t, bi_shdrdev)),
232*fcf3ce44SJohn Forte 	    flags, 0, NULL);
233*fcf3ce44SJohn Forte 
234*fcf3ce44SJohn Forte 	mdb_printf("Bitmap:\n");
235*fcf3ce44SJohn Forte 	ii_info_dev((uintptr_t)(addr + offsetof(_ii_info_t, bi_bmpdev)),
236*fcf3ce44SJohn Forte 	    flags, 0, NULL);
237*fcf3ce44SJohn Forte 
238*fcf3ce44SJohn Forte 	mdb_printf("bi_keyname: %-*s\n", DSW_NAMELEN, ii_info.bi_keyname);
239*fcf3ce44SJohn Forte 	mdb_printf("bi_bitmap: 0x%p\n", ii_info.bi_bitmap);
240*fcf3ce44SJohn Forte 
241*fcf3ce44SJohn Forte 	if ((ii_info.bi_cluster == NULL) ||
242*fcf3ce44SJohn Forte 	    (mdb_vread(&string, sizeof (string), (uintptr_t)ii_info.bi_cluster)
243*fcf3ce44SJohn Forte 		!= sizeof (string)))
244*fcf3ce44SJohn Forte 		string[0] = 0;
245*fcf3ce44SJohn Forte 	mdb_printf("bi_cluster: %s\n", string);
246*fcf3ce44SJohn Forte 
247*fcf3ce44SJohn Forte 	if ((ii_info.bi_group == NULL) ||
248*fcf3ce44SJohn Forte 	    (mdb_vread(&string, sizeof (string), (uintptr_t)ii_info.bi_group)
249*fcf3ce44SJohn Forte 			!= sizeof (string)))
250*fcf3ce44SJohn Forte 		string[0] = 0;
251*fcf3ce44SJohn Forte 	mdb_printf("bi_group: %s\n", string);
252*fcf3ce44SJohn Forte 
253*fcf3ce44SJohn Forte 	mdb_printf("bi_busy: 0x%p\n", ii_info.bi_busy);
254*fcf3ce44SJohn Forte 
255*fcf3ce44SJohn Forte 	mdb_printf("bi_shdfba: %0x\t", ii_info.bi_shdfba);
256*fcf3ce44SJohn Forte 	mdb_printf("bi_shdbits: %0x\n", ii_info.bi_shdbits);
257*fcf3ce44SJohn Forte 	mdb_printf("bi_copyfba: %0x\t", ii_info.bi_copyfba);
258*fcf3ce44SJohn Forte 	mdb_printf("bi_copybits: %0x\n", ii_info.bi_copybits);
259*fcf3ce44SJohn Forte 
260*fcf3ce44SJohn Forte 	mdb_printf("bi_size: %0x\n", ii_info.bi_size);
261*fcf3ce44SJohn Forte 
262*fcf3ce44SJohn Forte 	mdb_printf("bi_flags: 0x%x <%b>\n",
263*fcf3ce44SJohn Forte 		ii_info.bi_flags, ii_info.bi_flags, bi_flags_bits);
264*fcf3ce44SJohn Forte 
265*fcf3ce44SJohn Forte 	mdb_printf("bi_state: 0x%x <%b>\n",
266*fcf3ce44SJohn Forte 		ii_info.bi_state, ii_info.bi_state, bi_state_bits);
267*fcf3ce44SJohn Forte 
268*fcf3ce44SJohn Forte 	mdb_printf("bi_disabled: %d\n", ii_info.bi_disabled);
269*fcf3ce44SJohn Forte 	mdb_printf("bi_ioctl: %d\n", ii_info.bi_ioctl);
270*fcf3ce44SJohn Forte 	mdb_printf("bi_release: %d\t", ii_info.bi_release);
271*fcf3ce44SJohn Forte 	mdb_printf("bi_rsrvcnt: %d\n", ii_info.bi_rsrvcnt);
272*fcf3ce44SJohn Forte 
273*fcf3ce44SJohn Forte 	mdb_printf("bi_copydonecv: %x\t", ii_info.bi_copydonecv);
274*fcf3ce44SJohn Forte 	mdb_printf("bi_reservecv: %x\n", ii_info.bi_reservecv);
275*fcf3ce44SJohn Forte 	mdb_printf("bi_releasecv: %x\t", ii_info.bi_releasecv);
276*fcf3ce44SJohn Forte 	mdb_printf("bi_closingcv: %x\n", ii_info.bi_closingcv);
277*fcf3ce44SJohn Forte 	mdb_printf("bi_ioctlcv: %x\t", ii_info.bi_ioctlcv);
278*fcf3ce44SJohn Forte 	mdb_printf("bi_busycv: %x\n", ii_info.bi_busycv);
279*fcf3ce44SJohn Forte 	mdb_call_dcmd("rwlock", (uintptr_t)(addr +
280*fcf3ce44SJohn Forte 	    offsetof(_ii_info_t, bi_busyrw)), flags, 0, NULL);
281*fcf3ce44SJohn Forte 	mdb_printf("bi_bitmap_ops: 0x%p\n", ii_info.bi_bitmap_ops);
282*fcf3ce44SJohn Forte 
283*fcf3ce44SJohn Forte 	mdb_printf("bi_rsrvmutex: %x\t", ii_info.bi_rsrvmutex);
284*fcf3ce44SJohn Forte 	mdb_printf("bi_rlsemutex: %x\n", ii_info.bi_rlsemutex);
285*fcf3ce44SJohn Forte 	mdb_printf("bi_bmpmutex: %x\n", ii_info.bi_bmpmutex);
286*fcf3ce44SJohn Forte 
287*fcf3ce44SJohn Forte 	mdb_printf("bi_mstchks: %d\t", ii_info.bi_mstchks);
288*fcf3ce44SJohn Forte 	mdb_printf("bi_shdchks: %d\n", ii_info.bi_shdchks);
289*fcf3ce44SJohn Forte 	mdb_printf("bi_shdchkused: %d\t", ii_info.bi_shdchkused);
290*fcf3ce44SJohn Forte 	mdb_printf("bi_shdfchk: %d\n", ii_info.bi_shdfchk);
291*fcf3ce44SJohn Forte 
292*fcf3ce44SJohn Forte 	mdb_printf("bi_overflow\n");
293*fcf3ce44SJohn Forte 	if (ii_info.bi_overflow)
294*fcf3ce44SJohn Forte 		ii_overflow((uintptr_t)ii_info.bi_overflow, flags, 0, NULL);
295*fcf3ce44SJohn Forte 
296*fcf3ce44SJohn Forte 	mdb_printf("bi_iifd:\n");
297*fcf3ce44SJohn Forte 	if (ii_info.bi_iifd)
298*fcf3ce44SJohn Forte 		(void) ii_fd((uintptr_t)ii_info.bi_iifd, flags, 0, NULL);
299*fcf3ce44SJohn Forte 
300*fcf3ce44SJohn Forte 	mdb_printf("bi_throttle_unit: %d\t", ii_info.bi_throttle_unit);
301*fcf3ce44SJohn Forte 	mdb_printf("bi_throttle_delay: %d\n", ii_info.bi_throttle_delay);
302*fcf3ce44SJohn Forte 
303*fcf3ce44SJohn Forte 	mdb_printf("bi_linkrw:\n");
304*fcf3ce44SJohn Forte 	mdb_call_dcmd("rwlock", (uintptr_t)(addr +
305*fcf3ce44SJohn Forte 	    offsetof(_ii_info_t, bi_linkrw)), flags, 0, NULL);
306*fcf3ce44SJohn Forte 
307*fcf3ce44SJohn Forte 	mdb_printf("bi_chksmutex: %x\n", ii_info.bi_chksmutex);
308*fcf3ce44SJohn Forte 	mdb_printf("bi_locked_pid: %x\n", ii_info.bi_locked_pid);
309*fcf3ce44SJohn Forte 	mdb_printf("bi_kstat: 0x%p\n", ii_info.bi_kstat);
310*fcf3ce44SJohn Forte 	/* ii_kstat_info_t bi_kstat_io; */
311*fcf3ce44SJohn Forte 
312*fcf3ce44SJohn Forte 	nextaddr = (uintptr_t)ii_info.bi_next;
313*fcf3ce44SJohn Forte 	return (DCMD_OK);
314*fcf3ce44SJohn Forte }
315*fcf3ce44SJohn Forte 
316*fcf3ce44SJohn Forte /*
317*fcf3ce44SJohn Forte  * This should be a walker surely.
318*fcf3ce44SJohn Forte  */
319*fcf3ce44SJohn Forte /*ARGSUSED*/
320*fcf3ce44SJohn Forte static int
ii_info_all(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)321*fcf3ce44SJohn Forte ii_info_all(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
322*fcf3ce44SJohn Forte {
323*fcf3ce44SJohn Forte 	uintptr_t myaddr;
324*fcf3ce44SJohn Forte 	/*
325*fcf3ce44SJohn Forte 	 * we use the global address.
326*fcf3ce44SJohn Forte 	 */
327*fcf3ce44SJohn Forte 	if (flags & DCMD_ADDRSPEC)
328*fcf3ce44SJohn Forte 		return (DCMD_USAGE);
329*fcf3ce44SJohn Forte 
330*fcf3ce44SJohn Forte 	if (mdb_readsym(&myaddr, sizeof (myaddr), "_ii_info_top") !=
331*fcf3ce44SJohn Forte 	    sizeof (myaddr)) {
332*fcf3ce44SJohn Forte 		return (DCMD_ERR);
333*fcf3ce44SJohn Forte 	}
334*fcf3ce44SJohn Forte 
335*fcf3ce44SJohn Forte 	mdb_printf("_ii_info_top contains 0x%lx\n", myaddr);
336*fcf3ce44SJohn Forte 
337*fcf3ce44SJohn Forte 	while (myaddr) {
338*fcf3ce44SJohn Forte 		ii_info(myaddr, DCMD_ADDRSPEC, 0, NULL);
339*fcf3ce44SJohn Forte 		myaddr = nextaddr;
340*fcf3ce44SJohn Forte 	}
341*fcf3ce44SJohn Forte 	return (DCMD_OK);
342*fcf3ce44SJohn Forte }
343*fcf3ce44SJohn Forte 
344*fcf3ce44SJohn Forte /*
345*fcf3ce44SJohn Forte  * Display general ii module information.
346*fcf3ce44SJohn Forte  */
347*fcf3ce44SJohn Forte 
348*fcf3ce44SJohn Forte #define	ii_get_print(kvar, str, fmt, val)		\
349*fcf3ce44SJohn Forte 	if (mdb_readvar(&(val), #kvar) == -1) {		\
350*fcf3ce44SJohn Forte 		mdb_dec_indent(4);			\
351*fcf3ce44SJohn Forte 		mdb_warn("unable to read '" #kvar "'");	\
352*fcf3ce44SJohn Forte 		return (DCMD_ERR);			\
353*fcf3ce44SJohn Forte 	}						\
354*fcf3ce44SJohn Forte 	mdb_printf("%-20s" fmt "\n", str ":", val)
355*fcf3ce44SJohn Forte 
356*fcf3ce44SJohn Forte /* ARGSUSED */
357*fcf3ce44SJohn Forte static int
ii(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)358*fcf3ce44SJohn Forte ii(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
359*fcf3ce44SJohn Forte {
360*fcf3ce44SJohn Forte 	int maj, min, mic, baseline, i;
361*fcf3ce44SJohn Forte 
362*fcf3ce44SJohn Forte 	if (argc != 0)
363*fcf3ce44SJohn Forte 		return (DCMD_USAGE);
364*fcf3ce44SJohn Forte 
365*fcf3ce44SJohn Forte 	if (mdb_readvar(&maj, "dsw_major_rev") == -1) {
366*fcf3ce44SJohn Forte 		mdb_warn("unable to read 'dsw_major_rev'");
367*fcf3ce44SJohn Forte 		return (DCMD_ERR);
368*fcf3ce44SJohn Forte 	}
369*fcf3ce44SJohn Forte 
370*fcf3ce44SJohn Forte 	if (mdb_readvar(&min, "dsw_minor_rev") == -1) {
371*fcf3ce44SJohn Forte 		mdb_warn("unable to read 'dsw_minor_rev'");
372*fcf3ce44SJohn Forte 		return (DCMD_ERR);
373*fcf3ce44SJohn Forte 	}
374*fcf3ce44SJohn Forte 
375*fcf3ce44SJohn Forte 	if (mdb_readvar(&mic, "dsw_micro_rev") == -1) {
376*fcf3ce44SJohn Forte 		mdb_warn("unable to read 'dsw_micro_rev'");
377*fcf3ce44SJohn Forte 		return (DCMD_ERR);
378*fcf3ce44SJohn Forte 	}
379*fcf3ce44SJohn Forte 
380*fcf3ce44SJohn Forte 	if (mdb_readvar(&baseline, "dsw_baseline_rev") == -1) {
381*fcf3ce44SJohn Forte 		mdb_warn("unable to read 'dsw_baseline_rev'");
382*fcf3ce44SJohn Forte 		return (DCMD_ERR);
383*fcf3ce44SJohn Forte 	}
384*fcf3ce44SJohn Forte 
385*fcf3ce44SJohn Forte 	mdb_printf("Point-in-Time Copy module version: kernel %d.%d.%d.%d; "
386*fcf3ce44SJohn Forte 	    "mdb %d.%d.%d.%d\n", maj, min, mic, baseline,
387*fcf3ce44SJohn Forte 	    ISS_VERSION_MAJ, ISS_VERSION_MIN, ISS_VERSION_MIC, ISS_VERSION_NUM);
388*fcf3ce44SJohn Forte 
389*fcf3ce44SJohn Forte 	mdb_inc_indent(4);
390*fcf3ce44SJohn Forte 	ii_get_print(ii_debug, "debug", "%d", i);
391*fcf3ce44SJohn Forte 	ii_get_print(ii_bitmap, "bitmaps", "%d", i);
392*fcf3ce44SJohn Forte 	mdb_dec_indent(4);
393*fcf3ce44SJohn Forte 
394*fcf3ce44SJohn Forte 	return (DCMD_OK);
395*fcf3ce44SJohn Forte }
396*fcf3ce44SJohn Forte 
397*fcf3ce44SJohn Forte 
398*fcf3ce44SJohn Forte /*
399*fcf3ce44SJohn Forte  * MDB module linkage information:
400*fcf3ce44SJohn Forte  */
401*fcf3ce44SJohn Forte 
402*fcf3ce44SJohn Forte static const mdb_dcmd_t dcmds[] = {
403*fcf3ce44SJohn Forte { "ii", NULL, "display ii module info", ii },
404*fcf3ce44SJohn Forte { "ii_fd", NULL, "display ii_fd structure", ii_fd },
405*fcf3ce44SJohn Forte { "ii_info", NULL, "display ii_info structure", ii_info },
406*fcf3ce44SJohn Forte { "ii_info_all", NULL, "display all ii_info structures", ii_info_all },
407*fcf3ce44SJohn Forte { "ii_info_dev", NULL, "display ii_info_dev structure", ii_info_dev},
408*fcf3ce44SJohn Forte { "ii_overflow", NULL, "display ii_overflow structure", ii_overflow},
409*fcf3ce44SJohn Forte { NULL }
410*fcf3ce44SJohn Forte };
411*fcf3ce44SJohn Forte 
412*fcf3ce44SJohn Forte 
413*fcf3ce44SJohn Forte static const mdb_walker_t walkers[] = {
414*fcf3ce44SJohn Forte 	{ NULL }
415*fcf3ce44SJohn Forte };
416*fcf3ce44SJohn Forte 
417*fcf3ce44SJohn Forte 
418*fcf3ce44SJohn Forte static const mdb_modinfo_t modinfo = {
419*fcf3ce44SJohn Forte 	MDB_API_VERSION, dcmds, walkers
420*fcf3ce44SJohn Forte };
421*fcf3ce44SJohn Forte 
422*fcf3ce44SJohn Forte 
423*fcf3ce44SJohn Forte const mdb_modinfo_t *
_mdb_init(void)424*fcf3ce44SJohn Forte _mdb_init(void)
425*fcf3ce44SJohn Forte {
426*fcf3ce44SJohn Forte 	return (&modinfo);
427*fcf3ce44SJohn Forte }
428