xref: /illumos-gate/usr/src/cmd/sgs/demo_rdb/common/rdb.h (revision 1a90c98d)
1d9328cd4SRobert Mustacchi /*
2d9328cd4SRobert Mustacchi  * CDDL HEADER START
3d9328cd4SRobert Mustacchi  *
4d9328cd4SRobert Mustacchi  * The contents of this file are subject to the terms of the
5d9328cd4SRobert Mustacchi  * Common Development and Distribution License (the "License").
6d9328cd4SRobert Mustacchi  * You may not use this file except in compliance with the License.
7d9328cd4SRobert Mustacchi  *
8d9328cd4SRobert Mustacchi  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9d9328cd4SRobert Mustacchi  * or http://www.opensolaris.org/os/licensing.
10d9328cd4SRobert Mustacchi  * See the License for the specific language governing permissions
11d9328cd4SRobert Mustacchi  * and limitations under the License.
12d9328cd4SRobert Mustacchi  *
13d9328cd4SRobert Mustacchi  * When distributing Covered Code, include this CDDL HEADER in each
14d9328cd4SRobert Mustacchi  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15d9328cd4SRobert Mustacchi  * If applicable, add the following below this CDDL HEADER, with the
16d9328cd4SRobert Mustacchi  * fields enclosed by brackets "[]" replaced with your own identifying
17d9328cd4SRobert Mustacchi  * information: Portions Copyright [yyyy] [name of copyright owner]
18d9328cd4SRobert Mustacchi  *
19d9328cd4SRobert Mustacchi  * CDDL HEADER END
20d9328cd4SRobert Mustacchi  */
21d9328cd4SRobert Mustacchi 
22d9328cd4SRobert Mustacchi /*
23d9328cd4SRobert Mustacchi  * Copyright (c) 1995, 2010, Oracle and/or its affiliates. All rights reserved.
24d9328cd4SRobert Mustacchi  */
25d9328cd4SRobert Mustacchi #ifndef _RDB_H
26d9328cd4SRobert Mustacchi #define	_RDB_H
27d9328cd4SRobert Mustacchi 
28d9328cd4SRobert Mustacchi #include <rtld_db.h>
29d9328cd4SRobert Mustacchi #include <sys/types.h>
30d9328cd4SRobert Mustacchi #include <procfs.h>
31d9328cd4SRobert Mustacchi #include <proc_service.h>
32d9328cd4SRobert Mustacchi #include <libelf.h>
33d9328cd4SRobert Mustacchi #include <gelf.h>
34d9328cd4SRobert Mustacchi 
35d9328cd4SRobert Mustacchi #include <rdb_mach.h>
36d9328cd4SRobert Mustacchi 
37d9328cd4SRobert Mustacchi #ifdef	__cplusplus
38d9328cd4SRobert Mustacchi extern "C" {
39d9328cd4SRobert Mustacchi #endif
40d9328cd4SRobert Mustacchi 
41d9328cd4SRobert Mustacchi /*
42d9328cd4SRobert Mustacchi  * Definitions from 2.7 sys/procfs_isa.h.
43d9328cd4SRobert Mustacchi  */
44d9328cd4SRobert Mustacchi #ifndef	PR_MODEL_LP64
45d9328cd4SRobert Mustacchi #define	PR_MODEL_UNKNOWN 0
46d9328cd4SRobert Mustacchi #define	PR_MODEL_ILP32	1	/* process data model is ILP32 */
47d9328cd4SRobert Mustacchi #define	PR_MODEL_LP64	2	/* process data model is LP64 */
48d9328cd4SRobert Mustacchi #endif
49d9328cd4SRobert Mustacchi 
50d9328cd4SRobert Mustacchi #define	INTERPSECT	".interp"
51d9328cd4SRobert Mustacchi #define	PLTSECT		".plt"
52d9328cd4SRobert Mustacchi 
53d9328cd4SRobert Mustacchi /*
54d9328cd4SRobert Mustacchi  * Flags for step_n routine
55d9328cd4SRobert Mustacchi  */
56d9328cd4SRobert Mustacchi typedef enum {
57d9328cd4SRobert Mustacchi 	FLG_SN_NONE = 0,
58d9328cd4SRobert Mustacchi 	FLG_SN_VERBOSE = (1 << 0),	/* disassemble instructions */
59d9328cd4SRobert Mustacchi 	FLG_SN_PLTSKIP = (1 << 1)	/* step *over* PLTS */
60d9328cd4SRobert Mustacchi } sn_flags_e;
61d9328cd4SRobert Mustacchi 
62d9328cd4SRobert Mustacchi 
63d9328cd4SRobert Mustacchi typedef	enum {
64d9328cd4SRobert Mustacchi 	RET_FAILED = -1,
65d9328cd4SRobert Mustacchi 	RET_OK = 0
66d9328cd4SRobert Mustacchi } retc_t;
67d9328cd4SRobert Mustacchi 
68d9328cd4SRobert Mustacchi /*
69d9328cd4SRobert Mustacchi  * sym_tbl_t contains a primary and an (optional) auxiliary symbol table, which
70d9328cd4SRobert Mustacchi  * we wish to treat as a single logical symbol table. In this logical table,
71d9328cd4SRobert Mustacchi  * the data from the auxiliary table precedes that from the primary. Symbol
72d9328cd4SRobert Mustacchi  * indices start at [0], which is the first item in the auxiliary table
73d9328cd4SRobert Mustacchi  * if there is one. The sole purpose for this is so that we can treat the
74d9328cd4SRobert Mustacchi  * combination of .SUNW_ldynsym and .dynsym sections as a logically single
75d9328cd4SRobert Mustacchi  * entity without having to violate the public interface to libelf.
76d9328cd4SRobert Mustacchi  *
77d9328cd4SRobert Mustacchi  * Both tables must share the same string table section.
78d9328cd4SRobert Mustacchi  *
79d9328cd4SRobert Mustacchi  * The symtab_getsym() function serves as a gelf_getsym() replacement
80d9328cd4SRobert Mustacchi  * that is aware of the two tables and makes them look like a single table
81d9328cd4SRobert Mustacchi  * to the caller.
82d9328cd4SRobert Mustacchi  *
83d9328cd4SRobert Mustacchi  */
84d9328cd4SRobert Mustacchi typedef struct sym_tbl {
85d9328cd4SRobert Mustacchi 	Elf_Data	*st_syms_pri;	/* start of primary table */
86d9328cd4SRobert Mustacchi 	Elf_Data	*st_syms_aux;	/* start of auxiliary table */
87d9328cd4SRobert Mustacchi 	char		*st_strs;	/* ptr to strings */
88d9328cd4SRobert Mustacchi 	size_t		st_symn;	/* Total # of entries in both tables */
89d9328cd4SRobert Mustacchi 	size_t		st_symn_aux;	/* # of entries in auxiliary table */
90d9328cd4SRobert Mustacchi } sym_tbl_t;
91d9328cd4SRobert Mustacchi 
92d9328cd4SRobert Mustacchi typedef struct	map_info {
93d9328cd4SRobert Mustacchi 	char			*mi_name;	/* file info */
94d9328cd4SRobert Mustacchi 	char			*mi_refname;	/* filter reference name */
95d9328cd4SRobert Mustacchi 	ulong_t			mi_addr;	/* start address */
96d9328cd4SRobert Mustacchi 	ulong_t			mi_end;		/* end address */
97d9328cd4SRobert Mustacchi 	int			mi_mapfd;	/* file desc. for mapping */
98d9328cd4SRobert Mustacchi 	size_t			mi_pltentsz;	/* size of PLT entries */
99d9328cd4SRobert Mustacchi 	Elf			*mi_elf;	/* elf handle so we can close */
100d9328cd4SRobert Mustacchi 	GElf_Ehdr		mi_ehdr;
101d9328cd4SRobert Mustacchi 	sym_tbl_t		mi_symtab;	/* symbol table */
102d9328cd4SRobert Mustacchi 	sym_tbl_t		mi_dynsym;	/* dynamic symbol table */
103d9328cd4SRobert Mustacchi 	Lmid_t			mi_lmident;	/* Link Map Ident */
104d9328cd4SRobert Mustacchi 	ulong_t			mi_pltbase;	/* PLT base address */
105d9328cd4SRobert Mustacchi 	ulong_t			mi_pltsize;	/* size of PLT table */
106d9328cd4SRobert Mustacchi 	struct map_info		*mi_next;
107d9328cd4SRobert Mustacchi 	ulong_t			mi_flags;	/* misc flags */
108d9328cd4SRobert Mustacchi 	rd_loadobj_t		mi_loadobj;	/* keep the old loadobj for */
109d9328cd4SRobert Mustacchi 						/*	good luck */
110d9328cd4SRobert Mustacchi } map_info_t;
111d9328cd4SRobert Mustacchi 
112d9328cd4SRobert Mustacchi #define	FLG_MI_EXEC		0x0001		/* is object an EXEC */
113d9328cd4SRobert Mustacchi 
114d9328cd4SRobert Mustacchi #define	FLG_PAP_SONAME		0x0001		/* embed SONAME in sym name */
115d9328cd4SRobert Mustacchi #define	FLG_PAP_NOHEXNAME	0x0002		/* if no symbol return */
116d9328cd4SRobert Mustacchi 						/* null string */
117d9328cd4SRobert Mustacchi #define	FLG_PAP_PLTDECOM	0x0004		/* decompe PLT name if */
118d9328cd4SRobert Mustacchi 						/* possible */
119d9328cd4SRobert Mustacchi typedef struct map_list {
120d9328cd4SRobert Mustacchi 	map_info_t		*ml_head;
121d9328cd4SRobert Mustacchi 	map_info_t		*ml_tail;
122d9328cd4SRobert Mustacchi } map_list_t;
123d9328cd4SRobert Mustacchi 
124d9328cd4SRobert Mustacchi /*
125d9328cd4SRobert Mustacchi  * Break point information
126d9328cd4SRobert Mustacchi  */
127d9328cd4SRobert Mustacchi typedef struct bpt_struct {
128d9328cd4SRobert Mustacchi 	ulong_t			bl_addr;	/* address of breakpoint */
129d9328cd4SRobert Mustacchi 	bptinstr_t		bl_instr;	/* original instruction */
130d9328cd4SRobert Mustacchi 	unsigned		bl_flags;	/* break point flags */
131d9328cd4SRobert Mustacchi 	struct bpt_struct	*bl_next;
132d9328cd4SRobert Mustacchi } bptlist_t;
133d9328cd4SRobert Mustacchi 
134d9328cd4SRobert Mustacchi #define	FLG_BP_USERDEF		0x0001		/* user defined BP */
135d9328cd4SRobert Mustacchi #define	FLG_BP_RDPREINIT	0x0002		/* PREINIT BreakPoint */
136d9328cd4SRobert Mustacchi #define	FLG_BP_RDPOSTINIT	0x0004		/* POSTINIT BreakPoint */
137d9328cd4SRobert Mustacchi #define	FLG_BP_RDDLACT		0x0008		/* DLACT BreakPoint */
138d9328cd4SRobert Mustacchi #define	FLG_BP_PLTRES		0x0010		/* PLT Resolve BP */
139d9328cd4SRobert Mustacchi 
140d9328cd4SRobert Mustacchi #define	MASK_BP_SPECIAL \
141d9328cd4SRobert Mustacchi 		(FLG_BP_RDPREINIT | FLG_BP_RDPOSTINIT | FLG_BP_RDDLACT)
142d9328cd4SRobert Mustacchi #define	MASK_BP_STOP \
143d9328cd4SRobert Mustacchi 		(FLG_BP_USERDEF | FLG_BP_PLTRES)
144d9328cd4SRobert Mustacchi #define	MASK_BP_ALL \
145d9328cd4SRobert Mustacchi 		(MASK_BP_SPECIAL | FLG_BP_USERDEF)
146d9328cd4SRobert Mustacchi 
147d9328cd4SRobert Mustacchi /*
148d9328cd4SRobert Mustacchi  * Proc Services Structure
149d9328cd4SRobert Mustacchi  */
150d9328cd4SRobert Mustacchi struct ps_prochandle {
151d9328cd4SRobert Mustacchi 	pid_t		pp_pid;		/* debug process pid */
152d9328cd4SRobert Mustacchi 	rd_agent_t	*pp_rap;	/* rtld_db handle */
153d9328cd4SRobert Mustacchi 	int		pp_ctlfd;	/* open ctl proc fd */
154d9328cd4SRobert Mustacchi 	int		pp_statusfd;	/* open status proc fd */
155d9328cd4SRobert Mustacchi 	int		pp_asfd;	/* open as proc fd */
156d9328cd4SRobert Mustacchi 	int		pp_mapfd;	/* open map proc fd */
157d9328cd4SRobert Mustacchi 	uintptr_t	pp_ldsobase;	/* ld.so.1 base address */
158d9328cd4SRobert Mustacchi 	uintptr_t	pp_execphdr;	/* a.out phdr address */
159d9328cd4SRobert Mustacchi 	map_info_t	pp_ldsomap;	/* ld.so.1 map info */
160d9328cd4SRobert Mustacchi 	map_info_t	pp_execmap;	/* exec map info */
161d9328cd4SRobert Mustacchi 	map_list_t	pp_lmaplist;	/* list of link map infos */
162d9328cd4SRobert Mustacchi 	bptlist_t	*pp_breakpoints; /* break point list */
163d9328cd4SRobert Mustacchi 	void		*pp_auxvp;	/* pointer to AUX vectors */
164d9328cd4SRobert Mustacchi 	int		pp_flags;	/* misc flags */
165d9328cd4SRobert Mustacchi 	int		pp_dmodel;	/* data model */
166d9328cd4SRobert Mustacchi };
167d9328cd4SRobert Mustacchi 
168d9328cd4SRobert Mustacchi #define	FLG_PP_PROMPT	0x0001		/* display debugger prompt */
169d9328cd4SRobert Mustacchi #define	FLG_PP_LMAPS	0x0002		/* link maps available */
170d9328cd4SRobert Mustacchi #define	FLG_PP_PACT	0x0004		/* active process being traced */
171d9328cd4SRobert Mustacchi #define	FLG_PP_PLTSKIP	0x0008		/* PLT skipping is active */
172d9328cd4SRobert Mustacchi 
173d9328cd4SRobert Mustacchi /*
174d9328cd4SRobert Mustacchi  * Debugging Structure
175d9328cd4SRobert Mustacchi  */
176d9328cd4SRobert Mustacchi typedef struct rtld_debug {
177d9328cd4SRobert Mustacchi 	int		rd_vers;
178d9328cd4SRobert Mustacchi 	caddr_t		rd_preinit;
179d9328cd4SRobert Mustacchi 	caddr_t		rd_postinit;
180d9328cd4SRobert Mustacchi } rtld_debug_t;
181d9328cd4SRobert Mustacchi 
182d9328cd4SRobert Mustacchi #define	TRAPBREAK	0x91d02001	/* ta	ST_BREAKPOINT */
183d9328cd4SRobert Mustacchi 
184d9328cd4SRobert Mustacchi /*
185d9328cd4SRobert Mustacchi  * values for rdb_flags
186d9328cd4SRobert Mustacchi  */
187d9328cd4SRobert Mustacchi #define	RDB_FL_EVENTS	0x0001		/* enable printing event information */
188d9328cd4SRobert Mustacchi 
189d9328cd4SRobert Mustacchi /*
190d9328cd4SRobert Mustacchi  * Globals
191d9328cd4SRobert Mustacchi  */
192d9328cd4SRobert Mustacchi 
193d9328cd4SRobert Mustacchi extern struct ps_prochandle	proch;
194d9328cd4SRobert Mustacchi extern unsigned long		rdb_flags;
195d9328cd4SRobert Mustacchi 
196d9328cd4SRobert Mustacchi /*
197d9328cd4SRobert Mustacchi  * Functions
198d9328cd4SRobert Mustacchi  */
199d9328cd4SRobert Mustacchi extern map_info_t	*addr_to_map(struct ps_prochandle *, ulong_t);
200d9328cd4SRobert Mustacchi extern retc_t		addr_to_sym(struct ps_prochandle *, ulong_t,
201d9328cd4SRobert Mustacchi 				GElf_Sym *, char **);
202d9328cd4SRobert Mustacchi extern void		CallStack(struct ps_prochandle *ph);
203d9328cd4SRobert Mustacchi extern unsigned		continue_to_break(struct ps_prochandle *);
204d9328cd4SRobert Mustacchi extern retc_t		delete_all_breakpoints(struct ps_prochandle *);
205d9328cd4SRobert Mustacchi extern retc_t		delete_breakpoint(struct ps_prochandle *, ulong_t,
206d9328cd4SRobert Mustacchi 				unsigned);
207d9328cd4SRobert Mustacchi extern void		disasm(struct ps_prochandle *, int);
208d9328cd4SRobert Mustacchi extern retc_t		disasm_addr(struct ps_prochandle *, ulong_t, int);
209d9328cd4SRobert Mustacchi extern retc_t		display_all_regs(struct ps_prochandle *);
210d9328cd4SRobert Mustacchi extern retc_t		display_maps(struct ps_prochandle *);
211d9328cd4SRobert Mustacchi extern retc_t		display_linkmaps(struct ps_prochandle *);
212d9328cd4SRobert Mustacchi extern void		free_linkmaps(struct ps_prochandle *);
213d9328cd4SRobert Mustacchi extern retc_t		get_linkmaps(struct ps_prochandle *);
214d9328cd4SRobert Mustacchi extern ulong_t		hexstr_to_num(const char *);
215d9328cd4SRobert Mustacchi extern ulong_t		is_plt(struct ps_prochandle *, ulong_t);
216d9328cd4SRobert Mustacchi extern void		list_breakpoints(struct ps_prochandle *);
217d9328cd4SRobert Mustacchi extern retc_t		load_map(struct ps_prochandle *, caddr_t,
218d9328cd4SRobert Mustacchi 				map_info_t *mp);
219d9328cd4SRobert Mustacchi extern char		*print_address(unsigned long);
220d9328cd4SRobert Mustacchi extern char		*print_address_ps(struct ps_prochandle *,
221d9328cd4SRobert Mustacchi 				unsigned long, unsigned);
222d9328cd4SRobert Mustacchi extern void		print_mem(struct ps_prochandle *, ulong_t, int,
223d9328cd4SRobert Mustacchi 				char *);
224d9328cd4SRobert Mustacchi extern void		print_varstring(struct ps_prochandle *, const char *);
225d9328cd4SRobert Mustacchi extern void		print_mach_varstring(struct ps_prochandle *,
226d9328cd4SRobert Mustacchi 				const char *);
227d9328cd4SRobert Mustacchi extern void		rdb_help(const char *);
228d9328cd4SRobert Mustacchi extern void		rdb_prompt();
229d9328cd4SRobert Mustacchi extern void		perr(char *);
230d9328cd4SRobert Mustacchi extern retc_t		proc_string_read(struct ps_prochandle *,
231d9328cd4SRobert Mustacchi 				ulong_t, char *, int);
232d9328cd4SRobert Mustacchi extern retc_t		ps_close(struct ps_prochandle *);
233d9328cd4SRobert Mustacchi extern retc_t		ps_init(int, int, pid_t, struct ps_prochandle *);
234d9328cd4SRobert Mustacchi extern retc_t		set_breakpoint(struct ps_prochandle *, ulong_t,
235d9328cd4SRobert Mustacchi 				unsigned);
236d9328cd4SRobert Mustacchi extern retc_t		set_objpad(struct ps_prochandle *, size_t);
237d9328cd4SRobert Mustacchi extern retc_t		step_n(struct ps_prochandle *, size_t, sn_flags_e);
238d9328cd4SRobert Mustacchi extern void		step_to_addr(struct ps_prochandle *, ulong_t);
239d9328cd4SRobert Mustacchi extern retc_t		str_map_sym(const char *, map_info_t *, GElf_Sym *,
240d9328cd4SRobert Mustacchi 				char **);
241d9328cd4SRobert Mustacchi extern map_info_t	*str_to_map(struct ps_prochandle *, const char *);
242d9328cd4SRobert Mustacchi extern retc_t		str_to_sym(struct ps_prochandle *, const char *,
243d9328cd4SRobert Mustacchi 				GElf_Sym *);
244d9328cd4SRobert Mustacchi extern int		yyparse(void);
245*1a90c98dSToomas Soome extern int		yyerror(const char *);
246d9328cd4SRobert Mustacchi extern int		yylex(void);
247d9328cd4SRobert Mustacchi 
248d9328cd4SRobert Mustacchi #ifdef	__cplusplus
249d9328cd4SRobert Mustacchi }
250d9328cd4SRobert Mustacchi #endif
251d9328cd4SRobert Mustacchi 
252d9328cd4SRobert Mustacchi #endif /* _RDB_H */
253