view usr/src/cmd/mdb/common/mdb/mdb_whatis.h @ 14167:7ac6fb740bcf

3946 ::gcore (fix sparc build)
author Christopher Siden <chris.siden@delphix.com>
date Tue, 27 Aug 2013 10:51:34 -0800
parents 218c21980cfd
children
line wrap: on
line source

/*
 * 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 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_MDB_WHATIS_H
#define	_MDB_WHATIS_H

#ifdef	__cplusplus
extern "C" {
#endif

struct mdb_whatis;
typedef struct mdb_whatis mdb_whatis_t;

/*
 * int mdb_whatis_overlaps(mdb_whatis_t *w, uintptr_t base, size_t size):
 *
 * Returns non-zero if and only if a call to
 *
 *	mdb_whatis_match(w, base, size, ...)
 *
 * will succeed;  that is, there is an address of interest in the
 * range [base, base+size).
 */
extern int mdb_whatis_overlaps(mdb_whatis_t *, uintptr_t, size_t);

/*
 * int mdb_whatis_match(mdb_whatis_t *w, uintptr_t base, size_t size,
 *	uintptr_t *out)
 *
 * Perform an iterative search for an address of interest in [base, base+size).
 * Each call returning a non-zero value returns the next interesting address
 * in the range.  This must be called repeatedly until it returns a zero
 * value, indicating that the search is complete.
 *
 * For example:
 *	uintptr_t cur;
 *
 *	while (mdb_whatis_match(w, base, size, &cur))
 *		mdb_whatis_report_object(w, cur, base, "allocated from ...");
 */
extern int mdb_whatis_match(mdb_whatis_t *, uintptr_t, size_t, uintptr_t *);

/*
 * void mdb_whatis_report_address(mdb_whatis_t *w, uintptr_t addr,
 *	uintptr_t base, const char *format, ...)
 *
 * Reports addr (an address from mdb_whatis_match()).  If addr is inside
 * a symbol, that will be reported. (format, ...) is an mdb_printf()
 * format string and associated arguments, and will follow a string like
 * "addr is ".  For example, it could be "in libfoo's text segment\n":
 *
 *	addr is in libfoo's text segment
 *
 * The caller should make sure to output a newline, either in format or in a
 * separate mdb_printf() call.
 */
extern void mdb_whatis_report_address(mdb_whatis_t *, uintptr_t,
    const char *, ...);

/*
 * void mdb_whatis_report_object(mdb_whatis_t *w, uintptr_t addr,
 *	uintptr_t base, const char *format, ...)
 *
 * Reports addr (an address from mdb_whatis_match()) as being part of an
 * object beginning at base.  (format, ...) is an mdb_printf() format
 * string and associated arguments, and will follow a string like
 * "addr is base+offset, ".  For example, it could be "allocated from foo\n":
 *
 *	addr is base+offset, allocated from foo
 *
 * The caller should make sure to output a newline, either in format or in a
 * separate mdb_printf() call.
 */
extern void mdb_whatis_report_object(mdb_whatis_t *, uintptr_t, uintptr_t,
    const char *, ...);

/*
 * uint_t mdb_whatis_flags(mdb_whatis_t *w)
 *
 * Reports which flags were passed to ::whatis.  See the flag definitions
 * for more details.
 */
extern uint_t mdb_whatis_flags(mdb_whatis_t *);

#define	WHATIS_BUFCTL	0x1	/* -b, the caller requested bufctls */
#define	WHATIS_IDSPACE 	0x2	/* -i, only search identifiers */
#define	WHATIS_QUIET	0x4	/* -q, single-line reports only */
#define	WHATIS_VERBOSE	0x8	/* -v, report information about the search */

/*
 * uint_t mdb_whatis_done(mdb_whatis_t *w)
 *
 * Returns non-zero if and only if all addresses have been reported, and it
 * is time to get out of the callback as quickly as possible.
 */
extern uint_t mdb_whatis_done(mdb_whatis_t *);

/* Macro for returning from a walker callback */
#define	WHATIS_WALKRET(w)	(mdb_whatis_done(w) ? WALK_DONE : WALK_NEXT)

typedef int mdb_whatis_cb_f(mdb_whatis_t *, void *);

/*
 * void mdb_whatis_register(const char *name, mdb_whatis_cb_f *cb, void *arg,
 *	uint_t prio, uint_t flags)
 *
 * May only be called from _mdb_init() for a module.
 *
 * Registers a whatis callback named "name" (which must be an MDB identifier),
 * with a callback function cb and argument arg.  prio determines when the
 * callback will be invoked, compared to other registered ones, and flags
 * determines when the callback will be invoked (see below).
 *
 * Callbacks with the same priority registered by the same module will be
 * executed in the order they were added.  The callbacks will be invoked as:
 *
 *	int ret = (*cb)(w, arg)
 *
 * Where w is an opaque mdb_whatis_t pointer which is to be passed to the API
 * routines, above.  The function should return 0 unless an error occurs.
 */
extern void mdb_whatis_register(const char *,
    mdb_whatis_cb_f *, void *, uint_t, uint_t);

#define	WHATIS_PRIO_EARLY	10	/* execute before allocator callbacks */
#define	WHATIS_PRIO_ALLOCATOR	20
#define	WHATIS_PRIO_LATE	30	/* execute after allocator callbacks */

#define	WHATIS_REG_ID_ONLY	0x1	/* only invoke for '-i' */
#define	WHATIS_REG_NO_ID	0x2	/* don't invoke for '-i' */

#ifdef	__cplusplus
}
#endif

#endif	/* _MDB_WHATIS_H */