Print this page
3946 ::gcore
Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/cmd/mdb/common/mdb/mdb_modapi.h
+++ new/usr/src/cmd/mdb/common/mdb/mdb_modapi.h
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
↓ open down ↓ |
13 lines elided |
↑ open up ↑ |
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21
22 22 /*
23 23 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
24 - * Copyright (c) 2012 by Delphix. All rights reserved.
24 + * Copyright (c) 2013 by Delphix. All rights reserved.
25 25 * Copyright (c) 2012 Joyent, Inc. All rights reserved.
26 26 */
27 27
28 28 #ifndef _MDB_MODAPI_H
29 29 #define _MDB_MODAPI_H
30 30
31 31 /*
32 32 * MDB Module API
33 33 *
34 34 * The debugger provides a set of interfaces for use in writing loadable
35 35 * debugger modules. Modules that call functions not listed in this header
36 36 * file may not be compatible with future versions of the debugger.
37 37 */
38 38
39 39 #include <sys/types.h>
40 40 #include <gelf.h>
41 41
42 42 #ifdef __cplusplus
43 43 extern "C" {
44 44 #endif
45 45
46 46 /*
47 47 * Make sure that NULL, TRUE, FALSE, MIN, and MAX have the usual definitions
48 48 * so module writers can depend on these macros and defines.
49 49 */
50 50 #ifndef NULL
51 51 #if defined(_LP64) && !defined(__cplusplus)
52 52 #define NULL 0L
53 53 #else
54 54 #define NULL 0
55 55 #endif
56 56 #endif
57 57
58 58 #ifndef TRUE
59 59 #define TRUE 1
60 60 #endif
61 61
62 62 #ifndef FALSE
63 63 #define FALSE 0
64 64 #endif
65 65
66 66 #ifndef MIN
67 67 #define MIN(x, y) ((x) < (y) ? (x) : (y))
68 68 #endif
69 69
70 70 #ifndef MAX
71 71 #define MAX(x, y) ((x) > (y) ? (x) : (y))
72 72 #endif
73 73
74 74 #define MDB_API_VERSION 4 /* Current API version number */
75 75
76 76 /*
77 77 * Debugger command function flags:
78 78 */
79 79 #define DCMD_ADDRSPEC 0x01 /* Dcmd invoked with explicit address */
80 80 #define DCMD_LOOP 0x02 /* Dcmd invoked in loop with ,cnt syntax */
81 81 #define DCMD_LOOPFIRST 0x04 /* Dcmd invoked as first iteration of LOOP */
82 82 #define DCMD_PIPE 0x08 /* Dcmd invoked with input from pipe */
83 83 #define DCMD_PIPE_OUT 0x10 /* Dcmd invoked with output set to pipe */
84 84
85 85 #define DCMD_HDRSPEC(fl) (((fl) & DCMD_LOOPFIRST) || !((fl) & DCMD_LOOP))
86 86
87 87 /*
88 88 * Debugger tab command function flags
89 89 */
90 90 #define DCMD_TAB_SPACE 0x01 /* Tab cb invoked with trailing space */
91 91
92 92 /*
93 93 * Debugger command function return values:
94 94 */
95 95 #define DCMD_OK 0 /* Dcmd completed successfully */
96 96 #define DCMD_ERR 1 /* Dcmd failed due to an error */
97 97 #define DCMD_USAGE 2 /* Dcmd usage error; abort and print usage */
98 98 #define DCMD_NEXT 3 /* Invoke next dcmd in precedence list */
99 99 #define DCMD_ABORT 4 /* Dcmd failed; abort current loop or pipe */
100 100
101 101 #define OFFSETOF(s, m) (size_t)(&(((s *)0)->m))
102 102
103 103 extern int mdb_prop_postmortem; /* Are we looking at a static dump? */
104 104 extern int mdb_prop_kernel; /* Are we looking at a kernel? */
105 105
106 106 typedef enum {
107 107 MDB_TYPE_STRING, /* a_un.a_str is valid */
108 108 MDB_TYPE_IMMEDIATE, /* a_un.a_val is valid */
109 109 MDB_TYPE_CHAR /* a_un.a_char is valid */
110 110 } mdb_type_t;
111 111
112 112 typedef struct mdb_arg {
113 113 mdb_type_t a_type;
114 114 union {
115 115 const char *a_str;
116 116 uintmax_t a_val;
117 117 char a_char;
118 118 } a_un;
119 119 } mdb_arg_t;
120 120
121 121 typedef struct mdb_tab_cookie mdb_tab_cookie_t;
122 122 typedef int mdb_dcmd_f(uintptr_t, uint_t, int, const mdb_arg_t *);
123 123 typedef int mdb_dcmd_tab_f(mdb_tab_cookie_t *, uint_t, int,
124 124 const mdb_arg_t *);
125 125
126 126 typedef struct mdb_dcmd {
127 127 const char *dc_name; /* Command name */
128 128 const char *dc_usage; /* Usage message (optional) */
129 129 const char *dc_descr; /* Description */
130 130 mdb_dcmd_f *dc_funcp; /* Command function */
131 131 void (*dc_help)(void); /* Command help function (or NULL) */
132 132 mdb_dcmd_tab_f *dc_tabp; /* Tab completion function */
133 133 } mdb_dcmd_t;
134 134
135 135 #define WALK_ERR -1 /* Walk fatal error (terminate walk) */
136 136 #define WALK_NEXT 0 /* Walk should continue to next step */
137 137 #define WALK_DONE 1 /* Walk is complete (no errors) */
138 138
139 139 typedef int (*mdb_walk_cb_t)(uintptr_t, const void *, void *);
140 140
141 141 typedef struct mdb_walk_state {
142 142 mdb_walk_cb_t walk_callback; /* Callback to issue */
143 143 void *walk_cbdata; /* Callback private data */
144 144 uintptr_t walk_addr; /* Current address */
145 145 void *walk_data; /* Walk private data */
146 146 void *walk_arg; /* Walk private argument */
147 147 const void *walk_layer; /* Data from underlying layer */
148 148 } mdb_walk_state_t;
149 149
150 150 typedef struct mdb_walker {
151 151 const char *walk_name; /* Walk type name */
152 152 const char *walk_descr; /* Walk description */
153 153 int (*walk_init)(mdb_walk_state_t *); /* Walk constructor */
154 154 int (*walk_step)(mdb_walk_state_t *); /* Walk iterator */
155 155 void (*walk_fini)(mdb_walk_state_t *); /* Walk destructor */
156 156 void *walk_init_arg; /* Walk constructor argument */
157 157 } mdb_walker_t;
158 158
159 159 typedef struct mdb_modinfo {
160 160 ushort_t mi_dvers; /* Debugger version number */
161 161 const mdb_dcmd_t *mi_dcmds; /* NULL-terminated list of dcmds */
162 162 const mdb_walker_t *mi_walkers; /* NULL-terminated list of walks */
163 163 } mdb_modinfo_t;
164 164
165 165 typedef struct mdb_bitmask {
166 166 const char *bm_name; /* String name to print */
167 167 u_longlong_t bm_mask; /* Mask for bits */
168 168 u_longlong_t bm_bits; /* Result required for value & mask */
169 169 } mdb_bitmask_t;
170 170
171 171 typedef struct mdb_pipe {
172 172 uintptr_t *pipe_data; /* Array of pipe values */
173 173 size_t pipe_len; /* Array length */
174 174 } mdb_pipe_t;
175 175
176 176 typedef struct mdb_object {
177 177 const char *obj_name; /* name of object */
178 178 const char *obj_fullname; /* full name of object */
179 179 uintptr_t obj_base; /* base address of object */
180 180 uintptr_t obj_size; /* in memory size of object in bytes */
181 181 } mdb_object_t;
182 182
183 183 typedef struct mdb_symbol {
184 184 const char *sym_name; /* name of symbol */
185 185 const char *sym_object; /* name of containing object */
186 186 const GElf_Sym *sym_sym; /* ELF symbol information */
187 187 uint_t sym_table; /* symbol table id */
188 188 uint_t sym_id; /* symbol identifier */
189 189 } mdb_symbol_t;
190 190
191 191 extern int mdb_pwalk(const char *, mdb_walk_cb_t, void *, uintptr_t);
192 192 extern int mdb_walk(const char *, mdb_walk_cb_t, void *);
193 193
194 194 extern int mdb_pwalk_dcmd(const char *, const char *,
195 195 int, const mdb_arg_t *, uintptr_t);
196 196
197 197 extern int mdb_walk_dcmd(const char *, const char *, int, const mdb_arg_t *);
198 198
199 199 extern int mdb_layered_walk(const char *, mdb_walk_state_t *);
↓ open down ↓ |
165 lines elided |
↑ open up ↑ |
200 200
201 201 extern int mdb_call_dcmd(const char *, uintptr_t,
202 202 uint_t, int, const mdb_arg_t *);
203 203
204 204 extern int mdb_add_walker(const mdb_walker_t *);
205 205 extern int mdb_remove_walker(const char *);
206 206
207 207 extern ssize_t mdb_vread(void *, size_t, uintptr_t);
208 208 extern ssize_t mdb_vwrite(const void *, size_t, uintptr_t);
209 209
210 +extern ssize_t mdb_aread(void *, size_t, uintptr_t, void *);
211 +extern ssize_t mdb_awrite(const void *, size_t, uintptr_t, void *);
212 +
210 213 extern ssize_t mdb_fread(void *, size_t, uintptr_t);
211 214 extern ssize_t mdb_fwrite(const void *, size_t, uintptr_t);
212 215
213 216 extern ssize_t mdb_pread(void *, size_t, uint64_t);
214 217 extern ssize_t mdb_pwrite(const void *, size_t, uint64_t);
215 218
216 219 extern ssize_t mdb_readstr(char *, size_t, uintptr_t);
217 220 extern ssize_t mdb_writestr(const char *, uintptr_t);
218 221
219 222 extern ssize_t mdb_readsym(void *, size_t, const char *);
220 223 extern ssize_t mdb_writesym(const void *, size_t, const char *);
221 224
222 225 extern ssize_t mdb_readvar(void *, const char *);
223 226 extern ssize_t mdb_writevar(const void *, const char *);
224 227
225 228 #define MDB_SYM_NAMLEN 1024 /* Recommended max name len */
226 229
227 230 #define MDB_SYM_FUZZY 0 /* Match closest address */
228 231 #define MDB_SYM_EXACT 1 /* Match exact address only */
229 232
230 233 #define MDB_OBJ_EXEC ((const char *)0L) /* Primary executable file */
231 234 #define MDB_OBJ_RTLD ((const char *)1L) /* Run-time link-editor */
232 235 #define MDB_OBJ_EVERY ((const char *)-1L) /* All known symbols */
233 236
234 237 extern int mdb_lookup_by_name(const char *, GElf_Sym *);
235 238 extern int mdb_lookup_by_obj(const char *, const char *, GElf_Sym *);
236 239 extern int mdb_lookup_by_addr(uintptr_t, uint_t, char *, size_t, GElf_Sym *);
237 240
238 241 typedef uintptr_t mdb_tid_t;
239 242 typedef uint64_t mdb_reg_t;
240 243
241 244 extern int mdb_getareg(mdb_tid_t, const char *, mdb_reg_t *);
242 245
243 246 #define MDB_OPT_SETBITS 1 /* Set specified flag bits */
244 247 #define MDB_OPT_CLRBITS 2 /* Clear specified flag bits */
245 248 #define MDB_OPT_STR 3 /* const char * argument */
246 249 #define MDB_OPT_UINTPTR 4 /* uintptr_t argument */
247 250 #define MDB_OPT_UINT64 5 /* uint64_t argument */
248 251 #define MDB_OPT_UINTPTR_SET 6 /* boolean_t+uintptr_t args */
249 252
250 253 extern int mdb_getopts(int, const mdb_arg_t *, ...);
251 254
252 255 extern u_longlong_t mdb_strtoull(const char *);
253 256
254 257 #define UM_NOSLEEP 0x0 /* Do not call failure handler; may fail */
255 258 #define UM_SLEEP 0x1 /* Can block for memory; will always succeed */
256 259 #define UM_GC 0x2 /* Garbage-collect this block automatically */
257 260
258 261 extern void *mdb_alloc(size_t, uint_t);
259 262 extern void *mdb_zalloc(size_t, uint_t);
260 263 extern void mdb_free(void *, size_t);
261 264
262 265 extern size_t mdb_snprintf(char *, size_t, const char *, ...);
263 266 extern void mdb_printf(const char *, ...);
264 267 extern void mdb_warn(const char *, ...);
265 268 extern void mdb_flush(void);
266 269
267 270 extern int mdb_ffs(uintmax_t);
268 271
269 272 extern void mdb_nhconvert(void *, const void *, size_t);
270 273
271 274 #define MDB_DUMP_RELATIVE 0x0001 /* Start numbering at 0 */
272 275 #define MDB_DUMP_ALIGN 0x0002 /* Enforce paragraph alignment */
273 276 #define MDB_DUMP_PEDANT 0x0004 /* Full-width addresses */
274 277 #define MDB_DUMP_ASCII 0x0008 /* Display ASCII values */
275 278 #define MDB_DUMP_HEADER 0x0010 /* Display a header */
276 279 #define MDB_DUMP_TRIM 0x0020 /* Trim at boundaries */
277 280 #define MDB_DUMP_SQUISH 0x0040 /* Eliminate redundant lines */
278 281 #define MDB_DUMP_NEWDOT 0x0080 /* Update dot when done */
279 282 #define MDB_DUMP_ENDIAN 0x0100 /* Adjust for endianness */
280 283 #define MDB_DUMP_WIDTH(x) ((((x) - 1) & 0xf) << 16) /* paragraphs/line */
281 284 #define MDB_DUMP_GROUP(x) ((((x) - 1) & 0xff) << 20) /* bytes/group */
282 285
283 286 typedef ssize_t (*mdb_dumpptr_cb_t)(void *, size_t, uintptr_t, void *);
284 287 typedef ssize_t (*mdb_dump64_cb_t)(void *, size_t, uint64_t, void *);
285 288
286 289 extern int mdb_dumpptr(uintptr_t, size_t, uint_t, mdb_dumpptr_cb_t, void *);
287 290 extern int mdb_dump64(uint64_t, uint64_t, uint_t, mdb_dump64_cb_t, void *);
288 291
289 292 extern const char *mdb_one_bit(int, int, int);
290 293 extern const char *mdb_inval_bits(int, int, int);
291 294
292 295 extern ulong_t mdb_inc_indent(ulong_t);
293 296 extern ulong_t mdb_dec_indent(ulong_t);
294 297
295 298 extern int mdb_eval(const char *);
296 299 extern void mdb_set_dot(uintmax_t);
297 300 extern uintmax_t mdb_get_dot(void);
298 301
299 302 extern void mdb_get_pipe(mdb_pipe_t *);
300 303 extern void mdb_set_pipe(const mdb_pipe_t *);
301 304
302 305 extern ssize_t mdb_get_xdata(const char *, void *, size_t);
303 306
304 307 typedef int (*mdb_object_cb_t)(mdb_object_t *, void *);
305 308 extern int mdb_object_iter(mdb_object_cb_t, void *);
306 309
307 310 #define MDB_SYMTAB 1 /* Normal symbol table (.symtab) */
308 311 #define MDB_DYNSYM 2 /* Dynamic symbol table (.dynsym) */
309 312
310 313 #define MDB_BIND_LOCAL 0x0001 /* Local (static-scope) symbols */
311 314 #define MDB_BIND_GLOBAL 0x0002 /* Global symbols */
312 315 #define MDB_BIND_WEAK 0x0004 /* Weak binding symbols */
313 316 #define MDB_BIND_ANY 0x0007 /* Any of the above */
314 317
315 318 #define MDB_TYPE_NOTYPE 0x0100 /* Symbol has no type */
316 319 #define MDB_TYPE_OBJECT 0x0200 /* Symbol refers to data */
317 320 #define MDB_TYPE_FUNC 0x0400 /* Symbol refers to text */
318 321 #define MDB_TYPE_SECT 0x0800 /* Symbol refers to a section */
319 322 #define MDB_TYPE_FILE 0x1000 /* Symbol refers to a source file */
320 323 #define MDB_TYPE_COMMON 0x2000 /* Symbol refers to a common block */
321 324 #define MDB_TYPE_TLS 0x4000 /* Symbol refers to TLS */
322 325
323 326 #define MDB_TYPE_ANY 0x7f00 /* Any of the above */
324 327
325 328 typedef int (*mdb_symbol_cb_t)(mdb_symbol_t *, void *);
326 329 extern int mdb_symbol_iter(const char *, uint_t, uint_t, mdb_symbol_cb_t,
327 330 void *);
328 331
329 332 #define MDB_STATE_IDLE 0 /* Target is idle (not running yet) */
330 333 #define MDB_STATE_RUNNING 1 /* Target is currently executing */
331 334 #define MDB_STATE_STOPPED 2 /* Target is stopped */
332 335 #define MDB_STATE_UNDEAD 3 /* Target is undead (zombie) */
333 336 #define MDB_STATE_DEAD 4 /* Target is dead (core dump) */
334 337 #define MDB_STATE_LOST 5 /* Target lost by debugger */
335 338
336 339 extern int mdb_get_state(void);
337 340
338 341 #define MDB_CALLBACK_STCHG 1
339 342 #define MDB_CALLBACK_PROMPT 2
340 343
341 344 typedef void (*mdb_callback_f)(void *);
342 345
343 346 extern void *mdb_callback_add(int, mdb_callback_f, void *);
344 347 extern void mdb_callback_remove(void *);
345 348
346 349 #define MDB_TABC_ALL_TYPES 0x1 /* Include array types in type output */
347 350 #define MDB_TABC_MEMBERS 0x2 /* Tab comp. types with members */
348 351 #define MDB_TABC_NOPOINT 0x4 /* Tab comp. everything but pointers */
349 352 #define MDB_TABC_NOARRAY 0x8 /* Don't include array data in output */
350 353
351 354 /*
352 355 * Module's interaction path
353 356 */
354 357 extern void mdb_tab_insert(mdb_tab_cookie_t *, const char *);
355 358 extern void mdb_tab_setmbase(mdb_tab_cookie_t *, const char *);
356 359
357 360 /*
358 361 * Tab completion utility functions for modules.
359 362 */
360 363 extern int mdb_tab_complete_type(mdb_tab_cookie_t *, const char *, uint_t);
361 364 extern int mdb_tab_complete_member(mdb_tab_cookie_t *, const char *,
362 365 const char *);
363 366 extern int mdb_tab_typename(int *, const mdb_arg_t **, char *buf, size_t len);
364 367
365 368 /*
366 369 * Tab completion functions for common signatures.
367 370 */
368 371 extern int mdb_tab_complete_mt(mdb_tab_cookie_t *, uint_t, int,
369 372 const mdb_arg_t *);
370 373
371 374 extern size_t strlcat(char *, const char *, size_t);
372 375 extern char *strcat(char *, const char *);
373 376 extern char *strcpy(char *, const char *);
374 377 extern char *strncpy(char *, const char *, size_t);
375 378
376 379 /* Need to be consistent with <string.h> C++ definitions */
377 380 #if __cplusplus >= 199711L
378 381 extern const char *strchr(const char *, int);
379 382 #ifndef _STRCHR_INLINE
380 383 #define _STRCHR_INLINE
381 384 extern "C++" {
382 385 inline char *strchr(char *__s, int __c) {
383 386 return (char *)strchr((const char *)__s, __c);
384 387 }
385 388 }
386 389 #endif /* _STRCHR_INLINE */
387 390 extern const char *strrchr(const char *, int);
388 391 #ifndef _STRRCHR_INLINE
389 392 #define _STRRCHR_INLINE
390 393 extern "C++" {
391 394 inline char *strrchr(char *__s, int __c) {
392 395 return (char *)strrchr((const char *)__s, __c);
393 396 }
394 397 }
395 398 #endif /* _STRRCHR_INLINE */
396 399 extern const char *strstr(const char *, const char *);
397 400 #ifndef _STRSTR_INLINE
398 401 #define _STRSTR_INLINE
399 402 extern "C++" {
400 403 inline char *strstr(char *__s1, const char *__s2) {
401 404 return (char *)strstr((const char *)__s1, __s2);
402 405 }
403 406 }
404 407 #endif /* _STRSTR_INLINE */
405 408 #else
406 409 extern char *strchr(const char *, int);
407 410 extern char *strrchr(const char *, int);
408 411 extern char *strstr(const char *, const char *);
409 412 #endif /* __cplusplus >= 199711L */
410 413
411 414 extern int strcmp(const char *, const char *);
412 415 extern int strncmp(const char *, const char *, size_t);
413 416 extern int strcasecmp(const char *, const char *);
414 417 extern int strncasecmp(const char *, const char *, size_t);
415 418
416 419 extern size_t strlen(const char *);
417 420
418 421 extern int bcmp(const void *, const void *, size_t);
419 422 extern void bcopy(const void *, void *, size_t);
420 423 extern void bzero(void *, size_t);
421 424
422 425 extern void *memcpy(void *, const void *, size_t);
423 426 extern void *memmove(void *, const void *, size_t);
424 427 extern int memcmp(const void *, const void *, size_t);
425 428 /* Need to be consistent with <string.h> C++ definitions */
426 429 #if __cplusplus >= 199711L
427 430 extern const void *memchr(const void *, int, size_t);
428 431 #ifndef _MEMCHR_INLINE
429 432 #define _MEMCHR_INLINE
430 433 extern "C++" {
431 434 inline void *memchr(void * __s, int __c, size_t __n) {
432 435 return (void *)memchr((const void *)__s, __c, __n);
433 436 }
434 437 }
435 438 #endif /* _MEMCHR_INLINE */
436 439 #else
437 440 extern void *memchr(const void *, int, size_t);
438 441 #endif /* __cplusplus >= 199711L */
439 442 extern void *memset(void *, int, size_t);
440 443 extern void *memccpy(void *, const void *, int, size_t);
441 444
442 445 extern void *bsearch(const void *, const void *, size_t, size_t,
443 446 int (*)(const void *, const void *));
444 447
445 448 extern void qsort(void *, size_t, size_t,
446 449 int (*)(const void *, const void *));
447 450
448 451 #ifdef __cplusplus
449 452 }
450 453 #endif
451 454
452 455 #endif /* _MDB_MODAPI_H */
↓ open down ↓ |
233 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX