summaryrefslogtreecommitdiff
path: root/usr/src/cmd/mdb/common/mdb/mdb.h
blob: 7f712ad340520d221f13ad02a8cc16fe9d07980c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
/*
 * 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.
 */

/*
 * Copyright (c) 2012 by Delphix. All rights reserved.
 * Copyright (c) 2012 Joyent, Inc. All rights reserved.
 */

#ifndef	_MDB_H
#define	_MDB_H

#include <mdb/mdb_nv.h>
#include <mdb/mdb_io.h>
#include <mdb/mdb_gelf.h>
#include <mdb/mdb_addrvec.h>
#include <mdb/mdb_argvec.h>
#include <mdb/mdb_target.h>
#include <mdb/mdb_disasm.h>
#include <mdb/mdb_demangle.h>
#include <mdb/mdb_module.h>
#include <mdb/mdb_modapi.h>
#include <mdb/mdb_list.h>
#include <mdb/mdb_vcb.h>
#include <mdb/mdb_ctf.h>
#include <mdb/mdb_tab.h>
#ifdef _KMDB
#include <kmdb/kmdb_wr.h>
#endif

#ifdef	__cplusplus
extern "C" {
#endif

#define	MDB_ERR_PARSE	1	/* Error occurred in lexer or parser */
#define	MDB_ERR_NOMEM	2	/* Failed to allocate needed memory */
#define	MDB_ERR_PAGER	3	/* User quit current command from pager */
#define	MDB_ERR_SIGINT	4	/* User interrupt: abort current command */
#define	MDB_ERR_QUIT	5	/* User request: quit debugger */
#define	MDB_ERR_ASSERT	6	/* Assertion failure: abort current command */
#define	MDB_ERR_API	7	/* API function error: abort current command */
#define	MDB_ERR_ABORT	8	/* User abort or resume: abort to top level */
#define	MDB_ERR_OUTPUT	9	/* Write to m_out failed: abort to top level */

#define	MDB_ERR_IS_FATAL(err)	\
	((err) == MDB_ERR_QUIT || (err) == MDB_ERR_ABORT || \
	(err) == MDB_ERR_OUTPUT)

#define	MDB_DEF_RADIX	16	/* Default output radix */
#define	MDB_DEF_NARGS	6	/* Default # of arguments in stack trace */
#define	MDB_DEF_HISTLEN	128	/* Default length of command history */
#define	MDB_DEF_SYMDIST	0x8000	/* Default symbol distance for addresses */
#define	MDB_DEF_ARRMEM	32	/* Default number of array members to print */
#define	MDB_DEF_ARRSTR	1024	/* Default number of array chars to print */

#define	MDB_ARR_NOLIMIT	-1UL	/* No limit on number of array elements */

#define	MDB_FL_PSYM	0x00001	/* Print dot as symbol + offset when possible */
#define	MDB_FL_LOG	0x00002	/* Logging is enabled */
#define	MDB_FL_NOMODS	0x00004	/* Skip automatic mdb module loading */
#define	MDB_FL_USECUP	0x00008	/* Use terminal cup initialization sequences */
#define	MDB_FL_ADB	0x00010	/* Enable stricter adb(1) compatibility */
#define	MDB_FL_SHOWLMID	0x00020	/* Always show link map id with symbol names */
#define	MDB_FL_IGNEOF	0x00040	/* Ignore EOF as a synonym for ::quit */
#define	MDB_FL_REPLAST	0x00080	/* Naked newline repeats previous command */
#define	MDB_FL_PAGER	0x00100	/* Enable pager by default */
#define	MDB_FL_LATEST	0x00200	/* Replace version string with "latest" */
#define	MDB_FL_VCREATE	0x00400	/* Victim process was created by debugger */
#define	MDB_FL_JOBCTL	0x00800	/* Victim process jobctl stopped on same tty */
#define	MDB_FL_DEMANGLE	0x01000	/* Demangle symbols as part of %a processing */
#define	MDB_FL_EXEC	0x02000	/* Debugger exec'd by a previous instance */
#define	MDB_FL_NOCTF	0x04000	/* Skip automatic CTF data loading */
#define	MDB_FL_BPTNOSYMSTOP 0x08000 /* Stop on deferred bkpts for unk symbols */
#define	MDB_FL_TERMGUESS 0x10000 /* m_termtype derived from userland */
#define	MDB_FL_READBACK	0x20000	/* Read value back after write */
#ifdef _KMDB
#define	MDB_FL_NOUNLOAD	0x40000	/* Don't allow debugger unload */
#endif
#define	MDB_FL_LMRAW	0x80000	/* Show unresolved link map object names */

#define	MDB_FL_VOLATILE	0x0001	/* Mask of all volatile flags to save/restore */

#define	MDB_EM_ASK	0	/* Ask what to do on an exec */
#define	MDB_EM_STOP	1	/* Stop after an exec */
#define	MDB_EM_FOLLOW	2	/* Follow an exec */

#define	MDB_FM_ASK	0	/* Ask what to do on a fork */
#define	MDB_FM_PARENT	1	/* Follow parent process on a fork */
#define	MDB_FM_CHILD	2	/* Follow child process on a fork */

#define	MDB_PROMPTLEN	35	/* Maximum prompt length */

struct kmdb_promif;

typedef struct mdb {
	uint_t m_tgtflags;	/* Target open flags (see mdb_target.h) */
	uint_t m_flags;		/* Miscellaneous flags (see above) */
	uint_t m_debug;		/* Debugging flags (see mdb_debug.h) */
	int m_radix;		/* Default radix for output formatting */
	int m_nargs;		/* Default number of arguments in stack trace */
	int m_histlen;		/* Length of command history */
	size_t m_symdist;	/* Distance from sym for addr match (0=smart) */
	const char *m_pname;	/* Program basename from argv[0] */
	char m_promptraw[MDB_PROMPTLEN + 1]; /* Un-expanded prompt */
	char m_prompt[MDB_PROMPTLEN + 1]; /* Prompt for interactive mode */
	size_t m_promptlen;	/* Length of prompt in bytes */
	const char *m_shell;	/* Shell for ! commands and pipelines */
	char *m_root;		/* Root for path construction */
	char *m_ipathstr;	/* Path string for include path */
	char *m_lpathstr;	/* Path string for library path */
	const char **m_ipath;	/* Path for $< and $<< macro files */
	size_t m_ipathlen;	/* Length of underlying ipath buffer */
	const char **m_lpath;	/* Path for :: loadable modules */
	size_t m_lpathlen;	/* Length of underlying lpath buffer */
	mdb_modinfo_t m_rminfo;	/* Root debugger module information */
	mdb_module_t m_rmod;	/* Root debugger module (builtins) */
	mdb_module_t *m_mhead;	/* Head of module list (in load order) */
	mdb_module_t *m_mtail;	/* Tail of module list (in load order) */
	mdb_list_t m_tgtlist;	/* List of active target backends */
	mdb_tgt_t *m_target;	/* Current debugger target backend */
	mdb_nv_t m_disasms;	/* Hash of available disassemblers */
	mdb_disasm_t *m_disasm;	/* Current disassembler backend */
	char *m_defdisasm;	/* Deferred diassembler selection */
	mdb_nv_t m_modules;	/* Name/value hash for loadable modules */
	mdb_nv_t m_dcmds;	/* Name/value hash for extended commands */
	mdb_nv_t m_walkers;	/* Name/value hash for walk operations */
	mdb_nv_t m_nv;		/* Name/value hash for named variables */
	mdb_var_t *m_dot;	/* Variable reference for '.' */
	uintmax_t m_incr;	/* Current increment */
	uintmax_t m_raddr;	/* Most recent address specified to a dcmd */
	uintmax_t m_dcount;	/* Most recent count specified to a dcmd */
	mdb_var_t *m_rvalue;	/* Most recent value printed */
	mdb_var_t *m_roffset;	/* Most recent offset from an instruction */
	mdb_var_t *m_proffset;	/* Previous value of m_roffset */
	mdb_var_t *m_rcount;	/* Most recent count on $< dcmd */
	mdb_iob_t *m_in;	/* Input stream */
	mdb_iob_t *m_out;	/* Output stream */
	mdb_iob_t *m_err;	/* Error stream */
	mdb_iob_t *m_null;	/* Null stream */
	char *m_termtype;	/* Interactive mode terminal type */
	mdb_io_t *m_term;	/* Terminal for interactive mode */
	mdb_io_t *m_log;	/* Log file i/o backend (NULL if not logging) */
	mdb_module_t *m_lmod;	/* Pointer to loading module, if in load */
	mdb_list_t m_lastc;	/* Last executed command list */
	mdb_gelf_symtab_t *m_prsym;   /* Private symbol table */
	mdb_demangler_t *m_demangler; /* Demangler (see <mdb/mdb_demangle.h>) */
	mdb_list_t m_flist;	/* Stack of execution frames */
	struct mdb_frame *volatile m_frame; /* Current stack frame */
	struct mdb_frame *volatile m_fmark; /* Stack marker for pager */
	uint_t m_fid;		/* Next frame identifier number to assign */
	uint_t m_depth;		/* Depth of m_frame stack */
	volatile uint_t m_intr;	/* Don't allow SIGINT if set */
	volatile uint_t m_pend;	/* Pending SIGINT count */
	pid_t m_pgid;		/* Debugger process group id */
	uint_t m_rdvers;	/* Librtld_db version number */
	uint_t m_ctfvers;	/* Libctf version number */
	ulong_t m_armemlim;	/* Limit on number of array members to print */
	ulong_t m_arstrlim;	/* Limit on number of array chars to print */
	uchar_t m_execmode;	/* Follow exec behavior */
	uchar_t m_forkmode;	/* Follow fork behavior */
	char **m_env;		/* Current environment */
	mdb_list_t m_cblist;	/* List of callbacks */
	mdb_nv_t m_macaliases;	/* Name/value hash of ADB macro aliases */
	ctf_file_t *m_synth;	/* Container for synthetic types */
	int m_lastret;		/* Result of running the last command */
#ifdef _KMDB
	struct dpi_ops *m_dpi;	/* DPI ops vector */
	struct kdi *m_kdi;	/* KDI ops vector */
	size_t m_pagesize;	/* Base page size for this machine */
	caddr_t m_dseg;		/* Debugger segment address */
	size_t m_dsegsz;	/* Debugger segment size */
	mdb_nv_t m_dmodctl;	/* dmod name -> kmdb_modctl hash */
	kmdb_wr_t *m_drvwrhead;	/* Driver work request queue */
	kmdb_wr_t *m_drvwrtail;	/* Driver work request queue */
	kmdb_wr_t *m_dbgwrhead;	/* Debugger request queue */
	kmdb_wr_t *m_dbgwrtail;	/* Debugger request queue */
	struct cons_polledio *m_pio; /* Polled I/O struct from kernel */
	struct kmdb_promif *m_promif; /* Debugger/PROM interface state */
#endif
} mdb_t;

#ifdef _MDB_PRIVATE
mdb_t mdb;
#else
extern mdb_t mdb;
#endif

#ifdef _MDB

#define	MDB_CONFIG_ENV_VAR "_MDB_CONFIG"

extern void mdb_create(const char *, const char *);
extern void mdb_destroy(void);

extern int mdb_call_idcmd(mdb_idcmd_t *, uintmax_t, uintmax_t, uint_t,
    mdb_argvec_t *, mdb_addrvec_t *, mdb_vcb_t *);
extern void mdb_call_tab(mdb_idcmd_t *, mdb_tab_cookie_t *, uint_t, uintmax_t,
    mdb_arg_t *);

extern int mdb_call(uintmax_t, uintmax_t, uint_t);
extern int mdb_run(void);

extern const char *mdb_get_prompt(void);
extern int mdb_set_prompt(const char *);
extern void mdb_set_ipath(const char *);
extern void mdb_set_lpath(const char *);

extern const char **mdb_path_alloc(const char *, size_t *);
extern const char **mdb_path_dup(const char *[], size_t, size_t *);
extern void mdb_path_free(const char *[], size_t);

extern uintmax_t mdb_dot_incr(const char *);
extern uintmax_t mdb_dot_decr(const char *);

extern mdb_iwalker_t *mdb_walker_lookup(const char *);
extern mdb_idcmd_t *mdb_dcmd_lookup(const char *);
extern void mdb_dcmd_usage(const mdb_idcmd_t *, mdb_iob_t *);

extern void mdb_pservice_init(void);

extern void mdb_intr_enable(void);
extern void mdb_intr_disable(void);

extern char *mdb_get_config(void);
extern void mdb_set_config(const char *);

extern mdb_module_t *mdb_get_module(void);

#endif /* _MDB */

#ifdef	__cplusplus
}
#endif

#endif	/* _MDB_H */