#ifndef _MDB_PROC_H
#define _MDB_PROC_H
#include <mdb/mdb_target_impl.h>
#include <mdb/mdb_io_impl.h>
#include <mdb/mdb_addrvec.h>
#include <mdb/mdb_modapi.h>
#include <mdb/mdb_gelf.h>
#include <mdb/mdb_tdb.h>
#include <sys/param.h>
#include <libproc.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _MDB
typedef struct pt_ptl_ops {
int (*ptl_ctor)(mdb_tgt_t *);
void (*ptl_dtor)(mdb_tgt_t *, void *);
mdb_tgt_tid_t (*ptl_tid)(mdb_tgt_t *, void *);
int (*ptl_iter)(mdb_tgt_t *, void *, mdb_addrvec_t *);
int (*ptl_getregs)(mdb_tgt_t *, void *, mdb_tgt_tid_t, prgregset_t);
int (*ptl_setregs)(mdb_tgt_t *, void *, mdb_tgt_tid_t, prgregset_t);
int (*ptl_getxregs)(mdb_tgt_t *, void *, mdb_tgt_tid_t,
prxregset_t **, size_t *);
void (*ptl_freexregs)(mdb_tgt_t *, void *, prxregset_t *, size_t);
int (*ptl_setxregs)(mdb_tgt_t *, void *, mdb_tgt_tid_t,
const prxregset_t *, size_t);
int (*ptl_getfpregs)(mdb_tgt_t *, void *, mdb_tgt_tid_t,
prfpregset_t *);
int (*ptl_setfpregs)(mdb_tgt_t *, void *, mdb_tgt_tid_t,
const prfpregset_t *);
} pt_ptl_ops_t;
#define PTL_CTOR(t) \
(((pt_data_t *)(t)->t_data)->p_ptl_ops->ptl_ctor(t))
#define PTL_DTOR(t) \
(((pt_data_t *)(t)->t_data)->p_ptl_ops->ptl_dtor((t), \
((pt_data_t *)((t)->t_data))->p_ptl_hdl))
#define PTL_TID(t) \
(((pt_data_t *)((t)->t_data))->p_ptl_ops->ptl_tid((t), \
((pt_data_t *)(t)->t_data)->p_ptl_hdl))
#define PTL_ITER(t, ap) \
(((pt_data_t *)(t)->t_data)->p_ptl_ops->ptl_iter((t), \
((pt_data_t *)((t)->t_data))->p_ptl_hdl, (ap)))
#define PTL_GETREGS(t, tid, gregs) \
(((pt_data_t *)((t)->t_data))->p_ptl_ops->ptl_getregs((t), \
((pt_data_t *)((t)->t_data))->p_ptl_hdl, (tid), (gregs)))
#define PTL_SETREGS(t, tid, gregs) \
(((pt_data_t *)((t)->t_data))->p_ptl_ops->ptl_setregs((t), \
((pt_data_t *)((t)->t_data))->p_ptl_hdl, (tid), (gregs)))
#define PTL_GETXREGS(t, tid, xregs, size) \
(((pt_data_t *)((t)->t_data))->p_ptl_ops->ptl_getxregs((t), \
((pt_data_t *)((t)->t_data))->p_ptl_hdl, (tid), (xregs), (size)))
#define PTL_FREEXREGS(t, xregs, size) \
(((pt_data_t *)((t)->t_data))->p_ptl_ops->ptl_freexregs((t), \
((pt_data_t *)((t)->t_data))->p_ptl_hdl, (xregs), (size)))
#define PTL_SETXREGS(t, tid, xregs, size) \
(((pt_data_t *)((t)->t_data))->p_ptl_ops->ptl_setxregs((t), \
((pt_data_t *)((t)->t_data))->p_ptl_hdl, (tid), (xregs), (size)))
#define PTL_GETFPREGS(t, tid, fpregs) \
(((pt_data_t *)((t)->t_data))->p_ptl_ops->ptl_getfpregs((t), \
((pt_data_t *)((t)->t_data))->p_ptl_hdl, (tid), (fpregs)))
#define PTL_SETFPREGS(t, tid, fpregs) \
(((pt_data_t *)((t)->t_data))->p_ptl_ops->ptl_setfpregs((t), \
((pt_data_t *)((t)->t_data))->p_ptl_hdl, (tid), (fpregs)))
typedef struct pt_vforkp {
mdb_list_t p_list;
struct ps_prochandle *p_pshandle;
} pt_vforkp_t;
typedef struct pt_data {
struct ps_prochandle *p_idlehandle;
mdb_gelf_symtab_t *p_symtab;
mdb_gelf_symtab_t *p_dynsym;
mdb_gelf_file_t *p_file;
mdb_io_t *p_fio;
mdb_io_t *p_aout_fio;
char p_platform[MAXNAMELEN];
char p_symname[MDB_TGT_SYM_NAMLEN];
char p_objname[MDB_TGT_MAPSZ];
mdb_map_t p_map;
mdb_list_t p_vforkp;
mdb_nv_t p_regs;
const mdb_tdb_ops_t *p_tdb_ops;
const pt_ptl_ops_t *p_ptl_ops;
void *p_ptl_hdl;
rd_agent_t *p_rtld;
const char *p_stdin;
const char *p_stdout;
int p_oflags;
int p_gflags;
int p_rflags;
int p_signal;
int p_rtld_finished;
int p_rdstate;
int p_maxsig;
mdb_nv_t p_env;
} pt_data_t;
#define PT_RD_NONE 0
#define PT_RD_ADD 1
#define PT_RD_CONSIST 2
struct mdb_tgt_gregset {
prgregset_t gregs;
};
typedef struct pt_symarg {
mdb_tgt_t *psym_targ;
uint_t psym_which;
uint_t psym_type;
mdb_tgt_sym_f *psym_func;
void *psym_private;
mdb_syminfo_t psym_info;
const char *psym_obj;
} pt_symarg_t;
typedef struct pt_maparg {
mdb_tgt_t *pmap_targ;
mdb_tgt_map_f *pmap_func;
void *pmap_private;
} pt_maparg_t;
typedef struct pt_stkarg {
mdb_tgt_stack_f *pstk_func;
void *pstk_private;
uint_t pstk_gotpc;
} pt_stkarg_t;
typedef struct pt_addarg_t {
pt_data_t *pa_pt;
mdb_addrvec_t *pa_ap;
} pt_addarg_t;
typedef struct pt_brkpt {
uintptr_t ptb_addr;
ulong_t ptb_instr;
} pt_brkpt_t;
typedef struct pt_bparg {
char *pta_symbol;
uintptr_t pta_addr;
} pt_bparg_t;
extern int pt_regs(uintptr_t, uint_t, int, const mdb_arg_t *);
extern int pt_fpregs(uintptr_t, uint_t, int, const mdb_arg_t *);
extern int pt_step_out(mdb_tgt_t *, uintptr_t *);
extern int pt_next(mdb_tgt_t *, uintptr_t *);
extern int pt_getfpreg(mdb_tgt_t *, mdb_tgt_tid_t, ushort_t, ushort_t,
mdb_tgt_reg_t *);
extern int pt_putfpreg(mdb_tgt_t *, mdb_tgt_tid_t, ushort_t, ushort_t,
mdb_tgt_reg_t);
extern void pt_addfpregs(mdb_tgt_t *);
extern const char *pt_disasm(const GElf_Ehdr *);
extern int pt_frameregs(void *, uintptr_t, uint_t, const long *,
const mdb_tgt_gregset_t *, boolean_t);
extern const mdb_tgt_regdesc_t pt_regdesc[];
#endif
#ifdef __cplusplus
}
#endif
#endif