diff options
Diffstat (limited to 'usr/src/cmd/mdb/common/modules')
-rw-r--r-- | usr/src/cmd/mdb/common/modules/ii/Makefile.com | 24 | ||||
-rw-r--r-- | usr/src/cmd/mdb/common/modules/ii/ii.c | 427 | ||||
-rw-r--r-- | usr/src/cmd/mdb/common/modules/nsctl/Makefile.com | 24 | ||||
-rw-r--r-- | usr/src/cmd/mdb/common/modules/nsctl/nsctl.c | 2159 | ||||
-rw-r--r-- | usr/src/cmd/mdb/common/modules/rdc/Makefile.com | 24 | ||||
-rw-r--r-- | usr/src/cmd/mdb/common/modules/rdc/rdc.c | 1563 | ||||
-rw-r--r-- | usr/src/cmd/mdb/common/modules/sdbc/Makefile.com | 24 | ||||
-rw-r--r-- | usr/src/cmd/mdb/common/modules/sdbc/sdbc.c | 3158 | ||||
-rw-r--r-- | usr/src/cmd/mdb/common/modules/sv/Makefile.com | 24 | ||||
-rw-r--r-- | usr/src/cmd/mdb/common/modules/sv/sv.c | 624 |
10 files changed, 0 insertions, 8051 deletions
diff --git a/usr/src/cmd/mdb/common/modules/ii/Makefile.com b/usr/src/cmd/mdb/common/modules/ii/Makefile.com deleted file mode 100644 index 40975cea69..0000000000 --- a/usr/src/cmd/mdb/common/modules/ii/Makefile.com +++ /dev/null @@ -1,24 +0,0 @@ -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 2008 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -CPPFLAGS += -DNSC_MULTI_TERABYTE diff --git a/usr/src/cmd/mdb/common/modules/ii/ii.c b/usr/src/cmd/mdb/common/modules/ii/ii.c deleted file mode 100644 index 48bc03502b..0000000000 --- a/usr/src/cmd/mdb/common/modules/ii/ii.c +++ /dev/null @@ -1,427 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <stddef.h> - -#include <sys/types.h> -#include <sys/mdb_modapi.h> - -#include <sys/nsctl/nsctl.h> -#include <sys/unistat/spcs_s.h> -#include <sys/unistat/spcs_s_k.h> - - -#include <sys/nsctl/dsw.h> -#include <sys/nsctl/dsw_dev.h> - -#include <sys/nsctl/nsvers.h> - - -const mdb_bitmask_t bi_flags_bits[] = { - { "DSW_GOLDEN", DSW_GOLDEN, DSW_GOLDEN }, - { "DSW_COPYINGP", DSW_COPYINGP, DSW_COPYINGP }, - { "DSW_COPYINGM", DSW_COPYINGM, DSW_COPYINGM }, - { "DSW_COPYINGS", DSW_COPYINGS, DSW_COPYINGS }, - { "DSW_COPYINGX", DSW_COPYINGX, DSW_COPYINGX }, - { "DSW_BMPOFFLINE", DSW_BMPOFFLINE, DSW_BMPOFFLINE }, - { "DSW_SHDOFFLINE", DSW_SHDOFFLINE, DSW_SHDOFFLINE }, - { "DSW_MSTOFFLINE", DSW_MSTOFFLINE, DSW_MSTOFFLINE }, - { "DSW_OVROFFLINE", DSW_OVROFFLINE, DSW_OVROFFLINE }, - { "DSW_TREEMAP", DSW_TREEMAP, DSW_TREEMAP }, - { "DSW_OVERFLOW", DSW_OVERFLOW, DSW_OVERFLOW }, - { "DSW_SHDEXPORT", DSW_SHDEXPORT, DSW_SHDEXPORT }, - { "DSW_SHDIMPORT", DSW_SHDIMPORT, DSW_SHDIMPORT }, - { "DSW_VOVERFLOW", DSW_VOVERFLOW, DSW_VOVERFLOW }, - { "DSW_HANGING", DSW_HANGING, DSW_HANGING }, - { "DSW_CFGOFFLINE", DSW_CFGOFFLINE, DSW_CFGOFFLINE }, - { "DSW_OVRHDRDRTY", DSW_OVRHDRDRTY, DSW_OVRHDRDRTY }, - { "DSW_RESIZED", DSW_RESIZED, DSW_RESIZED }, - { "DSW_FRECLAIM", DSW_FRECLAIM, DSW_FRECLAIM }, - { NULL, 0, 0 } -}; - -const mdb_bitmask_t bi_state_bits[] = { - { "DSW_IOCTL", DSW_IOCTL, DSW_IOCTL }, - { "DSW_CLOSING", DSW_CLOSING, DSW_CLOSING }, - { "DSW_MSTTARGET", DSW_MSTTARGET, DSW_MSTTARGET }, - { "DSW_MULTIMST", DSW_MULTIMST, DSW_MULTIMST }, - { NULL, 0, 0 } -}; -static uintptr_t nextaddr; -/* - * Display a ii_fd_t - * Requires an address. - */ -/*ARGSUSED*/ -static int -ii_fd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - ii_fd_t fd; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (mdb_vread(&fd, sizeof (fd), addr) != sizeof (fd)) { - mdb_warn("failed to read ii_fd_t at 0x%p", addr); - return (DCMD_ERR); - } - - mdb_inc_indent(4); - mdb_printf("ii_info: 0x%p ii_bmp: %d ii_shd: %d ii_ovr: %d ii_optr: " - "0x%p\nii_oflags: 0x%x\n", fd.ii_info, fd.ii_bmp, fd.ii_shd, - fd.ii_ovr, fd.ii_optr, fd.ii_oflags); - mdb_dec_indent(4); - - return (DCMD_OK); -} - -/* - * displays a ii_info_dev structure. - */ -/*ARGSUSED*/ -static int -ii_info_dev(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - _ii_info_dev_t ipdev; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (mdb_vread(&ipdev, sizeof (ipdev), addr) != sizeof (ipdev)) { - mdb_warn("failed to read ii_info_dev_t at 0x%p", addr); - return (DCMD_ERR); - } - - mdb_inc_indent(4); - mdb_printf("bi_fd: 0x%p bi_iodev: 0x%p bi_tok: 0x%p\n", - ipdev.bi_fd, ipdev.bi_iodev, ipdev.bi_tok); - mdb_printf("bi_ref: %d bi_rsrv: %d bi_orsrv: %d\n", - ipdev.bi_ref, ipdev.bi_rsrv, ipdev.bi_orsrv); - - /* - * use nsc_fd to dump the fd details.... if present. - */ - if (ipdev.bi_fd) { - mdb_printf("nsc_fd structure:\n"); - mdb_inc_indent(4); - mdb_call_dcmd("nsc_fd", (uintptr_t)(ipdev.bi_fd), - flags, 0, NULL); - mdb_dec_indent(4); - } - mdb_dec_indent(4); - return (DCMD_OK); -} - -/* - * Displays an _ii_overflow structure - */ -/*ARGSUSED*/ -static int -ii_overflow(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - _ii_overflow_t ii_overflow; - - nextaddr = 0; - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (mdb_vread(&ii_overflow, sizeof (ii_overflow), addr) - != sizeof (ii_overflow)) { - mdb_warn("failed to read ii_overflow_t at 0x%p", addr); - return (DCMD_ERR); - } - - mdb_inc_indent(4); - mdb_printf("_ii_overflow at 0x%p\n", addr); - mdb_printf("_ii_doverflow_t\n"); - mdb_inc_indent(4); - mdb_printf("ii_dvolname: %s\n", ii_overflow.ii_volname); - mdb_printf("ii_dhmagic: %x\n", ii_overflow.ii_hmagic); - mdb_printf("ii_dhversion: %x\n", ii_overflow.ii_hversion); - mdb_printf("ii_ddrefcnt: %x\n", ii_overflow.ii_drefcnt); - mdb_printf("ii_dflags: %x\n", ii_overflow.ii_flags); - mdb_printf("ii_dfreehead: %x\n", ii_overflow.ii_freehead); - mdb_printf("ii_dnchunks: %x\n", ii_overflow.ii_nchunks); - mdb_printf("ii_dunused: %x\n", ii_overflow.ii_unused); - mdb_printf("ii_dused: %x\n", ii_overflow.ii_used); - mdb_printf("ii_urefcnt: %x\n", ii_overflow.ii_urefcnt); - mdb_dec_indent(4); - - mdb_printf("ii_mutex: %x\n", ii_overflow.ii_mutex); - mdb_printf("ii_kstat_mutex: %x\n", ii_overflow.ii_kstat_mutex); - mdb_printf("ii_crefcnt: %d\n", ii_overflow.ii_crefcnt); - mdb_printf("ii_detachcnt: %d\n", ii_overflow.ii_detachcnt); - mdb_printf("ii_next: %x\n", ii_overflow.ii_next); - - mdb_printf("Overflow volume:\n"); - if (ii_overflow.ii_dev) - ii_info_dev((uintptr_t)ii_overflow.ii_dev, flags, 0, NULL); - - mdb_printf(" ii_ioname: %s\n", &ii_overflow.ii_ioname); - mdb_dec_indent(4); - - nextaddr = (uintptr_t)ii_overflow.ii_next; - return (DCMD_OK); -} -/*ARGSUSED*/ -static int -ii_info(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - _ii_info_t ii_info = {0}; - char string[DSW_NAMELEN]; - - nextaddr = 0; - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (mdb_vread(&ii_info, sizeof (ii_info), addr) != sizeof (ii_info)) { - mdb_warn("failed to read ii_info_t at 0x%p", addr); - return (DCMD_ERR); - } - - mdb_printf( - "bi_next: 0x%p\n" - "bi_head: 0x%p\t" - "bi_sibling: 0x%p\n" - "bi_master: 0x%p\t" - "bi_nextmst: 0x%p\n", - ii_info.bi_next, ii_info.bi_head, ii_info.bi_sibling, - ii_info.bi_master, ii_info.bi_nextmst); - - mdb_printf("bi_mutex: 0x%p\n", ii_info.bi_mutex); - - /* - * Print out all the fds by using ii_info_dev - */ - mdb_printf("Cache master:\n"); - if (ii_info.bi_mstdev) - ii_info_dev((uintptr_t)ii_info.bi_mstdev, flags, 0, NULL); - - mdb_printf("Raw master:\n"); - if (ii_info.bi_mstrdev) - ii_info_dev((uintptr_t)ii_info.bi_mstrdev, flags, 0, NULL); - - mdb_printf("Cache shadow:\n"); - ii_info_dev((uintptr_t)(addr + offsetof(_ii_info_t, bi_shddev)), - flags, 0, NULL); - - mdb_printf("Raw shadow:\n"); - ii_info_dev((uintptr_t)(addr + offsetof(_ii_info_t, bi_shdrdev)), - flags, 0, NULL); - - mdb_printf("Bitmap:\n"); - ii_info_dev((uintptr_t)(addr + offsetof(_ii_info_t, bi_bmpdev)), - flags, 0, NULL); - - mdb_printf("bi_keyname: %-*s\n", DSW_NAMELEN, ii_info.bi_keyname); - mdb_printf("bi_bitmap: 0x%p\n", ii_info.bi_bitmap); - - if ((ii_info.bi_cluster == NULL) || - (mdb_vread(&string, sizeof (string), (uintptr_t)ii_info.bi_cluster) - != sizeof (string))) - string[0] = 0; - mdb_printf("bi_cluster: %s\n", string); - - if ((ii_info.bi_group == NULL) || - (mdb_vread(&string, sizeof (string), (uintptr_t)ii_info.bi_group) - != sizeof (string))) - string[0] = 0; - mdb_printf("bi_group: %s\n", string); - - mdb_printf("bi_busy: 0x%p\n", ii_info.bi_busy); - - mdb_printf("bi_shdfba: %0x\t", ii_info.bi_shdfba); - mdb_printf("bi_shdbits: %0x\n", ii_info.bi_shdbits); - mdb_printf("bi_copyfba: %0x\t", ii_info.bi_copyfba); - mdb_printf("bi_copybits: %0x\n", ii_info.bi_copybits); - - mdb_printf("bi_size: %0x\n", ii_info.bi_size); - - mdb_printf("bi_flags: 0x%x <%b>\n", - ii_info.bi_flags, ii_info.bi_flags, bi_flags_bits); - - mdb_printf("bi_state: 0x%x <%b>\n", - ii_info.bi_state, ii_info.bi_state, bi_state_bits); - - mdb_printf("bi_disabled: %d\n", ii_info.bi_disabled); - mdb_printf("bi_ioctl: %d\n", ii_info.bi_ioctl); - mdb_printf("bi_release: %d\t", ii_info.bi_release); - mdb_printf("bi_rsrvcnt: %d\n", ii_info.bi_rsrvcnt); - - mdb_printf("bi_copydonecv: %x\t", ii_info.bi_copydonecv); - mdb_printf("bi_reservecv: %x\n", ii_info.bi_reservecv); - mdb_printf("bi_releasecv: %x\t", ii_info.bi_releasecv); - mdb_printf("bi_closingcv: %x\n", ii_info.bi_closingcv); - mdb_printf("bi_ioctlcv: %x\t", ii_info.bi_ioctlcv); - mdb_printf("bi_busycv: %x\n", ii_info.bi_busycv); - mdb_call_dcmd("rwlock", (uintptr_t)(addr + - offsetof(_ii_info_t, bi_busyrw)), flags, 0, NULL); - mdb_printf("bi_bitmap_ops: 0x%p\n", ii_info.bi_bitmap_ops); - - mdb_printf("bi_rsrvmutex: %x\t", ii_info.bi_rsrvmutex); - mdb_printf("bi_rlsemutex: %x\n", ii_info.bi_rlsemutex); - mdb_printf("bi_bmpmutex: %x\n", ii_info.bi_bmpmutex); - - mdb_printf("bi_mstchks: %d\t", ii_info.bi_mstchks); - mdb_printf("bi_shdchks: %d\n", ii_info.bi_shdchks); - mdb_printf("bi_shdchkused: %d\t", ii_info.bi_shdchkused); - mdb_printf("bi_shdfchk: %d\n", ii_info.bi_shdfchk); - - mdb_printf("bi_overflow\n"); - if (ii_info.bi_overflow) - ii_overflow((uintptr_t)ii_info.bi_overflow, flags, 0, NULL); - - mdb_printf("bi_iifd:\n"); - if (ii_info.bi_iifd) - (void) ii_fd((uintptr_t)ii_info.bi_iifd, flags, 0, NULL); - - mdb_printf("bi_throttle_unit: %d\t", ii_info.bi_throttle_unit); - mdb_printf("bi_throttle_delay: %d\n", ii_info.bi_throttle_delay); - - mdb_printf("bi_linkrw:\n"); - mdb_call_dcmd("rwlock", (uintptr_t)(addr + - offsetof(_ii_info_t, bi_linkrw)), flags, 0, NULL); - - mdb_printf("bi_chksmutex: %x\n", ii_info.bi_chksmutex); - mdb_printf("bi_locked_pid: %x\n", ii_info.bi_locked_pid); - mdb_printf("bi_kstat: 0x%p\n", ii_info.bi_kstat); - /* ii_kstat_info_t bi_kstat_io; */ - - nextaddr = (uintptr_t)ii_info.bi_next; - return (DCMD_OK); -} - -/* - * This should be a walker surely. - */ -/*ARGSUSED*/ -static int -ii_info_all(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - uintptr_t myaddr; - /* - * we use the global address. - */ - if (flags & DCMD_ADDRSPEC) - return (DCMD_USAGE); - - if (mdb_readsym(&myaddr, sizeof (myaddr), "_ii_info_top") != - sizeof (myaddr)) { - return (DCMD_ERR); - } - - mdb_printf("_ii_info_top contains 0x%lx\n", myaddr); - - while (myaddr) { - ii_info(myaddr, DCMD_ADDRSPEC, 0, NULL); - myaddr = nextaddr; - } - return (DCMD_OK); -} - -/* - * Display general ii module information. - */ - -#define ii_get_print(kvar, str, fmt, val) \ - if (mdb_readvar(&(val), #kvar) == -1) { \ - mdb_dec_indent(4); \ - mdb_warn("unable to read '" #kvar "'"); \ - return (DCMD_ERR); \ - } \ - mdb_printf("%-20s" fmt "\n", str ":", val) - -/* ARGSUSED */ -static int -ii(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - int maj, min, mic, baseline, i; - - if (argc != 0) - return (DCMD_USAGE); - - if (mdb_readvar(&maj, "dsw_major_rev") == -1) { - mdb_warn("unable to read 'dsw_major_rev'"); - return (DCMD_ERR); - } - - if (mdb_readvar(&min, "dsw_minor_rev") == -1) { - mdb_warn("unable to read 'dsw_minor_rev'"); - return (DCMD_ERR); - } - - if (mdb_readvar(&mic, "dsw_micro_rev") == -1) { - mdb_warn("unable to read 'dsw_micro_rev'"); - return (DCMD_ERR); - } - - if (mdb_readvar(&baseline, "dsw_baseline_rev") == -1) { - mdb_warn("unable to read 'dsw_baseline_rev'"); - return (DCMD_ERR); - } - - mdb_printf("Point-in-Time Copy module version: kernel %d.%d.%d.%d; " - "mdb %d.%d.%d.%d\n", maj, min, mic, baseline, - ISS_VERSION_MAJ, ISS_VERSION_MIN, ISS_VERSION_MIC, ISS_VERSION_NUM); - - mdb_inc_indent(4); - ii_get_print(ii_debug, "debug", "%d", i); - ii_get_print(ii_bitmap, "bitmaps", "%d", i); - mdb_dec_indent(4); - - return (DCMD_OK); -} - - -/* - * MDB module linkage information: - */ - -static const mdb_dcmd_t dcmds[] = { -{ "ii", NULL, "display ii module info", ii }, -{ "ii_fd", NULL, "display ii_fd structure", ii_fd }, -{ "ii_info", NULL, "display ii_info structure", ii_info }, -{ "ii_info_all", NULL, "display all ii_info structures", ii_info_all }, -{ "ii_info_dev", NULL, "display ii_info_dev structure", ii_info_dev}, -{ "ii_overflow", NULL, "display ii_overflow structure", ii_overflow}, -{ NULL } -}; - - -static const mdb_walker_t walkers[] = { - { NULL } -}; - - -static const mdb_modinfo_t modinfo = { - MDB_API_VERSION, dcmds, walkers -}; - - -const mdb_modinfo_t * -_mdb_init(void) -{ - return (&modinfo); -} diff --git a/usr/src/cmd/mdb/common/modules/nsctl/Makefile.com b/usr/src/cmd/mdb/common/modules/nsctl/Makefile.com deleted file mode 100644 index 40975cea69..0000000000 --- a/usr/src/cmd/mdb/common/modules/nsctl/Makefile.com +++ /dev/null @@ -1,24 +0,0 @@ -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 2008 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -CPPFLAGS += -DNSC_MULTI_TERABYTE diff --git a/usr/src/cmd/mdb/common/modules/nsctl/nsctl.c b/usr/src/cmd/mdb/common/modules/nsctl/nsctl.c deleted file mode 100644 index e9a360deb6..0000000000 --- a/usr/src/cmd/mdb/common/modules/nsctl/nsctl.c +++ /dev/null @@ -1,2159 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <sys/types.h> -#include <sys/ksynch.h> -#include <sys/kmem.h> -#include <sys/errno.h> -#include <sys/ddi.h> - -#include <sys/mdb_modapi.h> - -#define __NSC_GEN__ -#include <sys/nsc_thread.h> -#include <sys/nsctl/nsc_dev.h> -#include <sys/nsctl/nsc_gen.h> -#include <sys/nsctl/nsc_mem.h> -#include <sys/nsctl/nsctl.h> -#include <sys/nsctl/nsc_disk.h> - - -/* - * Data struct for the complex walks. - */ - -struct complex_args { - int argc; - mdb_arg_t *argv; -}; - - -/* - * Bit definitions - */ - -#define NSC_RW_BITS \ - { "NSC_READ", NSC_READ, NSC_READ }, \ - { "NSC_WRITE", NSC_WRITE, NSC_WRITE } - - -static const mdb_bitmask_t nsc_bhflag_bits[] = { - NSC_RW_BITS, - { "NSC_PINNABLE", NSC_PINNABLE, NSC_PINNABLE }, - { "NSC_NOBLOCK", NSC_NOBLOCK, NSC_NOBLOCK }, - { "NSC_HALLOCATED", NSC_HALLOCATED, NSC_HALLOCATED }, - { "NSC_HACTIVE", NSC_HACTIVE, NSC_HACTIVE }, - { "NSC_BCOPY", NSC_BCOPY, NSC_BCOPY }, - { "NSC_PAGEIO", NSC_PAGEIO, NSC_PAGEIO }, - { "NSC_ABUF", NSC_ABUF, NSC_ABUF }, - { "NSC_MIXED", NSC_MIXED, NSC_MIXED }, - { "NSC_WRTHRU", NSC_WRTHRU, NSC_WRTHRU }, - { "NSC_FORCED_WRTHRU", NSC_FORCED_WRTHRU, NSC_FORCED_WRTHRU }, - { "NSC_NOCACHE", NSC_NOCACHE, NSC_NOCACHE }, - { "NSC_QUEUE", NSC_QUEUE, NSC_QUEUE }, - { "NSC_RDAHEAD", NSC_RDAHEAD, NSC_RDAHEAD }, - { "NSC_NO_FORCED_WRTHRU", NSC_NO_FORCED_WRTHRU, NSC_NO_FORCED_WRTHRU }, - { "NSC_METADATA", NSC_METADATA, NSC_METADATA }, - { "NSC_SEQ_IO", NSC_SEQ_IO, NSC_SEQ_IO }, - { NULL, 0, 0 } -}; - - -static const mdb_bitmask_t nsc_fdflag_bits[] = { - NSC_RW_BITS, - { NULL, 0, 0 } -}; - - -static const mdb_bitmask_t nsc_fdmode_bits[] = { - { "NSC_MULTI", NSC_MULTI, NSC_MULTI }, - { NULL, 0, 0 } -}; - - -static const mdb_bitmask_t nsc_type_bits[] = { - /* types */ - { "NSC_NULL", NSC_NULL, NSC_NULL }, - { "NSC_DEVICE", NSC_DEVICE, NSC_DEVICE }, - { "NSC_FILE", NSC_FILE, NSC_FILE }, - { "NSC_CACHE", NSC_CACHE, NSC_CACHE }, - { "NSC_VCHR", NSC_VCHR, NSC_VCHR }, - { "NSC_NCALL", NSC_NCALL, NSC_NCALL }, - - /* type flags */ - { "NSC_ANON", NSC_ANON, NSC_ANON }, - - /* ids */ - { "NSC_RAW_ID", NSC_RAW_ID, NSC_RAW_ID }, - { "NSC_FILE_ID", NSC_FILE_ID, NSC_FILE_ID }, - { "NSC_FREEZE_ID", NSC_FREEZE_ID, NSC_FREEZE_ID }, - { "NSC_VCHR_ID", NSC_VCHR_ID, NSC_VCHR_ID }, - { "NSC_NCALL_ID", NSC_NCALL_ID, NSC_NCALL_ID }, - { "NSC_SDBC_ID", NSC_SDBC_ID, NSC_SDBC_ID }, - { "NSC_RDCLR_ID", NSC_RDCLR_ID, NSC_RDCLR_ID }, - { "NSC_RDCL_ID", NSC_RDCL_ID, NSC_RDCL_ID }, - { "NSC_IIR_ID", NSC_IIR_ID, NSC_IIR_ID }, - { "NSC_II_ID", NSC_II_ID, NSC_II_ID }, - { "NSC_RDCHR_ID", NSC_RDCHR_ID, NSC_RDCHR_ID }, - { "NSC_RDCH_ID", NSC_RDCH_ID, NSC_RDCH_ID }, - { NULL, 0, 0 } -}; - - -static const mdb_bitmask_t nsc_availpend_bits[] = { - NSC_RW_BITS, - { "_NSC_OPEN", _NSC_OPEN, _NSC_OPEN }, - { "_NSC_CLOSE", _NSC_CLOSE, _NSC_CLOSE }, - { "_NSC_PINNED", _NSC_PINNED, _NSC_PINNED }, - { "_NSC_ATTACH", _NSC_ATTACH, _NSC_ATTACH }, - { "_NSC_DETACH", _NSC_DETACH, _NSC_DETACH }, - { "_NSC_OWNER", _NSC_OWNER, _NSC_OWNER }, - { NULL, 0, 0 } -}; - - -static const mdb_bitmask_t nsc_ioflag_bits[] = { - { "NSC_REFCNT", NSC_REFCNT, NSC_REFCNT }, - { "NSC_FILTER", NSC_FILTER, NSC_FILTER }, - { NULL, 0, 0 } -}; - - -static const mdb_bitmask_t nstset_flag_bits[] = { - { "NST_SF_KILL", NST_SF_KILL, NST_SF_KILL }, - { NULL, 0, 0 } -}; - - -static const mdb_bitmask_t nst_flag_bits[] = { - { "NST_TF_INUSE", NST_TF_INUSE, NST_TF_INUSE }, - { "NST_TF_ACTIVE", NST_TF_ACTIVE, NST_TF_ACTIVE }, - { "NST_TF_PENDING", NST_TF_PENDING, NST_TF_PENDING }, - { "NST_TF_DESTROY", NST_TF_DESTROY, NST_TF_DESTROY }, - { "NST_TF_KILL", NST_TF_KILL, NST_TF_KILL }, - { NULL, 0, 0 } -}; - - -/* - * Global data. - */ - -static nsc_mem_t type_mem[20]; -static int complex_walk; -static int complex_hdr; - - -/* ---------------------------------------------------------------------- */ - -/* - * Walker for an nsc_io chain. - * A global walk is assumed to start at _nsc_io_top. - */ - -static int -nsc_io_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL && - mdb_readvar(&wsp->walk_addr, "_nsc_io_top") == -1) { - mdb_warn("unable to read '_nsc_io_top'"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -static int -nsc_io_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t next; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - next = wsp->walk_addr + OFFSETOF(nsc_io_t, next); - - if (mdb_vread(&wsp->walk_addr, sizeof (uintptr_t), next) == -1) { - mdb_warn("failed to read nsc_io_t.next at %p", next); - return (WALK_DONE); - } - - return (status); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Walker for an nsc_dev chain. - * A global walk is assumed to start at _nsc_dev_top. - */ - -static int -nsc_dev_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL && - mdb_readvar(&wsp->walk_addr, "_nsc_dev_top") == -1) { - mdb_warn("unable to read '_nsc_dev_top'"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -static int -nsc_dev_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t next; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - next = wsp->walk_addr + OFFSETOF(nsc_dev_t, nsc_next); - - if (mdb_vread(&wsp->walk_addr, sizeof (uintptr_t), next) == -1) { - mdb_warn("failed to read nsc_dev_t.nsc_next at %p", next); - return (WALK_DONE); - } - - return (status); -} - - -/* ARGSUSED */ - -static void -nsc_dev_wfini(mdb_walk_state_t *wsp) -{ - complex_walk = 0; -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Walker for a chain of nsc_devval_t structures. - * Global walks start from _nsc_devval_top; - */ - -static int -nsc_devval_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL && - mdb_readvar(&wsp->walk_addr, "_nsc_devval_top") == -1) { - mdb_warn("unable to read '_nsc_devval_top'"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -static int -nsc_devval_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t devval = wsp->walk_addr; - int status; - - if (!devval) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - /* move on to next devval */ - - if (mdb_vread(&wsp->walk_addr, sizeof (wsp->walk_addr), - devval + OFFSETOF(nsc_devval_t, dv_next)) == -1) { - mdb_warn("failed to read nsc_devval_t.dv_next"); - return (WALK_ERR); - } - - return (status); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Walker for a chain of nsc_fd_t structures. - * No global walks. - */ - -static int -nsc_fd_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL) { - mdb_warn("nsc_fd doesn't support global walks"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -static int -nsc_fd_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t fd = wsp->walk_addr; - int status; - - if (!fd) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - /* move on to next fd */ - - if (mdb_vread(&wsp->walk_addr, sizeof (wsp->walk_addr), - fd + OFFSETOF(nsc_fd_t, sf_next)) == -1) { - mdb_warn("failed to read nsc_fd_t.sf_next"); - return (WALK_ERR); - } - - return (status); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Walker for a chain of nsc_iodev_t structures. - * No global walks. - */ - -static int -nsc_iodev_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL) { - mdb_warn("nsc_iodev doesn't support global walks"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -static int -nsc_iodev_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t iodev = wsp->walk_addr; - int status; - - if (!iodev) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - if (mdb_vread(&wsp->walk_addr, sizeof (wsp->walk_addr), - iodev + OFFSETOF(nsc_iodev_t, si_next)) == -1) { - mdb_warn("failed to read nsc_iodev_t.si_next"); - return (WALK_ERR); - } - - return (status); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Walker for a chain of nsc_service_t structures. - * Global walks start at _nsc_services. - */ - -static int -nsc_service_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL && - mdb_readvar(&wsp->walk_addr, "_nsc_services") == -1) { - mdb_warn("unable to read '_nsc_services'"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -static int -nsc_service_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t service = wsp->walk_addr; - int status; - - if (!service) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - /* move on to next service */ - - if (mdb_vread(&wsp->walk_addr, sizeof (wsp->walk_addr), - service + OFFSETOF(nsc_service_t, s_next)) == -1) { - mdb_warn("failed to read nsc_service_t.s_next"); - return (WALK_ERR); - } - - return (status); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Walker for a chain of nsc_svc_t structures. - * No global walks. - */ - -static int -nsc_svc_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL) { - mdb_warn("nsc_svc does not support global walks"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -static int -nsc_svc_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t svc = wsp->walk_addr; - int status; - - if (!svc) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - /* move on to next svc */ - - if (mdb_vread(&wsp->walk_addr, sizeof (wsp->walk_addr), - svc + OFFSETOF(nsc_svc_t, svc_next)) == -1) { - mdb_warn("failed to read nsc_svc_t.svc_next"); - return (WALK_ERR); - } - - return (status); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Walker for a chain of nsc_val_t structures. - * No global walks. - */ - -static int -nsc_val_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL) { - mdb_warn("nsc_val doesn't support global walks"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -static int -nsc_val_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t val = wsp->walk_addr; - int status; - - if (!val) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - /* move on to next val */ - - if (mdb_vread(&wsp->walk_addr, sizeof (wsp->walk_addr), - val + OFFSETOF(nsc_val_t, sv_next)) == -1) { - mdb_warn("failed to read nsc_val_t.sv_next"); - return (WALK_ERR); - } - - return (status); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Walker for a chain of nstset_t structures. - * Global walks start at _nst_sets. - */ - -static int -nstset_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL && - mdb_readvar(&wsp->walk_addr, "nst_sets") == -1) { - mdb_warn("unable to read 'nst_sets'"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -static int -nstset_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t set = wsp->walk_addr; - int status; - - if (!set) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - /* move on to next set */ - - if (mdb_vread(&wsp->walk_addr, sizeof (wsp->walk_addr), - set + OFFSETOF(nstset_t, set_next)) == -1) { - mdb_warn("failed to read nstset_t.set_next"); - return (WALK_ERR); - } - - return (status); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Walker for a chain of nsthread_t structures. - * No global walks. - */ - -static int -nsthread_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL) { - mdb_warn("nsthread does not support global walks"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -static int -nsthread_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t thread = wsp->walk_addr; - int status; - - if (!thread) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - /* move on to next iodev */ - - if (mdb_vread(&wsp->walk_addr, sizeof (wsp->walk_addr), - thread + OFFSETOF(nsthread_t, tp_chain)) == -1) { - mdb_warn("failed to read nsthread_t.tp_chain"); - return (WALK_ERR); - } - - return (status); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Walker for nsthread_t free/reuse chain. - * No global walks. - */ - -static int -nst_free_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL) { - mdb_warn("nst_free does not support global walks"); - return (WALK_ERR); - } - - /* store starting address */ - - wsp->walk_data = (void *)wsp->walk_addr; - - /* move on to next thread */ - - if (mdb_vread(&wsp->walk_addr, sizeof (wsp->walk_addr), - wsp->walk_addr + OFFSETOF(nsthread_t, tp_link.q_forw)) == -1) { - mdb_warn("failed to read nsthread_t.tp_link.q_forw"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -static int -nst_free_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t thread = wsp->walk_addr; - int status; - - if (!thread) - return (WALK_DONE); - - if (thread == (uintptr_t)wsp->walk_data) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - /* move on to next thread */ - - if (mdb_vread(&wsp->walk_addr, sizeof (wsp->walk_addr), - thread + OFFSETOF(nsthread_t, tp_link.q_forw)) == -1) { - mdb_warn("failed to read nsthread_t.tp_link.q_forw"); - return (WALK_ERR); - } - - return (status); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Walker for a chain of nsc_mem_t structures. - * Global walks start at _nsc_mem_top. - */ - -static int -nsc_mem_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL && - mdb_readvar(&wsp->walk_addr, "_nsc_mem_top") == -1) { - mdb_warn("unable to read '_nsc_mem_top'"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -static int -nsc_mem_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t mem = wsp->walk_addr; - int status; - - if (!mem) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - /* move on to next mem */ - - if (mdb_vread(&wsp->walk_addr, sizeof (wsp->walk_addr), - mem + OFFSETOF(nsc_mem_t, next)) == -1) { - mdb_warn("failed to read nsc_mem_t.next"); - return (WALK_ERR); - } - - return (status); -} - - -/* ---------------------------------------------------------------------- */ - -struct { - char *name; - int id; -} io_ids[] = { - { "NSC_RAW_ID", NSC_RAW_ID }, - { "NSC_FILE_ID", NSC_FILE_ID }, - { "NSC_FREEZE_ID", NSC_FREEZE_ID }, - { "NSC_SDBC_ID", NSC_SDBC_ID }, - { "NSC_RDCLR_ID", NSC_RDCLR_ID }, - { "NSC_RDCL_ID", NSC_RDCL_ID }, - { "NSC_IIR_ID", NSC_IIR_ID }, - { "NSC_II_ID", NSC_II_ID }, - { "NSC_RDCHR_ID", NSC_RDCHR_ID }, - { "NSC_RDCH_ID", NSC_RDCH_ID }, - { NULL, 0 } -}; - - -static char * -nsc_io_id(const int id) -{ - int i; - - for (i = 0; io_ids[i].name != NULL; i++) { - if (io_ids[i].id == id) { - return (io_ids[i].name); - } - } - - return ("unknown"); -} - - -/* - * Display a single nsc_io_t structure. - * If called with no address, performs a global walk of all nsc_ios. - */ -static int -nsc_io(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - char io_name[128]; - nsc_io_t *io; - int v_opt; - - v_opt = 0; - - if (mdb_getopts(argc, argv, - 'v', MDB_OPT_SETBITS, TRUE, &v_opt) != argc) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_walk_dcmd("nsctl`nsc_io", - "nsctl`nsc_io", argc, argv) == -1) { - mdb_warn("failed to walk 'nsc_io'"); - return (DCMD_ERR); - } - - return (DCMD_OK); - } - - io = mdb_zalloc(sizeof (*io), UM_SLEEP | UM_GC); - memset(io_name, 0, sizeof (io_name)); - - if (mdb_vread(io, sizeof (*io), addr) != sizeof (*io)) { - mdb_warn("failed to read nsc_io at %p", addr); - return (DCMD_ERR); - } - - if (io->name) { - if (mdb_readstr(io_name, sizeof (io_name), - (uintptr_t)io->name) == -1) { - mdb_warn("failed to read nsc_io_t.name"); - return (DCMD_ERR); - } - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8Tid fl ref abuf name\n", "io"); - } - - mdb_printf("%0?p %8T%08x %2x %4d %4d %s\n", - addr, io->id, io->flag, io->refcnt, io->abufcnt, io_name); - - if (!v_opt) - return (DCMD_OK); - - mdb_inc_indent(4); - - mdb_printf("id: %08x <%s>\n", io->id, nsc_io_id(io->id)); - - mdb_printf("provide: %08x <%b>\n", io->provide, - io->provide, nsc_type_bits); - - mdb_printf("flag: %08x <%b>\n", io->flag, io->flag, nsc_ioflag_bits); - - mdb_printf("pend: %d\n", io->pend); - - mdb_dec_indent(4); - - return (DCMD_OK); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Display a single nsc_dev_t structure. - * If called with no address, performs a global walk of all nsc_devs. - */ -static int -nsc_dev(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - char path[NSC_MAXPATH+1]; - nsc_devval_t *dv; - nsc_dev_t *dev; - uintptr_t dev_pend; - int a_opt, v_opt; - - a_opt = v_opt = 0; - - if (mdb_getopts(argc, argv, - 'a', MDB_OPT_SETBITS, TRUE, &a_opt, - 'v', MDB_OPT_SETBITS, TRUE, &v_opt) != argc) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - mdb_printf("Active device structures:\n"); - - if (mdb_walk_dcmd("nsctl`nsc_dev", - "nsctl`nsc_dev", argc, argv) == -1) { - mdb_warn("failed to walk 'nsc_dev'"); - return (DCMD_ERR); - } - - if (a_opt) { - if (mdb_readvar(&dev_pend, "_nsc_dev_pend") == -1) { - mdb_warn("failed to read _nsc_dev_pend"); - return (DCMD_ERR); - } - - mdb_printf("\nPending device structures:"); - - if (dev_pend) { - mdb_printf("\n"); - - if (mdb_pwalk_dcmd("nsctl`nsc_dev", - "nsctl`nsc_dev", argc, argv, - dev_pend) == -1) { - mdb_warn("failed to walk " - "pending dev structs"); - return (DCMD_ERR); - } - } else { - mdb_printf(" none\n"); - } - } - - return (DCMD_OK); - } - - memset(path, 0, sizeof (path)); - dev = mdb_zalloc(sizeof (*dev), UM_SLEEP | UM_GC); - - if (mdb_vread(dev, sizeof (*dev), addr) != sizeof (*dev)) { - mdb_warn("failed to read nsc_dev at %p", addr); - return (DCMD_ERR); - } - - if (mdb_readstr(path, sizeof (path), (uintptr_t)dev->nsc_path) == -1) { - mdb_warn("failed to read nsc_path at %p", dev->nsc_path); - return (DCMD_ERR); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8Tref pend rpnd wait path\n", "dev"); - } - - mdb_printf("%0?p %8T%3d %4d %4d %4d %s\n", - addr, dev->nsc_refcnt, dev->nsc_pend, dev->nsc_rpend, - dev->nsc_wait, path); - - if (!v_opt) - return (DCMD_OK); - - mdb_inc_indent(4); - - mdb_printf("next: %0?p %8Tclose: %0?p\n", - dev->nsc_next, dev->nsc_close); - - mdb_printf("list: %0?p %8Tlock: %0?p\n", - dev->nsc_list, addr + OFFSETOF(nsc_dev_t, nsc_lock)); - - mdb_printf("cv: %0?p %8Tpath: %0?p %8Tphash: %016llx\n", - addr + OFFSETOF(nsc_dev_t, nsc_cv), - dev->nsc_path, dev->nsc_phash); - - mdb_printf("drop: %d %8Treopen: %d\n", - dev->nsc_drop, dev->nsc_reopen); - - if (dev->nsc_values) { - dv = mdb_zalloc(sizeof (*dv), UM_SLEEP | UM_GC); - if (mdb_vread(dv, sizeof (*dv), (uintptr_t)dev->nsc_values) != - sizeof (*dv)) { - mdb_warn("unable to read nsc_dev_t.nsc_values"); - mdb_dec_indent(4); - return (DCMD_ERR); - } - - if (dv->dv_values) { - mdb_printf("device/values: (nsc_devval: %0?p)\n", - dev->nsc_values); - - mdb_inc_indent(4); - - if (mdb_pwalk_dcmd("nsctl`nsc_val", "nsctl`nsc_val", - 0, NULL, (uintptr_t)dv->dv_values) == -1) { - mdb_dec_indent(8); - return (DCMD_ERR); - } - - mdb_dec_indent(4); - } - } - - mdb_dec_indent(4); - - return (DCMD_OK); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Display a single nsc_devval_t structure. - * If called with no address, performs a global walk of all nsc_devs. - */ -static int -nsc_devval(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - nsc_devval_t *dv; - int a_opt; - - a_opt = 0; - - if (mdb_getopts(argc, argv, - 'a', MDB_OPT_SETBITS, TRUE, &a_opt) != argc) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_walk_dcmd("nsctl`nsc_devval", - "nsctl`nsc_devval", argc, argv) == -1) { - mdb_warn("failed to walk 'nsc_devval'"); - return (DCMD_ERR); - } - - return (DCMD_OK); - } - - dv = mdb_zalloc(sizeof (*dv), UM_SLEEP | UM_GC); - - if (mdb_vread(dv, sizeof (*dv), addr) != sizeof (*dv)) { - mdb_warn("failed to read nsc_devval at %p", addr); - return (DCMD_ERR); - } - - if (!a_opt && !dv->dv_values) { - return (DCMD_OK); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8T%?-s %8Tpath\n", "devval", "phash"); - } - - mdb_printf("%0?p %8T%016llx %8T%s\n", addr, - dv->dv_phash, dv->dv_path); - - mdb_inc_indent(4); - - if (dv->dv_values) { - if (mdb_pwalk_dcmd("nsctl`nsc_val", "nsctl`nsc_val", - 0, NULL, (uintptr_t)dv->dv_values) == -1) { - return (DCMD_ERR); - } - } else { - mdb_printf("No values\n"); - } - - mdb_dec_indent(4); - - return (DCMD_OK); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Part 2 callback for the all devices and fds walk. Called per iodev. - */ -/* ARGSUSED */ -static int -nsc_fd_iodev(uintptr_t addr, const void *data, void *cbdata) -{ - struct complex_args *fdall = cbdata; - struct nsc_fd_t *fd; - - if (mdb_vread(&fd, sizeof (fd), - addr + OFFSETOF(nsc_iodev_t, si_open)) == -1) { - mdb_warn("unable to read nsc_iodev_t.si_open"); - return (WALK_ERR); - } - - if (fd != NULL) { - if (mdb_pwalk_dcmd("nsctl`nsc_fd", "nsctl`nsc_fd", - fdall->argc, fdall->argv, (uintptr_t)fd) == -1) - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -/* - * Part 1 callback for the all devices and fds walk. Called per device. - */ -/* ARGSUSED */ -static int -nsc_fd_dev(uintptr_t addr, const void *data, void *cbdata) -{ - struct complex_args *fdall = cbdata; - nsc_iodev_t *iodev; - nsc_fd_t *fd; - - if (mdb_vread(&iodev, sizeof (iodev), - addr + OFFSETOF(nsc_dev_t, nsc_list)) == -1) { - mdb_warn("unable to read nsc_dev_t.nsc_list at %p", addr); - return (WALK_ERR); - } - - /* walk iodev chains */ - - if (iodev != NULL) { - if (mdb_pwalk("nsctl`nsc_iodev", - nsc_fd_iodev, fdall, (uintptr_t)iodev) == -1) - return (WALK_ERR); - } - - /* walk nsc_close (closing fds) chains */ - - if (mdb_vread(&fd, sizeof (fd), - addr + OFFSETOF(nsc_dev_t, nsc_close)) == -1) { - mdb_warn("unable to read nsc_dev_t.nsc_close at %p", addr); - return (WALK_ERR); - } - - if (fd != NULL) { - if (mdb_pwalk_dcmd("nsctl`nsc_fd", "nsctl`nsc_fd", - fdall->argc, fdall->argv, (uintptr_t)fd) == -1) - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -/* - * Walk all devices and fds in the system. - */ -static int -nsc_fd_all(int argc, const mdb_arg_t *argv) -{ - struct complex_args fdall; - - fdall.argc = argc; - fdall.argv = (mdb_arg_t *)argv; - - complex_walk = 1; - complex_hdr = 0; - - if (mdb_walk("nsctl`nsc_dev", nsc_fd_dev, &fdall) == -1) { - return (DCMD_ERR); - } - - return (DCMD_OK); -} - - - -/* - * Display an nsd_fd_t structure, or walk all devices and fds in the system. - */ -static int -nsc_fd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - char io_name[128], *io_namep; - char path[NSC_MAXPATH+1]; - uintptr_t pathp; - nsc_fd_t *fd; - nsc_io_t *io; - int v_opt; - int hdr; - - v_opt = 0; - - if (mdb_getopts(argc, argv, - 'v', MDB_OPT_SETBITS, TRUE, &v_opt) != argc) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - return (nsc_fd_all(argc, argv)); - } - - memset(path, 0, sizeof (path)); - fd = mdb_zalloc(sizeof (*fd), UM_SLEEP | UM_GC); - memset(io_name, 0, sizeof (io_name)); - - if (mdb_vread(fd, sizeof (*fd), addr) != sizeof (*fd)) { - mdb_warn("failed to read nsc_fd at %p", addr); - return (DCMD_ERR); - } - - if (mdb_vread(&pathp, sizeof (pathp), - (uintptr_t)fd->sf_dev + OFFSETOF(nsc_dev_t, nsc_path)) != - sizeof (pathp)) { - mdb_warn("failed to read nsc_dev.nsc_path"); - return (DCMD_ERR); - } - - if (mdb_readstr(path, sizeof (path), pathp) == -1) { - mdb_warn("failed to read nsc_path"); - return (DCMD_ERR); - } - - if (fd->sf_iodev) { - if (mdb_vread(&io, sizeof (io), - (uintptr_t)fd->sf_iodev + OFFSETOF(nsc_iodev_t, si_io)) != - sizeof (io)) { - mdb_warn("failed to read nsc_iodev.si_io"); - return (DCMD_ERR); - } - - if (mdb_vread(&io_namep, sizeof (io_namep), - (uintptr_t)io + OFFSETOF(nsc_io_t, name)) != - sizeof (io_namep)) { - mdb_warn("failed to read nsc_io_t.name"); - return (DCMD_ERR); - } - - if (mdb_readstr(io_name, sizeof (io_name), - (uintptr_t)io_namep) == -1) { - mdb_warn("failed to read nsc_io_t.name string"); - return (DCMD_ERR); - } - } - - hdr = 0; - if (complex_walk) { - if (!complex_hdr) { - complex_hdr = 1; - hdr = 1; - } - } else if (DCMD_HDRSPEC(flags)) { - hdr = 1; - } - - if (hdr) { - mdb_printf("%-?s %8T%-?s %8T%-8s %-?s\n", - "fd", "dev", "io", "cd"); - mdb_printf(" %-?s %8Trv pend av path\n", "arg"); - } - - mdb_printf("%0?p %8T%0?p %8T%-8s %p\n", - addr, fd->sf_dev, io_name, fd->sf_cd); - mdb_printf(" %0?p %8T%2d %4x %2x %s\n", - fd->sf_arg, fd->sf_reserve, fd->sf_pend, - fd->sf_avail, path); - - if (!v_opt) - return (DCMD_OK); - - mdb_inc_indent(4); - - mdb_printf("open type: %08x <%b>\n", fd->sf_type, - fd->sf_type, nsc_type_bits); - - mdb_printf("avail: %08x <%b>\n", fd->sf_avail, - fd->sf_avail, nsc_availpend_bits); - - mdb_printf("flag: %08x <%b>\n", fd->sf_flag, - fd->sf_flag, nsc_fdflag_bits); - - mdb_printf("rsrv mode: %08x <%b>\n", fd->sf_mode, - fd->sf_mode, nsc_fdmode_bits); - - mdb_printf("open lbolt: %?x %8Treopen: %d\n", fd->sf_lbolt, - fd->sf_reopen); - - mdb_dec_indent(4); - - return (DCMD_OK); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Callback for the all devices and iodevs walk. Called per device. - */ -/* ARGSUSED */ -static int -nsc_iodev_dev(uintptr_t addr, const void *data, void *cbdata) -{ - struct complex_args *iodevall = cbdata; - uintptr_t iodev; - - if (mdb_vread(&iodev, sizeof (iodev), - addr + OFFSETOF(nsc_dev_t, nsc_list)) == -1) { - mdb_warn("unable to read nsc_dev_t.nsc_list at %p", addr); - return (WALK_ERR); - } - - /* walk iodev chains */ - - if (iodev != NULL) { - if (mdb_pwalk_dcmd("nsctl`nsc_iodev", "nsctl`nsc_iodev", - iodevall->argc, iodevall->argv, iodev) == -1) - return (WALK_ERR); - } - - return (WALK_NEXT); -} - - -/* - * Walk all devices and iodevs in the system. - */ -static int -nsc_iodev_all(int argc, const mdb_arg_t *argv) -{ - struct complex_args iodevall; - - iodevall.argc = argc; - iodevall.argv = (mdb_arg_t *)argv; - - complex_walk = 1; - complex_hdr = 0; - - if (mdb_walk("nsctl`nsc_dev", nsc_iodev_dev, &iodevall) == -1) { - return (DCMD_ERR); - } - - return (DCMD_OK); -} - - -/* - * Display an nsc_iodev_t structure, or walk all devices and - * iodevs in the system. - */ -static int -nsc_iodev(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - char io_name[128], *io_namep; - char path[NSC_MAXPATH+1]; - nsc_iodev_t *iodev; - uintptr_t pathp; - int v_opt; - int hdr; - - v_opt = 0; - - if (mdb_getopts(argc, argv, - 'v', MDB_OPT_SETBITS, TRUE, &v_opt) != argc) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - return (nsc_iodev_all(argc, argv)); - } - - memset(path, 0, sizeof (path)); - iodev = mdb_zalloc(sizeof (*iodev), UM_SLEEP | UM_GC); - memset(io_name, 0, sizeof (io_name)); - - if (mdb_vread(iodev, sizeof (*iodev), addr) != sizeof (*iodev)) { - mdb_warn("failed to read nsc_iodev at %p", addr); - return (DCMD_ERR); - } - - if (mdb_vread(&pathp, sizeof (pathp), - (uintptr_t)iodev->si_dev + OFFSETOF(nsc_dev_t, nsc_path)) != - sizeof (pathp)) { - mdb_warn("failed to read nsc_dev.nsc_path"); - return (DCMD_ERR); - } - - if (mdb_readstr(path, sizeof (path), pathp) == -1) { - mdb_warn("failed to read nsc_path"); - return (DCMD_ERR); - } - - if (mdb_vread(&io_namep, sizeof (io_namep), - (uintptr_t)iodev->si_io + OFFSETOF(nsc_io_t, name)) != - sizeof (io_namep)) { - mdb_warn("failed to read nsc_io_t.name"); - return (DCMD_ERR); - } - - if (mdb_readstr(io_name, sizeof (io_name), - (uintptr_t)io_namep) == -1) { - mdb_warn("failed to read nsc_io_t.name string"); - return (DCMD_ERR); - } - - hdr = 0; - if (complex_walk) { - if (!complex_hdr) { - complex_hdr = 1; - hdr = 1; - } - } else if (DCMD_HDRSPEC(flags)) { - hdr = 1; - } - - if (hdr) { - mdb_printf("%-?s %8T%-?s ref %-8s path\n", - "iodev", "dev", "io"); - } - - mdb_printf("%0?p %8T%0?p %3d %-8s %s\n", - addr, iodev->si_dev, iodev->si_refcnt, io_name, path); - - if (!v_opt) - return (DCMD_OK); - - mdb_inc_indent(4); - - mdb_printf("open fds: %?p %8Tactive ios: %?p\n", - iodev->si_open, iodev->si_active); - - mdb_printf("busy: %d %8Trsrv pend: %d\n", - iodev->si_busy, iodev->si_rpend); - - mdb_printf("pend: %08x <%b>\n", iodev->si_pend, - iodev->si_pend, nsc_availpend_bits); - - mdb_printf("avail: %08x <%b>\n", iodev->si_avail, - iodev->si_avail, nsc_availpend_bits); - - mdb_dec_indent(4); - - return (DCMD_OK); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Display an nsc_service_t structure, or walk all services. - */ -static int -nsc_service(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - nsc_service_t *service; - char s_name[32]; - int v_opt; - - v_opt = 0; - - if (mdb_getopts(argc, argv, - 'v', MDB_OPT_SETBITS, TRUE, &v_opt) != argc) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_walk_dcmd("nsctl`nsc_service", - "nsctl`nsc_service", argc, argv) == -1) { - mdb_warn("failed to walk 'nsc_service'"); - return (DCMD_ERR); - } - - return (DCMD_OK); - } - - service = mdb_zalloc(sizeof (*service), UM_SLEEP | UM_GC); - - if (mdb_vread(service, sizeof (*service), addr) != sizeof (*service)) { - mdb_warn("failed to read nsc_service at %p", addr); - return (DCMD_ERR); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8Tname\n", "service"); - } - - memset(s_name, 0, sizeof (s_name)); - if (service->s_name) { - if (mdb_readstr(s_name, sizeof (s_name), - (uintptr_t)service->s_name) == -1) { - mdb_warn("failed to read nsc_io_t.name"); - return (DCMD_ERR); - } - } - - mdb_printf("%0?p %8T%s\n", addr, s_name); - - if (!v_opt) - return (DCMD_OK); - - mdb_inc_indent(4); - - mdb_printf("servers:\n"); - if (service->s_servers == NULL) { - mdb_printf("<none>\n"); - } else { - mdb_inc_indent(4); - if (mdb_pwalk_dcmd("nsctl`nsc_svc", "nsctl`nsc_svc", - argc, argv, (uintptr_t)service->s_servers) == -1) { - mdb_dec_indent(8); - return (DCMD_ERR); - } - mdb_dec_indent(4); - } - - mdb_printf("clients:\n"); - if (service->s_clients == NULL) { - mdb_printf("<none>\n"); - } else { - mdb_inc_indent(4); - if (mdb_pwalk_dcmd("nsctl`nsc_svc", "nsctl`nsc_svc", - argc, argv, (uintptr_t)service->s_clients) == -1) { - mdb_dec_indent(8); - return (DCMD_ERR); - } - mdb_dec_indent(4); - } - - mdb_dec_indent(4); - - return (DCMD_OK); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Display an nsc_svc_t structure. - */ -/*ARGSUSED*/ -static int -nsc_svc(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - nsc_svc_t *svc; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - svc = mdb_zalloc(sizeof (*svc), UM_SLEEP | UM_GC); - - if (mdb_vread(svc, sizeof (*svc), addr) != sizeof (*svc)) { - mdb_warn("failed to read nsc_svc at %p", addr); - return (DCMD_ERR); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8T%-?s %8Tfunc\n", "svc", "service"); - } - - mdb_printf("%0?p %8T%0?p %8T%a\n", addr, svc->svc_svc, svc->svc_fn); - return (DCMD_OK); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Display a single nsc_val_t structure. - * If called with no address, performs a global walk of all nsc_devs. - */ -/* ARGSUSED3 */ -static int -nsc_val(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - nsc_val_t *vp; - - if (argc != 0) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - mdb_warn("nsc_val requires an address"); - return (DCMD_ERR); - } - - vp = mdb_zalloc(sizeof (*vp), UM_SLEEP | UM_GC); - - if (mdb_vread(vp, sizeof (*vp), addr) != sizeof (*vp)) { - mdb_warn("failed to read nsc_val at %p", addr); - return (DCMD_ERR); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8T%8-s %8Tname\n", "val", "value"); - } - - mdb_printf("%0?p %8T%08x %8T%s\n", addr, vp->sv_value, vp->sv_name); - - return (DCMD_OK); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Display an nstset_t structure, or walk all sets. - */ - -static int -nstset(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - nstset_t *set; - int f_opt, r_opt, t_opt, v_opt; - - f_opt = r_opt = t_opt = v_opt = 0; - - if (mdb_getopts(argc, argv, - 'f', MDB_OPT_SETBITS, TRUE, &f_opt, /* free list */ - 'r', MDB_OPT_SETBITS, TRUE, &r_opt, /* reuse list */ - 't', MDB_OPT_SETBITS, TRUE, &t_opt, /* all threads */ - 'v', MDB_OPT_SETBITS, TRUE, &v_opt) != argc) - return (DCMD_USAGE); - - /* displaying threads implies verbose */ - if (f_opt || r_opt || t_opt) - v_opt = 1; - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_walk_dcmd("nsctl`nstset", - "nsctl`nstset", argc, argv) == -1) { - mdb_warn("failed to walk 'nstset'"); - return (DCMD_ERR); - } - - return (DCMD_OK); - } - - set = mdb_zalloc(sizeof (*set), UM_SLEEP | UM_GC); - - if (mdb_vread(set, sizeof (*set), addr) != sizeof (*set)) { - mdb_warn("failed to read nstset at %p", addr); - return (DCMD_ERR); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8T live nthr flag name\n", "set"); - } - - mdb_printf("%0?p %8T%6d %6d %4x %s\n", addr, - set->set_nlive, set->set_nthread, set->set_flag, set->set_name); - - if (!v_opt) - return (DCMD_OK); - - mdb_inc_indent(4); - - mdb_printf("chain: %0?p %8Tpending: %4d res_cnt: %4d\n", - set->set_chain, set->set_pending, set->set_res_cnt); - - if (set->set_reuse.q_forw == set->set_reuse.q_back && - (uintptr_t)set->set_reuse.q_forw == - (addr + OFFSETOF(nstset_t, set_reuse))) { - mdb_printf("reuse.forw: %-?s %8Treuse.back: %s\n", - "empty", "empty"); - } else { - mdb_printf("reuse.forw: %0?p %8Treuse.back: %0?p\n", - set->set_reuse.q_forw, set->set_reuse.q_back); - - /* display all threads in reuse list */ - if (r_opt && - mdb_pwalk_dcmd("nsctl`nst_free", "nsctl`nsthread", - 0, (const mdb_arg_t *)NULL, - (addr + OFFSETOF(nstset_t, set_reuse))) == -1) { - mdb_dec_indent(4); - return (DCMD_ERR); - } - } - - if (set->set_free.q_forw == set->set_free.q_back && - (uintptr_t)set->set_free.q_forw == - (addr + OFFSETOF(nstset_t, set_free))) { - mdb_printf("free.forw: %-?s %8Tfree.back: %s\n", - "empty", "empty"); - } else { - mdb_printf("free.forw: %0?p %8Tfree.back: %0?p\n", - set->set_free.q_forw, set->set_free.q_back); - - /* display all threads in free list */ - if (f_opt && - mdb_pwalk_dcmd("nsctl`nst_free", "nsctl`nsthread", - 0, (const mdb_arg_t *)NULL, - (addr + OFFSETOF(nstset_t, set_free))) == -1) { - mdb_dec_indent(4); - return (DCMD_ERR); - } - } - - mdb_printf("flag: %08x <%b>\n", - set->set_flag, set->set_flag, nstset_flag_bits); - - /* display all threads in set */ - if (t_opt) { - mdb_printf("all threads in set:\n"); - if (mdb_pwalk_dcmd("nsctl`nsthread", "nsctl`nsthread", - 0, (const mdb_arg_t *)NULL, - (uintptr_t)set->set_chain) == -1) { - mdb_dec_indent(4); - return (DCMD_ERR); - } - } - - mdb_dec_indent(4); - - return (DCMD_OK); -} - - -/* ---------------------------------------------------------------------- */ - -/* - * Callback for the all nstsets and threads walk. Called per set. - */ -/* ARGSUSED */ -static int -nst_thr_set(uintptr_t addr, const void *data, void *cbdata) -{ - struct complex_args *thrall = cbdata; - char set_name[48]; - uintptr_t tp; - - if (mdb_vread(&tp, sizeof (tp), - addr + OFFSETOF(nstset_t, set_chain)) == -1) { - mdb_warn("unable to read nstset_t.set_chain at %p", addr); - return (WALK_ERR); - } - - memset(set_name, 0, sizeof (set_name)); - - if (mdb_readstr(set_name, sizeof (set_name), - addr + OFFSETOF(nstset_t, set_name)) == -1) { - mdb_warn("unable to read nstset_t.set_name at %p", addr); - } - - mdb_printf("nstset: %0?p (%s)\n", addr, set_name); - - /* walk thread chains */ - - if (tp != NULL) { - if (mdb_pwalk_dcmd("nsctl`nsthread", "nsctl`nsthread", - thrall->argc, thrall->argv, tp) == -1) - return (WALK_ERR); - } else - mdb_printf(" no threads\n"); - - mdb_printf("\n"); - - return (WALK_NEXT); -} - - -/* - * Walk all nstsets and threads in the system. - */ -static int -nst_thr_all(int argc, const mdb_arg_t *argv) -{ - struct complex_args thrall; - - thrall.argc = argc; - thrall.argv = (mdb_arg_t *)argv; - - if (mdb_walk("nsctl`nstset", nst_thr_set, &thrall) == -1) - return (DCMD_ERR); - - return (DCMD_OK); -} - - -/* - * Display an nsthread_t structure, or walk all threads. - */ - -static int -nsthread(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - uintptr_t thrpend; - nsthread_t *tp; - int a_opt, v_opt; - int rc; - - a_opt = v_opt = 0; - - if (mdb_getopts(argc, argv, - 'a', MDB_OPT_SETBITS, TRUE, &a_opt, - 'v', MDB_OPT_SETBITS, TRUE, &v_opt) != argc) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - if ((rc = nst_thr_all(argc, argv)) != DCMD_OK) - return (rc); - - if (a_opt) { - if (mdb_readvar(&thrpend, "nst_pending") == -1) { - mdb_warn("unable to read 'nst_pending'"); - return (DCMD_ERR); - } - - if (thrpend) { - mdb_printf("\nPending threads:\n"); - - if (mdb_pwalk_dcmd("nsctl`nsthread", - "nsctl`nsthread", argc, argv, - thrpend) == -1) { - mdb_warn("failed to walk 'nsthread'"); - return (DCMD_ERR); - } - } - } - - return (DCMD_OK); - } - - tp = mdb_zalloc(sizeof (*tp), UM_SLEEP | UM_GC); - - if (mdb_vread(tp, sizeof (*tp), addr) != sizeof (*tp)) { - mdb_warn("failed to read nsthread at %p", addr); - return (DCMD_ERR); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8Tflag %-?s %8Tfunc\n", "thread", "arg"); - } - - mdb_printf("%0?p %8T%4x %0?p %8T%a\n", - addr, tp->tp_flag, tp->tp_arg, tp->tp_func); - - if (!v_opt) - return (DCMD_OK); - - mdb_inc_indent(4); - - mdb_printf("set: %0?p %8Tchain: %0?p\n", - tp->tp_set, tp->tp_chain); - - mdb_printf("link.forw: %0?p %8Tlink.back: %0?p\n", - tp->tp_link.q_forw, tp->tp_link.q_back); - - mdb_printf("flag: %08x <%b>\n", - tp->tp_flag, tp->tp_flag, nst_flag_bits); - - mdb_dec_indent(4); - - return (DCMD_OK); -} - - -/* ---------------------------------------------------------------------- */ - -static void -nsc_rmap(char *name) -{ - nsc_rmmap_t slot; - uintptr_t addr; - int nslot; - char *cp; - - if (mdb_readvar(&addr, name) == -1) { - mdb_warn("unable to read rmap '%s'", name); - return; - } - - if (mdb_vread(&slot, sizeof (slot), addr) != sizeof (slot)) { - mdb_warn("unable to read rmap '%s' slot 0", name); - return; - } - - mdb_printf("\nmap name offset size nslot\n"); - mdb_printf("%16s %9d %9d %5d\n", - slot.name, slot.offset, slot.size, slot.inuse); - - nslot = slot.inuse; - mdb_printf("\nslot name offset size inuse\n"); - - while (--nslot) { - addr += sizeof (slot); - - if (mdb_vread(&slot, sizeof (slot), addr) != sizeof (slot)) { - mdb_warn("unable to read rmap '%s' slot @ %p", - name, addr); - return; - } - - if (!slot.inuse || !slot.size) - continue; - - for (cp = slot.name; *cp; cp++) - if (*cp == ':') - *cp = ' '; - - mdb_printf("%16s %9d %9d %08x\n", - slot.name, slot.offset, slot.size, slot.inuse); - } -} - - -static void -nsc_rmhdr(void) -{ - nsc_rmhdr_t *rmhdr = mdb_zalloc(sizeof (*rmhdr), UM_SLEEP | UM_GC); - uintptr_t addr; - - if (mdb_readvar(&addr, "_nsc_rmhdr_ptr") == -1) { - mdb_warn("unable to read _nsc_rmhdr_ptr"); - return; - } - - if (!addr) { - mdb_printf("\n\nGlobal header not initialised\n"); - return; - } - - if (mdb_vread(rmhdr, sizeof (*rmhdr), addr) != sizeof (*rmhdr)) { - mdb_warn("unable to read global header at %p", addr); - return; - } - - mdb_printf("\n\nglobal header (magic %08x, version %d, size %d)\n", - rmhdr->magic, rmhdr->ver, rmhdr->size); - - nsc_rmap("_nsc_global_map"); -} - - -static nsc_mem_t * -memptr(int type, int flag) -{ - int i; - - type &= NSC_MEM_GLOBAL; - - if (type) - flag = 0; - - if (!type && !flag) - return (&type_mem[0]); - - for (i = 1; i < (sizeof (type_mem) / sizeof (nsc_mem_t)); i++) { - if (!type_mem[i].flag && !type_mem[i].type) { - type_mem[i].flag = flag; - type_mem[i].type = type; - return (&type_mem[i]); - } - - if (type_mem[i].flag == flag && type_mem[i].type == type) - return (&type_mem[i]); - } - - return (&type_mem[i]); -} - - -#define typename(t) \ - (((t) & NSC_MEM_GLOBAL) ? "gbl" : " - ") - -#define memname(t) \ - (((t) & NSC_MEM_GLOBAL) ? "nsc_global" : "system kmem") - -static void -nsc_mem_type(const int first, nsc_mem_t *mp) -{ - char *type, *name; - - if (first) { - mdb_printf("\nregion typ f "); - mdb_printf("used hwm pgs alloc free\n"); - } - - type = typename(mp->type); - name = memname(mp->type); - - mdb_printf("%16s %s %2x %9d %9d %6d %5d %5d\n", - name, type, mp->flag, mp->used, mp->hwm, mp->pagehwm, - mp->nalloc, mp->nfree); -} - - -static int -nsc_mem_all(int argc, const mdb_arg_t *argv, int v_opt) -{ - int first; - int i; - - memset(type_mem, 0, sizeof (type_mem)); - - if (mdb_walk_dcmd("nsctl`nsc_mem", - "nsctl`nsc_mem", argc, argv) == -1) { - mdb_warn("unable to walk 'nsc_mem'"); - return (DCMD_ERR); - } - - for (first = 1, i = 0; - i < (sizeof (type_mem) / sizeof (nsc_mem_t)); first = 0, i++) { - if (type_mem[i].nalloc || type_mem[i].hwm) { - nsc_mem_type(first, &type_mem[i]); - } - } - - if (v_opt) - nsc_rmhdr(); - - return (DCMD_OK); -} - - -static int -nsc_mem(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - char name[16], *type, *cp; - nsc_mem_t mem, *mp; - int v_opt; - - v_opt = 0; - - if (mdb_getopts(argc, argv, - 'v', MDB_OPT_SETBITS, TRUE, &v_opt) != argc) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - return (nsc_mem_all(argc, argv, v_opt)); - } - - if (mdb_vread(&mem, sizeof (mem), addr) != sizeof (mem)) { - mdb_warn("failed to read nsc_mem_t at %p", addr); - return (DCMD_ERR); - } - - if (mdb_readstr(name, sizeof (name), (uintptr_t)mem.name) == -1) { - mdb_warn("failed to read nsc_mem_t.name at %p", addr); - return (DCMD_ERR); - } - - if (!mem.nalloc && !mem.hwm && !v_opt) - return (DCMD_OK); - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("name typ f "); - mdb_printf("used hwm pgs alloc free base\n"); - } - - type = typename(mem.type); - mp = memptr(mem.type, mem.flag); - - for (cp = name; *cp; cp++) - if (*cp == ':') - *cp = ' '; - - mdb_printf("%-16s %s %2x %9d %9d %5d %5d %5d %0?p\n", - name, type, mem.flag, mem.used, mem.hwm, mem.pagehwm, - mem.nalloc, mem.nfree, mem.base); - - mp->used += mem.used; - mp->hwm += mem.hwm; - mp->pagehwm += mem.pagehwm; - mp->nalloc += mem.nalloc; - mp->nfree += mem.nfree; - - return (DCMD_OK); -} - -/*ARGSUSED*/ -static int -nsc_vec(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - nsc_vec_t *vec; - - vec = mdb_zalloc(sizeof (*vec), UM_SLEEP | UM_GC); - if (mdb_vread(vec, sizeof (*vec), addr) != sizeof (*vec)) { - mdb_warn("failed to read nsc_vec at %p", addr); - return (DCMD_ERR); - } - mdb_printf("nsc_vec_t @ 0x%p = {\n", addr); - mdb_inc_indent(4); - mdb_printf("sv_addr: %p\n", vec->sv_addr); - mdb_printf("sv_vme: %lu\n", vec->sv_vme); - mdb_printf("sv_len: %d\n", vec->sv_len); - mdb_dec_indent(4); - mdb_printf("};\n"); - if (vec->sv_addr) - return (DCMD_OK); - else - return (DCMD_ERR); -} - -/* ---------------------------------------------------------------------- */ -/* - * Display an nsc_buf_t structure. - */ - -#ifdef NSC_MULTI_TERABYTE -#define STRCONV "ll" -#else -#define STRCONV "" -#endif - -/* ARGSUSED */ -static int -nsc_buf(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - nsc_buf_t *bh; - nsc_vec_t *v; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - bh = mdb_zalloc(sizeof (*bh), UM_SLEEP | UM_GC); - - if (mdb_vread(bh, sizeof (*bh), addr) != sizeof (*bh)) { - mdb_warn("failed to read nsc_buf at %p", addr); - return (DCMD_ERR); - } - - mdb_printf("nsc_buf_t @ 0x%p = {\n", addr); - mdb_inc_indent(4); - mdb_printf("sb_fd: 0x%p\n", bh->sb_fd); - mdb_printf("sb_pos: 0x%" STRCONV "x\n", bh->sb_pos); - mdb_printf("sb_len: 0x%" STRCONV "x\n", bh->sb_len); - mdb_printf("sb_flag: 0x%08x <%b>\n", bh->sb_flag, - bh->sb_flag, nsc_bhflag_bits); - mdb_printf("sb_error: %d\n", bh->sb_error); -#ifdef NSC_MULTI_TERABYTE - mdb_printf("sb_user: 0x%p\n", bh->sb_user); -#else - mdb_printf("sb_user: 0x%x\n", bh->sb_user); -#endif - mdb_printf("sb_vec: 0x%p\n", bh->sb_vec); - v = bh->sb_vec++; - while (nsc_vec((uintptr_t)v, flags, argc, argv) == DCMD_OK) - v++; - - mdb_dec_indent(4); - mdb_printf("};\n"); - - return (DCMD_OK); -} - -/* ---------------------------------------------------------------------- */ - -/* ARGSUSED */ -static int -nsc_dbuf(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - nsc_dbuf_t *bh; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - bh = mdb_zalloc(sizeof (*bh), UM_SLEEP | UM_GC); - - if (mdb_vread(bh, sizeof (*bh), addr) != sizeof (*bh)) { - mdb_warn("failed to read nsc_dbuf at %p", addr); - return (DCMD_ERR); - } - - mdb_printf("nsc_dbuf_t @ 0x%p = {\n", addr); - mdb_inc_indent(4); - mdb_printf("db_disc: 0x%p\n", bh->db_disc); - mdb_printf("db_addr: 0x%p\n", bh->db_addr); - mdb_printf("db_next: 0x%p\n", bh->db_next); - mdb_printf("db_maxfbas: 0x%d\n", bh->db_maxfbas); - - - mdb_dec_indent(4); - mdb_printf("};\n"); - - return (DCMD_OK); -} -/* ---------------------------------------------------------------------- */ - -/* - * MDB module linkage information: - */ - -static const mdb_dcmd_t dcmds[] = { -#if 0 - { "nsctl", NULL, "display nsctl module info", nsctl }, -#endif - { "nsc_buf", ":", "list nsc_buf structure", nsc_buf }, - { "nsc_dbuf", ":", "list nsc_dbuf structure", nsc_dbuf }, - { "nsc_dev", "?[-av]", "list nsc_dev structure", nsc_dev }, - { "nsc_devval", "?[-a]", "list nsc_devval structure", nsc_devval }, - { "nsc_fd", "?[-v]", "list nsc_fd structure", nsc_fd }, - { "nsc_iodev", "?[-v]", "list nsc_iodev structure", nsc_iodev }, - { "nsc_io", "?[-v]", "list nsc_io structure", nsc_io }, - { "nsc_mem", "?[-v]", "list nsc_mem structure", nsc_mem }, - { "nsc_svc", ":", "list nsc_svc structure", nsc_svc }, - { "nsc_service", "?[-v]", "list nsc_service structure", nsc_service }, - { "nsc_val", ":", "list nsc_val structure", nsc_val }, - { "nstset", "?[-frtv]", "list nstset structure", nstset }, - { "nsthread", "?[-av]", "list nsthread structure", nsthread }, - { NULL } -}; - - -static const mdb_walker_t walkers[] = { - { "nsc_dev", "walk nsc_dev chain", - nsc_dev_winit, nsc_dev_wstep, nsc_dev_wfini, NULL }, - { "nsc_devval", "walk nsc_devval chain", - nsc_devval_winit, nsc_devval_wstep, NULL, NULL }, - { "nsc_fd", "walk nsc_fd chain", - nsc_fd_winit, nsc_fd_wstep, NULL, NULL }, - { "nsc_io", "walk nsc_io chain", - nsc_io_winit, nsc_io_wstep, NULL, NULL }, - { "nsc_iodev", "walk nsc_iodev chain", - nsc_iodev_winit, nsc_iodev_wstep, NULL, NULL }, - { "nsc_mem", "walk nsc_mem chain", - nsc_mem_winit, nsc_mem_wstep, NULL, NULL }, - { "nsc_service", "walk nsc_service chain", - nsc_service_winit, nsc_service_wstep, NULL, NULL }, - { "nsc_svc", "walk nsc_svc chain", - nsc_svc_winit, nsc_svc_wstep, NULL, NULL }, - { "nsc_val", "walk nsc_val chain", - nsc_val_winit, nsc_val_wstep, NULL, NULL }, - { "nstset", "walk nstset chain", - nstset_winit, nstset_wstep, NULL, NULL }, - { "nsthread", "walk nsthread chain", - nsthread_winit, nsthread_wstep, NULL, NULL }, - { "nst_free", "walk nsthread free/reuse list", - nst_free_winit, nst_free_wstep, NULL, NULL }, - { NULL } -}; - - -static const mdb_modinfo_t modinfo = { - MDB_API_VERSION, dcmds, walkers -}; - - -const mdb_modinfo_t * -_mdb_init(void) -{ - return (&modinfo); -} diff --git a/usr/src/cmd/mdb/common/modules/rdc/Makefile.com b/usr/src/cmd/mdb/common/modules/rdc/Makefile.com deleted file mode 100644 index 40975cea69..0000000000 --- a/usr/src/cmd/mdb/common/modules/rdc/Makefile.com +++ /dev/null @@ -1,24 +0,0 @@ -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 2008 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -CPPFLAGS += -DNSC_MULTI_TERABYTE diff --git a/usr/src/cmd/mdb/common/modules/rdc/rdc.c b/usr/src/cmd/mdb/common/modules/rdc/rdc.c deleted file mode 100644 index 48d8b28969..0000000000 --- a/usr/src/cmd/mdb/common/modules/rdc/rdc.c +++ /dev/null @@ -1,1563 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <sys/types.h> -#include <sys/mdb_modapi.h> - -#include <sys/nsctl/nsctl.h> -#include <sys/unistat/spcs_s.h> -#include <sys/unistat/spcs_s_k.h> - -#include <rpc/auth.h> -#include <rpc/auth_unix.h> -#include <rpc/auth_des.h> -#include <rpc/svc.h> -#include <rpc/xdr.h> -#include <rpc/svc_soc.h> - -/* HACK HACK so we can bring in rdc_io.h and friends */ -#define nstset_t char - -#include <sys/nsctl/rdc.h> -#include <sys/nsctl/rdc_prot.h> -#include <sys/nsctl/rdc_ioctl.h> -#include <sys/nsctl/rdc_io.h> -#include <sys/nsctl/rdc_bitmap.h> - -#include <sys/nsctl/nsvers.h> - - -/* - * Walker for an array of rdc_k_info_t structures. - * A global walk is assumed to start at rdc_k_info. - */ - -struct rdc_kinfo_winfo { - uintptr_t start; - uintptr_t end; -}; - -char bitstr[33] = { '0' }; - -static int -rdc_k_info_winit(mdb_walk_state_t *wsp) -{ - struct rdc_kinfo_winfo *winfo; - rdc_k_info_t *rdc_k_info; - int rdc_max_sets; - - winfo = mdb_zalloc(sizeof (struct rdc_kinfo_winfo), UM_SLEEP); - - if (mdb_readvar(&rdc_k_info, "rdc_k_info") == -1) { - mdb_warn("failed to read 'rdc_k_info'"); - mdb_free(winfo, sizeof (struct rdc_kinfo_winfo)); - return (WALK_ERR); - } - - if (mdb_readvar(&rdc_max_sets, "rdc_max_sets") == -1) { - mdb_warn("failed to read 'rdc_max_sets'"); - mdb_free(winfo, sizeof (struct rdc_kinfo_winfo)); - return (WALK_ERR); - } - - winfo->start = (uintptr_t)rdc_k_info; - winfo->end = (uintptr_t)(rdc_k_info + rdc_max_sets); - - if (wsp->walk_addr == NULL) - wsp->walk_addr = winfo->start; - - wsp->walk_data = winfo; - return (WALK_NEXT); -} - - -static int -rdc_k_info_wstep(mdb_walk_state_t *wsp) -{ - struct rdc_kinfo_winfo *winfo = wsp->walk_data; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (wsp->walk_addr >= winfo->end) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - wsp->walk_addr += sizeof (rdc_k_info_t); - return (status); -} - - -static void -rdc_k_info_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (struct rdc_kinfo_winfo)); -} - -/* - * Walker for an array of rdc_u_info_t structures. - * A global walk is assumed to start at rdc_u_info. - */ - -struct rdc_uinfo_winfo { - uintptr_t start; - uintptr_t end; -}; - - -static int -rdc_u_info_winit(mdb_walk_state_t *wsp) -{ - struct rdc_uinfo_winfo *winfo; - rdc_u_info_t *rdc_u_info; - int rdc_max_sets; - - winfo = mdb_zalloc(sizeof (struct rdc_uinfo_winfo), UM_SLEEP); - - if (mdb_readvar(&rdc_u_info, "rdc_u_info") == -1) { - mdb_warn("failed to read 'rdc_u_info'"); - mdb_free(winfo, sizeof (struct rdc_uinfo_winfo)); - return (WALK_ERR); - } - - if (mdb_readvar(&rdc_max_sets, "rdc_max_sets") == -1) { - mdb_warn("failed to read 'rdc_max_sets'"); - mdb_free(winfo, sizeof (struct rdc_uinfo_winfo)); - return (WALK_ERR); - } - - winfo->start = (uintptr_t)rdc_u_info; - winfo->end = (uintptr_t)(rdc_u_info + rdc_max_sets); - - if (wsp->walk_addr == NULL) - wsp->walk_addr = winfo->start; - - wsp->walk_data = winfo; - return (WALK_NEXT); -} - - -static int -rdc_u_info_wstep(mdb_walk_state_t *wsp) -{ - struct rdc_uinfo_winfo *winfo = wsp->walk_data; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (wsp->walk_addr >= winfo->end) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - wsp->walk_addr += sizeof (rdc_u_info_t); - return (status); -} - - -static void -rdc_u_info_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (struct rdc_uinfo_winfo)); -} - -/* - * Walker for the rdc_if chain. - * A global walk is assumed to start at rdc_if_top. - */ - -static int -rdc_if_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL && - mdb_readvar(&wsp->walk_addr, "rdc_if_top") == -1) { - mdb_warn("unable to read 'rdc_if_top'"); - return (WALK_ERR); - } - - wsp->walk_data = mdb_zalloc(sizeof (rdc_if_t), UM_SLEEP); - - return (WALK_NEXT); -} - - -static int -rdc_if_wstep(mdb_walk_state_t *wsp) -{ - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (mdb_vread(wsp->walk_data, - sizeof (rdc_if_t), wsp->walk_addr) == -1) { - mdb_warn("failed to read rdc_if at %p", wsp->walk_addr); - return (WALK_DONE); - } - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - wsp->walk_addr = (uintptr_t)(((rdc_if_t *)wsp->walk_data)->next); - return (status); -} - - -static void -rdc_if_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (rdc_if_t)); -} - -/* - * Displays the asynchronous sleep q on the server. - */ -/*ARGSUSED*/ -static int -rdc_sleepq(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_sleepq_t sq; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - while (addr) { - if (mdb_vread(&sq, sizeof (sq), addr) != sizeof (sq)) { - mdb_warn("failed to read rdc_sleepq at %p", addr); - return (DCMD_ERR); - } - mdb_printf("sequence number %u qpos %d \n", sq.seq, sq.qpos); - addr = (uintptr_t)sq.next; - } - return (DCMD_OK); -} - -/* - * display the header info for the pending diskq requests - */ -/*ARGSUSED*/ -static int -rdc_iohdr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - io_hdr hdr; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - while (addr) { - if (mdb_vread(&hdr, sizeof (io_hdr), addr) != sizeof (io_hdr)) { - mdb_warn("failed to read io_hdr at %p", addr); - return (DCMD_ERR); - } - mdb_printf("iohdr: type %d pos %d qpos %d len %d flag 0x%x" - " iostatus %x setid %d next %p\n", hdr.dat.type, hdr.dat.pos, - hdr.dat.qpos, hdr.dat.len, hdr.dat.flag, hdr.dat.iostatus, - hdr.dat.setid, hdr.dat.next); - - addr = (uintptr_t)hdr.dat.next; - } - return (DCMD_OK); -} - -/* - * Display a krdc->group. - * Requires an address. - */ -/*ARGSUSED*/ -static int -rdc_group(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - struct rdc_group *group; - disk_queue *dq; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - - group = mdb_zalloc(sizeof (*group), UM_GC); - - if (mdb_vread(group, sizeof (*group), addr) != sizeof (*group)) { - mdb_warn("failed to read rdc_group at %p", addr); - return (DCMD_ERR); - } -#ifdef XXXJET - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8T%-8s %8T%s\n", "ADDR", "MAJOR", "INUSE"); - } -#endif - mdb_printf("count: %d %8Twriter: %d %8T flags: %d\n", - group->count, group->rdc_writer, group->flags); - mdb_printf("thread num %d\n", group->rdc_thrnum); - - dq = &group->diskq; - if (RDC_IS_MEMQ(group)) { - mdb_printf("queue type: Memory based\n"); - } else if (RDC_IS_DISKQ(group)) { - mdb_printf("queue type: Disk based %8Tqstate 0x%x\n", - QSTATE(dq)); - } - mdb_printf("ra_queue head: 0x%p %8Ttail 0x%p\n", - group->ra_queue.net_qhead, group->ra_queue.net_qtail); - mdb_printf("ra_queue blocks: %d %8Titems %d\n", - group->ra_queue.blocks, group->ra_queue.nitems); - mdb_printf("ra_queue blockhwm: %d itemhwm: %d\n", - group->ra_queue.blocks_hwm, group->ra_queue.nitems_hwm); - mdb_printf("ra_queue hwmhit: %d qfillsleep: %d\n", - group->ra_queue.hwmhit, group->ra_queue.qfill_sleeping); - mdb_printf("ra_queue throttle: %ld\n", - group->ra_queue.throttle_delay); - - if (RDC_IS_DISKQ(group)) { - mdb_printf("head: %d %8Tnxtio: %d %8Ttail %d %8Tlastail: %d\n", - QHEAD(dq), QNXTIO(dq), QTAIL(dq), LASTQTAIL(dq)); - mdb_printf("coalbounds: %d %8Tqwrap: %d\n", QCOALBOUNDS(dq), - QWRAP(dq)); - mdb_printf("blocks: %d %8Titems %d qfflags 0x%x \n", - QBLOCKS(dq), QNITEMS(dq), group->ra_queue.qfflags); - mdb_printf("diskq throttle: %ld %8Tflags: %x\n", - dq->throttle_delay, group->flags); - mdb_printf("disk queue nitems_hwm: %d %8Tblocks_hwm: %d\n", - dq->nitems_hwm, dq->blocks_hwm); - mdb_printf("diskqfd: 0x%p %8Tdisqrsrv: %d lastio: 0x%p\n", - group->diskqfd, group->diskqrsrv, dq->lastio); - mdb_printf("outstanding req %d iohdrs 0x%p iohdrs_last 0x%p\n", - dq->hdrcnt, dq->iohdrs, dq->hdr_last); - } - mdb_printf("seq: %u\n", group->seq); - mdb_printf("seqack: %u\n", group->seqack); - mdb_printf("sleepq: 0x%p\n", group->sleepq); - mdb_printf("asyncstall %d\n", group->asyncstall); - mdb_printf("asyncdis %d\n", group->asyncdis); - - mdb_inc_indent(4); - if (group->sleepq) { - rdc_sleepq((uintptr_t)group->sleepq, DCMD_ADDRSPEC, - 0, 0); - } - mdb_dec_indent(4); - - return (DCMD_OK); -} - - -/* - * Display a krdc->lsrv. - * Requires an address. - */ -/*ARGSUSED*/ -static int -rdc_srv(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_srv_t *lsrv; - char name[MAX_RDC_HOST_SIZE]; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - - lsrv = mdb_zalloc(sizeof (*lsrv), UM_GC); - - if (mdb_vread(lsrv, sizeof (*lsrv), addr) != sizeof (*lsrv)) { - mdb_warn("failed to read rdc_srv at %p", addr); - return (DCMD_ERR); - } - - if (mdb_readstr(name, sizeof (name), - (uintptr_t)lsrv->ri_hostname) == -1) { - mdb_warn("failed to read ri_hostname name at %p", addr); - return (DCMD_ERR); - } - - mdb_printf("host: %s %16Tri_knconf 0x%p\n", name, lsrv->ri_knconf); - - mdb_printf("ri_addr: 0x%p %8Tsecdata 0x%p\n", - addr + OFFSETOF(rdc_srv_t, ri_addr), lsrv->ri_secdata); - - return (DCMD_OK); -} - -/* - * Display a rdc_if_t. - * Requires an address. - */ -static int -rdc_if(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_if_t *ifp; - - if (!(flags & DCMD_ADDRSPEC)) { - /* - * paranoid mode on: qualify walker name with module name - * using '`' syntax. - */ - if (mdb_walk_dcmd("rdc`rdc_if", - "rdc`rdc_if", argc, argv) == -1) { - mdb_warn("failed to walk 'rdc_if'"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - - ifp = mdb_zalloc(sizeof (*ifp), UM_GC); - - if (mdb_vread(ifp, sizeof (*ifp), addr) != sizeof (*ifp)) { - mdb_warn("failed to read rdc_srv at %p", addr); - return (DCMD_ERR); - } - - mdb_printf("next: 0x%p %8Tsrv 0x%p\n", ifp->next, ifp->srv); - mdb_printf("if_addr: 0x%p %8Tr_ifaddr 0x%p\n", - addr + OFFSETOF(rdc_if_t, ifaddr), - addr + OFFSETOF(rdc_if_t, r_ifaddr)); - mdb_printf("if_down: %d %8Tprimary %d %8Tsecondary %d\n", - ifp->if_down, ifp->isprimary, ifp->issecondary); - mdb_printf("version %d %8Tnoping %d\n", ifp->rpc_version, - ifp->no_ping); - mdb_printf("\n"); - - return (DCMD_OK); -} - - -/* - * Display a rdc_buf_t - * Requires an address. - */ -/*ARGSUSED*/ -static int -rdc_buf(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_buf_t *buf; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - - buf = mdb_zalloc(sizeof (*buf), UM_GC); - - if (mdb_vread(buf, sizeof (*buf), addr) != sizeof (*buf)) { - mdb_warn("failed to read rdc_buf at %p", addr); - return (DCMD_ERR); - } - - mdb_printf("nsc_buf fd: 0x%p %8Tvec 0x%p\n", - buf->rdc_bufh.sb_fd, buf->rdc_bufh.sb_vec); - - mdb_printf("nsc_buf pos: %d %8Tlen %d\n", - buf->rdc_bufh.sb_pos, buf->rdc_bufh.sb_len); - - mdb_printf("nsc_buf flag: 0x%x %8Terror %d\n", - buf->rdc_bufh.sb_flag, buf->rdc_bufh.sb_error); - - mdb_printf("anon_buf : 0x%p %8Tfd 0x%p %8Tbufp 0x%p\n", - buf->rdc_anon, buf->rdc_fd, buf->rdc_bufp); - - mdb_printf("vsize: %d %8Tflags 0x%x\n", - buf->rdc_vsize, buf->rdc_flags); - - return (DCMD_OK); -} - -/*ARGSUSED*/ -static int -rdc_aio(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_aio_t *aio; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - aio = mdb_zalloc(sizeof (*aio), UM_GC); - - if (mdb_vread(aio, sizeof (*aio), addr) != sizeof (*aio)) { - mdb_warn("failed to read rdc_aio at %p", addr); - return (DCMD_ERR); - } - mdb_printf("rdc_aio next: %p %8T nsc_buf: %p %8T nsc_qbuf %p\n", - aio->next, aio->handle, aio->qhandle); - mdb_printf("pos: %d len: %d qpos: %d flag: %x iostatus: %d index: %d" - " seq: %d\n", aio->pos, aio->len, aio->qpos, aio->flag, - aio->iostatus, aio->index, aio->seq); - return (DCMD_OK); -} - -/*ARGSUSED*/ -static int -rdc_dset(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_net_dataset_t *dset; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - dset = mdb_zalloc(sizeof (*dset), UM_GC); - - if (mdb_vread(dset, sizeof (*dset), addr) != sizeof (*dset)) { - mdb_warn("failed to read dset at %p", addr); - return (DCMD_ERR); - } - mdb_printf("dset id: %d %8T dset inuse: %d %8T dset delpend: %d\n", - dset->id, dset->inuse, dset->delpend); - mdb_printf("dset items: %d %8T dset head %p %8T dset tail %p \n", - dset->nitems, dset->head, dset->tail); - mdb_printf("dset pos %d %8T dset len %d\n", dset->pos, dset->fbalen); - - return (DCMD_OK); -} -/* - * Display a single rdc_k_info structure. - * If called with no address, performs a global walk of all rdc_k_info. - * -a : all (i.e. display all devices, even if disabled - * -v : verbose - */ - -const mdb_bitmask_t sv_flag_bits[] = { - { "NSC_DEVICE", NSC_DEVICE, NSC_DEVICE }, - { "NSC_CACHE", NSC_CACHE, NSC_CACHE }, - { NULL, 0, 0 } -}; - -static int -rdc_kinfo(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_k_info_t *krdc; - rdc_u_info_t *rdc_u_info, *urdc; - int a_opt, v_opt; - int dev_t_chars; - - a_opt = v_opt = FALSE; - dev_t_chars = sizeof (dev_t) * 2; /* # chars to display dev_t */ - - if (mdb_getopts(argc, argv, - 'a', MDB_OPT_SETBITS, TRUE, &a_opt, - 'v', MDB_OPT_SETBITS, TRUE, &v_opt) != argc) - return (DCMD_USAGE); - - krdc = mdb_zalloc(sizeof (*krdc), UM_GC); - urdc = mdb_zalloc(sizeof (*urdc), UM_GC); - - if (!(flags & DCMD_ADDRSPEC)) { - /* - * paranoid mode on: qualify walker name with module name - * using '`' syntax. - */ - if (mdb_walk_dcmd("rdc`rdc_kinfo", - "rdc`rdc_kinfo", argc, argv) == -1) { - mdb_warn("failed to walk 'rdc_kinfo'"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8T%-*s %8T%s\n", "ADDR", - dev_t_chars, "TFLAG", "STATE"); - } - - if (mdb_vread(krdc, sizeof (*krdc), addr) != sizeof (*krdc)) { - mdb_warn("failed to read rdc_k_info at %p", addr); - return (DCMD_ERR); - } - - if (mdb_readvar(&rdc_u_info, "rdc_u_info") == -1) { - mdb_warn("failed to read 'rdc_u_info'"); - return (DCMD_ERR); - } - - urdc = &rdc_u_info[krdc->index]; - - if (!a_opt && ((krdc->type_flag & RDC_CONFIGURED) == 0)) - return (DCMD_OK); - - mdb_printf("%?p %8T%0*lx %8T", addr, dev_t_chars, krdc->type_flag); - - - if (krdc->type_flag & RDC_DISABLEPEND) - mdb_printf(" disable pending"); - if (krdc->type_flag & RDC_ASYNCMODE) - mdb_printf(" async"); - if (krdc->type_flag & RDC_RESUMEPEND) - mdb_printf(" resume pending"); - if (krdc->type_flag & RDC_BUSYWAIT) - mdb_printf(" busywait"); -#ifdef RDC_SMALLIO - if (krdc->type_flag & RDC_SMALLIO) - mdb_printf(" smallio"); -#endif - - mdb_printf("\n"); - - if (!v_opt) - return (DCMD_OK); - - /* - * verbose - print the rest of the structure as well. - */ - - mdb_inc_indent(4); - - mdb_printf("index: %d %8Trindex: %d %8Tbusyc: %d %8Tmaxfbas: %d\n", - krdc->index, krdc->remote_index, krdc->busy_count, krdc->maxfbas); - - mdb_printf("info_dev: 0x%p %8Tiodev: 0x%p %8T %8T vers %d\n", - krdc->devices, krdc->iodev, krdc->rpc_version); - - mdb_printf("iokstats: 0x%p\n", krdc->io_kstats); - mdb_printf("group: 0x%p %8Tgroup_next: 0x%p\n", - krdc->group, krdc->group_next); - mdb_printf("group lock: 0x%p aux_state: %d\n", - &krdc->group->lock, krdc->aux_state); - - mdb_inc_indent(4); - if (krdc->type_flag & RDC_ASYNCMODE) { - rdc_group((uintptr_t)krdc->group, DCMD_ADDRSPEC, 0, 0); - } - mdb_dec_indent(4); - - mdb_printf("servinfo: 0x%p %8Tintf: 0x%p\nbitmap: 0x%p %8T" - "bitmap_ref: 0x%p\n", - krdc->lsrv, krdc->intf, krdc->dcio_bitmap, krdc->bitmap_ref); - - mdb_printf("bmap_size: %d %8Tbmaprsrv: %d%8T bmap_write: %d\n", - krdc->bitmap_size, krdc->bmaprsrv, krdc->bitmap_write); - - mdb_printf("bitmapfd: 0x%p %8Tremote_fd: 0x%p %8T\n", krdc->bitmapfd, - krdc->remote_fd); - - mdb_printf("net_dataset: 0x%p %8Tdisk_status: %d %8T\n", - krdc->net_dataset, krdc->disk_status); - - mdb_printf("many: 0x%p %8Tmulti: 0x%p %8T\n", krdc->many_next, - krdc->multi_next); - - mdb_printf("rdc_uinfo: 0x%p\n\n", urdc); - mdb_dec_indent(4); - return (DCMD_OK); -} - - -static int -rdc_uinfo(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_u_info_t *urdc; - rdc_k_info_t *rdc_k_info, *krdc, krdc1; - rdc_group_t grp; - disk_queue *dqp = NULL; - int a_opt, v_opt; - int dev_t_chars; - int rdcflags; - - a_opt = v_opt = FALSE; - dev_t_chars = sizeof (dev_t) * 2; /* # chars to display dev_t */ - - if (mdb_getopts(argc, argv, - 'a', MDB_OPT_SETBITS, TRUE, &a_opt, - 'v', MDB_OPT_SETBITS, TRUE, &v_opt) != argc) - return (DCMD_USAGE); - - urdc = mdb_zalloc(sizeof (*urdc), UM_GC); - krdc = mdb_zalloc(sizeof (*krdc), UM_GC); - - if (!(flags & DCMD_ADDRSPEC)) { - /* - * paranoid mode on: qualify walker name with module name - * using '`' syntax. - */ - if (mdb_walk_dcmd("rdc`rdc_uinfo", - "rdc`rdc_uinfo", argc, argv) == -1) { - mdb_warn("failed to walk 'rdc_uinfo'"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8T%-*s %8T%s\n", "ADDR", - dev_t_chars, "FLAG", "STATE"); - } - - if (mdb_vread(urdc, sizeof (*urdc), addr) != sizeof (*urdc)) { - mdb_warn("failed to read rdc_u_info at %p", addr); - return (DCMD_ERR); - } - - if (mdb_readvar(&rdc_k_info, "rdc_k_info") == -1) { - mdb_warn("failed to read 'rdc_k_info'"); - return (DCMD_ERR); - } - - krdc = &rdc_k_info[urdc->index]; - - if (!a_opt && ((urdc->flags & RDC_ENABLED) == 0)) - return (DCMD_OK); - - - if (mdb_vread(&krdc1, sizeof (krdc1), - (uintptr_t)krdc) != sizeof (krdc1)) { - mdb_warn("failed to read 'rdc_k_info1'"); - return (DCMD_ERR); - } - - if (krdc1.group) { - if (mdb_vread(&grp, sizeof (grp), - (uintptr_t)krdc1.group) != sizeof (grp)) { - mdb_warn("failed to read group info "); - return (DCMD_ERR); - } - dqp = &grp.diskq; - } - - rdcflags = (urdc->flags | urdc->sync_flags | urdc->bmap_flags); - mdb_printf("%?p %8T%0*lx %8T", addr, dev_t_chars, rdcflags); - - - if (rdcflags & RDC_PRIMARY) - mdb_printf(" primary"); - if (rdcflags & RDC_SLAVE) - mdb_printf(" slave"); - if (rdcflags & RDC_SYNCING) - mdb_printf(" syncing"); - if (rdcflags & RDC_SYNC_NEEDED) - mdb_printf(" sync_need"); - if (rdcflags & RDC_RSYNC_NEEDED) - mdb_printf(" rsync_need"); - if (rdcflags & RDC_LOGGING) - mdb_printf(" logging"); - if (rdcflags & RDC_QUEUING) - mdb_printf(" queuing"); - if (rdcflags & RDC_DISKQ_FAILED) - mdb_printf(" diskq failed"); - if (rdcflags & RDC_VOL_FAILED) - mdb_printf(" vol failed"); - if (rdcflags & RDC_BMP_FAILED) - mdb_printf(" bmp failed"); - if (rdcflags & RDC_ASYNC) - mdb_printf(" async"); - if (rdcflags & RDC_CLR_AFTERSYNC) - mdb_printf(" clr_bitmap_aftersync"); - if (dqp) { - if (IS_QSTATE(dqp, RDC_QNOBLOCK)) - mdb_printf(" noblock"); - } -#ifdef RDC_SMALLIO - if (rdcflags & RDC_SMALLIO) - mdb_printf(" smallio"); -#endif - - mdb_printf("\n"); - - if (!v_opt) - return (DCMD_OK); - - /* - * verbose - print the rest of the structure as well. - */ - - mdb_inc_indent(4); - mdb_printf("\n"); - - mdb_printf("primary: %s %8Tfile: %s \nbitmap: %s ", - urdc->primary.intf, urdc->primary.file, urdc->primary.bitmap); - mdb_printf("netbuf: 0x%p\n", addr + OFFSETOF(rdc_set_t, primary)); - mdb_printf("secondary: %s %8Tfile: %s \nbitmap: %s ", - urdc->secondary.intf, urdc->secondary.file, urdc->secondary.bitmap); - mdb_printf("netbuf: 0x%p\n", addr + OFFSETOF(rdc_set_t, secondary)); - - mdb_printf("sflags: %d %8Tbflags: %d%8T mflags: %d\n", - urdc->sync_flags, urdc->bmap_flags, urdc->mflags); - mdb_printf("index: %d %8Tsync_pos: %d%8T vsize: %d\n", - urdc->index, urdc->sync_pos, urdc->volume_size); - mdb_printf("setid: %d %8Tbits set: %d %8Tautosync: %d\n", - urdc->setid, urdc->bits_set, urdc->autosync); - mdb_printf("maxqfbas: %d %8Tmaxqitems: %d\n", - urdc->maxqfbas, urdc->maxqitems); - mdb_printf("netconfig: %p\n", urdc->netconfig); - mdb_printf("group: %s %8TdirectIO: %s\n", - urdc->group_name, urdc->direct_file); - mdb_printf("diskqueue: %s ", urdc->disk_queue); - if (dqp) { - mdb_printf("diskqsize: %d\n", QSIZE(dqp)); - } else { - mdb_printf("\n"); - } - mdb_printf("rdc_k_info: 0x%p\n", krdc); - mdb_printf("\n"); - mdb_dec_indent(4); - - mdb_printf("\n"); - return (DCMD_OK); -} - -/*ARGSUSED*/ -static int -rdc_infodev(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_info_dev_t *infodev; - _rdc_info_dev_t *infp; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - infodev = mdb_zalloc(sizeof (*infodev), UM_GC); - infp = mdb_zalloc(sizeof (*infp), UM_GC); - - if (mdb_vread(infodev, sizeof (*infodev), addr) != sizeof (*infodev)) { - mdb_warn("failed to read rdc_infodev at 0x%p\n", addr); - return (DCMD_ERR); - } - - infp = &infodev->id_cache_dev; - mdb_inc_indent(4); - - mdb_printf("id_next: 0x%p\n", infodev->id_next); - mdb_printf("id_cache_dev:\n"); - - mdb_inc_indent(4); - mdb_printf("bi_fd: 0x%p %8Tbi_iodev: 0x%p %8Tbi_krdc 0x%p\n", - infp->bi_fd, infp->bi_iodev, infp->bi_krdc); - mdb_printf("bi_rsrv: %d %8Tbi_orsrv: %d %8Tbi_failed: %d %8T\n" - "bi_ofailed: %d %8Tbi_flag: %d\n", infp->bi_rsrv, infp->bi_orsrv, - infp->bi_failed, infp->bi_ofailed, infp->bi_flag); - - infp = &infodev->id_raw_dev; - - mdb_dec_indent(4); - mdb_printf("id_cache_dev:\n"); - mdb_inc_indent(4); - - mdb_printf("bi_fd: 0x%p %8Tbi_iodev: 0x%p %8Tbi_krdc 0x%p\n", - infp->bi_fd, infp->bi_iodev, infp->bi_krdc); - mdb_printf("bi_rsrv: %d %8Tbi_orsrv: %d %8Tbi_failed: %d %8T\n" - "bi_ofailed: %d %8Tbi_flag: %d\n", infp->bi_rsrv, infp->bi_orsrv, - infp->bi_failed, infp->bi_ofailed, infp->bi_flag); - - mdb_dec_indent(4); - - mdb_printf("id_sets: %d %8Tid_release: %d %8Tid_flag %d", - infodev->id_sets, infodev->id_release, infodev->id_flag); - - if (infodev->id_flag & RDC_ID_CLOSING) { - mdb_printf("closing"); - } - mdb_printf("\n"); - - mdb_dec_indent(4); - return (DCMD_OK); -} - -/* - * Display general sv module information. - */ - -#define rdc_get_print(kvar, str, fmt, val) \ - if (mdb_readvar(&(val), #kvar) == -1) { \ - mdb_dec_indent(4); \ - mdb_warn("unable to read '" #kvar "'"); \ - return (DCMD_ERR); \ - } \ - mdb_printf("%-20s" fmt "\n", str ":", val) - -/*ARGSUSED*/ -static int -rdc(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - int maj, min, mic, baseline, i; - - if (argc != 0) - return (DCMD_USAGE); - - if (mdb_readvar(&maj, "sndr_major_rev") == -1) { - mdb_warn("unable to read 'sndr_major_rev'"); - return (DCMD_ERR); - } - - if (mdb_readvar(&min, "sndr_minor_rev") == -1) { - mdb_warn("unable to read 'sndr_minor_rev'"); - return (DCMD_ERR); - } - - if (mdb_readvar(&mic, "sndr_micro_rev") == -1) { - mdb_warn("unable to read 'sndr_micro_rev'"); - return (DCMD_ERR); - } - - if (mdb_readvar(&baseline, "sndr_baseline_rev") == -1) { - mdb_warn("unable to read 'sndr_baseline_rev'"); - return (DCMD_ERR); - } - - mdb_printf("Remote Mirror module version: kernel %d.%d.%d.%d; " - "mdb %d.%d.%d.%d\n", maj, min, mic, baseline, - ISS_VERSION_MAJ, ISS_VERSION_MIN, ISS_VERSION_MIC, ISS_VERSION_NUM); - mdb_inc_indent(4); - - rdc_get_print(rdc_debug, "debug", "%d", i); - rdc_get_print(rdc_bitmap_mode, "bitmap mode", "%d", i); - rdc_get_print(rdc_max_sets, "max sndr devices", "%d", i); - rdc_get_print(rdc_rpc_tmout, "client RPC timeout", "%d", i); - rdc_get_print(rdc_health_thres, "health threshold", "%d", i); - rdc_get_print(MAX_RDC_FBAS, "max trans fba", "%d", i); - - mdb_dec_indent(4); - return (DCMD_OK); -} - -static int -rdc_k2u(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_k_info_t *krdc; - rdc_u_info_t *rdc_u_info, *urdc; - int rc; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - krdc = mdb_zalloc(sizeof (*krdc), UM_GC); - urdc = mdb_zalloc(sizeof (*urdc), UM_GC); - - if (mdb_vread(krdc, sizeof (*krdc), addr) != sizeof (*krdc)) { - mdb_warn("failed to read krdc at %p", addr); - return (DCMD_ERR); - } - - if (mdb_readvar(&rdc_u_info, "rdc_u_info") == -1) { - mdb_warn("failed to read 'rdc_u_info'"); - return (DCMD_ERR); - } - - urdc = &rdc_u_info[krdc->index]; - - rc = rdc_uinfo((uintptr_t)urdc, DCMD_ADDRSPEC, argc, argv); - return (rc); -} - -static int -rdc_u2k(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_u_info_t *urdc; - rdc_k_info_t *rdc_k_info, *krdc; - int rc; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - urdc = mdb_zalloc(sizeof (*urdc), UM_GC); - krdc = mdb_zalloc(sizeof (*krdc), UM_GC); - - if (mdb_vread(urdc, sizeof (*urdc), addr) != sizeof (*urdc)) { - mdb_warn("failed to read urdc at %p\n", addr); - return (DCMD_ERR); - } - - if (mdb_readvar(&rdc_k_info, "rdc_k_info") == -1) { - mdb_warn("failed to read 'rdc_k_info'"); - return (DCMD_ERR); - } - - krdc = &rdc_k_info[urdc->index]; - - rc = rdc_kinfo((uintptr_t)krdc, DCMD_ADDRSPEC, argc, argv); - return (rc); -} - -#ifdef DEBUG -/* - * This routine is used to set the seq field in the rdc_kinfo->group - * structure. Used to test that the queue code handles the integer - * overflow correctly. - * Takes two arguments index and value. - * The index is the index into the kinfo structure array and - * the value is the new value to set into the seq field. - */ -/*ARGSUSED*/ -static int -rdc_setseq(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_k_info_t *rdc_k_info; - rdc_group_t *group; - int index; - uint_t val; - uintptr_t pokeaddr; - - if (argc != 2) { - mdb_warn("must have two arguments, index and value\n"); - return (DCMD_ERR); - } - - index = (int)mdb_strtoull(argv[0].a_un.a_str); - val = (uint_t)mdb_strtoull(argv[1].a_un.a_str); - - /* - * Find out where in memory the seq field. - * The structure offset first. - */ - - if (mdb_readvar(&rdc_k_info, "rdc_k_info") == -1) { - mdb_warn("failed to read 'rdc_k_info'"); - return (DCMD_ERR); - } - pokeaddr = (uintptr_t)&rdc_k_info[index].group; - if (mdb_vread(&group, sizeof (rdc_group_t *), pokeaddr) != - sizeof (rdc_group_t *)) { - mdb_warn("failed to fetch the group structure for set %d\n", - index); - return (DCMD_ERR); - } - pokeaddr = (uintptr_t)(&group->seq); - if (mdb_vwrite(&val, sizeof (val), pokeaddr) != sizeof (val)) { - mdb_warn("failed to write seq at %p\n", pokeaddr); - return (DCMD_ERR); - } - - return (DCMD_OK); -} - - -/* - * This routine is used to set the seqack field in the rdc_kinfo->group - * structure. Used to test that the queue code handles the integer - * overflow correctly. - * Takes two arguments index and value. - * The index is the index into the kinfo structure array and - * the value is the new value to set into the seqack field. - */ -/*ARGSUSED*/ -static int -rdc_setseqack(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_k_info_t *rdc_k_info; - rdc_group_t *group; - int index; - uint_t val; - uintptr_t pokeaddr; - - if (argc != 2) { - mdb_warn("must have two arguments, index and value\n"); - return (DCMD_ERR); - } - - index = (int)mdb_strtoull(argv[0].a_un.a_str); - val = (uint_t)mdb_strtoull(argv[1].a_un.a_str); - - /* - * Find out where in memory the seqack field. - * The structure offset first. - */ - - if (mdb_readvar(&rdc_k_info, "rdc_k_info") == -1) { - mdb_warn("failed to read 'rdc_k_info'"); - return (DCMD_ERR); - } - pokeaddr = (uintptr_t)&rdc_k_info[index].group; - if (mdb_vread(&group, sizeof (rdc_group_t *), pokeaddr) != - sizeof (rdc_group_t *)) { - mdb_warn("failed to fetch the group structure for set %d\n", - index); - return (DCMD_ERR); - } - pokeaddr = (uintptr_t)(&group->seqack); - if (mdb_vwrite(&val, sizeof (val), pokeaddr) != sizeof (val)) { - mdb_warn("failed to write seqack at %p\n", pokeaddr); - return (DCMD_ERR); - } - - return (DCMD_OK); -} - -/* - * random define printing stuff, just does the define, and print the result - */ -/*ARGSUSED*/ -static int -fba_to_log_num(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - int num; - if (argc < 1) { - mdb_warn("must have an argument\n"); - return (DCMD_ERR); - } - num = (int)mdb_strtoull(argv[0].a_un.a_str); - num = FBA_TO_LOG_NUM(num); - mdb_printf("LOG NUM: %d (0x%x)", num, num); - - return (DCMD_OK); -} - -/*ARGSUSED*/ -static int -log_to_fba_num(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - int num; - if (argc < 1) { - mdb_warn("must have an argument\n"); - return (DCMD_ERR); - } - num = (int)mdb_strtoull(argv[0].a_un.a_str); - num = LOG_TO_FBA_NUM(num); - mdb_printf("LOG NUM: %d (0x%x)", num, num); - - return (DCMD_OK); -} - -static int -bmap_bit_isset(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - int st; - int i, num; - rdc_k_info_t *krdc; - unsigned char *bmap; - unsigned char *bmaddr; - int bmsize; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (argc < 1) { - mdb_warn("must have an argument\n"); - return (DCMD_ERR); - } - krdc = mdb_zalloc(sizeof (*krdc), UM_GC); - - if (mdb_vread(krdc, sizeof (*krdc), addr) != sizeof (*krdc)) { - mdb_warn("failed to read rdc_k_info at %p", addr); - return (DCMD_ERR); - } - - bmaddr = krdc->dcio_bitmap; - bmsize = krdc->bitmap_size; - bmap = mdb_zalloc(bmsize, UM_GC); - if (mdb_vread(bmap, bmsize, (uintptr_t)bmaddr) != bmsize) { - mdb_warn("failed to read bitmap"); - return (DCMD_ERR); - } - - num = (int)mdb_strtoull(argv[0].a_un.a_str); - st = FBA_TO_LOG_NUM(num); - i = BMAP_BIT_ISSET(bmap, st); - mdb_printf(" BIT (%d) for %x %s set (%02x)", st, num, i?"IS":"IS NOT", - bmap[IND_BYTE(st)] & 0xff); - - return (DCMD_OK); -} - -static int -bmap_bitref_isset(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - int num, st, i; - rdc_k_info_t *krdc; - unsigned char *brefbyte; - unsigned int *brefint; - void *bradder; - int brsize; - size_t refcntsize = sizeof (unsigned char); - struct bm_ref_ops *refops; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (argc < 1) { - mdb_warn("must have an argument\n"); - return (DCMD_ERR); - } - - krdc = mdb_zalloc(sizeof (*krdc), UM_GC); - - if (mdb_vread(krdc, sizeof (*krdc), addr) != sizeof (*krdc)) { - mdb_warn("failed to read rdc_k_info at %p", addr); - return (DCMD_ERR); - } - - bradder = krdc->bitmap_ref; - refops = mdb_zalloc(sizeof (*refops), UM_GC); - if (mdb_vread(refops, sizeof (*refops), (uintptr_t)krdc->bm_refs) != - sizeof (*refops)) { - mdb_warn("failed to read bm_refops at %p", krdc->bm_refs); - return (DCMD_ERR); - } - refcntsize = refops->bmap_ref_size; - brsize = krdc->bitmap_size * BITS_IN_BYTE * refcntsize; - if (refcntsize == sizeof (unsigned char)) { - brefbyte = mdb_zalloc(brsize, UM_GC); - if (mdb_vread(brefbyte, brsize, (uintptr_t)bradder) != brsize) { - mdb_warn("failed to read bitmap"); - return (DCMD_ERR); - } - } else { - brefint = mdb_zalloc(brsize, UM_GC); - if (mdb_vread(brefint, brsize, (uintptr_t)bradder) != brsize) { - mdb_warn("failed to read bitmap"); - return (DCMD_ERR); - } - } - - num = (int)mdb_strtoull(argv[0].a_un.a_str); - st = FBA_TO_LOG_NUM(num); - if (refcntsize == sizeof (unsigned char)) - i = brefbyte[st]; - else - i = brefint[st]; - - mdb_printf("BITREF (%d) for %x %s set (%02x)", st, num, i?"IS":"IS NOT", - i); - - return (DCMD_OK); -} - -/*ARGSUSED*/ -static int -ind_byte(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - int num; - - if (argc < 1) { - mdb_warn("must have an argument\n"); - return (DCMD_ERR); - } - num = FBA_TO_LOG_NUM((int)mdb_strtoull(argv[0].a_un.a_str)); - mdb_printf("IND_BYTE: %d", IND_BYTE(num)); - - return (DCMD_OK); -} - -/*ARGSUSED*/ -static int -ind_bit(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - int num; - - if (argc < 1) { - mdb_warn("must have an argument\n"); - return (DCMD_ERR); - } - num = FBA_TO_LOG_NUM((int)mdb_strtoull(argv[0].a_un.a_str)); - mdb_printf("IND_BIT: %d 0x%x", IND_BIT(num), IND_BIT(num)); - - return (DCMD_OK); -} - -static char * -print_bit(uint_t bitmask) -{ - int bitval = 1; - int i; - - bitstr[32] = '\0'; - - for (i = 31; i >= 0; i--) { - if (bitmask & bitval) { - bitstr[i] = '1'; - } else { - bitstr[i] = '0'; - } - bitval *= 2; - } - return (bitstr); -} - -/*ARGSUSED*/ -static int -rdc_bitmask(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - uint_t bitmask = 0; - int first, st, en, pos, len; - - if (argc < 2) { - mdb_warn("must have 2 args (pos, len)\n"); - return (DCMD_ERR); - } - pos = (int)mdb_strtoull(argv[0].a_un.a_str); - len = (int)mdb_strtoull(argv[1].a_un.a_str); - - if (len <= 0) { - mdb_printf("non positive len specified"); - return (DCMD_ERR); - } - - if ((len - pos) > 2048) { - mdb_printf("len out of range, 32 bit bitmask"); - return (DCMD_ERR); - } - - first = st = FBA_TO_LOG_NUM(pos); - en = FBA_TO_LOG_NUM(pos + len - 1); - while (st <= en) { - BMAP_BIT_SET((uchar_t *)&bitmask, st - first); - st++; - } - - mdb_printf("bitmask for POS: %d LEN: %d : 0x%08x (%s)", pos, len, - bitmask & 0xffffffff, print_bit(bitmask)); - return (DCMD_OK); - -} - -/* - * Dump the bitmap of the krdc structure indicated by the index - * argument. Used by the ZatoIchi tests. - */ -/*ARGSUSED*/ -static int -rdc_bmapdump(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_k_info_t *rdc_k_info; - int index; - uintptr_t bmapaddr; - uintptr_t bmapdata; - unsigned char *data; - int bmapsize; - int i; - int st = 0; - int en = 0; - - if (argc < 1) { - mdb_warn("must have index argument\n"); - return (DCMD_ERR); - } - - i = argc; - if (i == 3) { - en = (int)mdb_strtoull(argv[2].a_un.a_str); - en = FBA_TO_LOG_NUM(en); - i--; - } - if (i == 2) { - st = (int)mdb_strtoull(argv[1].a_un.a_str); - st = FBA_TO_LOG_NUM(st); - } - - index = (int)mdb_strtoull(argv[0].a_un.a_str); - /* - * Find out where in memory the rdc_k_kinfo array starts - */ - if (mdb_readvar(&rdc_k_info, "rdc_k_info") == -1) { - mdb_warn("failed to read 'rdc_k_info'"); - return (DCMD_ERR); - } - bmapaddr = (uintptr_t)(&rdc_k_info[index].bitmap_size); - if (mdb_vread(&bmapsize, sizeof (bmapsize), bmapaddr) - != sizeof (bmapsize)) { - mdb_warn("failed to read dcio_bitmap at %p\n", bmapaddr); - return (DCMD_ERR); - } - - bmapaddr = (uintptr_t)(&rdc_k_info[index].dcio_bitmap); - if (mdb_vread(&bmapdata, sizeof (bmapdata), bmapaddr) - != sizeof (bmapdata)) { - mdb_warn("failed to read dcio_bitmap at %p\n", bmapaddr); - return (DCMD_ERR); - } - data = mdb_zalloc(bmapsize, UM_SLEEP); - - if (mdb_vread(data, bmapsize, bmapdata) != bmapsize) { - mdb_warn("failed to read the bitmap data\n"); - mdb_free(data, bmapsize); - return (DCMD_ERR); - } - mdb_printf("bitmap data address 0x%p bitmap size %d\n" - "kinfo 0x%p\n", bmapdata, bmapsize, &rdc_k_info[index]); - - if ((st < 0) || ((st/8) > bmapsize) || (en < 0)) { - mdb_warn("offset is out of range st %d bms %d en %d", - st, bmapsize, en); - return (DCMD_ERR); - } - if (((en/8) > bmapsize) || (en == 0)) - en = bmapsize * 8; - - mdb_printf("bit start pos: %d bit end pos: %d\n\n", st, en); - st /= 8; - en /= 8; - for (i = st; i < en; i++) { - mdb_printf("%02x ", data[i] & 0xff); - if ((i % 16) == 15) { - int s = LOG_TO_FBA_NUM((i-15)*8); - int e = LOG_TO_FBA_NUM(((i+1)*8)) - 1; - mdb_printf(" fbas: %x - %x\n", s, e); - } - } - mdb_printf("\n"); - mdb_free(data, bmapsize); - return (DCMD_OK); -} - -/* - * dump the bitmap reference count - */ -/*ARGSUSED*/ -static int -rdc_brefdump(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - rdc_k_info_t *rdc_k_info; - int index; - uintptr_t bmapaddr; - uintptr_t bmapdata; - unsigned char *data; - int bmapsize; - int i; - int st = 0; - int en = 0; - - if (argc < 1) { - mdb_warn("must have index argument\n"); - return (DCMD_ERR); - } - index = (int)mdb_strtoull(argv[0].a_un.a_str); - - i = argc; - if (i == 3) { - en = (int)mdb_strtoull(argv[2].a_un.a_str); - en = FBA_TO_LOG_NUM(en); - i--; - - } - if (i == 2) { - st = (int)mdb_strtoull(argv[1].a_un.a_str); - st = FBA_TO_LOG_NUM(st); - } - - /* - * Find out where in memory the rdc_k_kinfo array starts - */ - if (mdb_readvar(&rdc_k_info, "rdc_k_info") == -1) { - mdb_warn("failed to read 'rdc_k_info'"); - return (DCMD_ERR); - } - bmapaddr = (uintptr_t)(&rdc_k_info[index].bitmap_size); - - if (mdb_vread(&bmapsize, sizeof (bmapsize), bmapaddr) - != sizeof (bmapsize)) { - mdb_warn("failed to read dcio_bitmap at %p\n", bmapaddr); - return (DCMD_ERR); - } - - bmapsize *= 8; - bmapaddr = (uintptr_t)(&rdc_k_info[index].bitmap_ref); - - if (mdb_vread(&bmapdata, sizeof (bmapdata), bmapaddr) - != sizeof (bmapdata)) { - mdb_warn("failed to read dcio_bitmap at %p\n", bmapaddr); - return (DCMD_ERR); - } - data = mdb_zalloc(bmapsize, UM_SLEEP); - - if (mdb_vread(data, bmapsize, bmapdata) != bmapsize) { - mdb_warn("failed to read the bitmap data\n"); - mdb_free(data, bmapsize); - return (DCMD_ERR); - } - mdb_printf("bitmap data address 0x%p bitmap size %d\n" - "kinfo 0x%p\n", bmapdata, bmapsize, &rdc_k_info[index]); - - if ((st < 0) || (st > bmapsize) || (en < 0)) { - mdb_warn("offset is out of range"); - } - if ((en > bmapsize) || (en == 0)) - en = bmapsize; - - mdb_printf("bit start pos: %d bit end pos: %d\n\n", st, en); - - for (i = st; i < en; i++) { - mdb_printf("%02x ", data[i] & 0xff); - if ((i % 16) == 15) { - int s = LOG_TO_FBA_NUM(i-15); - int e = LOG_TO_FBA_NUM(i+1) - 1; - mdb_printf(" fbas: 0x%x - 0x%x \n", s, e); - } - } - mdb_printf("\n"); - mdb_free(data, bmapsize); - return (DCMD_OK); -} - -static int -rdc_bmapnref(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - mdb_printf("\nRDC bitmap info\n"); - rdc_bmapdump(addr, flags, argc, argv); - mdb_printf("RDC bitmap reference count info\n"); - rdc_brefdump(addr, flags, argc, argv); - return (DCMD_OK); -} - -#endif -/* - * MDB module linkage information: - */ - -static const mdb_dcmd_t dcmds[] = { - { "rdc", NULL, "display sndr module info", rdc }, - { "rdc_buf", "?[-v]", "rdc_buf structure", rdc_buf }, - { "rdc_kinfo", "?[-av]", "rdc_k_info structure", rdc_kinfo }, - { "rdc_uinfo", "?[-av]", "rdc_u_info structure", rdc_uinfo }, - { "rdc_group", "?", "rdc group structure", rdc_group }, - { "rdc_srv", "?", "rdc_srv structure", rdc_srv }, - { "rdc_if", "?", "rdc_if structure", rdc_if }, - { "rdc_infodev", "?", "rdc_info_dev structure", rdc_infodev }, - { "rdc_k2u", "?", "rdc_kinfo to rdc_uinfo", rdc_k2u }, - { "rdc_u2k", "?", "rdc_uinfo to rdc_kinfo", rdc_u2k }, - { "rdc_aio", "?", "rdc_aio structure", rdc_aio}, - { "rdc_iohdr", "?", "rdc_iohdr structure", rdc_iohdr}, -#ifdef DEBUG - { "rdc_setseq", "?", "Write seq field in group", rdc_setseq }, - { "rdc_setseqack", "?", "Write seqack field in group", rdc_setseqack }, - { "rdc_dset", "?", "Dump dset info", rdc_dset }, - { "rdc_bmapdump", "?", "Dump bitmap", rdc_bmapdump }, - { "rdc_brefdump", "?", "Dump bitmap reference count", rdc_brefdump }, - { "rdc_bmapnref", "?", "Dump bitmap and ref count", rdc_bmapnref }, - { "rdc_fba2log", "?", "fba to log num", fba_to_log_num }, - { "rdc_log2fba", "?", "log to fba num", log_to_fba_num }, - { "rdc_bitisset", "?", "check bit set", bmap_bit_isset }, - { "rdc_brefisset", "?", "check bit ref set", bmap_bitref_isset }, - { "rdc_indbyte", "?", "print indbyte", ind_byte }, - { "rdc_indbit", "?", "print indbit", ind_bit }, - { "rdc_bitmask", "?", "print bitmask for pos->len", rdc_bitmask }, -#endif - { NULL } -}; - - -static const mdb_walker_t walkers[] = { - { "rdc_kinfo", "walk the rdc_k_info array", - rdc_k_info_winit, rdc_k_info_wstep, rdc_k_info_wfini }, - { "rdc_uinfo", "walk the rdc_u_info array", - rdc_u_info_winit, rdc_u_info_wstep, rdc_u_info_wfini }, - { "rdc_if", "walk rdc_if chain", - rdc_if_winit, rdc_if_wstep, rdc_if_wfini }, - { NULL } -}; - - -static const mdb_modinfo_t modinfo = { - MDB_API_VERSION, dcmds, walkers -}; - - -const mdb_modinfo_t * -_mdb_init(void) -{ - return (&modinfo); -} diff --git a/usr/src/cmd/mdb/common/modules/sdbc/Makefile.com b/usr/src/cmd/mdb/common/modules/sdbc/Makefile.com deleted file mode 100644 index 40975cea69..0000000000 --- a/usr/src/cmd/mdb/common/modules/sdbc/Makefile.com +++ /dev/null @@ -1,24 +0,0 @@ -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 2008 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -CPPFLAGS += -DNSC_MULTI_TERABYTE diff --git a/usr/src/cmd/mdb/common/modules/sdbc/sdbc.c b/usr/src/cmd/mdb/common/modules/sdbc/sdbc.c deleted file mode 100644 index 14c99abecf..0000000000 --- a/usr/src/cmd/mdb/common/modules/sdbc/sdbc.c +++ /dev/null @@ -1,3158 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <sys/mdb_modapi.h> -#include <sys/nsc_thread.h> - -/* needed to maintain identical _sd_bitmap_t sizes */ -#define _SD_8K_BLKSIZE -#include <sys/nsctl/sd_bcache.h> - -#include <ns/sdbc/sd_io.h> -#include <ns/sdbc/sd_ft.h> -#include <ns/sdbc/safestore.h> - -/* - * initialize cd filter options to this - * to differentiate with kernel values in range [-1, sdbc_max_devs] - */ -#define MDB_CD ((uintptr_t)~1) -#define OPT_C_SELECTED (opt_c != MDB_CD) - -/* initialize block filters to this */ -#define MDB_BLKNUM ((uintptr_t)~1) -#define OPT_B_SELECTED (opt_b != MDB_BLKNUM) - -enum vartype { UINTTYPE = 0, ADDRTYPE, LOCKTYPE, CVTYPE }; - -static void display_var(char *, enum vartype); -#ifdef SAFESTORE -static void print_wrq(_sd_writeq_t *, uint_t); -#endif - -struct walk_info { - uintptr_t w_start; - uintptr_t w_end; -}; - - -mdb_bitmask_t host_states[] = { - { "HOST_NONE", 0xff, _SD_HOST_NONE }, - { "HOST_CONFIGURED", 0xff, _SD_HOST_CONFIGURED }, - { "HOST_DECONFIGURED", 0xff, _SD_HOST_DECONFIGURED }, - { "HOST_NOCACHE", 0xff, _SD_HOST_NOCACHE }, - { NULL, 0, 0 } - -}; - -mdb_bitmask_t cache_hints[] = { - { "WRTHRU", NSC_WRTHRU, NSC_WRTHRU }, - { "FORCED_WRTHRU", NSC_FORCED_WRTHRU, NSC_FORCED_WRTHRU }, - { "NOCACHE", NSC_NOCACHE, NSC_NOCACHE }, - { "QUEUE", NSC_QUEUE, NSC_QUEUE }, - { "RDAHEAD", NSC_RDAHEAD, NSC_RDAHEAD }, - { "NO_FORCED_WRTHRU", NSC_NO_FORCED_WRTHRU, NSC_NO_FORCED_WRTHRU }, - { "METADATA", NSC_METADATA, NSC_METADATA }, - { "SEQ_IO", NSC_SEQ_IO, NSC_SEQ_IO }, - { NULL, 0, 0 } - -}; - - -/* - * some cache general dcmds that do not use walkers - */ -/*ARGSUSED*/ -static int -sdbc_config(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - _sd_cache_param_t _sd_cache_config; - _sd_net_t _sd_net_config; - _sd_ft_info_t _sd_ft_data; - uint_t _sd_node_hint; - char sdbc_version[17]; - - if (mdb_readvar(sdbc_version, "sdbc_version") == -1) { - mdb_warn("failed to read sdbc_version symbol"); - } else { - sdbc_version[16] = '\0'; /* make sure string is terminated */ - mdb_printf("sdbc_version %s\n", sdbc_version); - } - - if (mdb_readvar(&_sd_cache_config, "_sd_cache_config") == -1) { - mdb_warn("failed to read _sd_cache_config symbol"); - } else { - - mdb_printf("SDBC Configuration:\n"); - mdb_inc_indent(4); - mdb_printf("user magic: %X kernel magic: %X (should match)\n", - _SD_MAGIC, _sd_cache_config.magic); - mdb_printf( - "mirror host: %2d Block size: %4d threads %4d " - "write cache: %4dM\n", - _sd_cache_config.mirror_host, - _sd_cache_config.blk_size, - _sd_cache_config.threads, - _sd_cache_config.write_cache); - mdb_printf("num_handles %4-d cache_mem %4dM prot_lru %d\n", - _sd_cache_config.num_handles, - _sd_cache_config.cache_mem[0], - _sd_cache_config.prot_lru); - mdb_printf("gen_pattern %d fill_pattern %?-p num_nodes %d\n", - _sd_cache_config.gen_pattern, - _sd_cache_config.fill_pattern, - _sd_cache_config.num_nodes); - mdb_dec_indent(4); - } - - if (mdb_readvar(&_sd_net_config, "_sd_net_config") == -1) { - mdb_warn("failed to read _sd_net_config symbol"); - } else { - mdb_inc_indent(4); - mdb_printf( - "psize %4-d configured %d csize %10-d wsize %10-d cpages %6d\n", - _sd_net_config.sn_psize, - _sd_net_config.sn_configured, - _sd_net_config.sn_csize, - _sd_net_config.sn_wsize, - _sd_net_config.sn_cpages); - - mdb_dec_indent(4); -#ifdef SAFESTORE - print_wrq(&(_sd_net_config.sn_wr_queue), FALSE); -#endif - } - - - if (mdb_readvar(&_sd_ft_data, "_sd_ft_data") == -1) { - mdb_warn("failed to read _sd_ft_data symbol"); - - } else { - mdb_printf("FT data:\n"); - mdb_inc_indent(4); - mdb_printf("crashed %d host_state <%b> numio %d\n", - _sd_ft_data.fi_crashed, - _sd_ft_data.fi_host_state, host_states, - _sd_ft_data.fi_numio); - mdb_printf("lock %?-p (owner) rem_sv %h-x sleep %?-p (owner)\n", - _sd_ft_data.fi_lock._opaque[0], - _sd_ft_data.fi_rem_sv._opaque, - _sd_ft_data.fi_sleep._opaque[0]); - mdb_dec_indent(4); - } - - if (mdb_readvar(&_sd_node_hint, "_sd_node_hint") == -1) { - mdb_warn("failed to read _sd_node_hint symbol"); - - } else - mdb_printf("Node Hints: %08x <%b>\n", - _sd_node_hint, cache_hints); - - display_var("sdbc_wrthru_len", UINTTYPE); - display_var("_sd_debug_level", UINTTYPE); - display_var("_sdbc_attached", UINTTYPE); - - return (DCMD_OK); -} - -static void -sdbc_hit_percent(uint_t hits, uint_t misses, char *type) -{ - uint64_t dhits, dmisses; - uint64_t hit_rate = 0; - - mdb_printf("%s hits: %u\t %s misses: %u\n", type, hits, type, misses); - - /* a little crude. anything less than 1 percent will show as 0 */ - if (hits > 0 || misses > 0) { - dhits = (uint64_t)hits; - dmisses = (uint64_t)misses; - hit_rate = (dhits * 100)/ (dhits + dmisses); - mdb_printf("%s hit rate: %lld %%\n", type, hit_rate); - } - mdb_printf("\n"); -} - -/*ARGSUSED*/ -static int -sdbc_stats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - int i; - char *fn; - _sd_stats_t *_sd_cache_stats; /* local memory */ - uintptr_t _sd_cache_statsp; /* kernel pointer */ - _sd_shared_t *sh; - int statssize; - GElf_Sym sym; - int maxdevs; - - if (argc != 0) - return (DCMD_USAGE); - - /* get the number of volumes */ - if (mdb_readvar(&maxdevs, "sdbc_max_devs") == -1) { - mdb_warn("failed to read sdbc_max_devs"); - return (DCMD_ERR); - } - - statssize = sizeof (_sd_stats_t) + (maxdevs - 1) * - sizeof (_sd_shared_t); - - _sd_cache_stats = mdb_zalloc(statssize, UM_SLEEP); - - if (mdb_lookup_by_obj("sdbc", "_sd_cache_stats", &sym) == -1) { - mdb_warn("failed to lookup _sd_cache_stats symbol"); - return (DCMD_ERR); - } - - if (mdb_vread(&_sd_cache_statsp, sizeof (uintptr_t), - sym.st_value) == -1) { - mdb_warn("failed to read _sd_stats_t pointer"); - return (DCMD_ERR); - } - - if (mdb_vread(_sd_cache_stats, statssize, _sd_cache_statsp) == -1) { - mdb_warn("failed to read _sd_stats_t structure"); - return (DCMD_ERR); - } - - mdb_printf("Storage Device Block Cache Statistics\n"); - mdb_printf("-------------------------------------\n"); - - i = _sd_cache_stats->st_blksize; - mdb_printf("Blocksize: 0x%x (%d)\n", i, i); - - mdb_printf("\n"); - sdbc_hit_percent(_sd_cache_stats->st_rdhits, _sd_cache_stats->st_rdmiss, - "Read"); - sdbc_hit_percent(_sd_cache_stats->st_wrhits, _sd_cache_stats->st_wrmiss, - "Write"); - - mdb_printf("%3s %10s %8s %8s %8s %8s %8s %7s %4s %4s %s\n", - "Cd", "Dev", "Size", - "CacheRd", "CacheWr", "DiskRd", "DiskWr", - "DirtyBl", "#IO", "Fail", "F"); - for (i = 0; i < maxdevs; i++) { - sh = &_sd_cache_stats->st_shared[i]; - if (!sh->sh_alloc) - continue; - fn = strrchr(sh->sh_filename, '/'); - fn = fn ? fn+1 : sh->sh_filename; - mdb_printf("%3d %10s %7d %8d %8d %8d %8d %7d %4d %4d %d\n", - sh->sh_cd, fn, sh->sh_filesize, - sh->sh_cache_read, sh->sh_cache_write, - sh->sh_disk_read, sh->sh_disk_write, - sh->sh_numdirty, sh->sh_numio, sh->sh_numfail, - sh->sh_failed); - } - - mdb_free(_sd_cache_stats, statssize); - return (DCMD_OK); -} - -/* - * display some variables and counters - */ -static void -display_var(char *name, enum vartype type) -{ - uint_t uintval; - uintptr_t addrval; - kmutex_t lockval; - kcondvar_t cvval; - - switch (type) { - case UINTTYPE: - if (mdb_readvar(&uintval, name) == -1) { - mdb_warn("failed to read %s variable", name); - } else - mdb_printf("%s =\t%8x %12u\n", - name, uintval, uintval); - break; - case ADDRTYPE: - if (mdb_readvar(&addrval, name) == -1) { - mdb_warn("failed to read %s variable", name); - } else - mdb_printf("%s =\t%?-p\n", - name, addrval); - break; - case LOCKTYPE: - if (mdb_readvar(&lockval, name) == -1) { - mdb_warn("failed to read %s lock variable", - name); - } else - mdb_printf("%s =\t%-p (owner)\n", - name, lockval._opaque[0]); - break; - case CVTYPE: - if (mdb_readvar(&cvval, name) == -1) { - mdb_warn("failed to read %s condvar variable", - name); - } else - mdb_printf("%s = \t%h-x\n", - name, cvval._opaque); - break; - default: - mdb_warn("display_var: unknown type"); - } -} - -mdb_bitmask_t dealloc_flag_vals[] = { - { "PROCESS_CACHE_DM", (u_longlong_t)~0, PROCESS_CACHE_DM }, - { "CACHE_SHUTDOWN_DM", (u_longlong_t)~0, CACHE_SHUTDOWN_DM }, - { "CACHE_THREAD_TERMINATED_DM", - (u_longlong_t)~0, CACHE_THREAD_TERMINATED_DM }, - { "TIME_DELAY_LVL0", (u_longlong_t)~0, TIME_DELAY_LVL0 }, - { "TIME_DELAY_LVL1", (u_longlong_t)~0, TIME_DELAY_LVL1 }, - { "TIME_DELAY_LVL2", (u_longlong_t)~0, TIME_DELAY_LVL2 }, - { NULL, 0, 0 } -}; - -mdb_bitmask_t mdp_bits[] = { - { "MONITOR_DYNMEM_PROCESS_DEFAULT", - (u_longlong_t)~0, MONITOR_DYNMEM_PROCESS_DEFAULT}, - { "RPT_SHUTDOWN_PROCESS_DM", - RPT_SHUTDOWN_PROCESS_DM, RPT_SHUTDOWN_PROCESS_DM }, - { "RPT_DEALLOC_STATS1_DM", - RPT_DEALLOC_STATS1_DM, RPT_DEALLOC_STATS1_DM }, - { "RPT_DEALLOC_STATS2_DM", - RPT_DEALLOC_STATS2_DM, RPT_DEALLOC_STATS2_DM }, - { NULL, 0, 0 } -}; - -mdb_bitmask_t process_directive_bits[] = { - { "PROCESS_DIRECTIVE_DEFAULT", - (u_longlong_t)~0, PROCESS_DIRECTIVE_DEFAULT }, - { "WAKE_DEALLOC_THREAD_DM", - WAKE_DEALLOC_THREAD_DM, WAKE_DEALLOC_THREAD_DM }, - { "MAX_OUT_ACCEL_HIST_FLAG_DM", - MAX_OUT_ACCEL_HIST_FLAG_DM, MAX_OUT_ACCEL_HIST_FLAG_DM}, - { NULL, 0, 0 } -}; - -/*ARGSUSED*/ -static int -sdbc_vars(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - int sd_dealloc_flag_dm; - _dm_process_vars_t dynmem_processing_dm; - - if (argc != 0) - return (DCMD_USAGE); - - mdb_printf("counters and other variables:\n"); - mdb_inc_indent(4); - - display_var("xmem_inval_hit", UINTTYPE); - display_var("xmem_inval_miss", UINTTYPE); - display_var("xmem_inval_inuse", UINTTYPE); - - display_var("sdbc_allocb_pageio1", UINTTYPE); - display_var("sdbc_allocb_pageio2", UINTTYPE); - display_var("sdbc_allocb_inuse", UINTTYPE); - display_var("sdbc_allocb_hit", UINTTYPE); - display_var("sdbc_allocb_lost", UINTTYPE); - display_var("sdbc_pageio_always", UINTTYPE); - display_var("sdbc_do_page", UINTTYPE); - display_var("sdbc_flush_pageio", UINTTYPE); - - display_var("sdbc_centry_hit", UINTTYPE); - display_var("sdbc_centry_inuse", UINTTYPE); - display_var("sdbc_centry_lost", UINTTYPE); - display_var("sdbc_centry_deallocd", UINTTYPE); - - display_var("_sd_prefetch_opt", UINTTYPE); - - display_var("sdbc_ra_hash", UINTTYPE); - display_var("sdbc_ra_none", UINTTYPE); - - display_var("sdbc_static_cache", UINTTYPE); - display_var("sdbc_use_dmchain", UINTTYPE); - - /* in no particular order ... */ - display_var("sdbc_check_cot", UINTTYPE); - display_var("_sd_cctl_groupsz", UINTTYPE); - display_var("CBLOCKS", UINTTYPE); - display_var("_SD_SELF_HOST", UINTTYPE); - display_var("_SD_MIRROR_HOST", UINTTYPE); - display_var("sdbc_bio_count", UINTTYPE); - display_var("_sd_cblock_shift", UINTTYPE); - display_var("_sd_nodes_configured", UINTTYPE); - display_var("nv_alloc_factor", UINTTYPE); - display_var("_sd_ft_exit", UINTTYPE); - display_var("_sd_flush_exit", UINTTYPE); - display_var("_sd_node_recovery", UINTTYPE); - display_var("_sd_async_recovery", UINTTYPE); - display_var("_sdbc_ft_hold_io", UINTTYPE); - display_var("mirror_clean_shutdown", UINTTYPE); - display_var("_sd_ft_warm_start", UINTTYPE); - mdb_dec_indent(4); - mdb_printf("\n"); - - /* some addresses of various lists and tables */ - mdb_printf("Addresses:\n"); - mdb_inc_indent(4); - display_var("_sd_htable", ADDRTYPE); - display_var("_sdbc_gl_centry_info", ADDRTYPE); - display_var("_sdbc_gl_centry_info_nvmem", ADDRTYPE); - display_var("_sdbc_gl_centry_info_size", ADDRTYPE); /* size_t */ - display_var("_sdbc_gl_file_info", ADDRTYPE); - display_var("_sdbc_gl_file_info_size", ADDRTYPE); /* size_t */ - mdb_dec_indent(4); - mdb_printf("\n"); - - /* dynamic memory variables */ - mdb_printf("Dynamic Memory variables and stats:\n"); - mdb_inc_indent(4); - display_var("_sdbc_memtype_deconfigure_delayed", UINTTYPE); - - if (mdb_readvar(&sd_dealloc_flag_dm, "sd_dealloc_flag_dm") == -1) { - mdb_warn("failed to read sd_dealloc_flag_dm symbol"); - } else - mdb_printf("sd_dealloc_flag_dm %08x <%b>\n", - sd_dealloc_flag_dm, - sd_dealloc_flag_dm, dealloc_flag_vals); - - if (mdb_readvar(&dynmem_processing_dm, "dynmem_processing_dm") == -1) { - mdb_warn("failed to read dynmem_processing_dm structure"); - } else { - _dm_process_vars_t *dp; - - dp = &dynmem_processing_dm; - - mdb_printf( - "thread_dm_cv %h-x thread_dm_lock %?-p (owner)\n", - dp->thread_dm_cv._opaque, - dp->thread_dm_lock._opaque[0]); - - mdb_printf("sd_dealloc_flagx %x %8Tmax_dyn_list %3-d\n", - dp->sd_dealloc_flagx, - dp->max_dyn_list); - - mdb_printf("monitor_dynmem_process <%b>\n", - dp->monitor_dynmem_process, mdp_bits); - - mdb_printf( - "cache_aging_ct1 %3-d %8Tcache_aging_ct2 %3-d cache_aging_ct3 %3-d\n", - dp->cache_aging_ct1, - dp->cache_aging_ct2, - dp->cache_aging_ct3); - - mdb_printf( - "cache_aging_sec1 %3-d %8Tcache_aging_sec2 %3-d" - " cache_aging_sec3 %3-d\n", - dp->cache_aging_sec1, - dp->cache_aging_sec2, - dp->cache_aging_sec3); - - mdb_printf("cache_aging_pcnt1 %3-d %8Tcache_aging_pcnt2 %3-d\n", - dp->cache_aging_pcnt1, - dp->cache_aging_pcnt2); - - mdb_printf( - "max_holds_pcnt %3-d %8Talloc_ct %8-d dealloc_ct %8-d\n", - dp->max_holds_pcnt, - dp->alloc_ct, - dp->dealloc_ct); - - mdb_printf( - "history %4x %8Tnodatas %8-d notavail %8-d candidates %8-d\n", - dp->history, - dp->nodatas, - dp->notavail, - dp->candidates); - - mdb_printf( - "deallocs %8-d %8Thosts %8-d pests %8-d metas %8-d\n", - dp->deallocs, - dp->hosts, - dp->pests, - dp->metas); - - mdb_printf("holds %8-d %8Tothers %8-d\n", - dp->holds, - dp->others); - - mdb_printf("process_directive <%b>\n", - dp->process_directive, process_directive_bits); - - mdb_printf("read_hits %8-d %8Tread_misses %8-d\n", - dp->read_hits, - dp->read_misses); - - mdb_printf( - "write_thru %8-d %8Twrite_hits %8-d write_misses %8-d\n", - dp->write_hits, - dp->write_misses, - dp->write_thru); - - mdb_printf("prefetch_hits %8-d prefetch_misses %8-d\n", - dp->prefetch_hits, - dp->prefetch_misses); - } - mdb_dec_indent(4); - mdb_printf("\n"); - - /* some locks and condition variables */ - mdb_printf("Locks:\n"); - mdb_inc_indent(4); - display_var("mutex_and_condvar_flag", UINTTYPE); - display_var("_sd_cache_lock", LOCKTYPE); - display_var("_sd_block_lk", LOCKTYPE); - display_var("_sdbc_config_lock", LOCKTYPE); - display_var("_sdbc_ft_hold_io_lk", LOCKTYPE); - display_var("_sd_flush_cv", CVTYPE); - display_var("_sdbc_ft_hold_io_cv", CVTYPE); - mdb_dec_indent(4); - mdb_printf("\n"); - - return (DCMD_OK); -} - -const mdb_bitmask_t nsc_buf_bits[] = { - {"HALLOCATED", NSC_HALLOCATED, NSC_HALLOCATED}, - {"HACTIVE", NSC_HACTIVE, NSC_HACTIVE}, - {"RDBUF", NSC_RDBUF, NSC_RDBUF}, - {"WRBUF", NSC_WRBUF, NSC_WRBUF}, - {"NOBLOCK", NSC_NOBLOCK, NSC_NOBLOCK}, - {"WRTHRU", NSC_WRTHRU, NSC_WRTHRU}, - {"NOCACHE", NSC_NOCACHE, NSC_NOCACHE}, - {"BCOPY", NSC_BCOPY, NSC_BCOPY}, - {"PAGEIO", NSC_PAGEIO, NSC_PAGEIO}, - {"PINNABLE", NSC_PINNABLE, NSC_PINNABLE}, - {"FORCED_WRTHRU", NSC_FORCED_WRTHRU, NSC_FORCED_WRTHRU}, - {"METADATA", NSC_METADATA, NSC_METADATA}, - {"MIXED", NSC_MIXED, NSC_MIXED}, - {NULL, 0, 0} -}; - - -/* - * HELP functions for cache ctl type dcmds - */ - -static void -cctl_help_common(char *name) -{ - mdb_inc_indent(4); - mdb_printf("-c cd displays cctls for cache descriptor 'cd'\n"); - mdb_dec_indent(4); - mdb_printf("inclusive filters:\n"); - mdb_inc_indent(4); - mdb_printf("-b blk displays cctls for cache block number 'blk'\n"); - mdb_printf("-d displays cctls with dirty bits\n"); - mdb_printf("-h displays cctls that are hashed\n"); - mdb_printf("-i displays cctls that are inuse\n"); - mdb_printf("-o displays cctls that have I/O in progress\n"); - mdb_printf("-p displays cctls that have pagio set\n"); - mdb_printf("-B displays cctls that are marked BAD\n"); - mdb_printf("-H displays cctls that are HOSTS\n"); - mdb_printf("-P displays cctls that are PARASITES\n"); - mdb_printf("-R displays cctls that are explicit (NSC_RDAHEAD) " - "Prefetch bufs\n"); - mdb_printf("-r displays cctls that are implicit Prefetch bufs\n"); - mdb_printf("-V displays cctls that have valid bits set\n"); - mdb_printf("-v verbose\n"); - mdb_dec_indent(4); - - mdb_printf("Default: %s displays all cctls in the list\n", name); - mdb_printf("\n"); - - mdb_printf("Example:\n"); - mdb_inc_indent(4); - - mdb_printf("%s -io -c 5 displays all cctls for cd 5 that are\n" - "in use or have I/O in progress\n", name); - mdb_dec_indent(4); -} - -#define CCTL_OPTIONSTRING "[-vdhiopBHPV][-c cd][-b blknum]" -void -cctl_help() -{ - mdb_printf("sdbc_cctl displays cache ctl structures\n"); - mdb_printf("Usage: [address]::sdbc_cctl " CCTL_OPTIONSTRING "\n"); - cctl_help_common("sdbc_cctl"); -} - -void -cchain_help() -{ - mdb_printf("sdbc_cchain displays cache ctl structures in a" - " (alloc) cc_chain\n"); - mdb_printf("Usage: address::sdbc_cchain " CCTL_OPTIONSTRING "\n"); - cctl_help_common("sdbc_cchain"); -} - -void -dchain_help() -{ - mdb_printf("sdbc_dchain displays cache ctl structures in a" - " dirty chain\n"); - mdb_printf("Usage: address::sdbc_dchain " CCTL_OPTIONSTRING "\n"); - cctl_help_common("sdbc_dchain"); -} - -void -dmchain_help() -{ - mdb_printf("sdbc_dmchain displays cache ctl structures in a" - " dynamic memory allocation chain\n"); - mdb_printf("order of display is:\n" - "the cctl represented by the given address,\n" - "the cc_head_dm cctl,\n" - "the chain starting at cc_next_dm of the head cctl\n"); - mdb_printf("Usage: address::sdbc_dmchain " CCTL_OPTIONSTRING "\n"); - cctl_help_common("sdbc_dmchain"); -} - -void -hashchain_help() -{ - mdb_printf("sdbc_hashchain displays cache ctl structures in a" - " hash chain\n"); - mdb_printf("Usage: address::sdbc_hashchain " CCTL_OPTIONSTRING "\n"); - cctl_help_common("sdbc_hashchain"); -} - -void -hashtable_help() -{ - mdb_printf("sdbc_hashtable displays the hash table and its chains\n"); - mdb_printf("Usage: address::sdbc_hashtable " CCTL_OPTIONSTRING "\n"); - cctl_help_common("sdbc_hashtable"); -} - - -void -lru_help() -{ - mdb_printf("sdbc_lru displays cache ctl structures in the LRU queue\n"); - mdb_printf("Usage: [address]::sdbc_lru " CCTL_OPTIONSTRING "\n"); - cctl_help_common("sdbc_lru"); -} - -/* - * help functions for write ctl dcmds - */ -void -wctl_help_common(char *name) -{ - mdb_inc_indent(4); - mdb_printf("-v verbose\n"); - mdb_printf("-c cd show ctl structs for cache descriptor 'cd'\n"); - mdb_printf("-d show ctl structs that have dirty bits set\n"); - mdb_dec_indent(4); - mdb_printf("Default: %s displays all write ctl in the list\n", name); -} - -void -wctl_help() -{ - mdb_printf( - "sdbc_wctl displays the allocated array of write ctl structures\n"); - mdb_printf("Usage: [address]::sdbc_wctl [-vd][-c cd]\n"); - wctl_help_common("sdbc_wctl"); -} - -void -wrq_help() -{ - mdb_printf("sdbc_wrq displays the write ctl queue (wctl free list)\n"); - mdb_printf("Usage: [address]::sdbc_wrq [-vd][-c cd]\n"); - wctl_help_common("sdbc_wrq"); -} - -/* help function for the sdbc_cdinfo dcmd */ -void -cdinfo_help() -{ - mdb_printf( - "sdbc_cdinfo displays cd information from the _sd_cache_files table\n"); - mdb_printf("Usage: [address]::sdbc_cdfinfo [-av][-c cd]\n"); - mdb_inc_indent(4); - mdb_printf("-a displays info for all cd_info structures\n"); - mdb_printf("-c cd displays info for cache descriptor 'cd'\n"); - mdb_printf("-v verbose\n"); - mdb_dec_indent(4); - mdb_printf("Default: display info for cd's that are allocated\n"); -} - -void -ftctl_help() -{ - mdb_printf( - "sdbc_ftctl displays the array of fault tolerant structures \n"); - mdb_printf("Usage: [address]::sdbc_ftctl [-vd][-c cd]\n"); - wctl_help_common("sdbc_ftctl"); -} - -/* - * help function for the sdbc_handles dcmd - */ -void -handle_help() -{ - mdb_printf("sdbc_handles displays active or allocated" - " cache buffer handles\n"); - mdb_printf("Usage: [address]::sdbc_handles [-avC][-c cd]\n"); - mdb_inc_indent(4); - mdb_printf("-a displays all handles\n"); - mdb_printf("-c n displays handle for cd n\n"); - mdb_printf("-v displays detailed handle data\n"); - mdb_printf("-C displays the handle cc_chain\n"); - mdb_dec_indent(4); - mdb_printf("Default: display only allocated or active handles\n"); -} - -/* - * help functions for the "global" memory dcmds - */ -void -glcinfo_help() -{ - mdb_printf("sdbc_glcinfo displays the global cache entry info\n"); - mdb_printf("Usage: [address]::sdbc_glcinfo [-adC][-c cd][-b fbapos]\n"); - mdb_inc_indent(4); - mdb_printf("-a displays all global info structs\n"); - mdb_printf("-b fbapos displays structs that match FBA block" - "(not cache block) 'fbapos'\n"); - mdb_printf("-c cd displays structs that match cache descriptor 'cd'\n"); - mdb_printf("-d displays structs with dirty bits set\n"); - mdb_printf("-C does consistency check against nvram copy\n"); - mdb_dec_indent(4); - mdb_printf("Default: display entries with a valid cd\n"); -} - -void -glfinfo_help() -{ - mdb_printf("sdbc_glfinfo displays the global file info\n"); - mdb_printf("Usage: [address]::sdbc_glfinfo [-aptC]\n"); - mdb_inc_indent(4); - mdb_printf("-a displays all global info structs\n"); - mdb_printf("-p displays structs for pinned volumes\n"); - mdb_printf("-t displays structs for attached volumes\n"); - mdb_printf("-C does consistency check against nvram copy\n"); - mdb_dec_indent(4); - mdb_printf("Default: display entries with non-null filename\n"); -} - - -/* - * WALKERS - */ - -/* - * walker for the cctl list using the cc_link_list_dm pointers - */ -static int -sdbc_cctl_winit(mdb_walk_state_t *wsp) -{ - _sd_cctl_t *_sd_cctl[_SD_CCTL_GROUPS]; /* for getting first entry */ - struct walk_info *winfo; - - winfo = mdb_zalloc(sizeof (struct walk_info), UM_SLEEP); - - if (wsp->walk_addr == NULL) { - /* - * we get the "first" cctl from memory and then traverse - * the cc_link_list_dm pointers. - * this traversal could start from any cctl. here we start with - * the first cctl in the _sd_cctl[] array. - */ - if (mdb_readvar(_sd_cctl, "_sd_cctl") == -1) { - mdb_warn("failed to read _sd_cctl array"); - return (DCMD_ERR); - } - - wsp->walk_addr = (uintptr_t)_sd_cctl[0]; - } - - winfo->w_start = 0; - winfo->w_end = wsp->walk_addr; - wsp->walk_data = winfo; - - return (WALK_NEXT); -} - -static int -sdbc_cctl_wstep(mdb_walk_state_t *wsp) -{ - struct walk_info *winfo = wsp->walk_data; - _sd_cctl_t centry; - int status; - - if (wsp->walk_addr == NULL) /* should not happen */ - return (WALK_DONE); - - /* - * w_start is 0 on the first iteration so the test - * will fail, allowing the first centry to be processed - */ - if (wsp->walk_addr == winfo->w_start) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - if (mdb_vread(¢ry, sizeof (_sd_cctl_t), wsp->walk_addr) == -1) { - mdb_warn("failed to read centry at %p", wsp->walk_addr); - return (WALK_ERR); - } - wsp->walk_addr = (uintptr_t)(centry.cc_link_list_dm); - /* set termination condition. only needs to be done once */ - winfo->w_start = winfo->w_end; - - return (status); -} - -static void -sdbc_cctl_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (struct walk_info)); -} - -/* - * walk the cc_chain list of a _sd_cctl_t - * no global walks -- must be called with an address - */ -static int -sdbc_cchain_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL) - return (WALK_ERR); - - wsp->walk_data = mdb_zalloc(sizeof (_sd_cctl_t), UM_SLEEP); - - return (WALK_NEXT); -} - -static int -sdbc_cchain_wstep(mdb_walk_state_t *wsp) -{ - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (mdb_vread(wsp->walk_data, sizeof (_sd_cctl_t), wsp->walk_addr) - == -1) { - mdb_warn("sdbc_cchain_wstep failed to read centry at %p", - wsp->walk_addr); - return (WALK_ERR); - } - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - wsp->walk_addr = (uintptr_t)(((_sd_cctl_t *) - (wsp->walk_data))->cc_chain); - return (status); -} - -static void -sdbc_cchain_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (_sd_cctl_t)); -} - - -/* - * walk the dirty chain list of a _sd_cctl_t - * no global walks -- must be called with an address - */ -static int -sdbc_dchain_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL) - return (WALK_ERR); - - wsp->walk_data = mdb_zalloc(sizeof (_sd_cctl_t), UM_SLEEP); - - /* walk data stores the first and subsequent cc_dirty_link */ - if (mdb_vread(wsp->walk_data, sizeof (_sd_cctl_t), wsp->walk_addr) - == -1) { - mdb_warn("sdbc_dchain_winit failed to read centry at %p", - wsp->walk_addr); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - -static int -sdbc_dchain_wstep(mdb_walk_state_t *wsp) -{ - _sd_cctl_t centry; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - - if (mdb_vread(¢ry, sizeof (_sd_cctl_t), wsp->walk_addr) - == -1) { - mdb_warn("sdbc_dchain_wstep failed to read centry at %p", - wsp->walk_addr); - return (WALK_ERR); - } - - wsp->walk_addr = - (uintptr_t)(centry.cc_dirty_next); - - /* end of dirty_next chain? start on subsequent dirty_link */ - if (wsp->walk_addr == NULL) { - wsp->walk_addr = - (uintptr_t)(((_sd_cctl_t *)(wsp->walk_data))->cc_dirty_link); - - /* update dirty link */ - /* walk data stores the first and subsequent cc_dirty_link */ - if (wsp->walk_addr) { - if (mdb_vread(wsp->walk_data, sizeof (_sd_cctl_t), - wsp->walk_addr) == -1) { - - mdb_warn( - "sdbc_dchain_wstep failed to read centry at %p", - wsp->walk_addr); - - return (WALK_ERR); - } - } - } - - return (status); -} - -static void -sdbc_dchain_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (_sd_cctl_t)); -} - -/* for stepping thru the dynmem chain */ -#define GET_HEAD_DM 0x1 -#define GET_NEXT_DM 0x2 - -/* - * walk the dm chain of a cctl - * start with current address, then cc_head_dm, then the cc_next_dm chain - */ -static int -sdbc_dmchain_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL) - return (WALK_ERR); - - wsp->walk_data = (void *)GET_HEAD_DM; - - return (WALK_NEXT); -} - -static int -sdbc_dmchain_wstep(mdb_walk_state_t *wsp) -{ - _sd_cctl_t centry; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (mdb_vread(¢ry, sizeof (_sd_cctl_t), wsp->walk_addr) - == -1) { - mdb_warn("sdbc_dmchain_wstep failed to read centry at %p", - wsp->walk_addr); - return (WALK_ERR); - } - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - if (wsp->walk_data == (void *)GET_HEAD_DM) { - wsp->walk_addr = (uintptr_t)centry.cc_head_dm; - wsp->walk_data = (void *)GET_NEXT_DM; - } else - wsp->walk_addr = (uintptr_t)centry.cc_next_dm; - - return (status); -} - -/*ARGSUSED*/ -static void -sdbc_dmchain_wfini(mdb_walk_state_t *wsp) -{ -} - -/* - * walk a hash chain - * requires an address - */ -/*ARGSUSED*/ -static int -sdbc_hashchain_winit(mdb_walk_state_t *wsp) -{ - - if (wsp->walk_addr == NULL) - return (WALK_ERR); - - - return (WALK_NEXT); -} - -static int -sdbc_hashchain_wstep(mdb_walk_state_t *wsp) -{ - int status; - _sd_hash_hd_t hash_entry; - - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - if (mdb_vread(&hash_entry, sizeof (_sd_hash_hd_t), - wsp->walk_addr) == -1) { - mdb_warn( - "sdbc_hashchain_wstep failed to read hash_entry at %p", - wsp->walk_addr); - return (WALK_ERR); /* will upper layer continue ? */ - } - - wsp->walk_addr = (uintptr_t)hash_entry.hh_next; - - return (status); -} - -/*ARGSUSED*/ -static void -sdbc_hashchain_wfini(mdb_walk_state_t *wsp) -{ -} - -/* - * walk the sdbc lru list - */ -static int -sdbc_lru_winit(mdb_walk_state_t *wsp) -{ - struct walk_info *winfo; - GElf_Sym sym; - - winfo = mdb_zalloc(sizeof (struct walk_info), UM_SLEEP); - - /* if called without an address, start at the head of the queue */ - if (wsp->walk_addr == NULL) { - - if (mdb_lookup_by_obj("sdbc", "_sd_lru_q", &sym) == -1) { - mdb_warn("failed to lookup _sd_lru_q symbol"); - return (WALK_ERR); - } - - /* &(_sd_lru_q.sq_qhead) */ - wsp->walk_addr = (uintptr_t)(sym.st_value); - } - - winfo->w_start = 0; - winfo->w_end = wsp->walk_addr; - wsp->walk_data = winfo; - - return (WALK_NEXT); -} - -static int -sdbc_lru_wstep(mdb_walk_state_t *wsp) -{ - struct walk_info *winfo = wsp->walk_data; - _sd_cctl_t centry; - int status; - - if (wsp->walk_addr == NULL) /* should not happen */ - return (WALK_DONE); - - /* - * w_start is 0 on the first iteration so the test - * will fail, allowing the first centry to be processed - */ - if (wsp->walk_addr == winfo->w_start) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - if (mdb_vread(¢ry, sizeof (_sd_cctl_t), wsp->walk_addr) == -1) { - mdb_warn("failed to read centry at %p", wsp->walk_addr); - return (WALK_ERR); - } - wsp->walk_addr = (uintptr_t)(centry.cc_next); - - /* set termination condition. only needs to be done once */ - winfo->w_start = winfo->w_end; - - return (status); -} - -static void -sdbc_lru_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (struct walk_info)); -} - - -#ifdef SAFESTORE -/* - * walk the array of allocated write control structures - */ - -static int -sdbc_wctl_winit(mdb_walk_state_t *wsp) -{ - _sd_net_t _sd_net_config; - _sd_writeq_t wrq; - struct walk_info *winfo; - int blk_shft; - int count; - - - winfo = mdb_zalloc(sizeof (struct walk_info), UM_SLEEP); - - /* need to calculate the end of the array */ - if (mdb_readvar(&_sd_net_config, "_sd_net_config") == -1) { - mdb_warn("failed to read _sd_net_config structure"); - return (WALK_ERR); - } - - if (wsp->walk_addr == NULL) - wsp->walk_addr = (uintptr_t)(_sd_net_config.sn_wr_cctl); - - /* - * this module assumes 8k block size so this code can - * be commented out if necessary. - */ - if (mdb_readvar(&blk_shft, "_sd_cblock_shift") == -1) { - mdb_warn("failed to read _sd_cblock_shift." - "assuming 8k cache block size"); - blk_shft = 13; - } - - count = (_sd_net_config.sn_wpages * _sd_net_config.sn_psize) / - (1 << blk_shft); - - winfo->w_end = (uintptr_t)(_sd_net_config.sn_wr_cctl + count); - wsp->walk_data = winfo; - - return (WALK_NEXT); -} - -static int -sdbc_wctl_wstep(mdb_walk_state_t *wsp) -{ - struct walk_info *winfo = wsp->walk_data; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (wsp->walk_addr >= winfo->w_end) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - wsp->walk_addr += sizeof (_sd_wr_cctl_t); - - return (status); - -} - -static void -sdbc_wctl_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (struct walk_info)); -} - -/* - * walk the queue (free list) of write control structures - */ - -static int -sdbc_wrq_winit(mdb_walk_state_t *wsp) -{ - _sd_net_t _sd_net_config; - _sd_writeq_t wrq; - - /* if called without an address, start at the head of the queue */ - if (wsp->walk_addr == NULL) { - - if (mdb_readvar(&_sd_net_config, "_sd_net_config") == -1) { - mdb_warn("failed to read _sd_net_config structure"); - return (WALK_ERR); - } - - wsp->walk_addr = (uintptr_t) - (_sd_net_config.sn_wr_queue.wq_qtop); - } - - return (WALK_NEXT); -} - -static int -sdbc_wrq_wstep(mdb_walk_state_t *wsp) -{ - _sd_wr_cctl_t wctl; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - if (mdb_vread(&wctl, sizeof (_sd_wr_cctl_t), wsp->walk_addr) - == -1) { - mdb_warn("sdbc_cchain_wstep failed to read wctl at %p", - wsp->walk_addr); - return (WALK_ERR); - } - - /* special case -- mini-DSP fake wr_cctl */ - if (wsp->walk_addr == (uintptr_t)wctl.wc_next) - return (WALK_DONE); - - wsp->walk_addr = (uintptr_t)(wctl.wc_next); - - return (WALK_NEXT); -} - -static void -sdbc_wrq_wfini(mdb_walk_state_t *wsp) -{ -} -#endif /* SAFESTORE */ -/* - * walk the _sd_cache_files array of cd_info structures - */ -static int -sdbc_cdinfo_winit(mdb_walk_state_t *wsp) -{ - struct walk_info *winfo; - _sd_cd_info_t *_sd_cache_files_addr; - int maxdevs; - - winfo = mdb_zalloc(sizeof (struct walk_info), UM_SLEEP); - - - /* get the address of the cdinfo table */ - if (mdb_readvar(&_sd_cache_files_addr, "_sd_cache_files") == -1) { - mdb_warn("failed to read _sd_cache_files address\n"); - return (WALK_ERR); - } - - /* if called without an address, start at the head of the queue */ - if (wsp->walk_addr == NULL) { - /* address of first _sd_cd_info_t */ - wsp->walk_addr = (uintptr_t)(_sd_cache_files_addr); - } - - /* get the number of volumes */ - if (mdb_readvar(&maxdevs, "sdbc_max_devs") == -1) { - mdb_warn("failed to read sdbc_max_devs"); - return (WALK_ERR); - } - - winfo->w_end = (uintptr_t)(_sd_cache_files_addr + maxdevs); - wsp->walk_data = winfo; - - return (WALK_NEXT); -} - -static int -sdbc_cdinfo_wstep(mdb_walk_state_t *wsp) -{ - struct walk_info *winfo = wsp->walk_data; - int status; - - if (wsp->walk_addr >= winfo->w_end) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - wsp->walk_addr += sizeof (_sd_cd_info_t); - - return (status); -} - -static void -sdbc_cdinfo_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (struct walk_info)); -} - -#ifdef SAFESTORE -/* - * walk the array of allocated fault tolerant control structures - */ -static int -sdbc_ftctl_winit(mdb_walk_state_t *wsp) -{ - _sd_net_t _sd_net_config; - struct walk_info *winfo; - int blk_shft = 13; /* 8k default */ - int count; - - - winfo = mdb_zalloc(sizeof (struct walk_info), UM_SLEEP); - - /* need to calculate the end of the array */ - if (mdb_readvar(&_sd_net_config, "_sd_net_config") == -1) { - mdb_warn("failed to read _sd_net_config structure"); - return (WALK_ERR); - } - - if (wsp->walk_addr == NULL) - wsp->walk_addr = (uintptr_t)(_sd_net_config.sn_ft_cctl); - - /* - * this module assumes 8k block size so this code can - * be commented out if necessary. - */ - if (mdb_readvar(&blk_shft, "_sd_cblock_shift") == -1) { - mdb_warn("failed to read _sd_cblock_shift." - "assuming 8k cache block size"); - blk_shft = 13; - } - - count = (_sd_net_config.sn_wpages * _sd_net_config.sn_psize) / - (1 << blk_shft); - - winfo->w_end = (uintptr_t)(_sd_net_config.sn_ft_cctl + count); - wsp->walk_data = winfo; - - return (WALK_NEXT); -} - -static int -sdbc_ftctl_wstep(mdb_walk_state_t *wsp) -{ - struct walk_info *winfo = wsp->walk_data; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (wsp->walk_addr >= winfo->w_end) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - wsp->walk_addr += sizeof (_sd_ft_cctl_t); - - return (status); -} - -static void -sdbc_ftctl_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (struct walk_info)); -} -#endif /* SAFESTORE */ - -/* - * walk the handle list - */ -static int -sdbc_handle_winit(mdb_walk_state_t *wsp) -{ - _sd_buf_hlist_t hl; - struct walk_info *winfo; - GElf_Sym sym; - - if (mdb_readvar(&hl, "_sd_handle_list") == -1) { - mdb_warn("failed to read _sd_handle_list structure"); - return (WALK_ERR); - } - - if (mdb_lookup_by_obj("sdbc", "_sd_handle_list", &sym) == -1) { - mdb_warn("failed to lookup _sd_handle_list symbol"); - return (WALK_ERR); - } - - /* if called without an address, start at first element in list */ - if (wsp->walk_addr == NULL) - wsp->walk_addr = (uintptr_t)(hl.hl_top.bh_next); - - winfo = mdb_zalloc(sizeof (struct walk_info), UM_SLEEP); - - winfo->w_end = (uintptr_t)(sym.st_value); /* &_sd_handle_list.hl_top */ - wsp->walk_data = winfo; - - return (WALK_NEXT); -} - -static int -sdbc_handle_wstep(mdb_walk_state_t *wsp) -{ - struct walk_info *winfo = wsp->walk_data; - _sd_buf_handle_t handle; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (wsp->walk_addr == winfo->w_end) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - if (mdb_vread(&handle, sizeof (_sd_buf_handle_t), wsp->walk_addr) - == -1) { - mdb_warn("failed to read handle at %p", wsp->walk_addr); - return (WALK_ERR); - } - - wsp->walk_addr = (uintptr_t)(handle.bh_next); - - return (status); -} - -static void -sdbc_handle_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (struct walk_info)); -} - -/* - * walk the global info array (dirty bits) - */ - -static int -sdbc_glcinfo_winit(mdb_walk_state_t *wsp) -{ - ss_centry_info_t *gl_centry_info; - size_t gl_centry_info_size; - struct walk_info *winfo; - - - winfo = mdb_zalloc(sizeof (struct walk_info), UM_SLEEP); - - /* get start of the cache entry metadata */ - if (mdb_readvar(&gl_centry_info, "_sdbc_gl_centry_info") == -1) { - mdb_warn("failed to read _sdbc_gl_centry_info"); - return (WALK_ERR); - } - - /* need to calculate the end of the array */ - if (mdb_readvar(&gl_centry_info_size, - "_sdbc_gl_centry_info_size") == -1) { - mdb_warn("failed to read _sdbc_gl_centry_info_size"); - return (WALK_ERR); - } - - if (wsp->walk_addr == NULL) - wsp->walk_addr = (uintptr_t)(gl_centry_info); - - - - winfo->w_end = ((uintptr_t)(gl_centry_info)) + gl_centry_info_size; - wsp->walk_data = winfo; - - return (WALK_NEXT); -} - -static int -sdbc_glcinfo_wstep(mdb_walk_state_t *wsp) -{ - struct walk_info *winfo = wsp->walk_data; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (wsp->walk_addr >= winfo->w_end) - return (WALK_DONE); - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - wsp->walk_addr += sizeof (ss_centry_info_t); - - return (status); -} - -static void -sdbc_glcinfo_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (struct walk_info)); -} - -/* - * walk the global file info array - */ -static int -sdbc_glfinfo_winit(mdb_walk_state_t *wsp) -{ - ss_voldata_t *gl_file_info; - struct walk_info *winfo; - int maxdevs; - - - winfo = mdb_zalloc(sizeof (struct walk_info), UM_SLEEP); - - /* get start of the cache entry metadata */ - if (mdb_readvar(&gl_file_info, "_sdbc_gl_file_info") == -1) { - mdb_warn("failed to read _sdbc_gl_file_info"); - return (WALK_ERR); - } - - - if (wsp->walk_addr == NULL) - wsp->walk_addr = (uintptr_t)(gl_file_info); - - /* get the number of volumes */ - if (mdb_readvar(&maxdevs, "sdbc_max_devs") == -1) { - mdb_warn("failed to read sdbc_max_devs"); - return (WALK_ERR); - } - - /* end of the array */ - winfo->w_end = (uintptr_t)((gl_file_info) + maxdevs); - - wsp->walk_data = winfo; - - return (WALK_NEXT); -} - -static int -sdbc_glfinfo_wstep(mdb_walk_state_t *wsp) -{ - struct walk_info *winfo = wsp->walk_data; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (wsp->walk_addr >= winfo->w_end) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - wsp->walk_addr += sizeof (ss_voldata_t); - - return (status); - -} - -static void -sdbc_glfinfo_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (struct walk_info)); -} - -/* end of WALKERS section */ - - -const mdb_bitmask_t cc_flag_bits[] = { - {"PEND_DIRTY", CC_PEND_DIRTY, CC_PEND_DIRTY}, - {"PINNED", CC_PINNED, CC_PINNED}, - {"PINNABLE", CC_PINNABLE, CC_PINNABLE}, - {"QHEAD", CC_QHEAD, CC_QHEAD}, - {NULL, 0, 0} -}; - -const mdb_bitmask_t io_status_bits[] = { - {"IO_NONE", 0xff, _SD_IO_NONE}, - {"IO_INITIATE", 0xff, _SD_IO_INITIATE}, - {"IO_DONE", 0xff, _SD_IO_DONE}, - {"IO_FAILED", 0xff, _SD_IO_FAILED}, - {"IO_DISCARDED", 0xff, _SD_IO_DISCARDED}, - {NULL, 0, 0} -}; - -const mdb_bitmask_t cc_aging_bits[] = { - {"FOUND_IN_HASH", FOUND_IN_HASH_DM, FOUND_IN_HASH_DM}, - {"FOUND_HOLD_OVER", FOUND_HOLD_OVER_DM, FOUND_HOLD_OVER_DM}, - {"HOST_ENTRY", HOST_ENTRY_DM, HOST_ENTRY_DM}, - {"PARASITIC_ENTRY", PARASITIC_ENTRY_DM, PARASITIC_ENTRY_DM}, - {"STICKY_METADATA", STICKY_METADATA_DM, STICKY_METADATA_DM}, - {"ELIGIBLE_ENTRY", ELIGIBLE_ENTRY_DM, ELIGIBLE_ENTRY_DM}, - {"HASH_ENTRY", HASH_ENTRY_DM, HASH_ENTRY_DM}, - {"HOLD_ENTRY", HOLD_ENTRY_DM, HOLD_ENTRY_DM}, - {"AVAIL_ENTRY", AVAIL_ENTRY_DM, AVAIL_ENTRY_DM}, - {"BAD_CHAIN", BAD_CHAIN_DM, BAD_CHAIN_DM}, - {"BAD_ENTRY", BAD_ENTRY_DM, BAD_ENTRY_DM}, - {"PREFETCH_I", PREFETCH_BUF_I, PREFETCH_BUF_I}, - {"PREFETCH_E", PREFETCH_BUF_E, PREFETCH_BUF_E}, - {NULL, 0, 0} -}; - - -/* DCMDS that use walkers */ - -/* - * dcmd to display cache entry control structures - */ -static int -sdbc_cctl(uintptr_t addr, uint_t flags, int argc, - const mdb_arg_t *argv) -{ - uint_t opt_a = FALSE; - uintptr_t opt_c = MDB_CD; /* cd */ - uintptr_t opt_b = MDB_BLKNUM; /* block num */ - uint_t opt_B = FALSE; /* BAD CHAIN or ENTRY */ - uint_t opt_d = FALSE; /* dirty */ - uint_t opt_H = FALSE; /* HOST */ - uint_t opt_h = FALSE; /* hashed */ - uint_t opt_i = FALSE; /* inuse */ - uint_t opt_p = FALSE; /* pageio */ - uint_t opt_P = FALSE; /* PARASITE */ - uint_t opt_R = FALSE; /* explicit read-ahead (prefetch) */ - uint_t opt_r = FALSE; /* implicit read-ahead (prefetch) */ - uint_t opt_o = FALSE; /* io in progress */ - uint_t opt_m = FALSE; /* has memory allocated */ - uint_t opt_V = FALSE; /* valid bits */ - uint_t opt_v = FALSE; /* verbose */ - uint_t nofilter = FALSE; /* true if b, d, h, i, o, p, V are all false */ - _sd_cctl_t centry; - _sd_cctl_sync_t cc_sync; - - /* - * possible enhancements -- option to filter on flag bits - * option that toggles other options. - */ - if (mdb_getopts(argc, argv, - 'a', MDB_OPT_SETBITS, TRUE, &opt_a, - 'B', MDB_OPT_SETBITS, TRUE, &opt_B, - 'b', MDB_OPT_UINTPTR, &opt_b, - 'c', MDB_OPT_UINTPTR, &opt_c, - 'd', MDB_OPT_SETBITS, TRUE, &opt_d, - 'H', MDB_OPT_SETBITS, TRUE, &opt_H, - 'h', MDB_OPT_SETBITS, TRUE, &opt_h, - 'i', MDB_OPT_SETBITS, TRUE, &opt_i, - 'o', MDB_OPT_SETBITS, TRUE, &opt_o, - 'm', MDB_OPT_SETBITS, TRUE, &opt_m, - 'P', MDB_OPT_SETBITS, TRUE, &opt_P, - 'p', MDB_OPT_SETBITS, TRUE, &opt_p, - 'R', MDB_OPT_SETBITS, TRUE, &opt_R, - 'r', MDB_OPT_SETBITS, TRUE, &opt_r, - 'V', MDB_OPT_SETBITS, TRUE, &opt_V, - 'v', MDB_OPT_SETBITS, TRUE, &opt_v) != argc) - return (DCMD_USAGE); - - - nofilter = (!OPT_B_SELECTED && !opt_d && !opt_h && !opt_i && - !opt_o && !opt_m && !opt_p && !opt_V && !opt_B && - !opt_P && !opt_H && !opt_R && !opt_r); /* no options */ - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_walk_dcmd("sdbc`sdbc_cctl", "sdbc`sdbc_cctl", - argc, argv) == -1) { - mdb_warn("failed to walk 'cctl' list"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("sdbc cache ctl structures:\n"); - } - - - if (mdb_vread(¢ry, sizeof (_sd_cctl_t), addr) == -1) { - mdb_warn("dcmd failed to read centry at %p", addr); - return (DCMD_ERR); - } - - /* filter exclusively on a cd number if specified */ - if (OPT_C_SELECTED && (centry.cc_head.hh_cd != opt_c)) - return (DCMD_OK); - - /* all other filters are inclusive */ - if ((nofilter) || - (OPT_B_SELECTED && (centry.cc_head.hh_blk_num == opt_b)) || - (opt_B && (centry.cc_aging_dm & - (BAD_ENTRY_DM | BAD_CHAIN_DM))) || - (opt_d && (centry.cc_dirty)) || - (opt_H && (centry.cc_aging_dm & HOST_ENTRY_DM)) || - (opt_h && (centry.cc_head.hh_hashed)) || - (opt_i && (centry.cc_inuse)) || - (opt_p && (centry.cc_pageio)) || - (opt_P && (centry.cc_aging_dm & PARASITIC_ENTRY_DM)) || - (opt_R && (centry.cc_aging_dm & PREFETCH_BUF_E)) || - (opt_r && (centry.cc_aging_dm & PREFETCH_BUF_I)) || - (opt_V && (centry.cc_valid)) || - (opt_m && (centry.cc_alloc_size_dm)) || - (opt_o && (centry.cc_iostatus != _SD_IO_NONE))) - /*EMPTY*/; - else - return (DCMD_OK); - - mdb_inc_indent(4); - mdb_printf( - "%-?p cd %3-d blk_num %10-d valid %04hx dirty %04hx flag %02x\n", - addr, centry.cc_head.hh_cd, - centry.cc_head.hh_blk_num, centry.cc_valid, - centry.cc_dirty, centry.cc_flag); - mdb_dec_indent(4); - - if (!opt_v) - return (DCMD_OK); - - /* verbose */ - mdb_inc_indent(4); - mdb_printf( - "hashed %d seq %4-d toflush %04hx %8Tawait_use %4-d await_page %4-d\n", - centry.cc_head.hh_hashed, centry.cc_seq, - centry.cc_toflush, centry.cc_await_use, - centry.cc_await_page); - - mdb_printf("inuse %d pageio %d cc_flag <%b>\n", - centry.cc_inuse, centry.cc_pageio, - centry.cc_flag, cc_flag_bits); - - mdb_printf("iocount %2d iostatus <%b>\n", - centry.cc_iocount, centry.cc_iostatus, io_status_bits); - - if (mdb_vread(&cc_sync, sizeof (struct _sd_cctl_sync), - (uintptr_t)centry.cc_sync) - == -1) - mdb_warn("failed to read cc_sync"); /* not catastophic */ - - else - mdb_printf("cc_sync blkcv: %h-x %8Tlock: 0x%p (owner)\n", - cc_sync._cc_blkcv._opaque, - cc_sync._cc_lock._opaque[0]); - - mdb_printf("dynamic memory allocation:\n"); - mdb_inc_indent(4); - mdb_printf("aging_dm age %3d %4Tage flags: <%b> 0x%x\n", - centry.cc_aging_dm & 0xff, - centry.cc_aging_dm, cc_aging_bits, centry.cc_aging_dm); - - mdb_printf("alloc_size_dm %10-d head_dm %?-p\n", - centry.cc_alloc_size_dm, centry.cc_head_dm); - mdb_printf("next_dm %?-p link_list_dm %?-p\n", - centry.cc_next_dm, centry.cc_link_list_dm); - - mdb_printf("alloc_ct_dm %10-d dealloc_ct_dm %10-d\n", - centry.cc_alloc_ct_dm, centry.cc_dealloc_ct_dm); - - mdb_dec_indent(4); - /* pointers */ - mdb_printf("cctl pointers:\n"); - mdb_inc_indent(4); - - mdb_printf("next %?-p prev %?-p chain %?-p\n", - centry.cc_next, centry.cc_prev, centry.cc_chain); - mdb_printf("dirty_next %?-p dirty_link %?-p\n", - centry.cc_dirty_next, centry.cc_dirty_link); - mdb_printf("data %?-p write ctl %?-p\n", - centry.cc_data, centry.cc_write); - - mdb_dec_indent(4); - - /* dynmem chain */ - mdb_printf("cctl dmqueue index cc_blocks %4-d\n", centry.cc_cblocks); - - mdb_printf("anon_addr %?-p anon_len %8-d\n", - centry.cc_anon_addr.sa_virt, centry.cc_anon_len); - - /* stats */ - mdb_printf("cctl stats: "); - mdb_inc_indent(4); - mdb_printf("hits %8-d creat time %?-p\n", centry.cc_hits, - centry.cc_creat); - mdb_dec_indent(4); - - mdb_printf("\n"); - - mdb_dec_indent(4); - - return (DCMD_OK); -} - - -/* - * convenience dcmd to display the _sd_cctl cc_chain list (alloc list) - * Must be called with an address of a cache entry (_sd_cctl_t) - * same options as sdbc_cctl(). - * alternatively the user can call the sdbc_cchain walker - * and pipe the addresses to sdbc_cctl dcmd. - */ -static int -sdbc_cchain(uintptr_t addr, uint_t flags, int argc, - const mdb_arg_t *argv) -{ - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (mdb_pwalk_dcmd("sdbc`sdbc_cchain", "sdbc`sdbc_cctl", - argc, argv, addr) - == -1) { - mdb_warn("failed to walk cc_chain at addr %p", addr); - return (DCMD_ERR); - } - - return (DCMD_OK); -} - - -/* - * convenience dcmd to cdisplay the _sd_cctl dirty chain - * (which is really a 2d chain). - * Must be called with an address of a cache entry (_sd_cctl_t) - * same options as sdbc_cctl(). - * alternatively the user can call the sdbc_dchain walker - * and pipe the addresses to sdbc_cctl dcmd. - */ -static int -sdbc_dchain(uintptr_t addr, uint_t flags, int argc, - const mdb_arg_t *argv) -{ - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (mdb_pwalk_dcmd("sdbc`sdbc_dchain", "sdbc`sdbc_cctl", - argc, argv, addr) - == -1) { - mdb_warn("failed to walk dirty chain at addr %p", addr); - return (DCMD_ERR); - } - - return (DCMD_OK); -} - -/* - * convenience dcmd to display the _sd_cctl dm chain list - * Must be called with an address of a cache entry (_sd_cctl_t) - * same options as sdbc_cctl(). - * alternatively the user can call the sdbc_dmchain walker - * and pipe the addresses to sdbc_cctl dcmd. - */ -static int -sdbc_dmchain(uintptr_t addr, uint_t flags, int argc, - const mdb_arg_t *argv) -{ - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (mdb_pwalk_dcmd("sdbc`sdbc_dmchain", "sdbc`sdbc_cctl", - argc, argv, addr) - == -1) { - mdb_warn("failed to walk dm chain at addr %p", addr); - return (DCMD_ERR); - } - - return (DCMD_OK); -} - -/* - * dcmd to walk a hash chain - * requires an address. same options as sdbc_cctl dcmd - */ -static int -sdbc_hashchain(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (mdb_pwalk_dcmd("sdbc`sdbc_hashchain", "sdbc`sdbc_cctl", - argc, argv, addr) == -1) { - mdb_warn("failed to walk hashchain at %p", addr); - return (DCMD_ERR); - } - - return (DCMD_OK); -} - - -static void -display_hash_table(_sd_hash_table_t *addr, _sd_hash_table_t *ht) -{ - mdb_printf("hash table (%p):\n", addr); - mdb_inc_indent(4); - mdb_printf("size %7-d bits %2-d mask %8-x nmask %8-x buckets %p\n", - ht->ht_size, ht->ht_bits, ht->ht_mask, - ht->ht_nmask, ht->ht_buckets); - mdb_dec_indent(4); -} - -static void -display_hash_bucket(_sd_hash_bucket_t *addr, _sd_hash_bucket_t *hb) -{ - kmutex_t lock; - int rc; - - if ((rc = mdb_vread(&lock, sizeof (kmutex_t), - (uintptr_t)hb->hb_lock)) == -1) - mdb_warn("failed to read bucket lock at %p", hb->hb_lock); - - mdb_printf("hash bucket (%p):\n", addr); - mdb_inc_indent(4); - mdb_printf("head %?-p tail %?-p lock %?-p %s\n", - hb->hb_head, hb->hb_tail, - (rc == -1) ? hb->hb_lock : lock._opaque[0], - (rc == -1) ? "" : "(owner)"); - mdb_printf("inlist %d seq %d\n", hb->hb_inlist, hb->hb_seq); - mdb_dec_indent(4); -} - -/* - * dcmd to walk the hash table - * defaults to _sd_htable the cache hash table, - * but wil accept an address which is probably only useful - * in the event that other hash tables are implemented in - * the cache. - * - * calls sdbc_hashchain dcmd. same options as sdbc_cctl dcmd. - */ -static int -sdbc_hashtable(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - _sd_hash_table_t *sd_htable_addr; - _sd_hash_table_t _sd_htable; - _sd_hash_bucket_t hash_bucket; - int i; - - - - if (!(flags & DCMD_ADDRSPEC)) { - /* get the address of the standard cache hash table */ - if (mdb_readvar(&sd_htable_addr, "_sd_htable") == -1) { - mdb_warn("failed to read _sd_htable address\n"); - return (DCMD_ERR); - } - } else - sd_htable_addr = (_sd_hash_table_t *)addr; - - /* read in the hash table structure */ - if (mdb_vread(&_sd_htable, sizeof (_sd_hash_table_t), - (uintptr_t)sd_htable_addr) == -1) { - mdb_warn("failed to read _sd_htable structure at %p\n", - sd_htable_addr); - return (DCMD_ERR); - } - - display_hash_table(sd_htable_addr, &_sd_htable); - - /* - * read in the hash buckets - * and display chains if there are any - */ - for (i = 0; i < _sd_htable.ht_size; ++i) { - if (mdb_vread(&hash_bucket, sizeof (_sd_hash_bucket_t), - (uintptr_t)(_sd_htable.ht_buckets + i)) == -1) { - mdb_warn("failed to read ht_buckets at %p\n", - _sd_htable.ht_buckets + i); - return (DCMD_ERR); - } - - if (hash_bucket.hb_head != NULL) { - display_hash_bucket(_sd_htable.ht_buckets + i, - &hash_bucket); - /* - * if this walk fails, continue trying - * to read hash buckets - */ - if (mdb_call_dcmd("sdbc`sdbc_hashchain", - (uintptr_t)hash_bucket.hb_head, - flags|DCMD_ADDRSPEC, argc, argv) - == -1) - mdb_warn( - "failed to walk hash chain at %p", - hash_bucket.hb_head); - mdb_printf("\n"); - } - } - - return (DCMD_OK); -} -/* - * dcmd to display the sdbc lru queue - * same options as sdbc_cctl(). - * alternatively the user can call the sdbc_lru walker - * and pipe the addresses to sdbc_cctl dcmd. - */ -static int -sdbc_lru(uintptr_t addr, uint_t flags, int argc, - const mdb_arg_t *argv) -{ - _sd_queue_t _sd_lru_q; - GElf_Sym sym; - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_lookup_by_obj("sdbc", "_sd_lru_q", &sym) == -1) { - mdb_warn("failed to lookup _sd_lru_q symbol"); - return (DCMD_ERR); - } - - if (mdb_vread(&_sd_lru_q, sizeof (_sd_queue_t), - sym.st_value) == -1) { - mdb_warn("failed to read _sd_lru_q structure"); - return (DCMD_ERR); - } - - mdb_printf("Cache LRU Queue\n"); - mdb_inc_indent(4); - mdb_printf( - "qlock: 0x%-p (owner) await %d seq %d inq %d req %d noreq %d\n", - _sd_lru_q.sq_qlock._opaque[0], - _sd_lru_q.sq_await, - _sd_lru_q.sq_seq, - _sd_lru_q.sq_inq, - _sd_lru_q.sq_req_stat, - _sd_lru_q.sq_noreq_stat); - - addr = (uintptr_t)(sym.st_value); - } - - if (mdb_pwalk_dcmd("sdbc`sdbc_lru", "sdbc`sdbc_cctl", - argc, argv, addr) == -1) { - mdb_warn("failed to walk lru at addr %p", addr); - return (DCMD_ERR); - } - - return (DCMD_OK); -} - -#ifdef SAFESTORE -static void -print_wrq(_sd_writeq_t *wrq, uint_t verbose) -{ - int i; - - mdb_printf("Cache Write Ctl Queue:\n"); - mdb_inc_indent(4); - mdb_printf("qtop %-p qlock: %-p (owner) inq %d\n", - wrq->wq_qtop, - wrq->wq_qlock._opaque[0], - wrq->wq_inq); - - mdb_printf("slp_top %3-d slp_index %3-d slp_inq %3-d\n", - wrq->wq_slp_top, - wrq->wq_slp_index, - wrq->wq_slp_inq); - - for (i = 0; verbose && i < SD_WR_SLP_Q_MAX; i += 2) { - mdb_printf("%3d: cv %h-x wq_need %3-d wq_held %3-d%4T", - i, - wrq->wq_slp[i].slp_wqcv._opaque, - wrq->wq_slp[i].slp_wqneed, - wrq->wq_slp[i].slp_wqheld); - if (SD_WR_SLP_Q_MAX > (i + 1)) { - mdb_printf( - "%3d: cv %h-x wq_need %3-d wq_held %3-d%\n", - i+1, - wrq->wq_slp[i+1].slp_wqcv._opaque, - wrq->wq_slp[i+1].slp_wqneed, - wrq->wq_slp[i+1].slp_wqheld); - } - } - mdb_dec_indent(4); -} - -/* - * dcmd to display write control structures - */ - -static int -sdbc_wctl(uintptr_t addr, uint_t flags, int argc, - const mdb_arg_t *argv) -{ - _sd_wr_cctl_t wctl; - ss_centry_info_t gl_info; - ss_centry_info_t nv_gl_info; - uintptr_t opt_c = MDB_CD; - uint_t opt_d = FALSE; - uint_t opt_v = FALSE; - - - /* TODO option for fba pos */ - if (mdb_getopts(argc, argv, - 'd', MDB_OPT_SETBITS, TRUE, &opt_d, - 'c', MDB_OPT_UINTPTR, &opt_c, - 'v', MDB_OPT_SETBITS, TRUE, &opt_v) != argc) - return (DCMD_USAGE); - - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_walk_dcmd("sdbc`sdbc_wctl", "sdbc`sdbc_wctl", - argc, argv) == -1) { - mdb_warn("failed to walk write ctl array"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("write control block structures:\n"); - } - - if (mdb_vread(&wctl, sizeof (_sd_wr_cctl_t), addr) == -1) { - mdb_warn("failed to read wctl at 0x%p", addr); - return (DCMD_ERR); - } - - - /* - * print "all" is the default. - * filter conditions can only be checked by reading in wc_gl_info - */ - if (opt_c || opt_d || opt_v) - if (mdb_vread(&gl_info, sizeof (ss_centry_info_t), - (uintptr_t)wctl.wc_gl_info) == -1) { - mdb_warn("failed to read at wc_gl_info 0x%p", addr); - return (DCMD_ERR); - } - - - if (OPT_C_SELECTED && (gl_info.gl_cd != opt_c)) - return (DCMD_OK); - - if (opt_d && !(gl_info.gl_dirty)) - return (DCMD_OK); - - mdb_inc_indent(4); - mdb_printf("%-p data %-p gl_info %-p Ngl_info %-p flg %02x\n", - addr, - wctl.wc_data, - wctl.wc_gl_info, - wctl.wc_nvmem_gl_info, - wctl.wc_flag); - mdb_dec_indent(4); - - /* verbose */ - if (!opt_v) - return (DCMD_OK); - - mdb_inc_indent(4); - mdb_printf("next %?-p prev %?-p\n", wctl.wc_next, wctl.wc_prev); - mdb_printf(" gl_info: "); - mdb_printf("cd %3-d fpos %10-d dirty %04x flag <%b>\n", - gl_info.gl_cd, gl_info.gl_fpos, gl_info.gl_dirty & 0xffff, - gl_info.gl_flag, cc_flag_bits); - - if (wctl.wc_nvmem_gl_info) { - if (mdb_vread(&nv_gl_info, sizeof (ss_centry_info_t), - (uintptr_t)wctl.wc_nvmem_gl_info) == -1) { - mdb_warn("failed to read at wc_nvmem_gl_info 0x%p", - wctl.wc_nvmem_gl_info); /* not catastophic, continue */ - } else { - - /* consistency check */ - if (memcmp(&gl_info, &nv_gl_info, - sizeof (ss_centry_info_t) != 0)) { - mdb_warn("nvram and host memory are NOT identical!"); - mdb_printf("nvmem_gl_info: "); - mdb_printf("cd %3-d fpos %10-d dirty %04x flag <%b>\n", - nv_gl_info.gl_cd, nv_gl_info.gl_fpos, - nv_gl_info.gl_dirty & 0xffff, - nv_gl_info.gl_flag, cc_flag_bits); - } - - } - } - - mdb_dec_indent(4); - mdb_printf("\n"); - return (DCMD_OK); -} - -/* - * dcmd to display write control structures in the free list - * same options as sdbc_wctl - */ - -static int -sdbc_wrq(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - _sd_net_t _sd_net_config; - uintptr_t opt_c = MDB_CD; - uint_t opt_d = FALSE; - uint_t opt_v = FALSE; - - - /* look for verbose option */ - if (mdb_getopts(argc, argv, - 'd', MDB_OPT_SETBITS, TRUE, &opt_d, - 'c', MDB_OPT_UINTPTR, &opt_c, - 'v', MDB_OPT_SETBITS, TRUE, &opt_v) != argc) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_readvar(&_sd_net_config, "_sd_net_config") == -1) { - mdb_warn("failed to read _sd_net_config structure"); - return (DCMD_ERR); - } - - print_wrq(&(_sd_net_config.sn_wr_queue), opt_v); - - addr = (uintptr_t)(_sd_net_config.sn_wr_queue.wq_qtop); - } - - if (mdb_pwalk_dcmd("sdbc`sdbc_wrq", "sdbc`sdbc_wctl", - argc, argv, addr) == -1) { - mdb_warn("failed to walk write ctl queue at addr %p", addr); - return (DCMD_ERR); - } - return (DCMD_OK); -} -#endif - -/* - * dcmd to display the dm queues - * use sdbc_lru walker to walk each queue. - */ -/*ARGSUSED*/ -static int -sdbc_dmqueues(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - _sd_queue_t *sdbc_dm_queues; /* kernel address of dm queues */ - int max_dm_queues; - _sd_queue_t *queues = NULL; /* local copy */ - int i; - - - if (argc != 0) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_readvar(&sdbc_dm_queues, "sdbc_dm_queues") == -1) { - mdb_warn("failed to read sdbc_dm_queues address\n"); - return (DCMD_ERR); - } - - if (mdb_readvar(&max_dm_queues, "max_dm_queues") == -1) { - mdb_warn("failed to read max_dm_queues variable\n"); - return (DCMD_ERR); - } - - queues = mdb_zalloc(max_dm_queues * sizeof (_sd_queue_t), - UM_SLEEP); -mdb_printf("max_dm_queues %d sdbc_dm_queues %p queues %p\n", - max_dm_queues, sdbc_dm_queues, queues); - - if (mdb_vread(queues, max_dm_queues * sizeof (_sd_queue_t), - (uintptr_t)sdbc_dm_queues) == -1) { - mdb_warn("failed to read sdbc_dm_queues"); - return (DCMD_ERR); - } - - for (i = 0; i < max_dm_queues; ++i) { - mdb_printf("Cache DM Queue %d %p\n", - queues[i].sq_dmchain_cblocks, - sdbc_dm_queues +i); - mdb_inc_indent(4); - mdb_printf("qlock: 0x%-p (owner) await %d " - "seq %d inq %d req %d noreq %d\n", - queues[i].sq_qlock._opaque[0], - queues[i].sq_await, - queues[i].sq_seq, - queues[i].sq_inq, - queues[i].sq_req_stat, - queues[i].sq_noreq_stat); - - mdb_dec_indent(4); - } - } - - return (DCMD_OK); -} - - -mdb_bitmask_t cd_writer_bits[] = { - { "NONE ", (u_longlong_t)~0, _SD_WRITER_NONE }, - { "CREATE ", (u_longlong_t)~0, _SD_WRITER_CREATE }, - { "RUNNING", (u_longlong_t)~0, _SD_WRITER_RUNNING }, - { NULL, 0, 0 } -}; - -mdb_bitmask_t sh_failed_status[] = { - { "STATUS OK", (u_longlong_t)~0, 0 }, - { "I/O ERROR", (u_longlong_t)~0, 1 }, - { "OPEN FAIL", (u_longlong_t)~0, 2 }, - { NULL, 0, 0 } -}; - -mdb_bitmask_t sh_flag_bits[] = { - { "ATTACHED", CD_ATTACHED, CD_ATTACHED }, - { NULL, 0, 0 } -}; - -mdb_bitmask_t sh_alloc_bits[] = { - { "ALLOC_IN_PROGRESS", CD_ALLOC_IN_PROGRESS, CD_ALLOC_IN_PROGRESS }, - { "ALLOCATED", CD_ALLOCATED, CD_ALLOCATED }, - { "CLOSE_IN_PROGRESS", CD_CLOSE_IN_PROGRESS, CD_CLOSE_IN_PROGRESS }, - { NULL, 0, 0 } -}; - -/* - * dcmd to display cd information - */ -static int -sdbc_cdinfo(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - _sd_shared_t sd_shared; - _sd_cd_info_t cdi; - ss_voldata_t gl_file; - char *fn = "nopath"; /* filename if sd_shared info cannot be read */ - uchar_t sh_alloc = 0; /* assume not alloc'd if sd_shared info unavail */ - uintptr_t opt_c = MDB_CD; - uint_t opt_a = FALSE; - uint_t opt_v = FALSE; - int dev_t_chars; - - dev_t_chars = sizeof (dev_t) * 2; /* # chars to display dev_t */ - - - if (mdb_getopts(argc, argv, - 'a', MDB_OPT_SETBITS, TRUE, &opt_a, - 'c', MDB_OPT_UINTPTR, &opt_c, - 'v', MDB_OPT_SETBITS, TRUE, &opt_v) != argc) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_walk_dcmd("sdbc`sdbc_cdinfo", "sdbc`sdbc_cdinfo", - argc, argv) == -1) { - mdb_warn("failed to walk cd info array"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("cd info structures:\n"); - } - - if (mdb_vread(&cdi, sizeof (_sd_cd_info_t), addr) == -1) { - mdb_warn("failed to read cd info at 0x%p", addr); - return (DCMD_ERR); - } - - /* - * need to do this read even for non-verbose option to - * get the filename and the sh_alloc field - */ - if (cdi.cd_info) { - if (mdb_vread(&sd_shared, sizeof (_sd_shared_t), - (uintptr_t)cdi.cd_info) == -1) { - mdb_warn("failed to read shared cd info at 0x%p", - cdi.cd_info); - /* not catastrophic, keep truckin' */ - } else { - fn = sd_shared.sh_filename; - sh_alloc = sd_shared.sh_alloc; - } - } - - if (!opt_a && (sh_alloc == 0)) - return (DCMD_OK); - - if (OPT_C_SELECTED && (opt_c != cdi.cd_desc)) - return (DCMD_OK); - - mdb_inc_indent(4); - mdb_printf("%p cd %3-d filename %s\n", - addr, cdi.cd_desc, fn); - mdb_printf("alloc <%b> hint <%b>\n", - sh_alloc, sh_alloc_bits, - cdi.cd_hint, cache_hints); - mdb_dec_indent(4); - - if (!opt_v) - return (DCMD_OK); - - /* verbose */ - mdb_inc_indent(4); - mdb_printf("rawfd %?-p crdev %0*lx iodev %?-p\n", - cdi.cd_rawfd, - dev_t_chars, - cdi.cd_crdev, - cdi.cd_iodev); - mdb_printf("flag %x %8Tlock %?-p writer <%b>\n", - cdi.cd_flag, - cdi.cd_lock._opaque[0], - cdi.cd_writer, cd_writer_bits); - mdb_printf("global %?-p dirty_head %?-p\n", - cdi.cd_global, cdi.cd_dirty_head); - mdb_printf("last_ent %?-p lastchain_ptr %?-p lastchain %d\n", - cdi.cd_last_ent, cdi.cd_lastchain_ptr, - cdi.cd_lastchain); - mdb_printf("io_head %?-p io_tail %?-p fail_head %?-p\n", - cdi.cd_io_head, cdi.cd_io_tail, cdi.cd_fail_head); - mdb_printf( - "cd_info %?-p failover %d recovering %d write_inprogress %d\n", - cdi.cd_info, cdi.cd_failover, - cdi.cd_recovering, - cdi.cd_write_inprogress); - - if (cdi.cd_global != NULL) { - if (mdb_vread(&gl_file, sizeof (ss_voldata_t), - (uintptr_t)cdi.cd_global) == -1) - mdb_warn("failed to read cd_global at %p", - cdi.cd_global); - else { - mdb_printf("cd_global: %s\n", gl_file.sv_volname); - mdb_printf("pinned %2-d attached %2-d devidsz %3-d\n", - gl_file.sv_pinned, gl_file.sv_attached, - gl_file.sv_devidsz); - mdb_printf("devid %s\n", gl_file.sv_devid); - mdb_printf("vol %?p\n", gl_file.sv_vol); - } - /* TODO do a consistency check here against the nvram copy */ - } - - if (cdi.cd_info == NULL) { - mdb_printf("no shared info\n"); - } else { - mdb_printf("shared:\n"); - mdb_printf("failed <%b> cd %3-d", - sd_shared.sh_failed, sh_failed_status, - sd_shared.sh_cd); - mdb_printf("cache_read %10-d cache_write %10-d\n", - sd_shared.sh_cache_read, sd_shared.sh_cache_write); - mdb_printf("disk_read %10-d disk_write %10-d filesize %10-d\n", - sd_shared.sh_disk_read, sd_shared.sh_disk_write, - sd_shared.sh_filesize); - mdb_printf("numdirty %8-d numio %8-d numfail %8-d\n", - sd_shared.sh_numdirty, - sd_shared.sh_numio, - sd_shared.sh_numfail); - mdb_printf("flushloop %2-d sh_flag <%b>\n", - sd_shared.sh_flushloop, sd_shared.sh_flag, sh_flag_bits); - - /* this can be really verbose */ - if (cdi.cd_dirty_head) { - mdb_printf("Dirty Chain (cd_dirty_head):"); - /* TODO reconstruct argv without opt_a */ - if (!opt_a) - mdb_call_dcmd("sdbc_dchain", - (uintptr_t)cdi.cd_dirty_head, - flags, argc, argv); - else /* print with no options */ - mdb_call_dcmd("sdbc_dchain", - (uintptr_t)cdi.cd_dirty_head, - flags, 0, NULL); - } - - if (cdi.cd_io_head) { - mdb_printf("I/O Pending Chain (cd_io_head):"); - /* TODO reconstruct argv without opt_a */ - if (!opt_a) - mdb_call_dcmd("sdbc_dchain", - (uintptr_t)cdi.cd_io_head, - flags, argc, argv); - else /* print with no options */ - mdb_call_dcmd("sdbc_dchain", - (uintptr_t)cdi.cd_dirty_head, - flags, 0, NULL); - } - - if (cdi.cd_fail_head) { - mdb_printf("Failed Chain (cd_fail_head):"); - /* TODO reconstruct argv without opt_a */ - if (!opt_a) - mdb_call_dcmd("sdbc_dchain", - (uintptr_t)cdi.cd_fail_head, - flags, argc, argv); - else /* print with no options */ - mdb_call_dcmd("sdbc_dchain", - (uintptr_t)cdi.cd_dirty_head, - flags, 0, NULL); - } - } - - mdb_dec_indent(4); - - mdb_printf("\n"); - - return (DCMD_OK); -} - -#ifdef SAFESTORE -/* - * dcmd to display fault tolerant control structures - */ -static int -sdbc_ftctl(uintptr_t addr, uint_t flags, int argc, - const mdb_arg_t *argv) -{ - _sd_ft_cctl_t ft_cent; - ss_centry_info_t gl_info; - ss_centry_info_t nv_gl_info; - uintptr_t opt_c = MDB_CD; - uint_t opt_d = FALSE; - uint_t opt_v = FALSE; - - - /* TODO option to select on fpos */ - if (mdb_getopts(argc, argv, - 'd', MDB_OPT_SETBITS, TRUE, &opt_d, - 'c', MDB_OPT_UINTPTR, &opt_c, - 'v', MDB_OPT_SETBITS, TRUE, &opt_v) != argc) - return (DCMD_USAGE); - - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_walk_dcmd("sdbc`sdbc_ftctl", "sdbc`sdbc_ftctl", - argc, argv) == -1) { - mdb_warn("failed to walk write ctl array"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("Ft control block structures:\n"); - } - - if (mdb_vread(&ft_cent, sizeof (_sd_ft_cctl_t), addr) == -1) { - mdb_warn("failed to read ft_cent at 0x%p", addr); - return (DCMD_ERR); - } - - - /* - * print "all" is the default. - * filter conditions can only be checked by reading in wc_gl_info - */ - if (opt_c || opt_d || opt_v) - if (mdb_vread(&gl_info, sizeof (ss_centry_info_t), - (uintptr_t)ft_cent.ft_gl_info) == -1) { - mdb_warn("failed to read at wc_gl_info 0x%p", addr); - return (DCMD_ERR); - } - - - if (OPT_C_SELECTED && (gl_info.gl_cd != opt_c)) - return (DCMD_OK); - - if (opt_d && !(gl_info.gl_dirty)) - return (DCMD_OK); - - mdb_inc_indent(4); - mdb_printf("%-p data %?-p qnext %?-p\n", - addr, - ft_cent.ft_qnext, - ft_cent.ft_data); - mdb_printf("gl_info %?-p nvmem_gl_info %?-p\n", - ft_cent.ft_gl_info, - ft_cent.ft_nvmem_gl_info); - mdb_dec_indent(4); - - /* verbose */ - if (!opt_v) { - mdb_printf("\n"); - return (DCMD_OK); - } - - mdb_inc_indent(4); - mdb_printf(" gl_info: "); - mdb_printf("cd %3-d fpos %10-d dirty %04x flag <%b>\n", - gl_info.gl_cd, gl_info.gl_fpos, gl_info.gl_dirty & 0xffff, - gl_info.gl_flag, cc_flag_bits); - - if (ft_cent.ft_nvmem_gl_info) { - if (mdb_vread(&nv_gl_info, sizeof (ss_centry_info_t), - (uintptr_t)ft_cent.ft_nvmem_gl_info) == -1) { - mdb_warn("failed to read at ft_nvmem_gl_info 0x%p", - ft_cent.ft_nvmem_gl_info); /* not catastophic, continue */ - } else { - mdb_printf("nvmem_gl_info: "); - mdb_printf("cd %3-d fpos %10-d dirty %04x flag <%b>\n", - nv_gl_info.gl_cd, nv_gl_info.gl_fpos, - nv_gl_info.gl_dirty & 0xffff, - nv_gl_info.gl_flag, cc_flag_bits); - - /* consistency check */ - if (memcmp(&gl_info, &nv_gl_info, sizeof (ss_centry_info_t)) - != 0) { - mdb_warn("nvram and host memory are NOT identical!"); - } - - } - } - - mdb_dec_indent(4); - mdb_printf("\n"); - return (DCMD_OK); -} -#endif /* SAFESTORE */ - - -/* dcmd to display buffer handles */ -static int -sdbc_handles(uintptr_t addr, uint_t flags, int argc, - const mdb_arg_t *argv) -{ - uint_t opt_a = FALSE; - uintptr_t opt_c = MDB_CD; - uint_t opt_v = FALSE; - uint_t opt_C = FALSE; - _sd_buf_hlist_t hl; - _sd_buf_handle_t bh; - - - if (mdb_getopts(argc, argv, - 'a', MDB_OPT_SETBITS, TRUE, &opt_a, - 'c', MDB_OPT_UINTPTR, &opt_c, - 'C', MDB_OPT_SETBITS, TRUE, &opt_C, - 'v', MDB_OPT_SETBITS, TRUE, &opt_v) != argc) - return (DCMD_USAGE); - - - if (mdb_readvar(&hl, "_sd_handle_list") == -1) { - mdb_warn("failed to read _sd_handle_list structure"); - return (DCMD_ERR); - } - - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_walk_dcmd("sdbc`sdbc_handles", "sdbc`sdbc_handles", - argc, argv) == -1) { - mdb_warn("failed to walk 'sdbc_handle_list'"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("Handle List Info:\n"); - - mdb_inc_indent(4); - mdb_printf("hl_top.bh_next: 0x%p\n", hl.hl_top.bh_next); - mdb_printf("hl_lock: 0x%p (owner)\n", hl.hl_lock._opaque[0]); - mdb_printf("hl_count: %hd\n", hl.hl_count); - mdb_dec_indent(4); - mdb_printf("buf handles:\n"); - } - - if (mdb_vread(&bh, sizeof (bh), addr) == -1) { - mdb_warn("failed to read buf handle at 0x%p", addr); - return (DCMD_ERR); - } - - if (!opt_a && !(bh.bh_flag & (NSC_HALLOCATED | NSC_HACTIVE))) - return (DCMD_OK); - - /* - * may get false matches on cd option -- - * a cleared bh_cd field will match if user specified cd 0 - */ - if (OPT_C_SELECTED && (bh.bh_cd != opt_c)) - return (DCMD_OK); - - mdb_inc_indent(4); - mdb_printf("%p %8T cd %3-d %4T<%b> %x\n", addr, bh.bh_cd, - bh.bh_flag, nsc_buf_bits, bh.bh_flag); - - /* check for verbose, avoid printing twice */ - if (!opt_v && opt_C) { - mdb_printf("cc_chain: "); - if (bh.bh_centry) - mdb_call_dcmd("sdbc`sdbc_cchain", - (uintptr_t)bh.bh_centry, DCMD_ADDRSPEC, 0, NULL); - } - - mdb_dec_indent(4); - - if (!opt_v) - return (DCMD_OK); - - /* verbose */ - mdb_inc_indent(4); - - mdb_printf("callbacks: %-20a%-20a%-20a\n", - bh.bh_disconnect_cb, bh.bh_read_cb, bh.bh_write_cb); - - mdb_printf("centry %?p %8T next %?p\n", - bh.bh_centry, bh.bh_next); - mdb_printf("buffer:\n"); - - mdb_inc_indent(4); - mdb_printf("fd 0x%p pos %10d len %6d flag 0x%x\n", - bh.bh_buf.sb_fd, bh.bh_fba_pos, bh.bh_fba_len, bh.bh_flag); - - mdb_printf("alloc_thread %p busy_thread %p\n", bh.bh_alloc_thread, - bh.bh_busy_thread); - - mdb_printf("err %4d %8T bh_vec 0x%p\n", bh.bh_error, bh.bh_vec); - mdb_dec_indent(4); - - mdb_printf("bufvec (scatter gather list): %-?s %8T%-s\n", - "ADDR", "LEN"); - { - _sd_bufvec_t *bv, *endvec; - - - /* todo check for (bh_vec != bh_bufvec) => readahead? */ - - bv = bh.bh_bufvec; - endvec = bv + _SD_MAX_BLKS; - mdb_inc_indent(30); - while (bv->bufaddr) { - mdb_printf("%p %8T%d\n", bv->bufaddr, bv->buflen); - ++bv; - if (bv > endvec) { - mdb_warn("END of bh_bufvec ARRAY"); - break; - } - } - mdb_dec_indent(30); - } - - if (opt_C) { - mdb_printf("cc_chain: "); - if (bh.bh_centry) - mdb_call_dcmd("sdbc`sdbc_cchain", - (uintptr_t)bh.bh_centry, DCMD_ADDRSPEC, 0, NULL); - } - - mdb_dec_indent(4); - mdb_printf("\n"); - - return (DCMD_OK); -} -/* - * dcmd to display ss_centry_info_t structures and - * do optional consistency check with the nvram copy - * if configured for nvram safe storage. - */ - -static int -sdbc_glcinfo(uintptr_t addr, uint_t flags, int argc, - const mdb_arg_t *argv) -{ - ss_centry_info_t gl_centry_info; - /* for doing consistency check */ - - ss_centry_info_t *gl_centry_info_start; - ss_centry_info_t *nv_gl_centry_info_start; - uintptr_t nv_addr; - ss_centry_info_t nv_gl_centry_info; - - /* options */ - uint_t opt_a = FALSE; - uintptr_t opt_b = MDB_BLKNUM; /* fba pos match */ - uintptr_t opt_c = MDB_CD; - uintptr_t opt_C = FALSE; /* consistency check */ - uint_t opt_d = FALSE; - - - - if (mdb_getopts(argc, argv, - 'a', MDB_OPT_SETBITS, TRUE, &opt_a, - 'b', MDB_OPT_UINTPTR, &opt_b, - 'c', MDB_OPT_UINTPTR, &opt_c, - 'C', MDB_OPT_SETBITS, TRUE, &opt_C, - 'd', MDB_OPT_SETBITS, TRUE, &opt_d) != argc) - return (DCMD_USAGE); - - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_walk_dcmd("sdbc`sdbc_glcinfo", "sdbc`sdbc_glcinfo", - argc, argv) == -1) { - mdb_warn("failed to walk global centry info array"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("global cache entry info:\n"); - } - - if (mdb_vread(&gl_centry_info, sizeof (ss_centry_info_t), addr) == -1) { - mdb_warn("failed to read gl_centry_info at 0x%p", addr); - return (DCMD_ERR); - } - - - /* - * default is to print entries initialized with a cd. return if - * no options are selected and cd is invalid. - */ - if (!opt_a && (!OPT_B_SELECTED) && (!OPT_C_SELECTED) && !opt_d && - (gl_centry_info.sc_cd == -1)) - return (DCMD_OK); - - - /* - * opt_c is exclusive filter. if opt_c is selected and there - * is no match on the cd then return - */ - if (!opt_a && - (OPT_C_SELECTED && (gl_centry_info.sc_cd != opt_c))) - return (DCMD_OK); - - /* - * opt_d and opt_b are inclusive. print if either one is chosen - * and the selection condition is true. - */ - if (opt_a || - (!opt_d && (!OPT_B_SELECTED)) || /* no options chosen */ - (opt_d && gl_centry_info.sc_dirty) || - (OPT_B_SELECTED && (gl_centry_info.sc_fpos == opt_b))) - /*EMPTY*/; - else - return (DCMD_OK); - - mdb_inc_indent(4); - mdb_printf("%?-p cd %3-d fpos %10-d dirty %04x flag <%b>\n", - addr, - gl_centry_info.sc_cd, - gl_centry_info.sc_fpos, - gl_centry_info.sc_dirty & 0xffff, - gl_centry_info.sc_flag, cc_flag_bits); - - if (opt_C) { - /* get start of the cache entry metadata */ - if (mdb_readvar(&gl_centry_info_start, - "_sdbc_gl_centry_info") == -1) { - mdb_warn("failed to read _sdbc_gl_centry_info"); - /* not catastrophic */ - goto end; - } - - /* get start of the nvram copy cache entry metadata */ - if (mdb_readvar(&nv_gl_centry_info_start, - "_sdbc_gl_centry_info_nvmem") == -1) { - mdb_warn("failed to read _sdbc_gl_centry_info_nvmem"); - /* not catastrophic */ - goto end; - } - - nv_addr = (addr - (uintptr_t)gl_centry_info_start) + - (uintptr_t)nv_gl_centry_info_start; - - if (mdb_vread(&nv_gl_centry_info, sizeof (ss_centry_info_t), - nv_addr) == -1) { - mdb_warn("failed to read at nvmem_gl_info 0x%p", - nv_addr); - /* not catastophic, continue */ - } else { - - /* consistency check */ - mdb_inc_indent(4); - if (memcmp(&gl_centry_info, &nv_gl_centry_info, - sizeof (ss_centry_info_t) != 0)) { - mdb_warn( - "nvram and host memory are NOT identical!"); - mdb_printf("nvmem_gl_centry_info: "); - mdb_printf( - "%?-p cd %3-d fpos %10-d dirty %04x flag <%b>\n", - nv_addr, - nv_gl_centry_info.sc_cd, - nv_gl_centry_info.sc_fpos, - nv_gl_centry_info.sc_dirty & 0xffff, - nv_gl_centry_info.sc_flag, cc_flag_bits); - mdb_printf("\n"); - } else - mdb_printf("NVRAM ok\n"); - - mdb_dec_indent(4); - - } - } - - end: - mdb_dec_indent(4); - return (DCMD_OK); -} - -/* - * dcmd to display ss_voldata_t structures and - * do optional consistency check with the nvram copy - * if configured for nvram safe storage. - */ - -static int -sdbc_glfinfo(uintptr_t addr, uint_t flags, int argc, - const mdb_arg_t *argv) -{ - ss_voldata_t gl_file_info; - /* for doing consistency check */ - - ss_voldata_t *gl_file_info_start; - ss_voldata_t *nv_gl_file_info_start; - uintptr_t nv_addr; - ss_voldata_t nv_gl_file_info; - - /* options default: valid filename */ - uint_t opt_a = FALSE; /* all */ - uint_t opt_p = FALSE; /* PINNED */ - uint_t opt_t = FALSE; /* attached */ - uint_t opt_C = FALSE; /* consistency check */ - - - - /* - * possible enhancement -- match on filename, - * or filename part (e.g. controller number) - */ - if (mdb_getopts(argc, argv, - 'a', MDB_OPT_SETBITS, TRUE, &opt_a, - 'C', MDB_OPT_SETBITS, TRUE, &opt_C, - 'p', MDB_OPT_SETBITS, TRUE, &opt_p, - 't', MDB_OPT_SETBITS, TRUE, &opt_t) != argc) - return (DCMD_USAGE); - - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_walk_dcmd("sdbc`sdbc_glfinfo", "sdbc`sdbc_glfinfo", - argc, argv) == -1) { - mdb_warn("failed to walk global file info array"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("global file entry info:\n"); - } - - if (mdb_vread(&gl_file_info, sizeof (ss_voldata_t), addr) == -1) { - mdb_warn("failed to read gl_file_info at 0x%p", addr); - return (DCMD_ERR); - } - - - /* - * default is to print entries initialized with non-null filename. - * return if no options are selected and filename is invalid. - */ - if (!opt_a && !opt_p && !opt_t && - (strlen(gl_file_info.sv_volname) == 0)) - return (DCMD_OK); - - - if (opt_a || - (!opt_p && !opt_t) || /* no options chosen */ - (opt_p && (gl_file_info.sv_pinned != _SD_NO_HOST)) || - (opt_t && (gl_file_info.sv_attached != _SD_NO_HOST))) - /*EMPTY*/; - else - return (DCMD_OK); - - mdb_inc_indent(4); - mdb_printf("%?-p %s\n", addr, gl_file_info.sv_volname); - mdb_printf("pinned %2-d attached %2-d devidsz %3-d\n", - gl_file_info.sv_pinned, - gl_file_info.sv_attached, - gl_file_info.sv_devidsz); - mdb_printf("devid %s\n", gl_file_info.sv_devid); - - if (opt_C) { - /* get start of the cache entry metadata */ - if (mdb_readvar(&gl_file_info_start, - "_sdbc_gl_file_info") == -1) { - mdb_warn("failed to read _sdbc_gl_file_info"); - /* not catastrophic */ - goto end; - } - - /* get start of the nvram copy cache entry metadata */ - if (mdb_readvar(&nv_gl_file_info_start, - "_sdbc_gl_file_info_nvmem") == -1) { - mdb_warn("failed to read _sdbc_gl_file_info_nvmem"); - /* not catastrophic */ - goto end; - } - - nv_addr = (addr - (uintptr_t)gl_file_info_start) + - (uintptr_t)nv_gl_file_info_start; - - if (mdb_vread(&nv_gl_file_info, sizeof (ss_voldata_t), - nv_addr) == -1) { - mdb_warn("failed to read nvmem_gl_info at 0x%p", - nv_addr); - /* not catastophic, continue */ - } else { - - /* consistency check */ - mdb_inc_indent(4); - if (memcmp(&gl_file_info, &nv_gl_file_info, - sizeof (ss_centry_info_t) != 0)) { - mdb_warn("nvram and host memory are NOT identical!"); - mdb_printf("nvmem_gl_file_info: "); - mdb_printf("%?-p %s\n", nv_addr, - nv_gl_file_info.sv_volname); - mdb_printf("pinned %2-d attached %2-d devidsz %3-d\n", - nv_gl_file_info.sv_pinned, - nv_gl_file_info.sv_attached, - nv_gl_file_info.sv_devidsz); - mdb_printf("devid %s\n", nv_gl_file_info.sv_devid); - } else - mdb_printf("NVRAM ok\n"); - - mdb_dec_indent(4); - - } - } - - end: - mdb_dec_indent(4); - mdb_printf("\n"); - return (DCMD_OK); -} - - -/* - * MDB module linkage information: - * - * We declare a list of structures describing our dcmds, and a function - * named _mdb_init to return a pointer to our module information. - */ - -static const mdb_dcmd_t dcmds[] = { - /* general dcmds */ - { "sdbc_config", NULL, - "display sdbc configuration information", - sdbc_config }, - { "sdbc_stats", NULL, - "display sdbc stats information", - sdbc_stats }, - { "sdbc_vars", NULL, - "display some sdbc variables, counters and addresses", - sdbc_vars }, - - /* cctl dcmds */ - {"sdbc_cctl", "?[-vdhioV][-c cd][-b blknum]", - "display sdbc cache ctl structures", - sdbc_cctl, cctl_help }, - {"sdbc_cchain", ":[-vdhioV][-c cd][-b blknum]", - "display cache ctl structure cc_chain", - sdbc_cchain, cchain_help }, - {"sdbc_dchain", ":[-vdhioV][-c cd][-b blknum]", - "display cache ctl structure dirty chain", - sdbc_dchain, dchain_help }, - {"sdbc_dmchain", ":[-vdhioV][-c cd][-b blknum]", - "display dynamic memory cache ctl chain", - sdbc_dmchain, dmchain_help }, - {"sdbc_hashchain", ":[-vdhioV][-c cd][-b blknum]", - "display a hash chain", sdbc_hashchain, hashchain_help }, - {"sdbc_hashtable", "?[-vdhioV][-c cd][-b blknum]", - "display hash table", sdbc_hashtable, hashtable_help }, - {"sdbc_lru", "?[-vdhioV][-c cd][-b blknum]", - "display the cache lru queue", - sdbc_lru, lru_help }, -#ifdef SAFESTORE - /* wctl dcmds */ - {"sdbc_wctl", "?[-vd][-c cd]", - "display the write control structures", - sdbc_wctl, wctl_help }, - {"sdbc_wrq", "?[-vd][-c cd]", - "display the write control queue", - sdbc_wrq, wrq_help }, -#endif /* SAFESTORE */ - - /* others */ - {"sdbc_cdinfo", "?[-av][-c cd]", - "display cache descriptor information", - sdbc_cdinfo, cdinfo_help }, -#ifdef SAFESTORE - {"sdbc_ftctl", "?[-vd][-c cd]", - "display the fault tolerant control structures", - sdbc_ftctl, ftctl_help }, -#endif /* SAFESTORE */ - {"sdbc_handles", "?[-avC][-c cd]", - "display sdbc buffer handle information", - sdbc_handles, handle_help }, - - { "sdbc_dmqueues", NULL, - "display sdbc dynamic memory buffer queues information", - sdbc_dmqueues }, - - /* "global" metadata dcmds */ - {"sdbc_glcinfo", "?[-adC][-c cd][-b fbapos]", - "display the global cache entry info structures", - sdbc_glcinfo, glcinfo_help }, - {"sdbc_glfinfo", "?[-aptC]", - "display the global file info structures", - sdbc_glfinfo, glfinfo_help }, - { NULL } -}; - -static const mdb_walker_t walkers[] = { - /* walkers of cctl list and arrays */ - { "sdbc_cchain", "walk the cc_chain (alloc chain) of a cache ctl", - sdbc_cchain_winit, sdbc_cchain_wstep, sdbc_cchain_wfini }, - { "sdbc_cctl", "walk the cache ctl structure list", - sdbc_cctl_winit, sdbc_cctl_wstep, sdbc_cctl_wfini }, - { "sdbc_dchain", "walk the dirty chain of a cache ctl", - sdbc_dchain_winit, sdbc_dchain_wstep, sdbc_dchain_wfini }, - { "sdbc_dmchain", "walk the dynamic memory chain of a cache cctl", - sdbc_dmchain_winit, sdbc_dmchain_wstep, sdbc_dmchain_wfini }, - { "sdbc_hashchain", "walk a hash chain", - sdbc_hashchain_winit, sdbc_hashchain_wstep, - sdbc_hashchain_wfini }, - { "sdbc_lru", "walk the cache lru queue", - sdbc_lru_winit, sdbc_lru_wstep, sdbc_lru_wfini }, - -#ifdef SAFESTORE - /* walkers of wctl lists and arrays */ - { "sdbc_wctl", "walk the allocated write ctl array", - sdbc_wctl_winit, sdbc_wctl_wstep, sdbc_wctl_wfini }, - { "sdbc_wrq", "walk the write ctl queue (free list)", - sdbc_wrq_winit, sdbc_wrq_wstep, sdbc_wrq_wfini }, -#endif /* SAFESTORE */ - /* others */ - { "sdbc_cdinfo", - "walk the _sd_cache_files array of cache descriptor information", - sdbc_cdinfo_winit, sdbc_cdinfo_wstep, sdbc_cdinfo_wfini }, -#ifdef SAFESTORE - { "sdbc_ftctl", - "walk the allocated array of fault tolerant structures", - sdbc_ftctl_winit, sdbc_ftctl_wstep, sdbc_ftctl_wfini }, -#endif /* SAFESTORE */ - { "sdbc_handles", "walk array of _sd_buf_handle_t structures", - sdbc_handle_winit, sdbc_handle_wstep, sdbc_handle_wfini }, - - /* walkers for metadata arrays */ - { "sdbc_glcinfo", "walk the allocated global cache entry info array", - sdbc_glcinfo_winit, sdbc_glcinfo_wstep, sdbc_glcinfo_wfini }, - { "sdbc_glfinfo", "walk the allocated global file info array", - sdbc_glfinfo_winit, sdbc_glfinfo_wstep, sdbc_glfinfo_wfini }, - { NULL } -}; - -static const mdb_modinfo_t modinfo = { - MDB_API_VERSION, dcmds, walkers -}; - -const mdb_modinfo_t * -_mdb_init(void) -{ - return (&modinfo); -} diff --git a/usr/src/cmd/mdb/common/modules/sv/Makefile.com b/usr/src/cmd/mdb/common/modules/sv/Makefile.com deleted file mode 100644 index 40975cea69..0000000000 --- a/usr/src/cmd/mdb/common/modules/sv/Makefile.com +++ /dev/null @@ -1,24 +0,0 @@ -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 2008 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -CPPFLAGS += -DNSC_MULTI_TERABYTE diff --git a/usr/src/cmd/mdb/common/modules/sv/sv.c b/usr/src/cmd/mdb/common/modules/sv/sv.c deleted file mode 100644 index 5c6ab5924f..0000000000 --- a/usr/src/cmd/mdb/common/modules/sv/sv.c +++ /dev/null @@ -1,624 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <sys/types.h> -#include <sys/mdb_modapi.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> -#include <sys/sunldi.h> - -#include <sys/nsctl/nsctl.h> -#include <sys/unistat/spcs_s.h> -#include <sys/unistat/spcs_s_k.h> - -#include <sys/nsctl/sv.h> -#include <sys/nsctl/sv_impl.h> - -#include <sys/nsctl/nsvers.h> - -/* - * Walker for an array of sv_dev_t structures. - * A global walk is assumed to start at sv_devs. - */ - -struct sv_dev_winfo { - uintptr_t start; - uintptr_t end; -}; - - -static int -sv_dev_winit(mdb_walk_state_t *wsp) -{ - struct sv_dev_winfo *winfo; - sv_dev_t *sv_devs; - int sv_max_devices; - - winfo = mdb_zalloc(sizeof (struct sv_dev_winfo), UM_SLEEP); - - if (mdb_readvar(&sv_devs, "sv_devs") == -1) { - mdb_warn("failed to read 'sv_devs'"); - mdb_free(winfo, sizeof (struct sv_dev_winfo)); - return (WALK_ERR); - } - - if (mdb_readvar(&sv_max_devices, "sv_max_devices") == -1) { - mdb_warn("failed to read 'sv_max_devices'"); - mdb_free(winfo, sizeof (struct sv_dev_winfo)); - return (WALK_ERR); - } - - winfo->start = (uintptr_t)sv_devs; - winfo->end = (uintptr_t)(sv_devs + sv_max_devices); - - if (wsp->walk_addr == NULL) - wsp->walk_addr = winfo->start; - - wsp->walk_data = winfo; - return (WALK_NEXT); -} - - -static int -sv_dev_wstep(mdb_walk_state_t *wsp) -{ - struct sv_dev_winfo *winfo = wsp->walk_data; - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (wsp->walk_addr >= winfo->end) - return (WALK_DONE); - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - wsp->walk_addr += sizeof (sv_dev_t); - return (status); -} - - -static void -sv_dev_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (struct sv_dev_winfo)); -} - - -/* - * Walker for an sv hash chain. - * Global walks are disallowed. - */ - -static int -sv_hash_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL) - return (WALK_ERR); - - wsp->walk_data = mdb_zalloc(sizeof (sv_dev_t), UM_SLEEP); - - return (WALK_NEXT); -} - - -static int -sv_hash_wstep(mdb_walk_state_t *wsp) -{ - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (mdb_vread(wsp->walk_data, - sizeof (sv_dev_t), wsp->walk_addr) == -1) { - mdb_warn("failed to read sv_dev at %p", wsp->walk_addr); - return (WALK_DONE); - } - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - wsp->walk_addr = (uintptr_t)(((sv_dev_t *)wsp->walk_data)->sv_hash); - return (status); -} - - -static void -sv_hash_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (sv_dev_t)); -} - - -/* - * Walker for an array of sv_maj_t structures. - * A global walk is assumed to start at sv_majors. - */ - -sv_maj_t *sv_majors[SV_MAJOR_HASH_CNT + 1] = {0}; - -static int -sv_maj_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL) { - if (mdb_readvar(&sv_majors, "sv_majors") == -1) { - mdb_warn("failed to read 'sv_majors'"); - return (WALK_ERR); - } - } else { - sv_majors[0] = (sv_maj_t *)wsp->walk_addr; - } - - wsp->walk_addr = (uintptr_t)&sv_majors[0]; - wsp->walk_data = mdb_zalloc(sizeof (sv_maj_t), UM_SLEEP); - - return (WALK_NEXT); -} - - -static int -sv_maj_wstep(mdb_walk_state_t *wsp) -{ - uintptr_t addr; - int status = DCMD_OK; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (wsp->walk_addr >= (uintptr_t)&sv_majors[SV_MAJOR_HASH_CNT]) - return (WALK_DONE); - - for (addr = *(uintptr_t *)wsp->walk_addr; addr; - addr = (uintptr_t)(((sv_maj_t *)wsp->walk_data)->sm_next)) { - - if (mdb_vread(wsp->walk_data, sizeof (sv_maj_t), addr) - != sizeof (sv_maj_t)) { - mdb_warn("failed to read sv_maj at %p", addr); - status = DCMD_ERR; - break; - } - - status = wsp->walk_callback(addr, wsp->walk_data, - wsp->walk_cbdata); - if (status != DCMD_OK) - break; - } - - wsp->walk_addr += sizeof (sv_maj_t *); - return (status); -} - - -static void -sv_maj_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (sv_maj_t)); -} - - -/* - * Walker for an sv gclient chain. - * A global walk is assumed to start at sv_gclients. - */ - -static int -sv_gclient_winit(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr == NULL && - mdb_readvar(&wsp->walk_addr, "sv_gclients") == -1) { - mdb_warn("unable to read 'sv_gclients'"); - return (WALK_ERR); - } - - wsp->walk_data = mdb_zalloc(sizeof (sv_gclient_t), UM_SLEEP); - - return (WALK_NEXT); -} - - -static int -sv_gclient_wstep(mdb_walk_state_t *wsp) -{ - int status; - - if (wsp->walk_addr == NULL) - return (WALK_DONE); - - if (mdb_vread(wsp->walk_data, - sizeof (sv_gclient_t), wsp->walk_addr) == -1) { - mdb_warn("failed to read sv_gclient at %p", wsp->walk_addr); - return (WALK_DONE); - } - - status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data, - wsp->walk_cbdata); - - wsp->walk_addr = (uintptr_t)(((sv_gclient_t *)wsp->walk_data)->sg_next); - return (status); -} - - -static void -sv_gclient_wfini(mdb_walk_state_t *wsp) -{ - mdb_free(wsp->walk_data, sizeof (sv_gclient_t)); -} - - -/* - * Display a single sv_glcient_t structure. - * If called with no address, performs a global walk of all sv_gclients. - */ -static int -sv_gclient(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - sv_gclient_t sg; - char name[64]; - - if (argc != 0) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - /* - * paranoid mode on: qualify walker name with module name - * using '`' syntax. - */ - if (mdb_walk_dcmd("sv`sv_gclient", - "sv`sv_gclient", argc, argv) == -1) { - mdb_warn("failed to walk 'sv_gclient'"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - - if (mdb_vread(&sg, sizeof (sg), addr) != sizeof (sg)) { - mdb_warn("failed to read sv_gclient at %p", addr); - return (DCMD_ERR); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8T%-?s %8T%-16s %8T%s\n", - "ADDR", "NEXT", "ID", "NAME"); - } - - if (mdb_readstr(name, sizeof (name), (uintptr_t)sg.sg_name) == -1) { - mdb_warn("failed to read sv_gclient name at %p", addr); - return (DCMD_ERR); - } - - mdb_printf("%p %8T%p %8T%llx %8T%s", - addr, sg.sg_next, sg.sg_id, name); - - return (DCMD_OK); -} - - -/* - * Display a single sv_maj_t structure. - * If called with no address, performs a global walk of all sv_majs. - * -a : all (i.e. display all devices, even if disabled - * -v : verbose - */ -static int -sv_maj(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - sv_maj_t *maj; - int a_opt, v_opt; - int i; - - a_opt = v_opt = FALSE; - - if (mdb_getopts(argc, argv, - 'a', MDB_OPT_SETBITS, TRUE, &a_opt, - 'v', MDB_OPT_SETBITS, TRUE, &v_opt) != argc) - return (DCMD_USAGE); - - if (!(flags & DCMD_ADDRSPEC)) { - /* - * paranoid mode on: qualify walker name with module name - * using '`' syntax. - */ - if (mdb_walk_dcmd("sv`sv_maj", "sv`sv_maj", argc, argv) == -1) { - mdb_warn("failed to walk 'sv_maj'"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8T%s\n", "ADDR", "INUSE"); - } - - maj = mdb_zalloc(sizeof (*maj), UM_GC); - if (mdb_vread(maj, sizeof (*maj), addr) != sizeof (*maj)) { - mdb_warn("failed to read sv_maj at %p", addr); - return (DCMD_ERR); - } - - if (!a_opt && maj->sm_inuse == 0) - return (DCMD_OK); - - mdb_printf("%?p %8T%d\n", addr, maj->sm_inuse); - - if (!v_opt) - return (DCMD_OK); - - /* - * verbose - print the rest of the structure as well. - */ - - mdb_inc_indent(4); - mdb_printf("\n"); - - mdb_printf("dev_ops: %a (%p)\n", maj->sm_dev_ops, maj->sm_dev_ops); - mdb_printf("flag: %08x %8Tsequence: %d %8Tmajor: %d\n", - maj->sm_flag, maj->sm_seq, maj->sm_major); - - mdb_printf("function pointers:\n"); - mdb_inc_indent(4); - mdb_printf("%-20a%-20a%\n%-20a%-20a%\n%-20a%-20a%\n%-20a%-20a%\n", - maj->sm_open, maj->sm_close, - maj->sm_read, maj->sm_write, - maj->sm_aread, maj->sm_awrite, - maj->sm_strategy, maj->sm_ioctl); - mdb_dec_indent(4); - - - mdb_printf("hash chain:\n"); - mdb_inc_indent(4); - for (i = 0; i < SV_MINOR_HASH_CNT; i++) { - mdb_printf("%?p", maj->sm_hash[i]); - mdb_printf(((i % 4) == 3) ? "\n" : " %8T"); - } - mdb_printf("\n\n"); - mdb_dec_indent(4); - mdb_dec_indent(4); - return (DCMD_OK); -} - - -/* - * Display a sv_dev_t hash chain. - * Requires an address. - * Same options as sv_dev(). - */ -static int -sv_hash(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - /* - * paranoid mode on: qualify walker name with module name - * using '`' syntax. - */ - if (mdb_pwalk_dcmd("sv`sv_hash", "sv`sv_dev", argc, argv, addr) == -1) { - mdb_warn("failed to walk sv_dev hash chain"); - return (DCMD_ERR); - } - - return (DCMD_OK); -} - - -/* - * Display a single sv_dev_t structure. - * If called with no address, performs a global walk of all sv_devs. - * -a : all (i.e. display all devices, even if disabled - * -v : verbose - */ - -const mdb_bitmask_t sv_flag_bits[] = { - { "NSC_DEVICE", NSC_DEVICE, NSC_DEVICE }, - { "NSC_CACHE", NSC_CACHE, NSC_CACHE }, - { NULL, 0, 0 } -}; - -static int -sv_dev(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - sv_dev_t *svp; - int a_opt, v_opt; - int dev_t_chars; - - a_opt = v_opt = FALSE; - dev_t_chars = sizeof (dev_t) * 2; /* # chars to display dev_t */ - - if (mdb_getopts(argc, argv, - 'a', MDB_OPT_SETBITS, TRUE, &a_opt, - 'v', MDB_OPT_SETBITS, TRUE, &v_opt) != argc) - return (DCMD_USAGE); - - svp = mdb_zalloc(sizeof (*svp), UM_GC); - - if (!(flags & DCMD_ADDRSPEC)) { - /* - * paranoid mode on: qualify walker name with module name - * using '`' syntax. - */ - if (mdb_walk_dcmd("sv`sv_dev", "sv`sv_dev", argc, argv) == -1) { - mdb_warn("failed to walk 'sv_dev'"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%-?s %8T%-*s %8T%s\n", "ADDR", - dev_t_chars, "DEV", "STATE"); - } - - if (mdb_vread(svp, sizeof (*svp), addr) != sizeof (*svp)) { - mdb_warn("failed to read sv_dev at %p", addr); - return (DCMD_ERR); - } - - if (!a_opt && svp->sv_state == SV_DISABLE) - return (DCMD_OK); - - mdb_printf("%?p %8T%0*lx %8T", addr, dev_t_chars, svp->sv_dev); - - if (svp->sv_state == SV_DISABLE) - mdb_printf("disabled"); - else if (svp->sv_state == SV_PENDING) - mdb_printf("pending"); - else if (svp->sv_state == SV_ENABLE) - mdb_printf("enabled"); - - mdb_printf("\n"); - - if (!v_opt) - return (DCMD_OK); - - /* - * verbose - print the rest of the structure as well. - */ - - mdb_inc_indent(4); - mdb_printf("\n"); - - mdb_printf("hash chain: 0x%p %8Tlock: 0x%p %8Tolock: 0x%p\n", - svp->sv_hash, - addr + OFFSETOF(sv_dev_t, sv_lock), - addr + OFFSETOF(sv_dev_t, sv_olock)); - - mdb_printf("fd: 0x%p %8T\n", svp->sv_fd); - - mdb_printf("maxfbas: %d %8Tnblocks: %d %8Tstate: %d\n", - svp->sv_maxfbas, svp->sv_nblocks, svp->sv_state); - - mdb_printf("gclients: 0x%llx %8Tgkernel: 0x%llx\n", - svp->sv_gclients, svp->sv_gkernel); - - mdb_printf("openlcnt: %d %8Ttimestamp: 0x%lx\n", - svp->sv_openlcnt, svp->sv_timestamp); - - mdb_printf("flags: 0x%08x <%b>\n", - svp->sv_flag, svp->sv_flag, sv_flag_bits); - - mdb_printf("lh: 0x%p %8Tpending: 0x%p\n", - svp->sv_lh, svp->sv_pending); - - mdb_dec_indent(4); - return (DCMD_OK); -} - - -/* - * Display general sv module information. - */ - -#define sv_get_print(kvar, str, fmt, val) \ - if (mdb_readvar(&(val), #kvar) == -1) { \ - mdb_dec_indent(4); \ - mdb_warn("unable to read '" #kvar "'"); \ - return (DCMD_ERR); \ - } \ - mdb_printf("%-20s" fmt "\n", str ":", val) - -/* ARGSUSED */ -static int -sv(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - clock_t clock; - int maj, min, mic, baseline, i; - - if (argc != 0) - return (DCMD_USAGE); - - if (mdb_readvar(&maj, "sv_major_rev") == -1) { - mdb_warn("unable to read 'sv_major_rev'"); - return (DCMD_ERR); - } - - if (mdb_readvar(&min, "sv_minor_rev") == -1) { - mdb_warn("unable to read 'sv_minor_rev'"); - return (DCMD_ERR); - } - - if (mdb_readvar(&mic, "sv_micro_rev") == -1) { - mdb_warn("unable to read 'sv_micro_rev'"); - return (DCMD_ERR); - } - - if (mdb_readvar(&baseline, "sv_baseline_rev") == -1) { - mdb_warn("unable to read 'sv_baseline_rev'"); - return (DCMD_ERR); - } - - mdb_printf("SV module version: kernel %d.%d.%d.%d; mdb %d.%d.%d.%d\n", - maj, min, mic, baseline, - ISS_VERSION_MAJ, ISS_VERSION_MIN, ISS_VERSION_MIC, ISS_VERSION_NUM); - mdb_inc_indent(4); - - sv_get_print(sv_config_time, "last config time", "0x%lx", clock); - sv_get_print(sv_stats_on, "stats on", "%d", i); - sv_get_print(sv_debug, "debug", "%d", i); - sv_get_print(sv_max_devices, "max sv devices", "%d", i); - - mdb_dec_indent(4); - return (DCMD_OK); -} - - -/* - * MDB module linkage information: - */ - -static const mdb_dcmd_t dcmds[] = { - { "sv", NULL, "display sv module info", sv }, - { "sv_dev", "?[-av]", "list sv_dev structure", sv_dev }, - { "sv_gclient", "?", "list sv_gclient structure", sv_gclient }, - { "sv_hash", ":[-av]", "display sv_dev hash chain", sv_hash }, - { "sv_maj", "?[-av]", "list sv_maj structure", sv_maj }, - { NULL } -}; - - -static const mdb_walker_t walkers[] = { - { "sv_dev", "walk array of sv_dev structures", - sv_dev_winit, sv_dev_wstep, sv_dev_wfini }, - { "sv_gclient", "walk sb_gclient chain", - sv_gclient_winit, sv_gclient_wstep, sv_gclient_wfini }, - { "sv_hash", "walk sv_dev hash chain", - sv_hash_winit, sv_hash_wstep, sv_hash_wfini }, - { "sv_maj", "walk array of sv_maj structures", - sv_maj_winit, sv_maj_wstep, sv_maj_wfini }, - { NULL } -}; - - -static const mdb_modinfo_t modinfo = { - MDB_API_VERSION, dcmds, walkers -}; - - -const mdb_modinfo_t * -_mdb_init(void) -{ - return (&modinfo); -} |