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