mdb_ks.c revision f4da9be01648d6afa604495d9b9956dddeb92a8c
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * CDDL HEADER START
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * The contents of this file are subject to the terms of the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Common Development and Distribution License (the "License").
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * You may not use this file except in compliance with the License.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * or http://www.opensolaris.org/os/licensing.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * See the License for the specific language governing permissions
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * and limitations under the License.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * When distributing Covered Code, include this CDDL HEADER in each
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * If applicable, add the following below this CDDL HEADER, with the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * fields enclosed by brackets "[]" replaced with your own identifying
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * information: Portions Copyright [yyyy] [name of copyright owner]
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * CDDL HEADER END
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Use is subject to license terms.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#pragma ident "%Z%%M% %I% %E% SMI"
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Mdb kernel support module. This module is loaded automatically when the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * kvm target is initialized. Any global functions declared here are exported
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * for the resolution of symbols in subsequently loaded modules.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * WARNING: Do not assume that static variables in mdb_ks will be initialized
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#define MDB_PATH_NELEM 256 /* Maximum path components */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef struct mdb_path {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail size_t mdp_nelem; /* Number of components */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t mdp_complete; /* Path completely resolved? */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uintptr_t mdp_vnode[MDB_PATH_NELEM]; /* Array of vnode_t addresses */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *mdp_name[MDB_PATH_NELEM]; /* Array of name components */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic int mdb_autonode2path(uintptr_t, mdb_path_t *);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic int mdb_sprintpath(char *, size_t, mdb_path_t *);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Kernel parameters from <sys/param.h> which we keep in-core:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailunsigned long long _mdb_ks_pagemask;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * In-core copy of DNLC information:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#define MDB_DNLC_HASH(vp) (((uintptr_t)(vp) >> 3) & (MDB_DNLC_HSIZE - 1))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#define MDB_DNLC_NCACHE_SZ(ncp) (sizeof (ncache_t) + (ncp)->namlen)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic ncache_t **dnlc_hash; /* mdbs hash array of dnlc entries */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * This will be the location of the vnodeops pointer for "autofs_vnodeops"
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * The pointer still needs to be read with mdb_vread() to get the location
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * of the vnodeops structure for autofs.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * STREAMS queue registrations:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef struct mdb_qinfo {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail const mdb_qops_t *qi_ops; /* Address of ops vector */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uintptr_t qi_addr; /* Address of qinit structure (key) */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail struct mdb_qinfo *qi_next; /* Next qinfo in list */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic mdb_qinfo_t *qi_head; /* Head of qinfo chain */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Device naming callback structure:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef struct nm_query {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail const char *nm_name; /* Device driver name [in/out] */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail major_t nm_major; /* Device major number [in/out] */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ushort_t nm_found; /* Did we find a match? [out] */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Address-to-modctl callback structure:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef struct a2m_query {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uintptr_t a2m_addr; /* Virtual address [in] */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uintptr_t a2m_where; /* Modctl address [out] */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Segment-to-mdb_map callback structure:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef struct {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail struct seg_ops *asm_segvn_ops; /* Address of segvn ops [in] */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void (*asm_callback)(const struct mdb_map *, void *); /* Callb [in] */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void *asm_cbdata; /* Callback data [in] */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Free up current dnlc entries
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (i = 0; i < MDB_DNLC_HSIZE; i++) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (ncp = dnlc_hash[i]; ncp; ncp = next) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_free(dnlc_hash, MDB_DNLC_HSIZE * sizeof (ncache_t *));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailchar bad_dnlc[] = "inconsistent dnlc chain: %d, ncache va: %p"
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail " - continuing with the rest\n";
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int i; /* hash index */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int nc_hashsz; /* kernel hash array size */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uintptr_t nc_hash_addr; /* kernel va of ncache hash array */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uintptr_t head; /* kernel va of head of hash chain */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * If we've already cached the DNLC and we're looking at a dump,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * our cache is good forever, so don't bother re-loading.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * For a core dump, retries wont help.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Just print and skip any bad chains.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Give up retrying the rapidly changing dnlc.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Just print and skip any bad chains
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail dnlc_free(); /* Free up the mdb hashed dnlc - if any */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Although nc_hashsz and the location of nc_hash doesn't currently
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * change, it may do in the future with a more dynamic dnlc.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * So always read these values afresh.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_readvar(&nc_hashsz, "nc_hashsz") == -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_readvar(&nc_hash_addr, "nc_hash") == -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Allocate the mdb dnlc hash array
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail dnlc_hash = mdb_zalloc(MDB_DNLC_HSIZE * sizeof (ncache_t *), UM_SLEEP);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* for each kernel hash chain */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (i = 0, head = nc_hash_addr; i < nc_hashsz;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nc_hash_t nch; /* kernel hash chain header */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uintptr_t nc_va; /* kernel va of next ncache */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uintptr_t ncprev_va; /* kernel va of previous ncache */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int nc_size; /* size of a name cache entry */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * We read each element of the nc_hash array individually
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * just before we process the entries in its chain. This is
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * because the chain can change so rapidly on a running system.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&nch, sizeof (nc_hash_t), head) == -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_warn("failed to read nc_hash chain header %d", i);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* for each entry in the chain */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * The size of the ncache entries varies
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * because the name is appended to the structure.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * So we read in the structure then re-read
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * for the structure plus name.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&nc, sizeof (ncache_t), nc_va) == -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(ncp, nc_size - 1, nc_va) == -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Check for chain consistency
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((uintptr_t)ncp->hash_prev != ncprev_va) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Terminate the new name with a null.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Note, we allowed space for this null when
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * allocating space for the entry.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Validate new entry by re-hashing using the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * kernel dnlc hash function and comparing the hash
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail DNLCHASH(ncp->name, ncp->dp, khash, namelen);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Finally put the validated entry into the mdb
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * hash chains. Reuse the kernel next hash field
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * for the mdb hash chain pointer.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildnlcdump(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_printf("%<u>%-?s %-?s %-32s%</u>\n", "VP", "DVP", "NAME");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (i = 0; i < MDB_DNLC_HSIZE; i++) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (ent = dnlc_hash[i]; ent != NULL; ent = ent->hash_next) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailmdb_sprintpath(char *buf, size_t len, mdb_path_t *path)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (i = path->mdp_nelem - 1; i >= 0; i--) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Number of bytes left is the distance from where we
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * are to the end, minus 2 for '/' and '\0'
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ssize_t left = (ssize_t)(&buf[len] - s) - 2;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) strncpy(s, path->mdp_name[i], left);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailmdb_autonode2path(uintptr_t addr, mdb_path_t *path)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * "autofs_vnops_ptr" is the address of the pointer to the vnodeops
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * structure for autofs. We want to read it each time we access
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * it since autofs could (in theory) be unloaded and reloaded.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&autofs_vnops, sizeof (autofs_vnops),
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&vn, sizeof (vn), addr) == -1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (autofs_vnops == NULL || vn.v_op != autofs_vnops)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&vfs, sizeof (vfs), (uintptr_t)vn.v_vfsp) == -1 ||
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_vread(&fni, sizeof (fni), (uintptr_t)vfs.vfs_data) == -1 ||
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_vread(&vn, sizeof (vn), (uintptr_t)fni.fi_rootvp) == -1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&fn, sizeof (fn), addr) != sizeof (fn)) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_readstr(elemstr, sizeof (elemstr),
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail c = mdb_alloc(strlen(elemstr) + 1, UM_SLEEP | UM_GC);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail path->mdp_vnode[elem] = (uintptr_t)fn.fn_vnode;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailmdb_vnode2path(uintptr_t addr, char *buf, size_t buflen)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Check to see if we have a cached value for this vnode
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&vp, sizeof (vp), addr) != -1 &&
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_readstr(buf, buflen, (uintptr_t)vp.v_path) != -1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_readvar(&rootdir, "rootdir") == -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((addr == NULL) && (path.mdp_nelem == 0)) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * 0 elems && complete tells sprintpath to just print "/"
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (ent = dnlc_hash[MDB_DNLC_HASH(addr)]; ent; ent = ent->hash_next) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail path.mdp_vnode[path.mdp_nelem] = (uintptr_t)ent->vp;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail path.mdp_name[path.mdp_nelem] = ent->name;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_warn("path exceeded maximum expected "
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "elements\n");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (mdb_sprintpath(buf, buflen, &path));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_readvar(&pidhash, "pidhash") == -1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_readvar(&pid_hashsz, "pid_hashsz") == -1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_readvar(&procdir, "procdir") == -1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while (paddr != 0) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&pidp, sizeof (pidp), paddr) == -1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&procp, sizeof (procp), procdir +
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (pidp.pid_prslot * sizeof (procp))) == -1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) mdb_vread(proc, sizeof (proc_t), procp);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&cpu, sizeof (cpu_t), cpup) != sizeof (cpu_t))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (i = 0; i < nr_words; i++) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (j = 0, m = 1; j < BT_NBIPUL; j++, m <<= 1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailmdb_vnode2page(uintptr_t vp, uintptr_t offset)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_readvar(&page_hashsz, "page_hashsz") == -1 ||
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_readvar(&page_hash, "page_hash") == -1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail static const char vttab[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (type < 0 || type >= sizeof (vttab) / sizeof (vttab[0]))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaila2m_walk_modctl(uintptr_t addr, const struct modctl *m, a2m_query_t *a2m)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&mod, sizeof (mod), (uintptr_t)m->mod_mp) == -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_warn("couldn't read modctl %p's module", addr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (a2m->a2m_addr >= (uintptr_t)mod.text &&
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail a2m->a2m_addr < (uintptr_t)mod.text + mod.text_size)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (a2m->a2m_addr >= (uintptr_t)mod.data &&
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail a2m->a2m_addr < (uintptr_t)mod.data + mod.data_size)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) mdb_walk("modctl", (mdb_walk_cb_t)a2m_walk_modctl, &a2m);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (qip = qi_head; qip != NULL; qip = qip->qi_next) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailmdb_qops_install(const mdb_qops_t *qops, uintptr_t qinit_addr)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail qip = mdb_alloc(sizeof (mdb_qinfo_t), UM_SLEEP);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailmdb_qops_remove(const mdb_qops_t *qops, uintptr_t qinit_addr)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (qip = qi_head; qip != NULL; p = qip, qip = qip->qi_next) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (qip->qi_addr == qinit_addr && qip->qi_ops == qops) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailmdb_qname(const queue_t *q, char *buf, size_t nbytes)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&qi, sizeof (qi), (uintptr_t)q->q_qinfo) == -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_warn("failed to read qinit at %p", q->q_qinfo);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_vread(&mi, sizeof (mi), (uintptr_t)qi.qi_minfo) == -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_warn("failed to read module_info at %p", qi.qi_minfo);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (mdb_readstr(buf, nbytes, (uintptr_t)mi.mi_idname) <= 0) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_warn("failed to read mi_idname at %p", mi.mi_idname);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailmdb_qinfo(const queue_t *q, char *buf, size_t nbytes)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_qinfo_t *qip = qi_lookup((uintptr_t)q->q_qinfo);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mdb_qinfo_t *qip = qi_lookup((uintptr_t)q->q_qinfo);
return (NULL);
* The following three routines borrowed from modsubr.c
int hash = 0;
hash ^= c;
static uintptr_t
int hashndx;
while (mb) {
return (NULL);
return (NULL);
return (mb);
return (NULL);
return (NULL);
return (NULL);
return ((const char *)name);
const char *namestr;
void *statep;
{ NULL }
const mdb_modinfo_t *
_mdb_init(void)
return (&modinfo);
_mdb_fini(void)
dnlc_free();
proc_t p;
return (NULL);
proc_t p;
switch (p.p_model) {
case DATAMODEL_ILP32:
return (PR_MODEL_ILP32);
case DATAMODEL_LP64:
return (PR_MODEL_LP64);
return (PR_MODEL_UNKNOWN);
MDB_TGT_MAPSZ) != 0) {
return (WALK_NEXT);
proc_t p;
return (__KERN_NAUXV_IMPL);
proc_t p;
int expcont = 0;
int actcont;
goto kthreadpanic_err;
goto kthreadpanic_err;
goto kthreadpanic_err;
mdb_dump_find_curproc(void)
pid > 0)
return (pid);
* Following three funcs extracted from sunddi.c
static uintptr_t
mdb_ddi_root_node(void)
return (NULL);
return (top_devinfo_addr);
return (NULL);
return (name);
return (NULL);
return (NULL);
return (name);
return (NULL);
return (name);
char *bp;
return (path);
return (path);
int count;
count++;
return (count);
int slen;
if (--alen == 0)
switch (prim) {
default: return (NULL);