1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 *
26 * Copyright 2018 Joyent, Inc.
27 */
28
29#ifndef	_MDB_TARGET_H
30#define	_MDB_TARGET_H
31
32#include <sys/utsname.h>
33#include <sys/types.h>
34#include <gelf.h>
35
36#ifdef	__cplusplus
37extern "C" {
38#endif
39
40/*
41 * Forward declaration of the target structure: the target itself is defined in
42 * mdb_tgt_impl.h and is opaque with respect to callers of this interface.
43 */
44
45struct mdb_tgt;
46struct mdb_arg;
47struct ctf_file;
48
49typedef struct mdb_tgt mdb_tgt_t;
50
51extern void mdb_create_builtin_tgts(void);
52extern void mdb_create_loadable_disasms(void);
53
54/*
55 * Target Constructors
56 *
57 * These functions are used to create a complete debugger target.  The
58 * constructor is passed as an argument to mdb_tgt_create().
59 */
60
61extern int mdb_value_tgt_create(mdb_tgt_t *, int, const char *[]);
62#ifndef _KMDB
63extern int mdb_kvm_tgt_create(mdb_tgt_t *, int, const char *[]);
64extern int mdb_proc_tgt_create(mdb_tgt_t *, int, const char *[]);
65extern int mdb_kproc_tgt_create(mdb_tgt_t *, int, const char *[]);
66extern int mdb_rawfile_tgt_create(mdb_tgt_t *, int, const char *[]);
67#ifdef __amd64
68extern int mdb_bhyve_tgt_create(mdb_tgt_t *, int, const char *[]);
69#endif
70#else
71extern int kmdb_kvm_create(mdb_tgt_t *, int, const char *[]);
72#endif
73
74/*
75 * Targets are created by calling mdb_tgt_create() with an optional set of
76 * target flags, an argument list, and a target constructor (see above):
77 */
78
79#define	MDB_TGT_F_RDWR		0x0001	/* Open for writing (else read-only) */
80#define	MDB_TGT_F_ALLOWIO	0x0002	/* Allow I/O mem access (live only) */
81#define	MDB_TGT_F_FORCE		0x0004	/* Force open (even if non-exclusive) */
82#define	MDB_TGT_F_PRELOAD	0x0008	/* Preload all symbol tables */
83#define	MDB_TGT_F_NOLOAD	0x0010	/* Do not do load-object processing */
84#define	MDB_TGT_F_NOSTOP	0x0020	/* Do not stop target on attach */
85#define	MDB_TGT_F_STEP		0x0040	/* Single-step is pending */
86#define	MDB_TGT_F_STEP_OUT	0x0080	/* Step-out is pending */
87#define	MDB_TGT_F_NEXT		0x0100	/* Step-over is pending */
88#define	MDB_TGT_F_CONT		0x0200	/* Continue is pending */
89#define	MDB_TGT_F_BUSY		0x0400	/* Target is busy executing */
90#define	MDB_TGT_F_ASIO		0x0800	/* Use t_aread and t_awrite for i/o */
91#define	MDB_TGT_F_UNLOAD	0x1000	/* Unload has been requested */
92#define	MDB_TGT_F_ALL		0x1fff	/* Mask of all valid flags */
93
94typedef int mdb_tgt_ctor_f(mdb_tgt_t *, int, const char *[]);
95
96extern mdb_tgt_t *mdb_tgt_create(mdb_tgt_ctor_f *, int, int, const char *[]);
97extern void mdb_tgt_destroy(mdb_tgt_t *);
98
99extern int mdb_tgt_getflags(mdb_tgt_t *);
100extern int mdb_tgt_setflags(mdb_tgt_t *, int);
101extern int mdb_tgt_setcontext(mdb_tgt_t *, void *);
102
103/*
104 * Targets are activated and de-activated by the debugger framework.  An
105 * activation occurs after construction when the target becomes the current
106 * target in the debugger.  A target is de-activated prior to its destructor
107 * being called by mdb_tgt_destroy, or when another target is activated.
108 * These callbacks are suitable for loading support modules and other tasks.
109 */
110extern void mdb_tgt_activate(mdb_tgt_t *);
111
112/*
113 * Prior to issuing a new command prompt, the debugger framework calls the
114 * target's periodic callback to allow it to load new modules or perform
115 * other background tasks.
116 */
117extern void mdb_tgt_periodic(mdb_tgt_t *);
118
119/*
120 * Convenience functions for accessing miscellaneous target information.
121 */
122extern const char *mdb_tgt_name(mdb_tgt_t *);
123extern const char *mdb_tgt_isa(mdb_tgt_t *);
124extern const char *mdb_tgt_platform(mdb_tgt_t *);
125extern int mdb_tgt_uname(mdb_tgt_t *, struct utsname *);
126extern int mdb_tgt_dmodel(mdb_tgt_t *);
127
128/*
129 * Address Space Interface
130 *
131 * Each target can provide access to a set of address spaces, which may include
132 * a primary virtual address space, a physical address space, an object file
133 * address space (where virtual addresses are converted to file offsets in an
134 * object file), and an I/O port address space.  Additionally, the target can
135 * provide access to alternate address spaces, which are identified by the
136 * opaque mdb_tgt_as_t type.  If the 'as' parameter to mdb_tgt_aread or
137 * mdb_tgt_awrite is one of the listed constants, these calls are equivalent
138 * to mdb_tgt_{v|p|f|io}read or write.
139 */
140
141typedef void *		mdb_tgt_as_t;		/* Opaque address space id */
142typedef uint64_t	mdb_tgt_addr_t;		/* Generic unsigned address */
143typedef uint64_t	physaddr_t;		/* Physical memory address */
144
145#define	MDB_TGT_AS_VIRT	((mdb_tgt_as_t)-1L)	/* Virtual address space: */
146#define	MDB_TGT_AS_VIRT_I ((mdb_tgt_as_t)-2L)	/*   special case for code */
147#define	MDB_TGT_AS_VIRT_S ((mdb_tgt_as_t)-3L)	/*   special case for stack */
148#define	MDB_TGT_AS_PHYS	((mdb_tgt_as_t)-4L)	/* Physical address space */
149#define	MDB_TGT_AS_FILE	((mdb_tgt_as_t)-5L)	/* Object file address space */
150#define	MDB_TGT_AS_IO	((mdb_tgt_as_t)-6L)	/* I/o address space */
151
152extern ssize_t mdb_tgt_aread(mdb_tgt_t *, mdb_tgt_as_t,
153	void *, size_t, mdb_tgt_addr_t);
154
155extern ssize_t mdb_tgt_awrite(mdb_tgt_t *, mdb_tgt_as_t,
156	const void *, size_t, mdb_tgt_addr_t);
157
158extern ssize_t mdb_tgt_vread(mdb_tgt_t *, void *, size_t, uintptr_t);
159extern ssize_t mdb_tgt_vwrite(mdb_tgt_t *, const void *, size_t, uintptr_t);
160extern ssize_t mdb_tgt_pread(mdb_tgt_t *, void *, size_t, physaddr_t);
161extern ssize_t mdb_tgt_pwrite(mdb_tgt_t *, const void *, size_t, physaddr_t);
162extern ssize_t mdb_tgt_fread(mdb_tgt_t *, void *, size_t, uintptr_t);
163extern ssize_t mdb_tgt_fwrite(mdb_tgt_t *, const void *, size_t, uintptr_t);
164extern ssize_t mdb_tgt_ioread(mdb_tgt_t *, void *, size_t, uintptr_t);
165extern ssize_t mdb_tgt_iowrite(mdb_tgt_t *, const void *, size_t, uintptr_t);
166
167/*
168 * Convert an address-space's virtual address to the corresponding
169 * physical address (only useful for kernel targets):
170 */
171extern int mdb_tgt_vtop(mdb_tgt_t *, mdb_tgt_as_t, uintptr_t, physaddr_t *);
172
173/*
174 * Convenience functions for reading and writing null-terminated
175 * strings from any of the target address spaces:
176 */
177extern ssize_t mdb_tgt_readstr(mdb_tgt_t *, mdb_tgt_as_t,
178	char *, size_t, mdb_tgt_addr_t);
179
180extern ssize_t mdb_tgt_writestr(mdb_tgt_t *, mdb_tgt_as_t,
181	const char *, mdb_tgt_addr_t);
182
183/*
184 * Symbol Table Interface
185 *
186 * Each target can provide access to one or more symbol tables, which can be
187 * iterated over, or used to lookup symbols by either name or address.  The
188 * target can support a primary executable and primary dynamic symbol table,
189 * a symbol table for its run-time link-editor, and symbol tables for one or
190 * more loaded objects.  A symbol is uniquely identified by an object name,
191 * a symbol table id, and a symbol id.  Symbols can be discovered by iterating
192 * over them, looking them up by name, or looking them up by address.
193 */
194
195typedef struct mdb_syminfo {
196	uint_t sym_table;	/* Symbol table id (see symbol_iter, below) */
197	uint_t sym_id;		/* Symbol identifier */
198} mdb_syminfo_t;
199
200/*
201 * Reserved object names for mdb_tgt_lookup_by_name():
202 */
203#define	MDB_TGT_OBJ_EXEC	((const char *)0L)	/* Executable symbols */
204#define	MDB_TGT_OBJ_RTLD	((const char *)1L)	/* Ldso/krtld symbols */
205#define	MDB_TGT_OBJ_EVERY	((const char *)-1L)	/* All known symbols */
206
207extern int mdb_tgt_lookup_by_scope(mdb_tgt_t *, const char *,
208	GElf_Sym *, mdb_syminfo_t *);
209
210extern int mdb_tgt_lookup_by_name(mdb_tgt_t *, const char *,
211	const char *, GElf_Sym *, mdb_syminfo_t *);
212
213/*
214 * Flag bit passed to mdb_tgt_lookup_by_addr():
215 */
216#define	MDB_TGT_SYM_FUZZY	0	/* Match closest address */
217#define	MDB_TGT_SYM_EXACT	1	/* Match exact address only */
218
219#define	MDB_TGT_SYM_NAMLEN	1024	/* Recommended max symbol name length */
220
221extern int mdb_tgt_lookup_by_addr(mdb_tgt_t *, uintptr_t, uint_t,
222	char *, size_t, GElf_Sym *, mdb_syminfo_t *);
223
224/*
225 * Callback function prototype for mdb_tgt_symbol_iter():
226 */
227typedef int mdb_tgt_sym_f(void *, const GElf_Sym *, const char *,
228	const mdb_syminfo_t *sip, const char *);
229
230/*
231 * Values for selecting symbol tables with mdb_tgt_symbol_iter():
232 */
233#define	MDB_TGT_PRVSYM		0	/* User's private symbol table */
234#define	MDB_TGT_SYMTAB		1	/* Normal symbol table (.symtab) */
235#define	MDB_TGT_DYNSYM		2	/* Dynamic symbol table (.dynsym) */
236
237/*
238 * Values for selecting symbols of interest by binding and type.  These flags
239 * can be used to construct a bitmask to pass to mdb_tgt_symbol_iter().  The
240 * module API has its own slightly different names for these values.  If you are
241 * adding a new flag here, you should consider exposing it in the module API.
242 * If you are changing these flags and their meanings, you will need to update
243 * the module API implementation to account for those changes.
244 */
245#define	MDB_TGT_BIND_LOCAL	0x0001	/* Local (static-scope) symbols */
246#define	MDB_TGT_BIND_GLOBAL	0x0002	/* Global symbols */
247#define	MDB_TGT_BIND_WEAK	0x0004	/* Weak binding symbols */
248
249#define	MDB_TGT_BIND_ANY	0x0007	/* Any of the above */
250
251#define	MDB_TGT_TYPE_NOTYPE	0x0100	/* Symbol has no type */
252#define	MDB_TGT_TYPE_OBJECT	0x0200	/* Symbol refers to data */
253#define	MDB_TGT_TYPE_FUNC	0x0400	/* Symbol refers to text */
254#define	MDB_TGT_TYPE_SECT	0x0800	/* Symbol refers to a section */
255#define	MDB_TGT_TYPE_FILE	0x1000	/* Symbol refers to a source file */
256#define	MDB_TGT_TYPE_COMMON	0x2000	/* Symbol refers to a common block */
257#define	MDB_TGT_TYPE_TLS	0x4000	/* Symbol refers to TLS */
258
259#define	MDB_TGT_TYPE_ANY	0x7f00	/* Any of the above */
260
261extern int mdb_tgt_symbol_iter(mdb_tgt_t *, const char *, uint_t, uint_t,
262	mdb_tgt_sym_f *, void *);
263
264/*
265 * Convenience functions for reading and writing at the address specified
266 * by a given object file and symbol name:
267 */
268extern ssize_t mdb_tgt_readsym(mdb_tgt_t *, mdb_tgt_as_t, void *, size_t,
269	const char *, const char *);
270
271extern ssize_t mdb_tgt_writesym(mdb_tgt_t *, mdb_tgt_as_t, const void *, size_t,
272	const char *, const char *);
273
274/*
275 * Virtual Address Mapping and Load Object interface
276 *
277 * These interfaces allow the caller to iterate over the various virtual
278 * address space mappings, or only those mappings corresponding to load objects.
279 * The mapping name (MDB_TGT_MAPSZ) is defined to be large enough for a string
280 * of length MAXPATHLEN, plus space for "LM`<lmid>" where lmid is a hex number.
281 */
282
283#define	MDB_TGT_MAPSZ		1048	/* Maximum length of mapping name */
284
285#define	MDB_TGT_MAP_R		0x01	/* Mapping is readable */
286#define	MDB_TGT_MAP_W		0x02	/* Mapping is writeable */
287#define	MDB_TGT_MAP_X		0x04	/* Mapping is executable */
288#define	MDB_TGT_MAP_SHMEM	0x08	/* Mapping is shared memory */
289#define	MDB_TGT_MAP_STACK	0x10	/* Mapping is a stack of some kind */
290#define	MDB_TGT_MAP_HEAP	0x20	/* Mapping is a heap of some kind */
291#define	MDB_TGT_MAP_ANON	0x40	/* Mapping is anonymous memory */
292
293typedef struct mdb_map {
294	char map_name[MDB_TGT_MAPSZ];	/* Name of mapped object */
295	uintptr_t map_base;		/* Virtual address of base of mapping */
296	size_t map_size;		/* Size of mapping in bytes */
297	uint_t map_flags;		/* Flags (see above) */
298} mdb_map_t;
299
300typedef int mdb_tgt_map_f(void *, const mdb_map_t *, const char *);
301
302extern int mdb_tgt_mapping_iter(mdb_tgt_t *, mdb_tgt_map_f *, void *);
303extern int mdb_tgt_object_iter(mdb_tgt_t *, mdb_tgt_map_f *, void *);
304
305extern const mdb_map_t *mdb_tgt_addr_to_map(mdb_tgt_t *, uintptr_t);
306extern const mdb_map_t *mdb_tgt_name_to_map(mdb_tgt_t *, const char *);
307
308extern struct ctf_file *mdb_tgt_addr_to_ctf(mdb_tgt_t *, uintptr_t);
309extern struct ctf_file *mdb_tgt_name_to_ctf(mdb_tgt_t *, const char *);
310
311/*
312 * Execution Control Interface
313 *
314 * For in-situ debugging, we provide a relatively simple interface for target
315 * execution control.  The target can be continued, or the representative
316 * thread of control can be single-stepped.  Once the target has stopped, the
317 * status of the representative thread is returned (this status can also be
318 * obtained using mdb_tgt_status()).  Upon continue, the target's internal list
319 * of software event specifiers determines what types of events will cause the
320 * target to stop and transfer control back to the debugger.  The target
321 * allows any number of virtual event specifiers to be registered, along with
322 * an associated callback.  These virtual specifiers are layered on top of
323 * underlying software event specifiers that are private to the target.  The
324 * virtual event specifier list can be manipulated by the functions described
325 * below.  We currently support the following types of traced events:
326 * breakpoints, watchpoints, system call entry, system call exit, signals,
327 * and machine faults.
328 */
329
330typedef uintptr_t mdb_tgt_tid_t;	/* Opaque thread identifier */
331
332typedef struct mdb_tgt_status {
333	mdb_tgt_tid_t st_tid;		/* Id of thread in question */
334	uintptr_t st_pc;		/* Program counter, if stopped */
335	uint_t st_state;		/* Program state (see below) */
336	uint_t st_flags;		/* Status flags (see below) */
337} mdb_tgt_status_t;
338
339/*
340 * Program state (st_state):
341 * (MDB_STATE_* definitions in the module API need to be in sync with these)
342 */
343#define	MDB_TGT_IDLE		0	/* Target is idle (not running yet) */
344#define	MDB_TGT_RUNNING		1	/* Target is currently executing */
345#define	MDB_TGT_STOPPED		2	/* Target is stopped */
346#define	MDB_TGT_UNDEAD		3	/* Target is undead (zombie) */
347#define	MDB_TGT_DEAD		4	/* Target is dead (core dump) */
348#define	MDB_TGT_LOST		5	/* Target lost by debugger */
349
350/*
351 * Status flags (st_flags):
352 */
353#define	MDB_TGT_ISTOP		0x1	/* Stop on event of interest */
354#define	MDB_TGT_DSTOP		0x2	/* Stop directive is pending */
355#define	MDB_TGT_BUSY		0x4	/* Busy in debugger */
356
357extern int mdb_tgt_status(mdb_tgt_t *, mdb_tgt_status_t *);
358extern int mdb_tgt_run(mdb_tgt_t *, int, const struct mdb_arg *);
359extern int mdb_tgt_step(mdb_tgt_t *, mdb_tgt_status_t *);
360extern int mdb_tgt_step_out(mdb_tgt_t *, mdb_tgt_status_t *);
361extern int mdb_tgt_next(mdb_tgt_t *, mdb_tgt_status_t *);
362extern int mdb_tgt_continue(mdb_tgt_t *, mdb_tgt_status_t *);
363extern int mdb_tgt_signal(mdb_tgt_t *, int);
364
365/*
366 * Iterating through the specifier list yields the integer id (VID) and private
367 * data pointer for each specifier.
368 */
369typedef int mdb_tgt_vespec_f(mdb_tgt_t *, void *, int, void *);
370
371/*
372 * Each event specifier is defined to be in one of the following states.  The
373 * state transitions are discussed in detail in the comments in mdb_target.c.
374 */
375#define	MDB_TGT_SPEC_IDLE	1	/* Inactive (e.g. object not loaded) */
376#define	MDB_TGT_SPEC_ACTIVE	2	/* Active but not armed in target */
377#define	MDB_TGT_SPEC_ARMED	3	/* Active and armed (e.g. bkpt set) */
378#define	MDB_TGT_SPEC_ERROR	4	/* Failed to arm event */
379
380/*
381 * Event specifiers may also have one or more of the following additional
382 * properties (spec_flags bits):
383 */
384#define	MDB_TGT_SPEC_INTERNAL	0x0001	/* Internal to target implementation */
385#define	MDB_TGT_SPEC_SILENT	0x0002	/* Do not describe when matched */
386#define	MDB_TGT_SPEC_TEMPORARY	0x0004	/* Delete next time target stops */
387#define	MDB_TGT_SPEC_MATCHED	0x0008	/* Specifier matched at last stop */
388#define	MDB_TGT_SPEC_DISABLED	0x0010	/* Specifier cannot be armed */
389#define	MDB_TGT_SPEC_DELETED	0x0020	/* Specifier has been deleted */
390#define	MDB_TGT_SPEC_AUTODEL	0x0040	/* Delete when match limit reached */
391#define	MDB_TGT_SPEC_AUTODIS	0x0080	/* Disable when match limit reached */
392#define	MDB_TGT_SPEC_AUTOSTOP	0x0100	/* Stop when match limit reached */
393#define	MDB_TGT_SPEC_STICKY	0x0200	/* Do not delete as part of :z */
394
395#define	MDB_TGT_SPEC_HIDDEN	(MDB_TGT_SPEC_INTERNAL | MDB_TGT_SPEC_SILENT)
396
397typedef struct mdb_tgt_spec_desc {
398	int spec_id;			/* Event specifier id (VID) */
399	uint_t spec_flags;		/* Flags (see above) */
400	uint_t spec_hits;		/* Count of number of times matched */
401	uint_t spec_limit;		/* Limit on number of times matched */
402	int spec_state;			/* State (see above) */
403	int spec_errno;			/* Last error code (if IDLE or ERROR) */
404	uintptr_t spec_base;		/* Start of affected memory region */
405	size_t spec_size;		/* Size of affected memory region */
406	void *spec_data;		/* Callback private data */
407} mdb_tgt_spec_desc_t;
408
409/*
410 * The target provides functions to convert a VID into the private data pointer,
411 * or a complete description of the event specifier and its state.
412 */
413extern void *mdb_tgt_vespec_data(mdb_tgt_t *, int);
414extern char *mdb_tgt_vespec_info(mdb_tgt_t *, int,
415    mdb_tgt_spec_desc_t *, char *, size_t);
416
417/*
418 * The common target layer provides functions to iterate over the list of
419 * registered event specifiers, modify or disable them, and delete them.
420 */
421extern int mdb_tgt_vespec_iter(mdb_tgt_t *, mdb_tgt_vespec_f *, void *);
422extern int mdb_tgt_vespec_modify(mdb_tgt_t *, int, uint_t, uint_t, void *);
423extern int mdb_tgt_vespec_enable(mdb_tgt_t *, int);
424extern int mdb_tgt_vespec_disable(mdb_tgt_t *, int);
425extern int mdb_tgt_vespec_delete(mdb_tgt_t *, int);
426
427/*
428 * The mdb_tgt_add_* functions are used to add software event specifiers to the
429 * target.  The caller provides a bitmask of flags (spec_flags above), callback
430 * function pointer, and callback data as arguments.  Whenever a matching event
431 * is detected, a software event callback function is invoked.  The callback
432 * receives a pointer to the target, the VID of the corresponding event
433 * specifier, and a private data pointer as arguments.  If no callback is
434 * desired, the caller can specify a pointer to the no_se_f default callback.
435 * Unlike other target layer functions, the mdb_tgt_add_* interfaces return the
436 * VID of the new event (which may be positive or negative), or 0 if the new
437 * event could not be created.
438 */
439typedef void mdb_tgt_se_f(mdb_tgt_t *, int, void *);
440extern void no_se_f(mdb_tgt_t *, int, void *);
441
442/*
443 * Breakpoints can be set at a specified virtual address or using MDB's
444 * symbol notation:
445 */
446extern int mdb_tgt_add_vbrkpt(mdb_tgt_t *, uintptr_t,
447    int, mdb_tgt_se_f *, void *);
448
449extern int mdb_tgt_add_sbrkpt(mdb_tgt_t *, const char *,
450    int, mdb_tgt_se_f *, void *);
451
452/*
453 * Watchpoints can be set at physical, virtual, or I/O port addresses for any
454 * combination of read, write, or execute operations.
455 */
456#define	MDB_TGT_WA_R		0x1	/* Read watchpoint */
457#define	MDB_TGT_WA_W		0x2	/* Write watchpoint */
458#define	MDB_TGT_WA_X		0x4	/* Execute watchpoint */
459
460#define	MDB_TGT_WA_RWX	(MDB_TGT_WA_R | MDB_TGT_WA_W | MDB_TGT_WA_X)
461
462extern int mdb_tgt_add_pwapt(mdb_tgt_t *, physaddr_t, size_t, uint_t,
463    int, mdb_tgt_se_f *, void *);
464
465extern int mdb_tgt_add_vwapt(mdb_tgt_t *, uintptr_t, size_t, uint_t,
466    int, mdb_tgt_se_f *, void *);
467
468extern int mdb_tgt_add_iowapt(mdb_tgt_t *, uintptr_t, size_t, uint_t,
469    int, mdb_tgt_se_f *, void *);
470
471/*
472 * For user process debugging, tracepoints can be set on entry or exit from
473 * a system call, or on receipt of a software signal or fault.
474 */
475extern int mdb_tgt_add_sysenter(mdb_tgt_t *, int, int, mdb_tgt_se_f *, void *);
476extern int mdb_tgt_add_sysexit(mdb_tgt_t *, int, int, mdb_tgt_se_f *, void *);
477extern int mdb_tgt_add_signal(mdb_tgt_t *, int, int, mdb_tgt_se_f *, void *);
478extern int mdb_tgt_add_fault(mdb_tgt_t *, int, int, mdb_tgt_se_f *, void *);
479
480/*
481 * Machine Register Interface
482 *
483 * The machine registers for a given thread can be manipulated using the
484 * getareg and putareg interface; the caller must know the naming convention
485 * for registers for the given target architecture.  For the purposes of
486 * this interface, we declare the register container to be the largest
487 * current integer container.
488 */
489
490typedef uint64_t mdb_tgt_reg_t;
491
492extern int mdb_tgt_getareg(mdb_tgt_t *, mdb_tgt_tid_t,
493	const char *, mdb_tgt_reg_t *);
494
495extern int mdb_tgt_putareg(mdb_tgt_t *, mdb_tgt_tid_t,
496	const char *, mdb_tgt_reg_t);
497
498/*
499 * Stack Interface
500 *
501 * The target stack interface provides the ability to iterate backward through
502 * the frames of an execution stack.  For the purposes of this interface, the
503 * mdb_tgt_gregset (general purpose register set) is an opaque type: there must
504 * be an implicit contract between the target implementation and any debugger
505 * modules that must interpret the contents of this structure.  The callback
506 * function is provided with the only elements of a stack frame which we can
507 * reasonably abstract: the virtual address corresponding to a program counter
508 * value, and an array of arguments passed to the function call represented by
509 * this frame.  The rest of the frame is presumed to be contained within the
510 * mdb_tgt_gregset_t, and is architecture-specific.
511 */
512
513typedef struct mdb_tgt_gregset mdb_tgt_gregset_t;
514
515typedef int mdb_tgt_stack_f(void *, uintptr_t, uint_t, const long *,
516	const mdb_tgt_gregset_t *);
517typedef int mdb_tgt_stack_iter_f(mdb_tgt_t *, const mdb_tgt_gregset_t *,
518	mdb_tgt_stack_f *, void *);
519
520extern mdb_tgt_stack_iter_f mdb_tgt_stack_iter;
521
522/*
523 * External Data Interface
524 *
525 * The external data interface provides each target with the ability to export
526 * a set of named buffers that contain data which is associated with the
527 * target, but is somehow not accessible through one of its address spaces and
528 * does not correspond to a machine register.  A process credential is an
529 * example of such a buffer: the credential is associated with the given
530 * process, but is stored in the kernel (not the process's address space) and
531 * thus is not accessible through any other target interface.  Since it is
532 * exported via /proc, the user process target can export this information as a
533 * named buffer for target-specific dcmds to consume.
534 */
535
536typedef int mdb_tgt_xdata_f(void *, const char *, const char *, size_t);
537
538extern int mdb_tgt_xdata_iter(mdb_tgt_t *, mdb_tgt_xdata_f *, void *);
539extern ssize_t mdb_tgt_getxdata(mdb_tgt_t *, const char *, void *, size_t);
540
541#ifdef	__cplusplus
542}
543#endif
544
545#endif	/* _MDB_TARGET_H */
546