xref: /illumos-gate/usr/src/cmd/truss/ramdata.h (revision 06e1a714)
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 (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved  	*/
29 
30 #ifndef _RAMDATA_H
31 #define	_RAMDATA_H
32 
33 #pragma ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.3	*/
34 
35 #ifdef	__cplusplus
36 extern "C" {
37 #endif
38 
39 /*
40  * ramdata.h -- read/write data declarations.
41  */
42 
43 #include <errno.h>
44 #include <signal.h>
45 #include <synch.h>
46 #include <thread.h>
47 #include <thread_db.h>
48 #include "htbl.h"
49 
50 /*
51  * Set type for possible filedescriptors.
52  */
53 #define	NOFILES_MAX	(64 * 1024)
54 typedef struct {
55 	uint32_t word[(NOFILES_MAX+31)/32];
56 } fileset_t;
57 
58 /*
59  * Previous stop state enumeration (used by signalled() and requested()).
60  */
61 #define	SLEEPING	1
62 #define	JOBSIG		2
63 #define	JOBSTOP		3
64 
65 /*
66  * Simple convenience.
67  */
68 #ifdef	TRUE
69 #undef	TRUE
70 #endif
71 #ifdef	FALSE
72 #undef	FALSE
73 #endif
74 #define	TRUE	1
75 #define	FALSE	0
76 
77 /*
78  * Definition of private data.  See get_private().
79  */
80 
81 #define	IOBSIZE	12		/* number of bytes shown by prt_iob() */
82 
83 #define	CACHE_LN_SZ 64
84 
85 typedef struct private {
86 	struct ps_lwphandle *Lwp;	/* non-NULL for each lwp controller */
87 	const lwpstatus_t *lwpstat; /* lwp status information while stopped */
88 	int	length;		/* length of printf() output so far */
89 	pid_t	child;		/* pid of fork()ed child process */
90 	char	pname[32];	/* formatted pid/tid of controlled lwp */
91 	struct {		/* remembered parameters for make_pname() */
92 		int	ff;
93 		int	lf;
94 		pid_t	pid;
95 		id_t	lwpid;
96 		id_t	tid;
97 	} pparam;
98 	int	Errno;		/* errno for controlled process's syscall */
99 	int	ErrPriv;	/* privilege missing for last syscall */
100 	long	Rval1;		/* rval1 (%r0) for syscall */
101 	long	Rval2;		/* rval2 (%r1) for syscall */
102 	timestruc_t syslast;	/* most recent value of stime */
103 	timestruc_t usrlast;	/* most recent value of utime */
104 	long	sys_args[9];	/* the arguments to the last syscall */
105 	int	sys_nargs;	/* number of arguments to the last syscall */
106 	int	sys_indirect;	/* if TRUE, this is an indirect system call */
107 	char	sys_name[12];	/* name of unknown system call */
108 	char	raw_sig_name[SIG2STR_MAX+4]; /* name of known signal */
109 	char	sig_name[12];	/* name of unknown signal */
110 	char	flt_name[12];	/* name of unknown fault */
111 	char	*sys_path;	/* first pathname given to syscall */
112 	size_t	sys_psize;	/* sizeof(*sys_path) */
113 	int	sys_valid;	/* pathname was fetched and is valid */
114 	char	*sys_string;	/* buffer for formatted syscall string */
115 	size_t	sys_ssize;	/* sizeof(*sys_string) */
116 	size_t	sys_leng;	/* strlen(sys_string) */
117 	char	*exec_string;	/* copy of sys_string for exec() only */
118 	char	exec_pname[32];	/* formatted pid for exec() only */
119 	id_t	exec_lwpid;	/* lwpid that performed the exec */
120 	char	*str_buffer;	/* fetchstring() buffer */
121 	size_t	str_bsize;	/* sizeof(*str_buffer) */
122 	char	iob_buf[2*IOBSIZE+8];	/* where prt_iob() leaves its stuff */
123 	char	code_buf[160];	/* for symbolic arguments, e.g., ioctl codes */
124 	int	recur;		/* show_strioctl() -- to prevent recursion */
125 	int	seconds;	/* seconds, fraction for timestamps */
126 	int	fraction;	/* fraction in 1/10 milliseconds */
127 } private_t;
128 
129 extern	thread_key_t	private_key;	/* set by thr_keycreate() */
130 
131 extern	char	*command;	/* name of command ("truss") */
132 extern	int	interrupt;	/* interrupt signal was received */
133 extern	int	sigusr1;	/* received SIGUSR1 (release process) */
134 extern	int	sfd;		/* file descriptor to shared tmp file */
135 extern	pid_t	created;	/* if process was created, its process id */
136 extern	uid_t	Euid;		/* truss's effective uid */
137 extern	uid_t	Egid;		/* truss's effective gid */
138 extern	uid_t	Ruid;		/* truss's real uid */
139 extern	uid_t	Rgid;		/* truss's real gid */
140 extern	prcred_t credentials;	/* traced process credentials */
141 extern	int	istty;		/* TRUE iff output is a tty */
142 extern	time_t	starttime;	/* start time */
143 
144 extern	int	Fflag;		/* option flags from getopt() */
145 extern	int	fflag;
146 extern	int	cflag;
147 extern	int	aflag;
148 extern	int	eflag;
149 extern	int	iflag;
150 extern	int	lflag;
151 extern	int	tflag;
152 extern	int	pflag;
153 extern	int	sflag;
154 extern	int	mflag;
155 extern	int	oflag;
156 extern	int	vflag;
157 extern	int	xflag;
158 extern	int	hflag;
159 
160 extern	int	dflag;
161 extern	int	Dflag;
162 extern	int	Eflag;
163 extern	int	Tflag;
164 extern	int	Sflag;
165 extern	int	Mflag;
166 
167 extern	sysset_t trace;		/* sys calls to trace */
168 extern	sysset_t traceeven;	/* sys calls to trace even if not reported */
169 extern	sysset_t verbose;	/* sys calls to be verbose about */
170 extern	sysset_t rawout;	/* sys calls to show in raw mode */
171 extern	sigset_t signals;	/* signals to trace */
172 extern	fltset_t faults;	/* faults to trace */
173 extern	fileset_t readfd;	/* read() file descriptors to dump */
174 extern	fileset_t writefd;	/* write() file descriptors to dump */
175 
176 #pragma align CACHE_LN_SZ(truss_lock, count_lock)
177 extern	mutex_t	truss_lock;	/* protects almost everything */
178 extern	cond_t	truss_cv;	/* condition variable associated w truss_lock */
179 extern	mutex_t count_lock;	/* lock protecting count struct Cp */
180 
181 extern	htbl_t	*fcall_tbl;	/* function call hash table (per-proc) */
182 
183 extern	int	truss_nlwp;	/* number of truss lwps */
184 extern	int	truss_maxlwp;	/* number of entries in truss_lwpid */
185 extern	lwpid_t	*truss_lwpid;	/* array of truss lwpid's */
186 
187 
188 struct syscount {
189 	long count;		/* system call count */
190 	long error;		/* system call errors */
191 	timestruc_t stime;	/* time spent in system call */
192 };
193 
194 struct counts {		/* structure for keeping counts */
195 	long sigcount[PRMAXSIG+1];	/* signals count [0..PRMAXSIG] */
196 	long fltcount[PRMAXFAULT+1];	/* faults count [0..MAXFAULT] */
197 	struct syscount *syscount[PRMAXSYS+1];
198 	timestruc_t systotal;		/* total time spent in kernel */
199 	timestruc_t usrtotal;		/* total time spent in user mode */
200 	timestruc_t basetime;		/* base time for timestamps */
201 };
202 
203 struct global_psinfo {
204 	mutex_t	fork_lock;		/* protects list of truss pids */
205 	cond_t	fork_cv;
206 	char p1[CACHE_LN_SZ - (sizeof (mutex_t) + sizeof (cond_t))];
207 	mutex_t ps_mutex0;		/* see ipc.c:Ecritical */
208 	char p2[CACHE_LN_SZ - sizeof (mutex_t)];
209 	mutex_t	ps_mutex1;		/* see ipc.c:Ecritical */
210 	char p3[CACHE_LN_SZ - sizeof (mutex_t)];
211 	pid_t	fork_pid;
212 	pid_t tpid[1000];	/* truss process pid */
213 	pid_t spid[1000];	/* subject process pid */
214 	const char *lwps[1000];	/* optional lwp list */
215 };
216 
217 extern	struct counts *Cp;	/* for counting: malloc() or shared memory */
218 extern	struct global_psinfo *gps;	/* ptr to global_psinfo struct */
219 
220 struct bkpt {		/* to describe one function's entry point */
221 	struct bkpt *next;	/* hash table linked list */
222 	char	*sym_name;	/* function name */
223 	struct dynlib *dyn;	/* enclosing library */
224 	uintptr_t addr;		/* function address, breakpointed */
225 	ulong_t	instr;		/* original instruction at addr */
226 	int	flags;		/* see below */
227 };
228 #define	BPT_HANG	0x01	/* leave stopped and abandoned when called */
229 #define	BPT_EXCLUDE	0x02	/* function found but is being excluded */
230 #define	BPT_INTERNAL	0x04	/* trace internal calls on this function */
231 #define	BPT_ACTIVE	0x08	/* function breakpoint is set in process */
232 #define	BPT_PREINIT	0x10	/* PREINIT event in ld.so.1 */
233 #define	BPT_POSTINIT	0x20	/* POSTINIT event in ld.so.1 */
234 #define	BPT_DLACTIVITY	0x40	/* DLACTIVITY event in ld.so.1 */
235 #define	BPT_TD_CREATE	0x80	/* TD_CREATE threading event */
236 
237 struct dynlib {		/* structure for tracing functions */
238 	struct dynlib *next;
239 	char	*lib_name;	/* full library name */
240 	char	*match_name;	/* library name used in name matching */
241 	char	*prt_name;	/* library name for printing */
242 	int	built;		/* if true, bkpt list has been built */
243 	int	present;	/* true if library is still present */
244 	uintptr_t base;		/* library's mapping base */
245 	size_t	size;		/* library's mapping size */
246 };
247 
248 struct dynpat {		/* structure specifying patterns for dynlib's */
249 	struct dynpat *next;
250 	const char **libpat;	/* array of patterns for library names */
251 	const char **sympat;	/* array of patterns for symbol names */
252 	int	nlibpat;	/* number of library patterns */
253 	int	nsympat;	/* number of symbol patterns */
254 	char	flag;		/* 0 or BPT_HANG */
255 	char	exclude_lib;	/* if true, exclude these libraries */
256 	char	exclude;	/* if true, exclude these functions */
257 	char	internal;	/* if true, trace internal calls */
258 	struct dynlib *Dp;	/* set to the dynlib instance when searching */
259 };
260 
261 extern	struct dynlib *Dyn;	/* for tracing functions in shared libraries */
262 extern	struct dynpat *Dynpat;
263 extern	struct dynpat *Lastpat;
264 extern	struct bkpt **bpt_hashtable;	/* breakpoint hash table */
265 extern	uint_t	nthr_create;	/* number of thr_create() calls seen so far */
266 
267 struct callstack {
268 	struct callstack *next;
269 	uintptr_t stkbase;	/* stkbase < stkend */
270 	uintptr_t stkend;	/* stkend == base + size */
271 	prgreg_t tref;		/* %g7 (sparc) or %gs (intel) */
272 	id_t	tid;		/* thread-id */
273 	uint_t	nthr_create;	/* value of nthr_create last time we looked */
274 	uint_t	ncall;		/* number of elements in stack */
275 	uint_t	maxcall;	/* max elements in stack (malloc'd) */
276 	struct {
277 		uintptr_t sp;		/* %sp for function call */
278 		uintptr_t pc;		/* value of the return %pc */
279 		struct bkpt *fcn;	/* name of function called */
280 	} *stack;		/* pointer to the call stack info */
281 };
282 
283 extern	struct callstack *callstack;	/* the callstack list */
284 extern	uint_t	nstack;			/* number of detected stacks */
285 extern	rd_agent_t *Rdb_agent;		/* run-time linker debug handle */
286 extern	td_thragent_t *Thr_agent;	/* thread debug handle */
287 extern	int	not_consist;	/* used while rebuilding breakpoint table */
288 extern	int	delete_library;	/* used while rebuilding breakpoint table */
289 
290 extern	pid_t	ancestor;	/* top-level parent process id */
291 extern	int	descendent;	/* TRUE iff descendent of top level */
292 extern	int	is_vfork_child;	/* TRUE iff process is a vfork()ed child */
293 
294 extern	int	ngrab;		/* number of pid's that were grabbed */
295 
296 extern	struct ps_prochandle *Proc;	/* global reference to process */
297 extern	int	data_model;	/* PR_MODEL_LP64 or PR_MODEL_ILP32 */
298 
299 extern	long	pagesize;	/* bytes per page; should be per-process */
300 
301 extern	int	exit_called;	/* _exit() syscall was seen */
302 
303 extern	lwpid_t	primary_lwp;	/* representative lwp on process grab */
304 
305 extern	sysset_t syshang;	/* sys calls to make process hang */
306 extern	sigset_t sighang;	/* signals to make process hang */
307 extern	fltset_t flthang;	/* faults to make process hang */
308 
309 extern	sigset_t emptyset;	/* no signals, for thr_sigsetmask() */
310 extern	sigset_t fillset;	/* all signals, for thr_sigsetmask() */
311 
312 extern	int	leave_hung;	/* if TRUE, leave the process hung */
313 
314 
315 #ifdef	__cplusplus
316 }
317 #endif
318 
319 #endif /* _RAMDATA_H */
320