| /* |
| * 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 */ |