mdb_target.h revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (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
* 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 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _MDB_TARGET_H
#define _MDB_TARGET_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <gelf.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Forward declaration of the target structure: the target itself is defined in
* mdb_tgt_impl.h and is opaque with respect to callers of this interface.
*/
struct mdb_tgt;
struct mdb_arg;
struct ctf_file;
extern void mdb_create_builtin_tgts(void);
extern void mdb_create_loadable_disasms(void);
/*
* Target Constructors
*
* These functions are used to create a complete debugger target. The
* constructor is passed as an argument to mdb_tgt_create().
*/
extern int mdb_value_tgt_create(mdb_tgt_t *, int, const char *[]);
#ifndef _KMDB
extern int mdb_kvm_tgt_create(mdb_tgt_t *, int, const char *[]);
extern int mdb_proc_tgt_create(mdb_tgt_t *, int, const char *[]);
extern int mdb_kproc_tgt_create(mdb_tgt_t *, int, const char *[]);
extern int mdb_rawfile_tgt_create(mdb_tgt_t *, int, const char *[]);
#else
extern int kmdb_kvm_create(mdb_tgt_t *, int, const char *[]);
#endif
/*
* Targets are created by calling mdb_tgt_create() with an optional set of
* target flags, an argument list, and a target constructor (see above):
*/
typedef int mdb_tgt_ctor_f(mdb_tgt_t *, int, const char *[]);
extern void mdb_tgt_destroy(mdb_tgt_t *);
extern int mdb_tgt_getflags(mdb_tgt_t *);
extern int mdb_tgt_setflags(mdb_tgt_t *, int);
extern int mdb_tgt_setcontext(mdb_tgt_t *, void *);
/*
* Targets are activated and de-activated by the debugger framework. An
* activation occurs after construction when the target becomes the current
* target in the debugger. A target is de-activated prior to its destructor
* being called by mdb_tgt_destroy, or when another target is activated.
* These callbacks are suitable for loading support modules and other tasks.
*/
extern void mdb_tgt_activate(mdb_tgt_t *);
/*
* Prior to issuing a new command prompt, the debugger framework calls the
* target's periodic callback to allow it to load new modules or perform
* other background tasks.
*/
extern void mdb_tgt_periodic(mdb_tgt_t *);
/*
* Convenience functions for accessing miscellaneous target information.
*/
extern const char *mdb_tgt_name(mdb_tgt_t *);
extern const char *mdb_tgt_isa(mdb_tgt_t *);
extern const char *mdb_tgt_platform(mdb_tgt_t *);
extern int mdb_tgt_dmodel(mdb_tgt_t *);
/*
* Address Space Interface
*
* Each target can provide access to a set of address spaces, which may include
* a primary virtual address space, a physical address space, an object file
* address space (where virtual addresses are converted to file offsets in an
* object file), and an I/O port address space. Additionally, the target can
* provide access to alternate address spaces, which are identified by the
* opaque mdb_tgt_as_t type. If the 'as' parameter to mdb_tgt_aread or
* mdb_tgt_awrite is one of the listed constants, these calls are equivalent
* to mdb_tgt_{v|p|f|io}read or write.
*/
typedef void * mdb_tgt_as_t; /* Opaque address space id */
void *, size_t, mdb_tgt_addr_t);
const void *, size_t, mdb_tgt_addr_t);
/*
* Convert an address-space's virtual address to the corresponding
* physical address (only useful for kernel targets):
*/
/*
* Convenience functions for reading and writing null-terminated
* strings from any of the target address spaces:
*/
char *, size_t, mdb_tgt_addr_t);
const char *, mdb_tgt_addr_t);
/*
* Symbol Table Interface
*
* Each target can provide access to one or more symbol tables, which can be
* iterated over, or used to lookup symbols by either name or address. The
* target can support a primary executable and primary dynamic symbol table,
* a symbol table for its run-time link-editor, and symbol tables for one or
* more loaded objects. A symbol is uniquely identified by an object name,
* a symbol table id, and a symbol id. Symbols can be discovered by iterating
* over them, looking them up by name, or looking them up by address.
*/
typedef struct mdb_syminfo {
/*
* Reserved object names for mdb_tgt_lookup_by_name():
*/
#define MDB_TGT_OBJ_EXEC ((const char *)0L) /* Executable symbols */
extern int mdb_tgt_lookup_by_scope(mdb_tgt_t *, const char *,
GElf_Sym *, mdb_syminfo_t *);
extern int mdb_tgt_lookup_by_name(mdb_tgt_t *, const char *,
const char *, GElf_Sym *, mdb_syminfo_t *);
/*
* Flag bit passed to mdb_tgt_lookup_by_addr():
*/
#define MDB_TGT_SYM_FUZZY 0 /* Match closest address */
/*
* Callback function prototype for mdb_tgt_symbol_iter():
*/
typedef int mdb_tgt_sym_f(void *, const GElf_Sym *, const char *,
const mdb_syminfo_t *sip, const char *);
/*
* Values for selecting symbol tables with mdb_tgt_symbol_iter():
*/
#define MDB_TGT_PRVSYM 0 /* User's private symbol table */
/*
* Values for selecting symbols of interest by binding and type. These flags
* can be used to construct a bitmask to pass to mdb_tgt_symbol_iter():
*/
mdb_tgt_sym_f *, void *);
/*
* Convenience functions for reading and writing at the address specified
* by a given object file and symbol name:
*/
const char *, const char *);
const char *, const char *);
/*
* Virtual Address Mapping and Load Object interface
*
* These interfaces allow the caller to iterate over the various virtual
* address space mappings, or only those mappings corresponding to load objects.
* The mapping name (MDB_TGT_MAPSZ) is defined to be large enough for a string
* of length MAXPATHLEN, plus space for "LM`<lmid>" where lmid is a hex number.
*/
typedef struct mdb_map {
} mdb_map_t;
typedef int mdb_tgt_map_f(void *, const mdb_map_t *, const char *);
/*
* Execution Control Interface
*
* For in-situ debugging, we provide a relatively simple interface for target
* execution control. The target can be continued, or the representative
* thread of control can be single-stepped. Once the target has stopped, the
* status of the representative thread is returned (this status can also be
* obtained using mdb_tgt_status()). Upon continue, the target's internal list
* of software event specifiers determines what types of events will cause the
* target to stop and transfer control back to the debugger. The target
* allows any number of virtual event specifiers to be registered, along with
* an associated callback. These virtual specifiers are layered on top of
* underlying software event specifiers that are private to the target. The
* virtual event specifier list can be manipulated by the functions described
* below. We currently support the following types of traced events:
* breakpoints, watchpoints, system call entry, system call exit, signals,
* and machine faults.
*/
typedef struct mdb_tgt_status {
/*
* Program state (st_state):
* (MDB_STATE_* definitions in the module API need to be in sync with these)
*/
#define MDB_TGT_IDLE 0 /* Target is idle (not running yet) */
/*
* Status flags (st_flags):
*/
extern int mdb_tgt_signal(mdb_tgt_t *, int);
/*
* Iterating through the specifier list yields the integer id (VID) and private
* data pointer for each specifier.
*/
typedef int mdb_tgt_vespec_f(mdb_tgt_t *, void *, int, void *);
/*
* Each event specifier is defined to be in one of the following states. The
* state transitions are discussed in detail in the comments in mdb_target.c.
*/
/*
* Event specifiers may also have one or more of the following additional
* properties (spec_flags bits):
*/
typedef struct mdb_tgt_spec_desc {
int spec_id; /* Event specifier id (VID) */
int spec_state; /* State (see above) */
int spec_errno; /* Last error code (if IDLE or ERROR) */
void *spec_data; /* Callback private data */
/*
* The target provides functions to convert a VID into the private data pointer,
* or a complete description of the event specifier and its state.
*/
extern void *mdb_tgt_vespec_data(mdb_tgt_t *, int);
extern char *mdb_tgt_vespec_info(mdb_tgt_t *, int,
mdb_tgt_spec_desc_t *, char *, size_t);
/*
* The common target layer provides functions to iterate over the list of
* registered event specifiers, modify or disable them, and delete them.
*/
extern int mdb_tgt_vespec_enable(mdb_tgt_t *, int);
extern int mdb_tgt_vespec_disable(mdb_tgt_t *, int);
extern int mdb_tgt_vespec_delete(mdb_tgt_t *, int);
/*
* The mdb_tgt_add_* functions are used to add software event specifiers to the
* target. The caller provides a bitmask of flags (spec_flags above), callback
* function pointer, and callback data as arguments. Whenever a matching event
* is detected, a software event callback function is invoked. The callback
* receives a pointer to the target, the VID of the corresponding event
* specifier, and a private data pointer as arguments. If no callback is
* desired, the caller can specify a pointer to the no_se_f default callback.
* Unlike other target layer functions, the mdb_tgt_add_* interfaces return the
* VID of the new event (which may be positive or negative), or 0 if the new
* event could not be created.
*/
typedef void mdb_tgt_se_f(mdb_tgt_t *, int, void *);
/*
* Breakpoints can be set at a specified virtual address or using MDB's
* symbol notation:
*/
int, mdb_tgt_se_f *, void *);
extern int mdb_tgt_add_sbrkpt(mdb_tgt_t *, const char *,
int, mdb_tgt_se_f *, void *);
/*
* Watchpoints can be set at physical, virtual, or I/O port addresses for any
* combination of read, write, or execute operations.
*/
int, mdb_tgt_se_f *, void *);
int, mdb_tgt_se_f *, void *);
int, mdb_tgt_se_f *, void *);
/*
* For user process debugging, tracepoints can be set on entry or exit from
* a system call, or on receipt of a software signal or fault.
*/
/*
* Machine Register Interface
*
* The machine registers for a given thread can be manipulated using the
* getareg and putareg interface; the caller must know the naming convention
* for registers for the given target architecture. For the purposes of
* this interface, we declare the register container to be the largest
* current integer container.
*/
typedef uint64_t mdb_tgt_reg_t;
const char *, mdb_tgt_reg_t *);
const char *, mdb_tgt_reg_t);
/*
* Stack Interface
*
* The target stack interface provides the ability to iterate backward through
* the frames of an execution stack. For the purposes of this interface, the
* mdb_tgt_gregset (general purpose register set) is an opaque type: there must
* be an implicit contract between the target implementation and any debugger
* modules that must interpret the contents of this structure. The callback
* function is provided with the only elements of a stack frame which we can
* reasonably abstract: the virtual address corresponding to a program counter
* value, and an array of arguments passed to the function call represented by
* this frame. The rest of the frame is presumed to be contained within the
* mdb_tgt_gregset_t, and is architecture-specific.
*/
typedef struct mdb_tgt_gregset mdb_tgt_gregset_t;
const mdb_tgt_gregset_t *);
mdb_tgt_stack_f *, void *);
/*
* External Data Interface
*
* The external data interface provides each target with the ability to export
* a set of named buffers that contain data which is associated with the
* target, but is somehow not accessible through one of its address spaces and
* does not correspond to a machine register. A process credential is an
* example of such a buffer: the credential is associated with the given
* process, but is stored in the kernel (not the process's address space) and
* thus is not accessible through any other target interface. Since it is
* exported via /proc, the user process target can export this information as a
* named buffer for target-specific dcmds to consume.
*/
typedef int mdb_tgt_xdata_f(void *, const char *, const char *, size_t);
#ifdef __cplusplus
}
#endif
#endif /* _MDB_TARGET_H */