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  * Copyright (c) 2001-2018 The strace developers.
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  * 3. The name of the author may not be used to endorse or promote products
     17  *    derived from this software without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #ifndef STRACE_DEFS_H
     32 #define STRACE_DEFS_H
     33 
     34 #ifdef HAVE_CONFIG_H
     35 # include "config.h"
     36 #endif
     37 
     38 #include <features.h>
     39 #include <stdbool.h>
     40 #include <stdint.h>
     41 #include <inttypes.h>
     42 #include <sys/types.h>
     43 #include <stddef.h>
     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 
     56 #include "arch_defs.h"
     57 #include "error_prints.h"
     58 #include "gcc_compat.h"
     59 #include "kernel_types.h"
     60 #include "macros.h"
     61 #include "mpers_type.h"
     62 #include "string_to_uint.h"
     63 #include "sysent.h"
     64 #include "xmalloc.h"
     65 
     66 #ifndef HAVE_STRERROR
     67 const char *strerror(int);
     68 #endif
     69 #ifndef HAVE_STPCPY
     70 /* Some libc have stpcpy, some don't. Sigh...
     71  * Roll our private implementation...
     72  */
     73 #undef stpcpy
     74 #define stpcpy strace_stpcpy
     75 extern char *stpcpy(char *dst, const char *src);
     76 #endif
     77 
     78 /* Glibc has an efficient macro for sigemptyset
     79  * (it just does one or two assignments of 0 to internal vector of longs).
     80  */
     81 #if defined(__GLIBC__) && defined(__sigemptyset) && !defined(sigemptyset)
     82 # define sigemptyset __sigemptyset
     83 #endif
     84 
     85 /* Configuration section */
     86 #ifndef DEFAULT_STRLEN
     87 /* default maximum # of bytes printed in `printstr', change with -s switch */
     88 # define DEFAULT_STRLEN	32
     89 #endif
     90 #ifndef DEFAULT_ACOLUMN
     91 # define DEFAULT_ACOLUMN	40	/* default alignment column for results */
     92 #endif
     93 /*
     94  * Maximum number of args to a syscall.
     95  *
     96  * Make sure that all entries in all syscallent.h files have nargs <= MAX_ARGS!
     97  * linux/<ARCH>/syscallent*.h:
     98  *	all have nargs <= 6 except mips o32 which has nargs <= 7.
     99  */
    100 #ifndef MAX_ARGS
    101 # ifdef LINUX_MIPSO32
    102 #  define MAX_ARGS	7
    103 # else
    104 #  define MAX_ARGS	6
    105 # endif
    106 #endif
    107 /* default sorting method for call profiling */
    108 #ifndef DEFAULT_SORTBY
    109 # define DEFAULT_SORTBY "time"
    110 #endif
    111 
    112 /* To force NOMMU build, set to 1 */
    113 #define NOMMU_SYSTEM 0
    114 
    115 #ifndef ERESTARTSYS
    116 # define ERESTARTSYS    512
    117 #endif
    118 #ifndef ERESTARTNOINTR
    119 # define ERESTARTNOINTR 513
    120 #endif
    121 #ifndef ERESTARTNOHAND
    122 # define ERESTARTNOHAND 514
    123 #endif
    124 #ifndef ERESTART_RESTARTBLOCK
    125 # define ERESTART_RESTARTBLOCK 516
    126 #endif
    127 
    128 #define PERSONALITY0_WORDSIZE  SIZEOF_LONG
    129 #define PERSONALITY0_KLONGSIZE SIZEOF_KERNEL_LONG_T
    130 #define PERSONALITY0_INCLUDE_PRINTERS_DECLS "native_printer_decls.h"
    131 #define PERSONALITY0_INCLUDE_PRINTERS_DEFS "native_printer_defs.h"
    132 
    133 #if SUPPORTED_PERSONALITIES > 1
    134 # define PERSONALITY1_WORDSIZE  4
    135 # define PERSONALITY1_KLONGSIZE PERSONALITY1_WORDSIZE
    136 #endif
    137 
    138 #if SUPPORTED_PERSONALITIES > 2
    139 # define PERSONALITY2_WORDSIZE  4
    140 # define PERSONALITY2_KLONGSIZE PERSONALITY0_KLONGSIZE
    141 #endif
    142 
    143 #if SUPPORTED_PERSONALITIES > 1 && defined HAVE_M32_MPERS
    144 # define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
    145 # define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
    146 # define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
    147 # define MPERS_m32_IOCTL_MACROS "ioctl_redefs1.h"
    148 # define HAVE_PERSONALITY_1_MPERS 1
    149 #else
    150 # define PERSONALITY1_INCLUDE_PRINTERS_DECLS "native_printer_decls.h"
    151 # define PERSONALITY1_INCLUDE_PRINTERS_DEFS "native_printer_defs.h"
    152 # define PERSONALITY1_INCLUDE_FUNCS "empty.h"
    153 # define HAVE_PERSONALITY_1_MPERS 0
    154 #endif
    155 
    156 #if SUPPORTED_PERSONALITIES > 2 && defined HAVE_MX32_MPERS
    157 # define PERSONALITY2_INCLUDE_FUNCS "mx32_funcs.h"
    158 # define PERSONALITY2_INCLUDE_PRINTERS_DECLS "mx32_printer_decls.h"
    159 # define PERSONALITY2_INCLUDE_PRINTERS_DEFS "mx32_printer_defs.h"
    160 # define MPERS_mx32_IOCTL_MACROS "ioctl_redefs2.h"
    161 # define HAVE_PERSONALITY_2_MPERS 1
    162 #else
    163 # define PERSONALITY2_INCLUDE_PRINTERS_DECLS "native_printer_decls.h"
    164 # define PERSONALITY2_INCLUDE_PRINTERS_DEFS "native_printer_defs.h"
    165 # define PERSONALITY2_INCLUDE_FUNCS "empty.h"
    166 # define HAVE_PERSONALITY_2_MPERS 0
    167 #endif
    168 
    169 #ifdef WORDS_BIGENDIAN
    170 # define is_bigendian true
    171 #else
    172 # define is_bigendian false
    173 #endif
    174 
    175 typedef struct ioctlent {
    176 	const char *symbol;
    177 	unsigned int code;
    178 } struct_ioctlent;
    179 
    180 #define INJECT_F_SIGNAL		0x01
    181 #define INJECT_F_ERROR		0x02
    182 #define INJECT_F_RETVAL		0x04
    183 #define INJECT_F_DELAY_ENTER	0x08
    184 #define INJECT_F_DELAY_EXIT	0x10
    185 #define INJECT_F_SYSCALL	0x20
    186 
    187 #define INJECT_ACTION_FLAGS	\
    188 	(INJECT_F_SIGNAL	\
    189 	|INJECT_F_ERROR		\
    190 	|INJECT_F_RETVAL	\
    191 	|INJECT_F_DELAY_ENTER	\
    192 	|INJECT_F_DELAY_EXIT	\
    193 	)
    194 
    195 struct inject_data {
    196 	uint8_t flags;		/* 6 of 8 flags are used so far */
    197 	uint8_t signo;		/* NSIG <= 128 */
    198 	uint16_t rval_idx;	/* index in retval_vec */
    199 	uint16_t delay_idx;	/* index in delay_data_vec */
    200 	uint16_t scno;		/* syscall to be injected instead of -1 */
    201 };
    202 
    203 struct inject_opts {
    204 	uint16_t first;
    205 	uint16_t step;
    206 	struct inject_data data;
    207 };
    208 
    209 #define MAX_ERRNO_VALUE			4095
    210 
    211 /* Trace Control Block */
    212 struct tcb {
    213 	int flags;		/* See below for TCB_ values */
    214 	int pid;		/* If 0, this tcb is free */
    215 	int qual_flg;		/* qual_flags[scno] or DEFAULT_QUAL_FLAGS + RAW */
    216 	unsigned long u_error;	/* Error code */
    217 	kernel_ulong_t scno;	/* System call number */
    218 	kernel_ulong_t u_arg[MAX_ARGS];	/* System call arguments */
    219 	kernel_long_t u_rval;	/* Return value */
    220 #if SUPPORTED_PERSONALITIES > 1
    221 	unsigned int currpers;	/* Personality at the time of scno update */
    222 #endif
    223 	int sys_func_rval;	/* Syscall entry parser's return value */
    224 	int curcol;		/* Output column for this process */
    225 	FILE *outf;		/* Output file for this process */
    226 	const char *auxstr;	/* Auxiliary info from syscall (see RVAL_STR) */
    227 	void *_priv_data;	/* Private data for syscall decoding functions */
    228 	void (*_free_priv_data)(void *); /* Callback for freeing priv_data */
    229 	const struct_sysent *s_ent; /* sysent[scno] or dummy struct for bad scno */
    230 	const struct_sysent *s_prev_ent; /* for "resuming interrupted SYSCALL" msg */
    231 	struct inject_opts *inject_vec[SUPPORTED_PERSONALITIES];
    232 	struct timespec stime;	/* System time usage as of last process wait */
    233 	struct timespec dtime;	/* Delta for system time usage */
    234 	struct timespec etime;	/* Syscall entry time */
    235 	struct timespec delay_expiration_time; /* When does the delay end */
    236 
    237 	struct mmap_cache_t *mmap_cache;
    238 
    239 #ifdef HAVE_LINUX_KVM_H
    240 	struct vcpu_info *vcpu_info_list;
    241 #endif
    242 
    243 #ifdef ENABLE_STACKTRACE
    244 	void *unwind_ctx;
    245 	struct unwind_queue_t *unwind_queue;
    246 #endif
    247 };
    248 
    249 /* TCB flags */
    250 /* We have attached to this process, but did not see it stopping yet */
    251 #define TCB_STARTUP		0x01
    252 #define TCB_IGNORE_ONE_SIGSTOP	0x02	/* Next SIGSTOP is to be ignored */
    253 /*
    254  * Are we in system call entry or in syscall exit?
    255  *
    256  * This bit is set in syscall_entering_finish() and cleared in
    257  * syscall_exiting_finish().
    258  * Other stops which are possible directly after syscall entry (death, ptrace
    259  * event stop) are handled without calling syscall_{entering,exiting}_*().
    260  *
    261  * Use entering(tcp) / exiting(tcp) to check this bit to make code more
    262  * readable.
    263  */
    264 #define TCB_INSYSCALL	0x04
    265 #define TCB_ATTACHED	0x08	/* We attached to it already */
    266 #define TCB_REPRINT	0x10	/* We should reprint this syscall on exit */
    267 #define TCB_FILTERED	0x20	/* This system call has been filtered out */
    268 #define TCB_TAMPERED	0x40	/* A syscall has been tampered with */
    269 #define TCB_HIDE_LOG	0x80	/* We should hide everything (until execve) */
    270 #define TCB_SKIP_DETACH_ON_FIRST_EXEC	0x100	/* -b execve should skip detach on first execve */
    271 #define TCB_GRABBED	0x200	/* We grab the process and can catch it
    272 				 * in the middle of a syscall */
    273 #define TCB_RECOVERING	0x400	/* We try to recover after detecting incorrect
    274 				 * syscall entering/exiting state */
    275 #define TCB_INJECT_DELAY_EXIT	0x800	/* Current syscall needs to be delayed
    276 					   on exit */
    277 #define TCB_DELAYED	0x1000	/* Current syscall has been delayed */
    278 #define TCB_TAMPERED_NO_FAIL 0x2000	/* We tamper tcb with syscall
    279 					   that should not fail. */
    280 
    281 /* qualifier flags */
    282 #define QUAL_TRACE	0x001	/* this system call should be traced */
    283 #define QUAL_ABBREV	0x002	/* abbreviate the structures of this syscall */
    284 #define QUAL_VERBOSE	0x004	/* decode the structures of this syscall */
    285 #define QUAL_RAW	0x008	/* print all args in hex for this syscall */
    286 #define QUAL_INJECT	0x010	/* tamper with this system call on purpose */
    287 
    288 #define DEFAULT_QUAL_FLAGS (QUAL_TRACE | QUAL_ABBREV | QUAL_VERBOSE)
    289 
    290 #define entering(tcp)	(!((tcp)->flags & TCB_INSYSCALL))
    291 #define exiting(tcp)	((tcp)->flags & TCB_INSYSCALL)
    292 #define syserror(tcp)	((tcp)->u_error != 0)
    293 #define traced(tcp)	((tcp)->qual_flg & QUAL_TRACE)
    294 #define verbose(tcp)	((tcp)->qual_flg & QUAL_VERBOSE)
    295 #define abbrev(tcp)	((tcp)->qual_flg & QUAL_ABBREV)
    296 #define raw(tcp)	((tcp)->qual_flg & QUAL_RAW)
    297 #define inject(tcp)	((tcp)->qual_flg & QUAL_INJECT)
    298 #define filtered(tcp)	((tcp)->flags & TCB_FILTERED)
    299 #define hide_log(tcp)	((tcp)->flags & TCB_HIDE_LOG)
    300 #define syscall_tampered(tcp)	((tcp)->flags & TCB_TAMPERED)
    301 #define recovering(tcp)	((tcp)->flags & TCB_RECOVERING)
    302 #define inject_delay_exit(tcp)	((tcp)->flags & TCB_INJECT_DELAY_EXIT)
    303 #define syscall_delayed(tcp)	((tcp)->flags & TCB_DELAYED)
    304 #define syscall_tampered_nofail(tcp) ((tcp)->flags & TCB_TAMPERED_NO_FAIL)
    305 
    306 #include "xlat.h"
    307 
    308 extern const struct xlat addrfams[];
    309 
    310 /** Protocol hardware identifiers array, sorted, defined in sockaddr.c. */
    311 extern const struct xlat arp_hardware_types[];
    312 /** Protocol hardware identifiers array size without terminating record. */
    313 extern const size_t arp_hardware_types_size;
    314 
    315 extern const struct xlat at_flags[];
    316 extern const struct xlat clocknames[];
    317 extern const struct xlat dirent_types[];
    318 
    319 /** Ethernet protocols list, sorted, defined in sockaddr.c. */
    320 extern const struct xlat ethernet_protocols[];
    321 /** Ethernet protocols array size without terminating record. */
    322 extern const size_t ethernet_protocols_size;
    323 
    324 /** IP protocols list, sorted, defined in net.c. */
    325 extern const struct xlat inet_protocols[];
    326 /** IP protocols array size without terminating record. */
    327 extern const size_t inet_protocols_size;
    328 
    329 extern const struct xlat evdev_abs[];
    330 /** Number of elements in evdev_abs array without the terminating record. */
    331 extern const size_t evdev_abs_size;
    332 
    333 extern const struct xlat evdev_ev[];
    334 extern const struct xlat iffflags[];
    335 extern const struct xlat ip_type_of_services[];
    336 extern const struct xlat ipc_private[];
    337 extern const struct xlat msg_flags[];
    338 extern const struct xlat netlink_protocols[];
    339 extern const struct xlat nl_netfilter_msg_types[];
    340 extern const struct xlat nl_route_types[];
    341 extern const struct xlat open_access_modes[];
    342 extern const struct xlat open_mode_flags[];
    343 extern const struct xlat resource_flags[];
    344 extern const struct xlat routing_scopes[];
    345 extern const struct xlat routing_table_ids[];
    346 extern const struct xlat routing_types[];
    347 extern const struct xlat seccomp_filter_flags[];
    348 extern const struct xlat seccomp_ret_action[];
    349 extern const struct xlat setns_types[];
    350 extern const struct xlat sg_io_info[];
    351 extern const struct xlat socketlayers[];
    352 extern const struct xlat socktypes[];
    353 extern const struct xlat tcp_state_flags[];
    354 extern const struct xlat tcp_states[];
    355 extern const struct xlat whence_codes[];
    356 
    357 /* Format of syscall return values */
    358 #define RVAL_UDECIMAL	000	/* unsigned decimal format */
    359 #define RVAL_HEX	001	/* hex format */
    360 #define RVAL_OCTAL	002	/* octal format */
    361 #define RVAL_FD		010	/* file descriptor */
    362 #define RVAL_MASK	013	/* mask for these values */
    363 
    364 #define RVAL_STR	020	/* Print `auxstr' field after return val */
    365 #define RVAL_NONE	040	/* Print nothing */
    366 
    367 #define RVAL_DECODED	0100	/* syscall decoding finished */
    368 #define RVAL_IOCTL_DECODED 0200	/* ioctl sub-parser successfully decoded
    369 				   the argument */
    370 
    371 #define IOCTL_NUMBER_UNKNOWN 0
    372 #define IOCTL_NUMBER_HANDLED 1
    373 #define IOCTL_NUMBER_STOP_LOOKUP 010
    374 
    375 #define indirect_ipccall(tcp) (tcp->s_ent->sys_flags & TRACE_INDIRECT_SUBCALL)
    376 
    377 enum sock_proto {
    378 	SOCK_PROTO_UNKNOWN,
    379 	SOCK_PROTO_UNIX,
    380 	SOCK_PROTO_TCP,
    381 	SOCK_PROTO_UDP,
    382 	SOCK_PROTO_UDPLITE,
    383 	SOCK_PROTO_DCCP,
    384 	SOCK_PROTO_SCTP,
    385 	SOCK_PROTO_L2TP_IP,
    386 	SOCK_PROTO_PING,
    387 	SOCK_PROTO_RAW,
    388 	SOCK_PROTO_TCPv6,
    389 	SOCK_PROTO_UDPv6,
    390 	SOCK_PROTO_UDPLITEv6,
    391 	SOCK_PROTO_DCCPv6,
    392 	SOCK_PROTO_L2TP_IPv6,
    393 	SOCK_PROTO_SCTPv6,
    394 	SOCK_PROTO_PINGv6,
    395 	SOCK_PROTO_RAWv6,
    396 	SOCK_PROTO_NETLINK,
    397 };
    398 extern enum sock_proto get_proto_by_name(const char *);
    399 extern int get_family_by_proto(enum sock_proto proto);
    400 
    401 enum iov_decode {
    402 	IOV_DECODE_ADDR,
    403 	IOV_DECODE_STR,
    404 	IOV_DECODE_NETLINK
    405 };
    406 
    407 typedef enum {
    408 	CFLAG_NONE = 0,
    409 	CFLAG_ONLY_STATS,
    410 	CFLAG_BOTH
    411 } cflag_t;
    412 extern cflag_t cflag;
    413 extern bool Tflag;
    414 extern bool iflag;
    415 extern bool count_wallclock;
    416 extern unsigned int qflag;
    417 extern bool not_failing_only;
    418 extern unsigned int show_fd_path;
    419 /* are we filtering traces based on paths? */
    420 extern struct path_set {
    421 	const char **paths_selected;
    422 	size_t num_selected;
    423 	size_t size;
    424 } global_path_set;
    425 #define tracing_paths (global_path_set.num_selected != 0)
    426 extern unsigned xflag;
    427 extern unsigned followfork;
    428 #ifdef ENABLE_STACKTRACE
    429 /* if this is true do the stack trace for every system call */
    430 extern bool stack_trace_enabled;
    431 #endif
    432 extern unsigned ptrace_setoptions;
    433 extern unsigned max_strlen;
    434 extern unsigned os_release;
    435 #undef KERNEL_VERSION
    436 #define KERNEL_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + (c))
    437 
    438 extern int read_int_from_file(struct tcb *, const char *, int *);
    439 
    440 extern void set_sortby(const char *);
    441 extern void set_overhead(int);
    442 extern void print_pc(struct tcb *);
    443 
    444 extern int syscall_entering_decode(struct tcb *);
    445 extern int syscall_entering_trace(struct tcb *, unsigned int *);
    446 extern void syscall_entering_finish(struct tcb *, int);
    447 
    448 extern int syscall_exiting_decode(struct tcb *, struct timespec *);
    449 extern int syscall_exiting_trace(struct tcb *, struct timespec *, int);
    450 extern void syscall_exiting_finish(struct tcb *);
    451 
    452 extern void count_syscall(struct tcb *, const struct timespec *);
    453 extern void call_summary(FILE *);
    454 
    455 extern void clear_regs(struct tcb *tcp);
    456 extern int get_scno(struct tcb *);
    457 extern kernel_ulong_t get_rt_sigframe_addr(struct tcb *);
    458 
    459 /**
    460  * Convert a (shuffled) syscall number to the corresponding syscall name.
    461  *
    462  * @param scno Syscall number.
    463  * @return     String literal corresponding to the syscall number in case latter
    464  *             is valid; NULL otherwise.
    465  */
    466 extern const char *syscall_name(kernel_ulong_t scno);
    467 /**
    468  * Convert a syscall name to the corresponding (shuffled) syscall number.
    469  *
    470  * @param s     Syscall name.
    471  * @param p     Personality.
    472  * @param start From which position in syscall entry table resume the search.
    473  * @return      Shuffled syscall number (ready to use against sysent_vec)
    474  *              if syscall name is found; -1 otherwise.
    475  */
    476 extern kernel_long_t scno_by_name(const char *s, unsigned p,
    477 				  kernel_long_t start);
    478 /**
    479  * Shuffle syscall numbers so that we don't have huge gaps in syscall table.
    480  * The shuffling should be an involution: shuffle_scno(shuffle_scno(n)) == n.
    481  *
    482  * @param scno Raw or shuffled syscall number.
    483  * @return     Shuffled or raw syscall number, respectively.
    484  */
    485 extern kernel_ulong_t shuffle_scno(kernel_ulong_t scno);
    486 extern const char *err_name(unsigned long err);
    487 
    488 extern bool is_erestart(struct tcb *);
    489 extern void temporarily_clear_syserror(struct tcb *);
    490 extern void restore_cleared_syserror(struct tcb *);
    491 
    492 extern void *get_tcb_priv_data(const struct tcb *);
    493 extern int set_tcb_priv_data(struct tcb *, void *priv_data,
    494 			     void (*free_priv_data)(void *));
    495 extern void free_tcb_priv_data(struct tcb *);
    496 
    497 static inline unsigned long get_tcb_priv_ulong(const struct tcb *tcp)
    498 {
    499 	return (unsigned long) get_tcb_priv_data(tcp);
    500 }
    501 
    502 static inline int set_tcb_priv_ulong(struct tcb *tcp, unsigned long val)
    503 {
    504 	return set_tcb_priv_data(tcp, (void *) val, 0);
    505 }
    506 
    507 /**
    508  * @return 0 on success, -1 on error.
    509  */
    510 extern int
    511 umoven(struct tcb *, kernel_ulong_t addr, unsigned int len, void *laddr);
    512 #define umove(pid, addr, objp)	\
    513 	umoven((pid), (addr), sizeof(*(objp)), (void *) (objp))
    514 
    515 /**
    516  * @return true on success, false on error.
    517  */
    518 extern bool
    519 tfetch_mem64(struct tcb *, uint64_t addr, unsigned int len, void *laddr);
    520 
    521 static inline bool
    522 tfetch_mem(struct tcb *tcp, const kernel_ulong_t addr,
    523 	   unsigned int len, void *laddr)
    524 {
    525 	return tfetch_mem64(tcp, addr, len, laddr);
    526 }
    527 #define tfetch_obj(pid, addr, objp)	\
    528 	tfetch_mem((pid), (addr), sizeof(*(objp)), (void *) (objp))
    529 
    530 /**
    531  * @return true on success, false on error.
    532  */
    533 extern bool
    534 tfetch_mem64_ignore_syserror(struct tcb *, uint64_t addr,
    535 			     unsigned int len, void *laddr);
    536 
    537 static inline bool
    538 tfetch_mem_ignore_syserror(struct tcb *tcp, const kernel_ulong_t addr,
    539 			   unsigned int len, void *laddr)
    540 {
    541 	return tfetch_mem64_ignore_syserror(tcp, addr, len, laddr);
    542 }
    543 
    544 /**
    545  * @return 0 on success, -1 on error (and print addr).
    546  */
    547 extern int
    548 umoven_or_printaddr64(struct tcb *, uint64_t addr,
    549 		      unsigned int len, void *laddr);
    550 #define umove_or_printaddr64(pid, addr, objp)	\
    551 	umoven_or_printaddr64((pid), (addr), sizeof(*(objp)), (void *) (objp))
    552 
    553 static inline int
    554 umoven_or_printaddr(struct tcb *tcp, const kernel_ulong_t addr,
    555 		    unsigned int len, void *laddr)
    556 {
    557 	return umoven_or_printaddr64(tcp, addr, len, laddr);
    558 }
    559 #define umove_or_printaddr(pid, addr, objp)	\
    560 	umoven_or_printaddr((pid), (addr), sizeof(*(objp)), (void *) (objp))
    561 
    562 /**
    563  * @return 0 on success, -1 on error (and print addr).
    564  */
    565 extern int
    566 umoven_or_printaddr64_ignore_syserror(struct tcb *, uint64_t addr,
    567 				      unsigned int len, void *laddr);
    568 #define umove_or_printaddr64_ignore_syserror(pid, addr, objp)	\
    569 	umoven_or_printaddr64_ignore_syserror((pid), (addr), sizeof(*(objp)), \
    570 					      (void *) (objp))
    571 
    572 static inline int
    573 umoven_or_printaddr_ignore_syserror(struct tcb *tcp, const kernel_ulong_t addr,
    574 				    unsigned int len, void *laddr)
    575 {
    576 	return umoven_or_printaddr64_ignore_syserror(tcp, addr, len, laddr);
    577 }
    578 #define umove_or_printaddr_ignore_syserror(pid, addr, objp)	\
    579 	umoven_or_printaddr_ignore_syserror((pid), (addr), sizeof(*(objp)), \
    580 					    (void *) (objp))
    581 
    582 /**
    583  * @return strlen + 1 on success, 0 on success and no NUL seen, -1 on error.
    584  */
    585 extern int
    586 umovestr(struct tcb *, kernel_ulong_t addr, unsigned int len, char *laddr);
    587 
    588 extern int upeek(struct tcb *tcp, unsigned long, kernel_ulong_t *);
    589 extern int upoke(struct tcb *tcp, unsigned long, kernel_ulong_t);
    590 
    591 #if HAVE_ARCH_GETRVAL2
    592 extern long getrval2(struct tcb *);
    593 #endif
    594 
    595 extern const char *signame(const int);
    596 extern void pathtrace_select_set(const char *, struct path_set *);
    597 extern bool pathtrace_match_set(struct tcb *, struct path_set *);
    598 
    599 static inline void
    600 pathtrace_select(const char *path)
    601 {
    602 	return pathtrace_select_set(path, &global_path_set);
    603 }
    604 
    605 static inline bool
    606 pathtrace_match(struct tcb *tcp)
    607 {
    608 	return pathtrace_match_set(tcp, &global_path_set);
    609 }
    610 
    611 extern int getfdpath(struct tcb *, int, char *, unsigned);
    612 extern unsigned long getfdinode(struct tcb *, int);
    613 extern enum sock_proto getfdproto(struct tcb *, int);
    614 
    615 extern const char *xlookup(const struct xlat *, const uint64_t);
    616 extern const char *xlat_search(const struct xlat *, const size_t, const uint64_t);
    617 extern const char *xlat_idx(const struct xlat *xlat, size_t nmemb, uint64_t val);
    618 
    619 struct dyxlat;
    620 struct dyxlat *dyxlat_alloc(size_t nmemb);
    621 void dyxlat_free(struct dyxlat *);
    622 const struct xlat *dyxlat_get(const struct dyxlat *);
    623 void dyxlat_add_pair(struct dyxlat *, uint64_t val, const char *str, size_t len);
    624 
    625 const struct xlat *genl_families_xlat(struct tcb *tcp);
    626 
    627 extern unsigned long get_pagesize(void);
    628 extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits);
    629 
    630 /*
    631  * Returns STR if it does not start with PREFIX,
    632  * or a pointer to the first char in STR after PREFIX.
    633  * The length of PREFIX is specified by PREFIX_LEN.
    634  */
    635 static inline const char *
    636 str_strip_prefix_len(const char *str, const char *prefix, size_t prefix_len)
    637 {
    638 	return strncmp(str, prefix, prefix_len) ? str : str + prefix_len;
    639 }
    640 
    641 #define STR_STRIP_PREFIX(str, prefix)	\
    642 	str_strip_prefix_len((str), (prefix), sizeof(prefix) - 1)
    643 
    644 #define QUOTE_0_TERMINATED			0x01
    645 #define QUOTE_OMIT_LEADING_TRAILING_QUOTES	0x02
    646 #define QUOTE_OMIT_TRAILING_0			0x08
    647 #define QUOTE_FORCE_HEX				0x10
    648 #define QUOTE_EMIT_COMMENT			0x20
    649 
    650 extern int string_quote(const char *, char *, unsigned int, unsigned int,
    651 			const char *escape_chars);
    652 extern int print_quoted_string_ex(const char *, unsigned int, unsigned int,
    653 				  const char *escape_chars);
    654 extern int print_quoted_string(const char *, unsigned int, unsigned int);
    655 extern int print_quoted_cstring(const char *, unsigned int);
    656 
    657 /* a refers to the lower numbered u_arg,
    658  * b refers to the higher numbered u_arg
    659  */
    660 #ifdef WORDS_BIGENDIAN
    661 # define ULONG_LONG(a, b) \
    662 	((unsigned long long)(unsigned)(b) | ((unsigned long long)(a)<<32))
    663 #else
    664 # define ULONG_LONG(a, b) \
    665 	((unsigned long long)(unsigned)(a) | ((unsigned long long)(b)<<32))
    666 #endif
    667 extern int getllval(struct tcb *, unsigned long long *, int);
    668 extern int printllval(struct tcb *, const char *, int)
    669 	ATTRIBUTE_FORMAT((printf, 2, 0));
    670 
    671 extern void printaddr64(uint64_t addr);
    672 
    673 static inline void
    674 printaddr(const kernel_ulong_t addr)
    675 {
    676 	printaddr64(addr);
    677 }
    678 
    679 #define xlat_verbose(style_) ((style_) & XLAT_STYLE_VERBOSITY_MASK)
    680 #define xlat_format(style_)  ((style_) & XLAT_STYLE_FORMAT_MASK)
    681 
    682 extern enum xlat_style xlat_verbosity;
    683 
    684 extern int printxvals_ex(uint64_t val, const char *dflt,
    685 			 enum xlat_style, const struct xlat *, ...)
    686 	ATTRIBUTE_SENTINEL;
    687 #define printxvals(val_, dflt_, ...) \
    688 	printxvals_ex((val_), (dflt_), XLAT_STYLE_DEFAULT, __VA_ARGS__)
    689 
    690 extern int printxval_searchn_ex(const struct xlat *, size_t xlat_size,
    691 				uint64_t val, const char *dflt,
    692 				enum xlat_style);
    693 
    694 static inline int
    695 printxval_searchn(const struct xlat *xlat, size_t xlat_size, uint64_t val,
    696 		  const char *dflt)
    697 {
    698 	return printxval_searchn_ex(xlat, xlat_size, val, dflt,
    699 				    XLAT_STYLE_DEFAULT);
    700 }
    701 
    702 /**
    703  * Wrapper around printxval_searchn that passes ARRAY_SIZE - 1
    704  * as the array size, as all arrays are XLAT_END-terminated and
    705  * printxval_searchn expects a size without the terminating record.
    706  */
    707 #define printxval_search(xlat__, val__, dflt__) \
    708 	printxval_searchn(xlat__, ARRAY_SIZE(xlat__) - 1, val__, dflt__)
    709 #define printxval_search_ex(xlat__, val__, dflt__, style__) \
    710 	printxval_searchn_ex((xlat__), ARRAY_SIZE(xlat__) - 1, (val__), \
    711 			     (dflt__), (style__))
    712 
    713 extern int printxval_indexn_ex(const struct xlat *, size_t xlat_size,
    714 			       uint64_t val, const char *dflt, enum xlat_style);
    715 
    716 static inline int
    717 printxval_indexn(const struct xlat *xlat, size_t xlat_size, uint64_t val,
    718 		 const char *dflt)
    719 {
    720 	return printxval_indexn_ex(xlat, xlat_size, val, dflt,
    721 				   XLAT_STYLE_DEFAULT);
    722 }
    723 
    724 #define printxval_index(xlat__, val__, dflt__) \
    725 	printxval_indexn(xlat__, ARRAY_SIZE(xlat__) - 1, val__, dflt__)
    726 #define printxval_index_ex(xlat__, val__, dflt__) \
    727 	printxval_indexn_ex((xlat__), ARRAY_SIZE(xlat__) - 1, (val__), \
    728 			    (dflt__), XLAT_STYLE_DEFAULT)
    729 
    730 extern int sprintxval_ex(char *buf, size_t size, const struct xlat *,
    731 			 unsigned int val, const char *dflt, enum xlat_style);
    732 
    733 static inline int
    734 sprintxval(char *buf, size_t size, const struct xlat *xlat, unsigned int val,
    735 	   const char *dflt)
    736 {
    737 	return sprintxval_ex(buf, size, xlat, val, dflt, XLAT_STYLE_DEFAULT);
    738 }
    739 
    740 extern void printxval_dispatch_ex(const struct xlat *, size_t xlat_size,
    741 				  uint64_t val, const char *dflt,
    742 				  enum xlat_type, enum xlat_style);
    743 static inline void
    744 printxval_dispatch(const struct xlat *xlat, size_t xlat_size, uint64_t val,
    745 		   const char *dflt, enum xlat_type xt)
    746 {
    747 	return printxval_dispatch_ex(xlat, xlat_size, val, dflt, xt,
    748 				     XLAT_STYLE_DEFAULT);
    749 }
    750 
    751 enum xlat_style_private_flag_bits {
    752 	/* print_array */
    753 	PAF_PRINT_INDICES_BIT = XLAT_STYLE_SPEC_BITS + 1,
    754 	PAF_INDEX_XLAT_SORTED_BIT,
    755 	PAF_INDEX_XLAT_VALUE_INDEXED_BIT,
    756 
    757 	/* print_xlat */
    758 	PXF_DEFAULT_STR_BIT,
    759 };
    760 
    761 #define FLAG_(name_) name_ = 1 << name_##_BIT
    762 
    763 enum xlat_style_private_flags {
    764 	/* print_array */
    765 	FLAG_(PAF_PRINT_INDICES),
    766 	FLAG_(PAF_INDEX_XLAT_SORTED),
    767 	FLAG_(PAF_INDEX_XLAT_VALUE_INDEXED),
    768 
    769 	/* print_xlat */
    770 	FLAG_(PXF_DEFAULT_STR),
    771 };
    772 
    773 #undef FLAG_
    774 
    775 /** Print a value in accordance with xlat formatting settings. */
    776 extern void print_xlat_ex(uint64_t val, const char *str, enum xlat_style style);
    777 #define print_xlat(val_) \
    778 	print_xlat_ex((val_), #val_, XLAT_STYLE_DEFAULT)
    779 #define print_xlat32(val_) \
    780 	print_xlat_ex((uint32_t) (val_), #val_, XLAT_STYLE_DEFAULT)
    781 #define print_xlat_u(val_) \
    782 	print_xlat_ex((val_), #val_, XLAT_STYLE_FMT_U)
    783 #define print_xlat_d(val_) \
    784 	print_xlat_ex((val_), #val_, XLAT_STYLE_FMT_D)
    785 
    786 extern int printargs(struct tcb *);
    787 extern int printargs_u(struct tcb *);
    788 extern int printargs_d(struct tcb *);
    789 
    790 extern int printflags_ex(uint64_t flags, const char *dflt,
    791 			 enum xlat_style, const struct xlat *, ...)
    792 	ATTRIBUTE_SENTINEL;
    793 extern const char *sprintflags_ex(const char *prefix, const struct xlat *,
    794 				  uint64_t flags, enum xlat_style);
    795 
    796 static inline const char *
    797 sprintflags(const char *prefix, const struct xlat *xlat, uint64_t flags)
    798 {
    799 	return sprintflags_ex(prefix, xlat, flags, XLAT_STYLE_DEFAULT);
    800 }
    801 
    802 extern const char *sprinttime(long long sec);
    803 extern const char *sprinttime_nsec(long long sec, unsigned long long nsec);
    804 extern const char *sprinttime_usec(long long sec, unsigned long long usec);
    805 
    806 extern const char *sprint_mac_addr(const uint8_t addr[], size_t size);
    807 
    808 extern void print_symbolic_mode_t(unsigned int);
    809 extern void print_numeric_umode_t(unsigned short);
    810 extern void print_numeric_long_umask(unsigned long);
    811 extern void print_dev_t(unsigned long long dev);
    812 extern void print_abnormal_hi(kernel_ulong_t);
    813 
    814 extern bool print_int32_array_member(struct tcb *, void *elem_buf,
    815 				     size_t elem_size, void *data);
    816 extern bool print_uint32_array_member(struct tcb *, void *elem_buf,
    817 				      size_t elem_size, void *data);
    818 extern bool print_uint64_array_member(struct tcb *, void *elem_buf,
    819 				      size_t elem_size, void *data);
    820 
    821 typedef bool (*tfetch_mem_fn)(struct tcb *, kernel_ulong_t addr,
    822 			      unsigned int size, void *dest);
    823 typedef bool (*print_fn)(struct tcb *, void *elem_buf,
    824 			 size_t elem_size, void *opaque_data);
    825 
    826 
    827 /**
    828  * @param flags Combination of xlat style settings and additional flags from
    829  *              enum print_array_flags.
    830  */
    831 extern bool
    832 print_array_ex(struct tcb *,
    833 	       kernel_ulong_t start_addr,
    834 	       size_t nmemb,
    835 	       void *elem_buf,
    836 	       size_t elem_size,
    837 	       tfetch_mem_fn tfetch_mem_func,
    838 	       print_fn print_func,
    839 	       void *opaque_data,
    840 	       unsigned int flags,
    841 	       const struct xlat *index_xlat,
    842 	       size_t index_xlat_size,
    843 	       const char *index_dflt);
    844 
    845 static inline bool
    846 print_array(struct tcb *const tcp,
    847 	    const kernel_ulong_t start_addr,
    848 	    const size_t nmemb,
    849 	    void *const elem_buf,
    850 	    const size_t elem_size,
    851 	    tfetch_mem_fn tfetch_mem_func,
    852 	    print_fn print_func,
    853 	    void *const opaque_data)
    854 {
    855 	return print_array_ex(tcp, start_addr, nmemb, elem_buf, elem_size,
    856 			      tfetch_mem_func, print_func, opaque_data,
    857 			      0, NULL, 0, NULL);
    858 }
    859 
    860 extern kernel_ulong_t *
    861 fetch_indirect_syscall_args(struct tcb *, kernel_ulong_t addr, unsigned int n_args);
    862 
    863 extern void
    864 dumpiov_in_msghdr(struct tcb *, kernel_ulong_t addr, kernel_ulong_t data_size);
    865 
    866 extern void
    867 dumpiov_in_mmsghdr(struct tcb *, kernel_ulong_t addr);
    868 
    869 extern void
    870 dumpiov_upto(struct tcb *, int len, kernel_ulong_t addr, kernel_ulong_t data_size);
    871 
    872 extern void
    873 dumpstr(struct tcb *, kernel_ulong_t addr, int len);
    874 
    875 extern int
    876 printstr_ex(struct tcb *, kernel_ulong_t addr, kernel_ulong_t len,
    877 	    unsigned int user_style);
    878 
    879 extern int
    880 printpathn(struct tcb *, kernel_ulong_t addr, unsigned int n);
    881 
    882 extern int
    883 printpath(struct tcb *, kernel_ulong_t addr);
    884 
    885 #define TIMESPEC_TEXT_BUFSIZE \
    886 		(sizeof(long long) * 3 * 2 + sizeof("{tv_sec=-, tv_nsec=}"))
    887 extern void printfd(struct tcb *, int);
    888 extern void print_sockaddr(const void *sa, int len);
    889 extern bool
    890 print_inet_addr(int af, const void *addr, unsigned int len, const char *var_name);
    891 extern bool
    892 decode_inet_addr(struct tcb *, kernel_ulong_t addr,
    893 		 unsigned int len, int family, const char *var_name);
    894 extern void print_ax25_addr(const void /* ax25_address */ *addr);
    895 extern void print_x25_addr(const void /* struct x25_address */ *addr);
    896 extern const char *get_sockaddr_by_inode(struct tcb *, int fd, unsigned long inode);
    897 extern bool print_sockaddr_by_inode(struct tcb *, int fd, unsigned long inode);
    898 extern void print_dirfd(struct tcb *, int);
    899 
    900 extern int
    901 decode_sockaddr(struct tcb *, kernel_ulong_t addr, int addrlen);
    902 
    903 extern void printuid(const char *, const unsigned int);
    904 
    905 extern void
    906 print_sigset_addr_len(struct tcb *, kernel_ulong_t addr, kernel_ulong_t len);
    907 extern void
    908 print_sigset_addr(struct tcb *, kernel_ulong_t addr);
    909 
    910 extern const char *sprintsigmask_n(const char *, const void *, unsigned int);
    911 #define tprintsigmask_addr(prefix, mask) \
    912 	tprints(sprintsigmask_n((prefix), (mask), sizeof(mask)))
    913 extern void printsignal(int);
    914 
    915 extern void
    916 tprint_iov_upto(struct tcb *, kernel_ulong_t len, kernel_ulong_t addr,
    917 		enum iov_decode, kernel_ulong_t data_size);
    918 
    919 extern void
    920 decode_netlink(struct tcb *, int fd, kernel_ulong_t addr, kernel_ulong_t len);
    921 
    922 extern void tprint_open_modes(unsigned int);
    923 extern const char *sprint_open_modes(unsigned int);
    924 
    925 extern void
    926 decode_seccomp_fprog(struct tcb *, kernel_ulong_t addr);
    927 
    928 extern void
    929 print_seccomp_fprog(struct tcb *, kernel_ulong_t addr, unsigned short len);
    930 
    931 extern void
    932 decode_sock_fprog(struct tcb *, kernel_ulong_t addr);
    933 
    934 extern void
    935 print_sock_fprog(struct tcb *, kernel_ulong_t addr, unsigned short len);
    936 
    937 struct strace_stat;
    938 extern void print_struct_stat(struct tcb *, const struct strace_stat *const st);
    939 
    940 struct strace_statfs;
    941 struct strace_keyctl_kdf_params;
    942 
    943 extern void
    944 print_struct_statfs(struct tcb *, kernel_ulong_t addr);
    945 
    946 extern void
    947 print_struct_statfs64(struct tcb *, kernel_ulong_t addr, kernel_ulong_t size);
    948 
    949 extern int
    950 fetch_perf_event_attr(struct tcb *const tcp, const kernel_ulong_t addr);
    951 extern void
    952 print_perf_event_attr(struct tcb *const tcp, const kernel_ulong_t addr);
    953 
    954 extern const char *get_ifname(const unsigned int ifindex);
    955 extern void print_ifindex(unsigned int);
    956 
    957 extern void print_bpf_filter_code(const uint16_t code, bool extended);
    958 
    959 extern void qualify(const char *);
    960 extern unsigned int qual_flags(const unsigned int);
    961 
    962 #define DECL_IOCTL(name)						\
    963 extern int								\
    964 name ## _ioctl(struct tcb *, unsigned int request, kernel_ulong_t arg)	\
    965 /* End of DECL_IOCTL definition. */
    966 
    967 DECL_IOCTL(dm);
    968 DECL_IOCTL(evdev);
    969 DECL_IOCTL(file);
    970 DECL_IOCTL(fs_x);
    971 DECL_IOCTL(inotify);
    972 DECL_IOCTL(kvm);
    973 DECL_IOCTL(nbd);
    974 DECL_IOCTL(nsfs);
    975 DECL_IOCTL(ptp);
    976 DECL_IOCTL(scsi);
    977 DECL_IOCTL(term);
    978 DECL_IOCTL(ubi);
    979 DECL_IOCTL(uffdio);
    980 #undef DECL_IOCTL
    981 
    982 extern int decode_sg_io_v4(struct tcb *, const kernel_ulong_t arg);
    983 extern void print_evdev_ff_type(const kernel_ulong_t val);
    984 
    985 struct nlmsghdr;
    986 
    987 typedef bool (*netlink_decoder_t)(struct tcb *, const struct nlmsghdr *,
    988 				  kernel_ulong_t addr, unsigned int len);
    989 
    990 #define DECL_NETLINK(name)						\
    991 extern bool								\
    992 decode_netlink_ ## name(struct tcb *, const struct nlmsghdr *,		\
    993 			kernel_ulong_t addr, unsigned int len)		\
    994 /* End of DECL_NETLINK definition. */
    995 
    996 DECL_NETLINK(crypto);
    997 DECL_NETLINK(netfilter);
    998 DECL_NETLINK(route);
    999 DECL_NETLINK(selinux);
   1000 DECL_NETLINK(sock_diag);
   1001 
   1002 extern void
   1003 decode_netlink_kobject_uevent(struct tcb *, kernel_ulong_t addr,
   1004 			      kernel_ulong_t len);
   1005 
   1006 extern int ts_nz(const struct timespec *);
   1007 extern int ts_cmp(const struct timespec *, const struct timespec *);
   1008 extern double ts_float(const struct timespec *);
   1009 extern void ts_add(struct timespec *, const struct timespec *, const struct timespec *);
   1010 extern void ts_sub(struct timespec *, const struct timespec *, const struct timespec *);
   1011 extern void ts_mul(struct timespec *, const struct timespec *, int);
   1012 extern void ts_div(struct timespec *, const struct timespec *, int);
   1013 
   1014 #ifdef ENABLE_STACKTRACE
   1015 extern void unwind_init(void);
   1016 extern void unwind_tcb_init(struct tcb *);
   1017 extern void unwind_tcb_fin(struct tcb *);
   1018 extern void unwind_tcb_print(struct tcb *);
   1019 extern void unwind_tcb_capture(struct tcb *);
   1020 #endif
   1021 
   1022 #ifdef HAVE_LINUX_KVM_H
   1023 extern void kvm_run_structure_decoder_init(void);
   1024 extern void kvm_vcpu_info_free(struct tcb *);
   1025 #endif
   1026 
   1027 static inline int
   1028 printstrn(struct tcb *tcp, kernel_ulong_t addr, kernel_ulong_t len)
   1029 {
   1030 	return printstr_ex(tcp, addr, len, 0);
   1031 }
   1032 
   1033 static inline int
   1034 printstr(struct tcb *tcp, kernel_ulong_t addr)
   1035 {
   1036 	return printstr_ex(tcp, addr, -1, QUOTE_0_TERMINATED);
   1037 }
   1038 
   1039 static inline int
   1040 printflags64(const struct xlat *x, uint64_t flags, const char *dflt)
   1041 {
   1042 	return printflags_ex(flags, dflt, XLAT_STYLE_DEFAULT, x, NULL);
   1043 }
   1044 
   1045 static inline int
   1046 printflags(const struct xlat *x, unsigned int flags, const char *dflt)
   1047 {
   1048 	return printflags64(x, flags, dflt);
   1049 }
   1050 
   1051 static inline int
   1052 printxval64(const struct xlat *x, const uint64_t val, const char *dflt)
   1053 {
   1054 	return printxvals(val, dflt, x, NULL);
   1055 }
   1056 
   1057 static inline int
   1058 printxval(const struct xlat *x, const unsigned int val, const char *dflt)
   1059 {
   1060 	return printxvals(val, dflt, x, NULL);
   1061 }
   1062 
   1063 static inline int
   1064 printxval64_u(const struct xlat *x, const uint64_t val, const char *dflt)
   1065 {
   1066 	return printxvals_ex(val, dflt, XLAT_STYLE_FMT_U, x, NULL);
   1067 }
   1068 
   1069 static inline int
   1070 printxval_u(const struct xlat *x, const unsigned int val, const char *dflt)
   1071 {
   1072 	return printxvals_ex(val, dflt, XLAT_STYLE_FMT_U, x, NULL);
   1073 }
   1074 
   1075 static inline int
   1076 printxval64_d(const struct xlat *x, const int64_t val, const char *dflt)
   1077 {
   1078 	return printxvals_ex(val, dflt, XLAT_STYLE_FMT_D, x, NULL);
   1079 }
   1080 
   1081 static inline int
   1082 printxval_d(const struct xlat *x, const int val, const char *dflt)
   1083 {
   1084 	return printxvals_ex(val, dflt, XLAT_STYLE_FMT_D, x, NULL);
   1085 }
   1086 
   1087 static inline void
   1088 tprint_iov(struct tcb *tcp, kernel_ulong_t len, kernel_ulong_t addr,
   1089 	   enum iov_decode decode_iov)
   1090 {
   1091 	tprint_iov_upto(tcp, len, addr, decode_iov, -1);
   1092 }
   1093 
   1094 #ifdef ALPHA
   1095 typedef struct {
   1096 	int tv_sec, tv_usec;
   1097 } timeval32_t;
   1098 
   1099 extern void print_timeval32_t(const timeval32_t *);
   1100 extern void printrusage32(struct tcb *, kernel_ulong_t);
   1101 extern const char *sprint_timeval32(struct tcb *, kernel_ulong_t addr);
   1102 extern void print_timeval32(struct tcb *, kernel_ulong_t addr);
   1103 extern void print_timeval32_utimes(struct tcb *, kernel_ulong_t addr);
   1104 extern void print_itimerval32(struct tcb *, kernel_ulong_t addr);
   1105 #endif
   1106 
   1107 #ifdef HAVE_STRUCT_USER_DESC
   1108 /**
   1109  * Filter what to print from the point of view of the get_thread_area syscall.
   1110  * Kernel copies only entry_number field at first and then tries to write the
   1111  * whole structure.
   1112  */
   1113 enum user_desc_print_filter {
   1114 	/* Print the "entering" part of struct user_desc - entry_number.  */
   1115 	USER_DESC_ENTERING = 1,
   1116 	/* Print the "exiting" part of the structure.  */
   1117 	USER_DESC_EXITING  = 2,
   1118 	USER_DESC_BOTH     = USER_DESC_ENTERING | USER_DESC_EXITING,
   1119 };
   1120 
   1121 extern void print_user_desc(struct tcb *, kernel_ulong_t addr,
   1122 			    enum user_desc_print_filter filter);
   1123 #endif
   1124 
   1125 /* Strace log generation machinery.
   1126  *
   1127  * printing_tcp: tcb which has incomplete line being printed right now.
   1128  * NULL if last line has been completed ('\n'-terminated).
   1129  * printleader(tcp) examines it, finishes incomplete line if needed,
   1130  * the sets it to tcp.
   1131  * line_ended() clears printing_tcp and resets ->curcol = 0.
   1132  * tcp->curcol == 0 check is also used to detect completeness
   1133  * of last line, since in -ff mode just checking printing_tcp for NULL
   1134  * is not enough.
   1135  *
   1136  * If you change this code, test log generation in both -f and -ff modes
   1137  * using:
   1138  * strace -oLOG -f[f] test/threaded_execve
   1139  * strace -oLOG -f[f] test/sigkill_rain
   1140  * strace -oLOG -f[f] -p "`pidof web_browser`"
   1141  */
   1142 extern struct tcb *printing_tcp;
   1143 extern void printleader(struct tcb *);
   1144 extern void line_ended(void);
   1145 extern void tabto(void);
   1146 extern void tprintf(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2));
   1147 extern void tprints(const char *str);
   1148 extern void tprintf_comment(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2));
   1149 extern void tprints_comment(const char *str);
   1150 
   1151 static inline void
   1152 printaddr_comment(const kernel_ulong_t addr)
   1153 {
   1154 	tprintf_comment("%#llx", (unsigned long long) addr);
   1155 }
   1156 
   1157 static inline void
   1158 print_mac_addr(const char *prefix, const uint8_t addr[], size_t size)
   1159 {
   1160 	tprints(prefix);
   1161 	tprints(sprint_mac_addr(addr, size));
   1162 }
   1163 
   1164 #if SUPPORTED_PERSONALITIES > 1
   1165 extern void set_personality(unsigned int personality);
   1166 extern unsigned current_personality;
   1167 #else
   1168 # define set_personality(personality) ((void)0)
   1169 # define current_personality 0
   1170 #endif
   1171 
   1172 #if SUPPORTED_PERSONALITIES == 1
   1173 # define current_wordsize PERSONALITY0_WORDSIZE
   1174 # define current_klongsize PERSONALITY0_KLONGSIZE
   1175 #else
   1176 # if SUPPORTED_PERSONALITIES == 2 && PERSONALITY0_WORDSIZE == PERSONALITY1_WORDSIZE
   1177 #  define current_wordsize PERSONALITY0_WORDSIZE
   1178 # else
   1179 extern unsigned current_wordsize;
   1180 # endif
   1181 # if SUPPORTED_PERSONALITIES == 2 && PERSONALITY0_KLONGSIZE == PERSONALITY1_KLONGSIZE
   1182 #  define current_klongsize PERSONALITY0_KLONGSIZE
   1183 # else
   1184 extern unsigned current_klongsize;
   1185 # endif
   1186 #endif
   1187 
   1188 #define max_addr() (~0ULL >> ((8 - current_wordsize) * 8))
   1189 #define max_kaddr() (~0ULL >> ((8 - current_klongsize) * 8))
   1190 
   1191 /*
   1192  * When u64 is interpreted by the kernel as an address, there is a difference
   1193  * in behaviour between 32-bit and 64-bit kernel in the way u64_to_user_ptr
   1194  * works (32-bit kernel trims higher bits during conversion which may result
   1195  * to a valid address).  Since 32-bit strace cannot figure out what kind of
   1196  * kernel the tracee is running on, it has to account for both possibilities.
   1197  */
   1198 #if CAN_ARCH_BE_COMPAT_ON_64BIT_KERNEL
   1199 
   1200 /**
   1201  * Print raw 64-bit value as an address if it's too big to fit in strace's
   1202  * kernel_long_t.
   1203  */
   1204 static inline void
   1205 print_big_u64_addr(const uint64_t addr)
   1206 {
   1207 	if (sizeof(kernel_long_t) < 8 && addr > max_kaddr()) {
   1208 		printaddr64(addr);
   1209 		tprints(" or ");
   1210 	}
   1211 }
   1212 #else /* !CAN_ARCH_BE_COMPAT_ON_64BIT_KERNEL */
   1213 # define print_big_u64_addr(addr_) ((void) 0)
   1214 #endif /* CAN_ARCH_BE_COMPAT_ON_64BIT_KERNEL */
   1215 
   1216 #if SIZEOF_KERNEL_LONG_T > 4		\
   1217  && (SIZEOF_LONG < SIZEOF_KERNEL_LONG_T || !defined(current_wordsize))
   1218 # define ANY_WORDSIZE_LESS_THAN_KERNEL_LONG	1
   1219 #else
   1220 # define ANY_WORDSIZE_LESS_THAN_KERNEL_LONG	0
   1221 #endif
   1222 
   1223 #define DECL_PRINTNUM(name)						\
   1224 extern bool								\
   1225 printnum_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt)	\
   1226 	ATTRIBUTE_FORMAT((printf, 3, 0))				\
   1227 /* End of DECL_PRINTNUM definition. */
   1228 
   1229 DECL_PRINTNUM(short);
   1230 DECL_PRINTNUM(int);
   1231 DECL_PRINTNUM(int64);
   1232 #undef DECL_PRINTNUM
   1233 
   1234 #define DECL_PRINTNUM_ADDR(name)					\
   1235 extern bool								\
   1236 printnum_addr_ ## name(struct tcb *, kernel_ulong_t addr)		\
   1237 /* End of DECL_PRINTNUM_ADDR definition. */
   1238 
   1239 DECL_PRINTNUM_ADDR(int);
   1240 DECL_PRINTNUM_ADDR(int64);
   1241 #undef DECL_PRINTNUM_ADDR
   1242 
   1243 #ifndef current_wordsize
   1244 extern bool
   1245 printnum_long_int(struct tcb *, kernel_ulong_t addr,
   1246 		  const char *fmt_long, const char *fmt_int)
   1247 	ATTRIBUTE_FORMAT((printf, 3, 0))
   1248 	ATTRIBUTE_FORMAT((printf, 4, 0));
   1249 
   1250 extern bool printnum_addr_long_int(struct tcb *, kernel_ulong_t addr);
   1251 
   1252 static inline bool
   1253 printnum_slong(struct tcb *tcp, kernel_ulong_t addr)
   1254 {
   1255 	return printnum_long_int(tcp, addr, "%" PRId64, "%d");
   1256 }
   1257 
   1258 static inline bool
   1259 printnum_ulong(struct tcb *tcp, kernel_ulong_t addr)
   1260 {
   1261 	return printnum_long_int(tcp, addr, "%" PRIu64, "%u");
   1262 }
   1263 
   1264 static inline bool
   1265 printnum_ptr(struct tcb *tcp, kernel_ulong_t addr)
   1266 {
   1267 	return printnum_addr_long_int(tcp, addr);
   1268 }
   1269 
   1270 #elif current_wordsize > 4
   1271 
   1272 static inline bool
   1273 printnum_slong(struct tcb *tcp, kernel_ulong_t addr)
   1274 {
   1275 	return printnum_int64(tcp, addr, "%" PRId64);
   1276 }
   1277 
   1278 static inline bool
   1279 printnum_ulong(struct tcb *tcp, kernel_ulong_t addr)
   1280 {
   1281 	return printnum_int64(tcp, addr, "%" PRIu64);
   1282 }
   1283 
   1284 static inline bool
   1285 printnum_ptr(struct tcb *tcp, kernel_ulong_t addr)
   1286 {
   1287 	return printnum_addr_int64(tcp, addr);
   1288 }
   1289 
   1290 #else /* current_wordsize == 4 */
   1291 
   1292 static inline bool
   1293 printnum_slong(struct tcb *tcp, kernel_ulong_t addr)
   1294 {
   1295 	return printnum_int(tcp, addr, "%d");
   1296 }
   1297 
   1298 static inline bool
   1299 printnum_ulong(struct tcb *tcp, kernel_ulong_t addr)
   1300 {
   1301 	return printnum_int(tcp, addr, "%u");
   1302 }
   1303 
   1304 static inline bool
   1305 printnum_ptr(struct tcb *tcp, kernel_ulong_t addr)
   1306 {
   1307 	return printnum_addr_int(tcp, addr);
   1308 }
   1309 
   1310 #endif
   1311 
   1312 #ifndef current_klongsize
   1313 extern bool printnum_addr_klong_int(struct tcb *, kernel_ulong_t addr);
   1314 
   1315 static inline bool
   1316 printnum_kptr(struct tcb *tcp, kernel_ulong_t addr)
   1317 {
   1318 	return printnum_addr_klong_int(tcp, addr);
   1319 }
   1320 
   1321 #elif current_klongsize > 4
   1322 
   1323 static inline bool
   1324 printnum_kptr(struct tcb *tcp, kernel_ulong_t addr)
   1325 {
   1326 	return printnum_addr_int64(tcp, addr);
   1327 }
   1328 
   1329 #else /* current_klongsize == 4 */
   1330 
   1331 static inline bool
   1332 printnum_kptr(struct tcb *tcp, kernel_ulong_t addr)
   1333 {
   1334 	return printnum_addr_int(tcp, addr);
   1335 }
   1336 
   1337 #endif
   1338 
   1339 #define DECL_PRINTPAIR(name)						\
   1340 extern bool								\
   1341 printpair_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt)	\
   1342 	ATTRIBUTE_FORMAT((printf, 3, 0))				\
   1343 /* End of DECL_PRINTPAIR definition. */
   1344 
   1345 DECL_PRINTPAIR(int);
   1346 DECL_PRINTPAIR(int64);
   1347 #undef DECL_PRINTPAIR
   1348 
   1349 static inline kernel_long_t
   1350 truncate_klong_to_current_wordsize(const kernel_long_t v)
   1351 {
   1352 #if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
   1353 	if (current_wordsize < sizeof(v)) {
   1354 		return (int) v;
   1355 	} else
   1356 #endif
   1357 	{
   1358 		return v;
   1359 	}
   1360 }
   1361 
   1362 static inline kernel_ulong_t
   1363 truncate_kulong_to_current_wordsize(const kernel_ulong_t v)
   1364 {
   1365 #if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
   1366 	if (current_wordsize < sizeof(v)) {
   1367 		return (unsigned int) v;
   1368 	} else
   1369 #endif
   1370 	{
   1371 		return v;
   1372 	}
   1373 }
   1374 
   1375 /*
   1376  * Cast a pointer or a pointer-sized integer to kernel_ulong_t.
   1377  */
   1378 #define ptr_to_kulong(v) ((kernel_ulong_t) (unsigned long) (v))
   1379 
   1380 /*
   1381  * Zero-extend a signed integer type to unsigned long long.
   1382  */
   1383 #define zero_extend_signed_to_ull(v) \
   1384 	(sizeof(v) == sizeof(char) ? (unsigned long long) (unsigned char) (v) : \
   1385 	 sizeof(v) == sizeof(short) ? (unsigned long long) (unsigned short) (v) : \
   1386 	 sizeof(v) == sizeof(int) ? (unsigned long long) (unsigned int) (v) : \
   1387 	 sizeof(v) == sizeof(long) ? (unsigned long long) (unsigned long) (v) : \
   1388 	 (unsigned long long) (v))
   1389 
   1390 /*
   1391  * Sign-extend an unsigned integer type to long long.
   1392  */
   1393 #define sign_extend_unsigned_to_ll(v) \
   1394 	(sizeof(v) == sizeof(char) ? (long long) (char) (v) : \
   1395 	 sizeof(v) == sizeof(short) ? (long long) (short) (v) : \
   1396 	 sizeof(v) == sizeof(int) ? (long long) (int) (v) : \
   1397 	 sizeof(v) == sizeof(long) ? (long long) (long) (v) : \
   1398 	 (long long) (v))
   1399 
   1400 extern const char *const errnoent[];
   1401 extern const char *const signalent[];
   1402 extern const unsigned int nerrnos;
   1403 extern const unsigned int nsignals;
   1404 
   1405 extern const struct_sysent sysent0[];
   1406 extern const struct_ioctlent ioctlent0[];
   1407 
   1408 extern const char *const personality_names[];
   1409 /* Personality designators to be used for specifying personality */
   1410 extern const char *const personality_designators[];
   1411 
   1412 #if SUPPORTED_PERSONALITIES > 1
   1413 extern const struct_sysent *sysent;
   1414 extern const struct_ioctlent *ioctlent;
   1415 #else
   1416 # define sysent     sysent0
   1417 # define ioctlent   ioctlent0
   1418 #endif
   1419 
   1420 extern unsigned nsyscalls;
   1421 extern unsigned nioctlents;
   1422 
   1423 extern const unsigned int nsyscall_vec[SUPPORTED_PERSONALITIES];
   1424 extern const struct_sysent *const sysent_vec[SUPPORTED_PERSONALITIES];
   1425 extern struct inject_opts *inject_vec[SUPPORTED_PERSONALITIES];
   1426 
   1427 #ifdef IN_MPERS_BOOTSTRAP
   1428 /* Transform multi-line MPERS_PRINTER_DECL statements to one-liners.  */
   1429 # define MPERS_PRINTER_DECL(type, name, ...) MPERS_PRINTER_DECL(type, name, __VA_ARGS__)
   1430 #else /* !IN_MPERS_BOOTSTRAP */
   1431 # if SUPPORTED_PERSONALITIES > 1
   1432 #  include "printers.h"
   1433 # else
   1434 #  include "native_printer_decls.h"
   1435 # endif
   1436 # define MPERS_PRINTER_DECL(type, name, ...) type MPERS_FUNC_NAME(name)(__VA_ARGS__)
   1437 #endif /* !IN_MPERS_BOOTSTRAP */
   1438 
   1439 /* Checks that sysent[scno] is not out of range. */
   1440 static inline bool
   1441 scno_in_range(kernel_ulong_t scno)
   1442 {
   1443 	return scno < nsyscalls;
   1444 }
   1445 
   1446 /*
   1447  * Checks whether scno is not out of range,
   1448  * its corresponding sysent[scno].sys_func is non-NULL,
   1449  * and its sysent[scno].sys_flags has no TRACE_INDIRECT_SUBCALL flag set.
   1450  */
   1451 static inline bool
   1452 scno_is_valid(kernel_ulong_t scno)
   1453 {
   1454 	return scno_in_range(scno)
   1455 	       && sysent[scno].sys_func
   1456 	       && !(sysent[scno].sys_flags & TRACE_INDIRECT_SUBCALL);
   1457 }
   1458 
   1459 #define MPERS_FUNC_NAME__(prefix, name) prefix ## name
   1460 #define MPERS_FUNC_NAME_(prefix, name) MPERS_FUNC_NAME__(prefix, name)
   1461 #define MPERS_FUNC_NAME(name) MPERS_FUNC_NAME_(MPERS_PREFIX, name)
   1462 
   1463 #define SYS_FUNC_NAME(syscall_name) MPERS_FUNC_NAME(syscall_name)
   1464 
   1465 #define SYS_FUNC(syscall_name) int SYS_FUNC_NAME(sys_ ## syscall_name)(struct tcb *tcp)
   1466 
   1467 #endif /* !STRACE_DEFS_H */
   1468