summaryrefslogtreecommitdiff
path: root/usr/src/cmd/mdb/common/modules
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/mdb/common/modules')
-rw-r--r--usr/src/cmd/mdb/common/modules/ii/Makefile.com24
-rw-r--r--usr/src/cmd/mdb/common/modules/ii/ii.c427
-rw-r--r--usr/src/cmd/mdb/common/modules/nsctl/Makefile.com24
-rw-r--r--usr/src/cmd/mdb/common/modules/nsctl/nsctl.c2159
-rw-r--r--usr/src/cmd/mdb/common/modules/rdc/Makefile.com24
-rw-r--r--usr/src/cmd/mdb/common/modules/rdc/rdc.c1563
-rw-r--r--usr/src/cmd/mdb/common/modules/sdbc/Makefile.com24
-rw-r--r--usr/src/cmd/mdb/common/modules/sdbc/sdbc.c3158
-rw-r--r--usr/src/cmd/mdb/common/modules/sv/Makefile.com24
-rw-r--r--usr/src/cmd/mdb/common/modules/sv/sv.c624
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(&centry, 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(&centry, 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(&centry, 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(&centry, 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(&centry, 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);
-}