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