Home | History | Annotate | Download | only in strace
      1 /*
      2  * Copyright (c) 1991, 1992 Paul Kranenburg <pk (at) cs.few.eur.nl>
      3  * Copyright (c) 1993 Branko Lankester <branko (at) hacktic.nl>
      4  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs (at) world.std.com>
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. The name of the author may not be used to endorse or promote products
     16  *    derived from this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28  */
     29 
     30 #ifdef HAVE_CONFIG_H
     31 # include "config.h"
     32 #endif
     33 
     34 #include <features.h>
     35 #ifdef HAVE_STDBOOL_H
     36 # include <stdbool.h>
     37 #endif
     38 #include <stdint.h>
     39 #include <inttypes.h>
     40 #include <sys/types.h>
     41 #ifdef STDC_HEADERS
     42 # include <stddef.h>
     43 #endif
     44 #include <unistd.h>
     45 #include <stdlib.h>
     46 #include <stdio.h>
     47 /* Open-coding isprint(ch) et al proved more efficient than calling
     48  * generalized libc interface. We don't *want* to do non-ASCII anyway.
     49  */
     50 /* #include <ctype.h> */
     51 #include <string.h>
     52 #include <errno.h>
     53 #include <time.h>
     54 #include <sys/time.h>
     55 #include <sys/syscall.h>
     56 
     57 #include "mpers_type.h"
     58 #include "gcc_compat.h"
     59 
     60 #ifndef HAVE_STRERROR
     61 const char *strerror(int);
     62 #endif
     63 #ifndef HAVE_STPCPY
     64 /* Some libc have stpcpy, some don't. Sigh...
     65  * Roll our private implementation...
     66  */
     67 #undef stpcpy
     68 #define stpcpy strace_stpcpy
     69 extern char *stpcpy(char *dst, const char *src);
     70 #endif
     71 
     72 #ifndef offsetof
     73 # define offsetof(type, member)	\
     74 	(((char *) &(((type *) NULL)->member)) - ((char *) (type *) NULL))
     75 #endif
     76 
     77 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
     78 
     79 /* macros */
     80 #ifndef MAX
     81 # define MAX(a, b)		(((a) > (b)) ? (a) : (b))
     82 #endif
     83 #ifndef MIN
     84 # define MIN(a, b)		(((a) < (b)) ? (a) : (b))
     85 #endif
     86 #define CLAMP(val, min, max) MIN(MAX(min, val), max)
     87 
     88 /* Glibc has an efficient macro for sigemptyset
     89  * (it just does one or two assignments of 0 to internal vector of longs).
     90  */
     91 #if defined(__GLIBC__) && defined(__sigemptyset) && !defined(sigemptyset)
     92 # define sigemptyset __sigemptyset
     93 #endif
     94 
     95 /* Configuration section */
     96 #ifndef DEFAULT_STRLEN
     97 /* default maximum # of bytes printed in `printstr', change with -s switch */
     98 # define DEFAULT_STRLEN	32
     99 #endif
    100 #ifndef DEFAULT_ACOLUMN
    101 # define DEFAULT_ACOLUMN	40	/* default alignment column for results */
    102 #endif
    103 /*
    104  * Maximum number of args to a syscall.
    105  *
    106  * Make sure that all entries in all syscallent.h files have nargs <= MAX_ARGS!
    107  * linux/<ARCH>/syscallent*.h:
    108  * 	all have nargs <= 6 except mips o32 which has nargs <= 7.
    109  */
    110 #ifndef MAX_ARGS
    111 # ifdef LINUX_MIPSO32
    112 #  define MAX_ARGS	7
    113 # else
    114 #  define MAX_ARGS	6
    115 # endif
    116 #endif
    117 /* default sorting method for call profiling */
    118 #ifndef DEFAULT_SORTBY
    119 # define DEFAULT_SORTBY "time"
    120 #endif
    121 /*
    122  * Experimental code using PTRACE_SEIZE can be enabled here.
    123  * This needs Linux kernel 3.4.x or later to work.
    124  */
    125 #define USE_SEIZE 1
    126 /* To force NOMMU build, set to 1 */
    127 #define NOMMU_SYSTEM 0
    128 /*
    129  * Set to 1 to use speed-optimized vfprintf implementation.
    130  * It results in strace using about 5% less CPU in user space
    131  * (compared to glibc version).
    132  * But strace spends a lot of time in kernel space,
    133  * so overall it does not appear to be a significant win.
    134  * Thus disabled by default.
    135  */
    136 #define USE_CUSTOM_PRINTF 0
    137 
    138 #ifndef ERESTARTSYS
    139 # define ERESTARTSYS    512
    140 #endif
    141 #ifndef ERESTARTNOINTR
    142 # define ERESTARTNOINTR 513
    143 #endif
    144 #ifndef ERESTARTNOHAND
    145 # define ERESTARTNOHAND 514
    146 #endif
    147 #ifndef ERESTART_RESTARTBLOCK
    148 # define ERESTART_RESTARTBLOCK 516
    149 #endif
    150 
    151 #if defined(SPARC) || defined(SPARC64)
    152 # define PERSONALITY0_WORDSIZE 4
    153 # if defined(SPARC64)
    154 #  define SUPPORTED_PERSONALITIES 2
    155 #  define PERSONALITY1_WORDSIZE 8
    156 #  ifdef HAVE_M32_MPERS
    157 #   define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
    158 #   define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
    159 #   define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
    160 #  endif
    161 # endif
    162 #endif
    163 
    164 #ifdef X86_64
    165 # define SUPPORTED_PERSONALITIES 3
    166 # define PERSONALITY0_WORDSIZE 8
    167 # define PERSONALITY1_WORDSIZE 4
    168 # define PERSONALITY2_WORDSIZE 4
    169 # ifdef HAVE_M32_MPERS
    170 #  define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
    171 #  define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
    172 #  define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
    173 # endif
    174 # ifdef HAVE_MX32_MPERS
    175 #  define PERSONALITY2_INCLUDE_FUNCS "mx32_funcs.h"
    176 #  define PERSONALITY2_INCLUDE_PRINTERS_DECLS "mx32_printer_decls.h"
    177 #  define PERSONALITY2_INCLUDE_PRINTERS_DEFS "mx32_printer_defs.h"
    178 # endif
    179 #endif
    180 
    181 #ifdef X32
    182 # define SUPPORTED_PERSONALITIES 2
    183 # define PERSONALITY0_WORDSIZE 4
    184 # define PERSONALITY1_WORDSIZE 4
    185 # ifdef HAVE_M32_MPERS
    186 #  define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
    187 #  define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
    188 #  define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
    189 # endif
    190 #endif
    191 
    192 #ifdef ARM
    193 /* one personality */
    194 #endif
    195 
    196 #ifdef AARCH64
    197 /* The existing ARM personality, then AArch64 */
    198 # define SUPPORTED_PERSONALITIES 2
    199 # define PERSONALITY0_WORDSIZE 8
    200 # define PERSONALITY1_WORDSIZE 4
    201 # ifdef HAVE_M32_MPERS
    202 #  define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
    203 #  define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
    204 #  define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
    205 # endif
    206 #endif
    207 
    208 #ifdef POWERPC64
    209 # define SUPPORTED_PERSONALITIES 2
    210 # define PERSONALITY0_WORDSIZE 8
    211 # define PERSONALITY1_WORDSIZE 4
    212 # ifdef HAVE_M32_MPERS
    213 #  define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
    214 #  define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
    215 #  define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
    216 # endif
    217 #endif
    218 
    219 #ifdef TILE
    220 # define SUPPORTED_PERSONALITIES 2
    221 # define PERSONALITY0_WORDSIZE 8
    222 # define PERSONALITY1_WORDSIZE 4
    223 # ifdef __tilepro__
    224 #  define DEFAULT_PERSONALITY 1
    225 # endif
    226 # ifdef HAVE_M32_MPERS
    227 #  define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
    228 #  define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
    229 #  define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
    230 # endif
    231 #endif
    232 
    233 #ifndef SUPPORTED_PERSONALITIES
    234 # define SUPPORTED_PERSONALITIES 1
    235 #endif
    236 #ifndef DEFAULT_PERSONALITY
    237 # define DEFAULT_PERSONALITY 0
    238 #endif
    239 #ifndef PERSONALITY0_WORDSIZE
    240 # define PERSONALITY0_WORDSIZE SIZEOF_LONG
    241 #endif
    242 
    243 #ifndef PERSONALITY0_INCLUDE_PRINTERS_DECLS
    244 # define PERSONALITY0_INCLUDE_PRINTERS_DECLS "native_printer_decls.h"
    245 #endif
    246 #ifndef PERSONALITY0_INCLUDE_PRINTERS_DEFS
    247 # define PERSONALITY0_INCLUDE_PRINTERS_DEFS "native_printer_defs.h"
    248 #endif
    249 
    250 #ifndef PERSONALITY1_INCLUDE_PRINTERS_DECLS
    251 # define PERSONALITY1_INCLUDE_PRINTERS_DECLS "native_printer_decls.h"
    252 #endif
    253 #ifndef PERSONALITY1_INCLUDE_PRINTERS_DEFS
    254 # define PERSONALITY1_INCLUDE_PRINTERS_DEFS "native_printer_defs.h"
    255 #endif
    256 
    257 #ifndef PERSONALITY2_INCLUDE_PRINTERS_DECLS
    258 # define PERSONALITY2_INCLUDE_PRINTERS_DECLS "native_printer_decls.h"
    259 #endif
    260 #ifndef PERSONALITY2_INCLUDE_PRINTERS_DEFS
    261 # define PERSONALITY2_INCLUDE_PRINTERS_DEFS "native_printer_defs.h"
    262 #endif
    263 
    264 #ifndef PERSONALITY1_INCLUDE_FUNCS
    265 # define PERSONALITY1_INCLUDE_FUNCS "empty.h"
    266 #endif
    267 #ifndef PERSONALITY2_INCLUDE_FUNCS
    268 # define PERSONALITY2_INCLUDE_FUNCS "empty.h"
    269 #endif
    270 
    271 typedef struct sysent {
    272 	unsigned nargs;
    273 	int	sys_flags;
    274 	int	sen;
    275 	int	(*sys_func)();
    276 	const char *sys_name;
    277 } struct_sysent;
    278 
    279 typedef struct ioctlent {
    280 	const char *symbol;
    281 	unsigned int code;
    282 } struct_ioctlent;
    283 
    284 /* Trace Control Block */
    285 struct tcb {
    286 	int flags;		/* See below for TCB_ values */
    287 	int pid;		/* If 0, this tcb is free */
    288 	int qual_flg;		/* qual_flags[scno] or DEFAULT_QUAL_FLAGS + RAW */
    289 	int u_error;		/* Error code */
    290 	long scno;		/* System call number */
    291 	long u_arg[MAX_ARGS];	/* System call arguments */
    292 #if defined(LINUX_MIPSN32) || defined(X32)
    293 	long long ext_arg[MAX_ARGS];
    294 	long long u_lrval;	/* long long return value */
    295 #endif
    296 	long u_rval;		/* Return value */
    297 #if SUPPORTED_PERSONALITIES > 1
    298 	unsigned int currpers;	/* Personality at the time of scno update */
    299 #endif
    300 	int sys_func_rval;	/* Syscall entry parser's return value */
    301 	int curcol;		/* Output column for this process */
    302 	FILE *outf;		/* Output file for this process */
    303 	const char *auxstr;	/* Auxiliary info from syscall (see RVAL_STR) */
    304 	const struct_sysent *s_ent; /* sysent[scno] or dummy struct for bad scno */
    305 	const struct_sysent *s_prev_ent; /* for "resuming interrupted SYSCALL" msg */
    306 	struct timeval stime;	/* System time usage as of last process wait */
    307 	struct timeval dtime;	/* Delta for system time usage */
    308 	struct timeval etime;	/* Syscall entry time */
    309 
    310 #ifdef USE_LIBUNWIND
    311 	struct UPT_info* libunwind_ui;
    312 	struct mmap_cache_t* mmap_cache;
    313 	unsigned int mmap_cache_size;
    314 	unsigned int mmap_cache_generation;
    315 	struct queue_t* queue;
    316 #endif
    317 };
    318 
    319 /* TCB flags */
    320 /* We have attached to this process, but did not see it stopping yet */
    321 #define TCB_STARTUP		0x01
    322 #define TCB_IGNORE_ONE_SIGSTOP	0x02	/* Next SIGSTOP is to be ignored */
    323 /*
    324  * Are we in system call entry or in syscall exit?
    325  *
    326  * This bit is set after all syscall entry processing is done.
    327  * Therefore, this bit will be set when next ptrace stop occurs,
    328  * which should be syscall exit stop. Other stops which are possible
    329  * directly after syscall entry (death, ptrace event stop)
    330  * are simpler and handled without calling trace_syscall(), therefore
    331  * the places where TCB_INSYSCALL can be set but we aren't in syscall stop
    332  * are limited to trace(), this condition is never observed in trace_syscall()
    333  * and below.
    334  * The bit is cleared after all syscall exit processing is done.
    335  *
    336  * Use entering(tcp) / exiting(tcp) to check this bit to make code more readable.
    337  */
    338 #define TCB_INSYSCALL	0x04
    339 #define TCB_ATTACHED	0x08	/* We attached to it already */
    340 #define TCB_REPRINT	0x10	/* We should reprint this syscall on exit */
    341 #define TCB_FILTERED	0x20	/* This system call has been filtered out */
    342 
    343 /* qualifier flags */
    344 #define QUAL_TRACE	0x001	/* this system call should be traced */
    345 #define QUAL_ABBREV	0x002	/* abbreviate the structures of this syscall */
    346 #define QUAL_VERBOSE	0x004	/* decode the structures of this syscall */
    347 #define QUAL_RAW	0x008	/* print all args in hex for this syscall */
    348 #define QUAL_SIGNAL	0x010	/* report events with this signal */
    349 #define QUAL_READ	0x020	/* dump data read on this file descriptor */
    350 #define QUAL_WRITE	0x040	/* dump data written to this file descriptor */
    351 typedef uint8_t qualbits_t;
    352 #define UNDEFINED_SCNO	0x100	/* Used only in tcp->qual_flg */
    353 
    354 #define DEFAULT_QUAL_FLAGS (QUAL_TRACE | QUAL_ABBREV | QUAL_VERBOSE)
    355 
    356 #define entering(tcp)	(!((tcp)->flags & TCB_INSYSCALL))
    357 #define exiting(tcp)	((tcp)->flags & TCB_INSYSCALL)
    358 #define syserror(tcp)	((tcp)->u_error != 0)
    359 #define verbose(tcp)	((tcp)->qual_flg & QUAL_VERBOSE)
    360 #define abbrev(tcp)	((tcp)->qual_flg & QUAL_ABBREV)
    361 #define filtered(tcp)	((tcp)->flags & TCB_FILTERED)
    362 
    363 struct xlat {
    364 	unsigned int val;
    365 	const char *str;
    366 };
    367 #define XLAT(x) { x, #x }
    368 #define XLAT_END { 0, NULL }
    369 
    370 extern const struct xlat addrfams[];
    371 extern const struct xlat at_flags[];
    372 extern const struct xlat dirent_types[];
    373 extern const struct xlat open_access_modes[];
    374 extern const struct xlat open_mode_flags[];
    375 extern const struct xlat resource_flags[];
    376 extern const struct xlat whence_codes[];
    377 
    378 /* Format of syscall return values */
    379 #define RVAL_DECIMAL	000	/* decimal format */
    380 #define RVAL_HEX	001	/* hex format */
    381 #define RVAL_OCTAL	002	/* octal format */
    382 #define RVAL_UDECIMAL	003	/* unsigned decimal format */
    383 #if defined(LINUX_MIPSN32) || defined(X32)
    384 # if 0 /* unused so far */
    385 #  define RVAL_LDECIMAL	004	/* long decimal format */
    386 #  define RVAL_LHEX	005	/* long hex format */
    387 #  define RVAL_LOCTAL	006	/* long octal format */
    388 # endif
    389 # define RVAL_LUDECIMAL	007	/* long unsigned decimal format */
    390 #endif
    391 #define RVAL_FD		010	/* file descriptor */
    392 #define RVAL_MASK	017	/* mask for these values */
    393 
    394 #define RVAL_STR	020	/* Print `auxstr' field after return val */
    395 #define RVAL_NONE	040	/* Print nothing */
    396 
    397 #define RVAL_DECODED	0100	/* syscall decoding finished */
    398 
    399 #define TRACE_FILE	001	/* Trace file-related syscalls. */
    400 #define TRACE_IPC	002	/* Trace IPC-related syscalls. */
    401 #define TRACE_NETWORK	004	/* Trace network-related syscalls. */
    402 #define TRACE_PROCESS	010	/* Trace process-related syscalls. */
    403 #define TRACE_SIGNAL	020	/* Trace signal-related syscalls. */
    404 #define TRACE_DESC	040	/* Trace file descriptor-related syscalls. */
    405 #define TRACE_MEMORY	0100	/* Trace memory mapping-related syscalls. */
    406 #define SYSCALL_NEVER_FAILS	0200	/* Syscall is always successful. */
    407 #define STACKTRACE_INVALIDATE_CACHE 0400  /* Trigger proc/maps cache updating */
    408 #define STACKTRACE_CAPTURE_ON_ENTER 01000 /* Capture stacktrace on "entering" stage */
    409 #define TRACE_INDIRECT_SUBCALL	02000	/* Syscall is an indirect socket/ipc subcall. */
    410 
    411 #define IOCTL_NUMBER_UNKNOWN 0
    412 #define IOCTL_NUMBER_HANDLED 1
    413 #define IOCTL_NUMBER_STOP_LOOKUP 010
    414 
    415 #define indirect_ipccall(tcp) (tcp->s_ent->sys_flags & TRACE_INDIRECT_SUBCALL)
    416 
    417 #if defined(ARM) || defined(AARCH64) \
    418  || defined(I386) || defined(X32) || defined(X86_64) \
    419  || defined(IA64) \
    420  || defined(BFIN) \
    421  || defined(M68K) \
    422  || defined(MICROBLAZE) \
    423  || defined(S390) \
    424  || defined(SH) || defined(SH64) \
    425  || defined(SPARC) || defined(SPARC64) \
    426  /**/
    427 # define NEED_UID16_PARSERS 1
    428 #else
    429 # define NEED_UID16_PARSERS 0
    430 #endif
    431 
    432 typedef enum {
    433 	CFLAG_NONE = 0,
    434 	CFLAG_ONLY_STATS,
    435 	CFLAG_BOTH
    436 } cflag_t;
    437 extern cflag_t cflag;
    438 extern bool debug_flag;
    439 extern bool Tflag;
    440 extern bool iflag;
    441 extern bool count_wallclock;
    442 extern unsigned int qflag;
    443 extern bool not_failing_only;
    444 extern unsigned int show_fd_path;
    445 extern bool hide_log_until_execve;
    446 /* are we filtering traces based on paths? */
    447 extern const char **paths_selected;
    448 #define tracing_paths (paths_selected != NULL)
    449 extern unsigned xflag;
    450 extern unsigned followfork;
    451 #ifdef USE_LIBUNWIND
    452 /* if this is true do the stack trace for every system call */
    453 extern bool stack_trace_enabled;
    454 #endif
    455 extern unsigned ptrace_setoptions;
    456 extern unsigned max_strlen;
    457 extern unsigned os_release;
    458 #undef KERNEL_VERSION
    459 #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
    460 
    461 void error_msg(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2));
    462 void perror_msg(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2));
    463 void error_msg_and_die(const char *fmt, ...)
    464 	ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN;
    465 void error_msg_and_help(const char *fmt, ...)
    466 	ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN;
    467 void perror_msg_and_die(const char *fmt, ...)
    468 	ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN;
    469 void die_out_of_memory(void) ATTRIBUTE_NORETURN;
    470 
    471 void *xmalloc(size_t size) ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((1));
    472 void *xcalloc(size_t nmemb, size_t size)
    473 	ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((1, 2));
    474 void *xreallocarray(void *ptr, size_t nmemb, size_t size)
    475 	ATTRIBUTE_ALLOC_SIZE((2, 3));
    476 char *xstrdup(const char *str) ATTRIBUTE_MALLOC;
    477 
    478 #if USE_CUSTOM_PRINTF
    479 /*
    480  * See comment in vsprintf.c for allowed formats.
    481  * Short version: %h[h]u, %zu, %tu are not allowed, use %[l[l]]u.
    482  */
    483 int strace_vfprintf(FILE *fp, const char *fmt, va_list args);
    484 #else
    485 # define strace_vfprintf vfprintf
    486 #endif
    487 
    488 extern void set_sortby(const char *);
    489 extern void set_overhead(int);
    490 extern void qualify(const char *);
    491 extern void print_pc(struct tcb *);
    492 extern int trace_syscall(struct tcb *);
    493 extern void count_syscall(struct tcb *, const struct timeval *);
    494 extern void call_summary(FILE *);
    495 
    496 extern void clear_regs(void);
    497 extern void get_regs(pid_t pid);
    498 extern int get_scno(struct tcb *tcp);
    499 extern const char *syscall_name(long scno);
    500 
    501 extern bool is_erestart(struct tcb *);
    502 extern void temporarily_clear_syserror(struct tcb *);
    503 extern void restore_cleared_syserror(struct tcb *);
    504 
    505 extern int umoven(struct tcb *, long, unsigned int, void *);
    506 #define umove(pid, addr, objp)	\
    507 	umoven((pid), (addr), sizeof(*(objp)), (void *) (objp))
    508 extern int umoven_or_printaddr(struct tcb *, long, unsigned int, void *);
    509 #define umove_or_printaddr(pid, addr, objp)	\
    510 	umoven_or_printaddr((pid), (addr), sizeof(*(objp)), (void *) (objp))
    511 extern int umove_ulong_or_printaddr(struct tcb *, long, unsigned long *);
    512 extern int umove_ulong_array_or_printaddr(struct tcb *, long, unsigned long *, size_t);
    513 extern int umovestr(struct tcb *, long, unsigned int, char *);
    514 extern int upeek(int pid, long, long *);
    515 
    516 #if defined ALPHA || defined IA64 || defined MIPS \
    517  || defined SH || defined SPARC || defined SPARC64
    518 # define HAVE_GETRVAL2
    519 extern long getrval2(struct tcb *);
    520 #else
    521 # undef HAVE_GETRVAL2
    522 #endif
    523 
    524 extern const char *signame(const int);
    525 extern void pathtrace_select(const char *);
    526 extern int pathtrace_match(struct tcb *);
    527 extern int getfdpath(struct tcb *, int, char *, unsigned);
    528 
    529 extern const char *xlookup(const struct xlat *, const unsigned int);
    530 extern const char *xlat_search(const struct xlat *, const size_t, const unsigned int);
    531 
    532 extern unsigned long get_pagesize(void);
    533 extern int string_to_uint(const char *str);
    534 extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits);
    535 
    536 #define QUOTE_0_TERMINATED			0x01
    537 #define QUOTE_OMIT_LEADING_TRAILING_QUOTES	0x02
    538 
    539 extern int print_quoted_string(const char *, unsigned int, unsigned int);
    540 
    541 /* a refers to the lower numbered u_arg,
    542  * b refers to the higher numbered u_arg
    543  */
    544 #ifdef WORDS_BIGENDIAN
    545 # define LONG_LONG(a,b) \
    546 	((long long)((unsigned long long)(unsigned)(b) | ((unsigned long long)(a)<<32)))
    547 #else
    548 # define LONG_LONG(a,b) \
    549 	((long long)((unsigned long long)(unsigned)(a) | ((unsigned long long)(b)<<32)))
    550 #endif
    551 extern int getllval(struct tcb *, unsigned long long *, int);
    552 extern int printllval(struct tcb *, const char *, int)
    553 	ATTRIBUTE_FORMAT((printf, 2, 0));
    554 
    555 extern void printaddr(long);
    556 extern void printxvals(const unsigned int, const char *, const struct xlat *, ...);
    557 #define printxval(xlat, val, dflt) printxvals(val, dflt, xlat, NULL)
    558 extern int printargs(struct tcb *);
    559 extern int printargs_lu(struct tcb *);
    560 extern int printargs_ld(struct tcb *);
    561 extern void addflags(const struct xlat *, int);
    562 extern int printflags(const struct xlat *, int, const char *);
    563 extern const char *sprintflags(const char *, const struct xlat *, int);
    564 extern const char *sprintmode(int);
    565 extern const char *sprinttime(time_t);
    566 extern void dumpiov_in_msghdr(struct tcb *, long);
    567 extern void dumpiov_in_mmsghdr(struct tcb *, long);
    568 extern void dumpiov(struct tcb *, int, long);
    569 extern void dumpstr(struct tcb *, long, int);
    570 extern void printstr(struct tcb *, long, long);
    571 extern bool printnum_short(struct tcb *, long, const char *)
    572 	ATTRIBUTE_FORMAT((printf, 3, 0));
    573 extern bool printnum_int(struct tcb *, long, const char *)
    574 	ATTRIBUTE_FORMAT((printf, 3, 0));
    575 extern bool printnum_int64(struct tcb *, long, const char *)
    576 	ATTRIBUTE_FORMAT((printf, 3, 0));
    577 
    578 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
    579 extern bool printnum_long_int(struct tcb *, long, const char *, const char *)
    580 	ATTRIBUTE_FORMAT((printf, 3, 0))
    581 	ATTRIBUTE_FORMAT((printf, 4, 0));
    582 # define printnum_slong(tcp, addr) \
    583 	printnum_long_int((tcp), (addr), "%" PRId64, "%d")
    584 # define printnum_ulong(tcp, addr) \
    585 	printnum_long_int((tcp), (addr), "%" PRIu64, "%u")
    586 # define printnum_ptr(tcp, addr) \
    587 	printnum_long_int((tcp), (addr), "%#" PRIx64, "%#x")
    588 #elif SIZEOF_LONG > 4
    589 # define printnum_slong(tcp, addr) \
    590 	printnum_int64((tcp), (addr), "%" PRId64)
    591 # define printnum_ulong(tcp, addr) \
    592 	printnum_int64((tcp), (addr), "%" PRIu64)
    593 # define printnum_ptr(tcp, addr) \
    594 	printnum_int64((tcp), (addr), "%#" PRIx64)
    595 #else
    596 # define printnum_slong(tcp, addr) \
    597 	printnum_int((tcp), (addr), "%d")
    598 # define printnum_ulong(tcp, addr) \
    599 	printnum_int((tcp), (addr), "%u")
    600 # define printnum_ptr(tcp, addr) \
    601 	printnum_int((tcp), (addr), "%#x")
    602 #endif
    603 
    604 extern bool printpair_int(struct tcb *, long, const char *)
    605 	ATTRIBUTE_FORMAT((printf, 3, 0));
    606 extern bool printpair_int64(struct tcb *, long, const char *)
    607 	ATTRIBUTE_FORMAT((printf, 3, 0));
    608 extern void printpath(struct tcb *, long);
    609 extern void printpathn(struct tcb *, long, unsigned int);
    610 #define TIMESPEC_TEXT_BUFSIZE \
    611 		(sizeof(intmax_t)*3 * 2 + sizeof("{tv_sec=%jd, tv_nsec=%jd}"))
    612 extern void printfd(struct tcb *, int);
    613 extern bool print_sockaddr_by_inode(const unsigned long, const char *);
    614 extern void print_dirfd(struct tcb *, int);
    615 extern void printsock(struct tcb *, long, int);
    616 extern void print_sock_optmgmt(struct tcb *, long, int);
    617 #ifdef ALPHA
    618 extern void printrusage32(struct tcb *, long);
    619 extern const char *sprint_timeval32(struct tcb *tcp, long);
    620 extern void print_timeval32(struct tcb *tcp, long);
    621 extern void print_timeval32_pair(struct tcb *tcp, long);
    622 extern void print_itimerval32(struct tcb *tcp, long);
    623 #endif
    624 extern void printuid(const char *, const unsigned int);
    625 extern void print_sigset_addr_len(struct tcb *, long, long);
    626 extern const char *sprintsigmask_n(const char *, const void *, unsigned int);
    627 #define tprintsigmask_addr(prefix, mask) \
    628 	tprints(sprintsigmask_n((prefix), (mask), sizeof(mask)))
    629 extern void printsignal(int);
    630 extern void tprint_iov(struct tcb *, unsigned long, unsigned long, int decode_iov);
    631 extern void tprint_iov_upto(struct tcb *, unsigned long, unsigned long, int decode_iov, unsigned long);
    632 extern void tprint_open_modes(int);
    633 extern const char *sprint_open_modes(int);
    634 extern void print_seccomp_filter(struct tcb *tcp, unsigned long);
    635 
    636 extern int block_ioctl(struct tcb *, const unsigned int, long);
    637 extern int evdev_ioctl(struct tcb *, const unsigned int, long);
    638 extern int loop_ioctl(struct tcb *, const unsigned int, long);
    639 extern int mtd_ioctl(struct tcb *, const unsigned int, long);
    640 extern int ptp_ioctl(struct tcb *, const unsigned int, long);
    641 extern int rtc_ioctl(struct tcb *, const unsigned int, long);
    642 extern int scsi_ioctl(struct tcb *, const unsigned int, long);
    643 extern int sock_ioctl(struct tcb *, const unsigned int, long);
    644 extern int term_ioctl(struct tcb *, const unsigned int, long);
    645 extern int ubi_ioctl(struct tcb *, const unsigned int, long);
    646 extern int v4l2_ioctl(struct tcb *, const unsigned int, long);
    647 
    648 extern int tv_nz(const struct timeval *);
    649 extern int tv_cmp(const struct timeval *, const struct timeval *);
    650 extern double tv_float(const struct timeval *);
    651 extern void tv_add(struct timeval *, const struct timeval *, const struct timeval *);
    652 extern void tv_sub(struct timeval *, const struct timeval *, const struct timeval *);
    653 extern void tv_mul(struct timeval *, const struct timeval *, int);
    654 extern void tv_div(struct timeval *, const struct timeval *, int);
    655 
    656 #ifdef USE_LIBUNWIND
    657 extern void unwind_init(void);
    658 extern void unwind_tcb_init(struct tcb *tcp);
    659 extern void unwind_tcb_fin(struct tcb *tcp);
    660 extern void unwind_cache_invalidate(struct tcb* tcp);
    661 extern void unwind_print_stacktrace(struct tcb* tcp);
    662 extern void unwind_capture_stacktrace(struct tcb* tcp);
    663 #endif
    664 
    665 /* Strace log generation machinery.
    666  *
    667  * printing_tcp: tcb which has incomplete line being printed right now.
    668  * NULL if last line has been completed ('\n'-terminated).
    669  * printleader(tcp) examines it, finishes incomplete line if needed,
    670  * the sets it to tcp.
    671  * line_ended() clears printing_tcp and resets ->curcol = 0.
    672  * tcp->curcol == 0 check is also used to detect completeness
    673  * of last line, since in -ff mode just checking printing_tcp for NULL
    674  * is not enough.
    675  *
    676  * If you change this code, test log generation in both -f and -ff modes
    677  * using:
    678  * strace -oLOG -f[f] test/threaded_execve
    679  * strace -oLOG -f[f] test/sigkill_rain
    680  * strace -oLOG -f[f] -p "`pidof web_browser`"
    681  */
    682 extern struct tcb *printing_tcp;
    683 extern void printleader(struct tcb *);
    684 extern void line_ended(void);
    685 extern void tabto(void);
    686 extern void tprintf(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2));
    687 extern void tprints(const char *str);
    688 
    689 #if SUPPORTED_PERSONALITIES > 1
    690 extern void set_personality(int personality);
    691 extern unsigned current_personality;
    692 #else
    693 # define set_personality(personality) ((void)0)
    694 # define current_personality 0
    695 #endif
    696 
    697 #if SUPPORTED_PERSONALITIES == 1
    698 # define current_wordsize PERSONALITY0_WORDSIZE
    699 #else
    700 # if SUPPORTED_PERSONALITIES == 2 && PERSONALITY0_WORDSIZE == PERSONALITY1_WORDSIZE
    701 #  define current_wordsize PERSONALITY0_WORDSIZE
    702 # else
    703 extern unsigned current_wordsize;
    704 # endif
    705 #endif
    706 
    707 /* In many, many places we play fast and loose and use
    708  * tprintf("%d", (int) tcp->u_arg[N]) to print fds, pids etc.
    709  * We probably need to use widen_to_long() instead:
    710  */
    711 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
    712 # define widen_to_long(v) (current_wordsize == 4 ? (long)(int32_t)(v) : (long)(v))
    713 #else
    714 # define widen_to_long(v) ((long)(v))
    715 #endif
    716 
    717 extern const struct_sysent sysent0[];
    718 extern const char *const errnoent0[];
    719 extern const char *const signalent0[];
    720 extern const struct_ioctlent ioctlent0[];
    721 extern qualbits_t *qual_vec[SUPPORTED_PERSONALITIES];
    722 #define qual_flags (qual_vec[current_personality])
    723 
    724 #if SUPPORTED_PERSONALITIES > 1
    725 extern const struct_sysent *sysent;
    726 extern const char *const *errnoent;
    727 extern const char *const *signalent;
    728 extern const struct_ioctlent *ioctlent;
    729 #else
    730 # define sysent     sysent0
    731 # define errnoent   errnoent0
    732 # define signalent  signalent0
    733 # define ioctlent   ioctlent0
    734 #endif
    735 
    736 extern unsigned nsyscalls;
    737 extern unsigned nerrnos;
    738 extern unsigned nsignals;
    739 extern unsigned nioctlents;
    740 extern unsigned num_quals;
    741 
    742 #if SUPPORTED_PERSONALITIES > 1
    743 # include "printers.h"
    744 #else
    745 # include "native_printer_decls.h"
    746 #endif
    747 
    748 /*
    749  * If you need non-NULL sysent[scno].sys_func and sysent[scno].sys_name
    750  */
    751 #define SCNO_IS_VALID(scno) \
    752 	((unsigned long)(scno) < nsyscalls && sysent[scno].sys_func)
    753 
    754 /* Only ensures that sysent[scno] isn't out of range */
    755 #define SCNO_IN_RANGE(scno) \
    756 	((unsigned long)(scno) < nsyscalls)
    757 
    758 #define MPERS_FUNC_NAME__(prefix, name) prefix ## name
    759 #define MPERS_FUNC_NAME_(prefix, name) MPERS_FUNC_NAME__(prefix, name)
    760 #define MPERS_FUNC_NAME(name) MPERS_FUNC_NAME_(MPERS_PREFIX, name)
    761 
    762 #define SYS_FUNC_NAME(syscall_name) MPERS_FUNC_NAME(syscall_name)
    763 
    764 #define SYS_FUNC(syscall_name) int SYS_FUNC_NAME(sys_ ## syscall_name)(struct tcb *tcp)
    765 
    766 #define MPERS_PRINTER_DECL(type, name) type MPERS_FUNC_NAME(name)
    767