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  * Experimental code using PTRACE_SEIZE can be enabled here.
    113  * This needs Linux kernel 3.4.x or later to work.
    114  */
    115 #define USE_SEIZE 1
    116 /* To force NOMMU build, set to 1 */
    117 #define NOMMU_SYSTEM 0
    118 
    119 #ifndef ERESTARTSYS
    120 # define ERESTARTSYS    512
    121 #endif
    122 #ifndef ERESTARTNOINTR
    123 # define ERESTARTNOINTR 513
    124 #endif
    125 #ifndef ERESTARTNOHAND
    126 # define ERESTARTNOHAND 514
    127 #endif
    128 #ifndef ERESTART_RESTARTBLOCK
    129 # define ERESTART_RESTARTBLOCK 516
    130 #endif
    131 
    132 #define PERSONALITY0_WORDSIZE  SIZEOF_LONG
    133 #define PERSONALITY0_KLONGSIZE SIZEOF_KERNEL_LONG_T
    134 #define PERSONALITY0_INCLUDE_PRINTERS_DECLS "native_printer_decls.h"
    135 #define PERSONALITY0_INCLUDE_PRINTERS_DEFS "native_printer_defs.h"
    136 
    137 #if SUPPORTED_PERSONALITIES > 1
    138 # define PERSONALITY1_WORDSIZE  4
    139 # define PERSONALITY1_KLONGSIZE PERSONALITY1_WORDSIZE
    140 #endif
    141 
    142 #if SUPPORTED_PERSONALITIES > 2
    143 # define PERSONALITY2_WORDSIZE  4
    144 # define PERSONALITY2_KLONGSIZE PERSONALITY0_KLONGSIZE
    145 #endif
    146 
    147 #if SUPPORTED_PERSONALITIES > 1 && defined HAVE_M32_MPERS
    148 # define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
    149 # define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
    150 # define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
    151 # define MPERS_m32_IOCTL_MACROS "ioctl_redefs1.h"
    152 # define HAVE_PERSONALITY_1_MPERS 1
    153 #else
    154 # define PERSONALITY1_INCLUDE_PRINTERS_DECLS "native_printer_decls.h"
    155 # define PERSONALITY1_INCLUDE_PRINTERS_DEFS "native_printer_defs.h"
    156 # define PERSONALITY1_INCLUDE_FUNCS "empty.h"
    157 # define HAVE_PERSONALITY_1_MPERS 0
    158 #endif
    159 
    160 #if SUPPORTED_PERSONALITIES > 2 && defined HAVE_MX32_MPERS
    161 # define PERSONALITY2_INCLUDE_FUNCS "mx32_funcs.h"
    162 # define PERSONALITY2_INCLUDE_PRINTERS_DECLS "mx32_printer_decls.h"
    163 # define PERSONALITY2_INCLUDE_PRINTERS_DEFS "mx32_printer_defs.h"
    164 # define MPERS_mx32_IOCTL_MACROS "ioctl_redefs2.h"
    165 # define HAVE_PERSONALITY_2_MPERS 1
    166 #else
    167 # define PERSONALITY2_INCLUDE_PRINTERS_DECLS "native_printer_decls.h"
    168 # define PERSONALITY2_INCLUDE_PRINTERS_DEFS "native_printer_defs.h"
    169 # define PERSONALITY2_INCLUDE_FUNCS "empty.h"
    170 # define HAVE_PERSONALITY_2_MPERS 0
    171 #endif
    172 
    173 typedef struct ioctlent {
    174 	const char *symbol;
    175 	unsigned int code;
    176 } struct_ioctlent;
    177 
    178 #define INJECT_F_SIGNAL 1
    179 #define INJECT_F_RETVAL 2
    180 
    181 struct inject_data {
    182 	uint16_t flags;
    183 	uint16_t signo;
    184 	kernel_long_t rval;
    185 };
    186 
    187 struct inject_opts {
    188 	uint16_t first;
    189 	uint16_t step;
    190 	struct inject_data data;
    191 };
    192 
    193 #define MAX_ERRNO_VALUE			4095
    194 
    195 /* Trace Control Block */
    196 struct tcb {
    197 	int flags;		/* See below for TCB_ values */
    198 	int pid;		/* If 0, this tcb is free */
    199 	int qual_flg;		/* qual_flags[scno] or DEFAULT_QUAL_FLAGS + RAW */
    200 	unsigned long u_error;	/* Error code */
    201 	kernel_ulong_t scno;	/* System call number */
    202 	kernel_ulong_t u_arg[MAX_ARGS];	/* System call arguments */
    203 	kernel_long_t u_rval;	/* Return value */
    204 #if SUPPORTED_PERSONALITIES > 1
    205 	unsigned int currpers;	/* Personality at the time of scno update */
    206 #endif
    207 	int sys_func_rval;	/* Syscall entry parser's return value */
    208 	int curcol;		/* Output column for this process */
    209 	FILE *outf;		/* Output file for this process */
    210 	const char *auxstr;	/* Auxiliary info from syscall (see RVAL_STR) */
    211 	void *_priv_data;	/* Private data for syscall decoding functions */
    212 	void (*_free_priv_data)(void *); /* Callback for freeing priv_data */
    213 	const struct_sysent *s_ent; /* sysent[scno] or dummy struct for bad scno */
    214 	const struct_sysent *s_prev_ent; /* for "resuming interrupted SYSCALL" msg */
    215 	struct inject_opts *inject_vec[SUPPORTED_PERSONALITIES];
    216 	struct timeval stime;	/* System time usage as of last process wait */
    217 	struct timeval dtime;	/* Delta for system time usage */
    218 	struct timeval etime;	/* Syscall entry time */
    219 
    220 #ifdef USE_LIBUNWIND
    221 	struct UPT_info *libunwind_ui;
    222 	struct mmap_cache_t *mmap_cache;
    223 	unsigned int mmap_cache_size;
    224 	unsigned int mmap_cache_generation;
    225 	struct queue_t *queue;
    226 #endif
    227 };
    228 
    229 /* TCB flags */
    230 /* We have attached to this process, but did not see it stopping yet */
    231 #define TCB_STARTUP		0x01
    232 #define TCB_IGNORE_ONE_SIGSTOP	0x02	/* Next SIGSTOP is to be ignored */
    233 /*
    234  * Are we in system call entry or in syscall exit?
    235  *
    236  * This bit is set in syscall_entering_finish() and cleared in
    237  * syscall_exiting_finish().
    238  * Other stops which are possible directly after syscall entry (death, ptrace
    239  * event stop) are handled without calling syscall_{entering,exiting}_*().
    240  *
    241  * Use entering(tcp) / exiting(tcp) to check this bit to make code more
    242  * readable.
    243  */
    244 #define TCB_INSYSCALL	0x04
    245 #define TCB_ATTACHED	0x08	/* We attached to it already */
    246 #define TCB_REPRINT	0x10	/* We should reprint this syscall on exit */
    247 #define TCB_FILTERED	0x20	/* This system call has been filtered out */
    248 #define TCB_TAMPERED	0x40	/* A syscall has been tampered with */
    249 #define TCB_HIDE_LOG	0x80	/* We should hide everything (until execve) */
    250 #define TCB_SKIP_DETACH_ON_FIRST_EXEC	0x100	/* -b execve should skip detach on first execve */
    251 #define TCB_GRABBED	0x200	/* We grab the process and can catch it
    252 				 * in the middle of a syscall */
    253 #define TCB_RECOVERING	0x400	/* We try to recover after detecting incorrect
    254 				 * syscall entering/exiting state */
    255 
    256 /* qualifier flags */
    257 #define QUAL_TRACE	0x001	/* this system call should be traced */
    258 #define QUAL_ABBREV	0x002	/* abbreviate the structures of this syscall */
    259 #define QUAL_VERBOSE	0x004	/* decode the structures of this syscall */
    260 #define QUAL_RAW	0x008	/* print all args in hex for this syscall */
    261 #define QUAL_INJECT	0x010	/* tamper with this system call on purpose */
    262 
    263 #define DEFAULT_QUAL_FLAGS (QUAL_TRACE | QUAL_ABBREV | QUAL_VERBOSE)
    264 
    265 #define entering(tcp)	(!((tcp)->flags & TCB_INSYSCALL))
    266 #define exiting(tcp)	((tcp)->flags & TCB_INSYSCALL)
    267 #define syserror(tcp)	((tcp)->u_error != 0)
    268 #define traced(tcp)	((tcp)->qual_flg & QUAL_TRACE)
    269 #define verbose(tcp)	((tcp)->qual_flg & QUAL_VERBOSE)
    270 #define abbrev(tcp)	((tcp)->qual_flg & QUAL_ABBREV)
    271 #define raw(tcp)	((tcp)->qual_flg & QUAL_RAW)
    272 #define inject(tcp)	((tcp)->qual_flg & QUAL_INJECT)
    273 #define filtered(tcp)	((tcp)->flags & TCB_FILTERED)
    274 #define hide_log(tcp)	((tcp)->flags & TCB_HIDE_LOG)
    275 #define syscall_tampered(tcp)	((tcp)->flags & TCB_TAMPERED)
    276 #define recovering(tcp)	((tcp)->flags & TCB_RECOVERING)
    277 
    278 #include "xlat.h"
    279 
    280 extern const struct xlat addrfams[];
    281 extern const struct xlat arp_hardware_types[];
    282 extern const struct xlat at_flags[];
    283 extern const struct xlat clocknames[];
    284 extern const struct xlat dirent_types[];
    285 extern const struct xlat ethernet_protocols[];
    286 extern const struct xlat evdev_abs[];
    287 extern const struct xlat iffflags[];
    288 extern const struct xlat inet_protocols[];
    289 extern const struct xlat ip_type_of_services[];
    290 extern const struct xlat msg_flags[];
    291 extern const struct xlat netlink_protocols[];
    292 extern const struct xlat nl_route_types[];
    293 extern const struct xlat open_access_modes[];
    294 extern const struct xlat open_mode_flags[];
    295 extern const struct xlat resource_flags[];
    296 extern const struct xlat routing_scopes[];
    297 extern const struct xlat routing_table_ids[];
    298 extern const struct xlat routing_types[];
    299 extern const struct xlat seccomp_ret_action[];
    300 extern const struct xlat setns_types[];
    301 extern const struct xlat sg_io_info[];
    302 extern const struct xlat socketlayers[];
    303 extern const struct xlat socktypes[];
    304 extern const struct xlat tcp_state_flags[];
    305 extern const struct xlat tcp_states[];
    306 extern const struct xlat whence_codes[];
    307 
    308 /* Format of syscall return values */
    309 #define RVAL_DECIMAL	000	/* decimal format */
    310 #define RVAL_HEX	001	/* hex format */
    311 #define RVAL_OCTAL	002	/* octal format */
    312 #define RVAL_UDECIMAL	003	/* unsigned decimal format */
    313 #define RVAL_FD		010	/* file descriptor */
    314 #define RVAL_MASK	013	/* mask for these values */
    315 
    316 #define RVAL_STR	020	/* Print `auxstr' field after return val */
    317 #define RVAL_NONE	040	/* Print nothing */
    318 
    319 #define RVAL_DECODED	0100	/* syscall decoding finished */
    320 #define RVAL_IOCTL_DECODED 0200	/* ioctl sub-parser successfully decoded
    321 				   the argument */
    322 #define RVAL_PRINT_ERR_VAL 0400 /* Print decoded error code along with
    323 				   syscall return value.  Needed for modify_ldt
    324 				   that for some reason decides to return
    325 				   an error with higher bits set to 0.  */
    326 
    327 #define IOCTL_NUMBER_UNKNOWN 0
    328 #define IOCTL_NUMBER_HANDLED 1
    329 #define IOCTL_NUMBER_STOP_LOOKUP 010
    330 
    331 #define indirect_ipccall(tcp) (tcp->s_ent->sys_flags & TRACE_INDIRECT_SUBCALL)
    332 
    333 enum sock_proto {
    334 	SOCK_PROTO_UNKNOWN,
    335 	SOCK_PROTO_UNIX,
    336 	SOCK_PROTO_TCP,
    337 	SOCK_PROTO_UDP,
    338 	SOCK_PROTO_TCPv6,
    339 	SOCK_PROTO_UDPv6,
    340 	SOCK_PROTO_NETLINK
    341 };
    342 extern enum sock_proto get_proto_by_name(const char *);
    343 
    344 enum iov_decode {
    345 	IOV_DECODE_ADDR,
    346 	IOV_DECODE_STR,
    347 	IOV_DECODE_NETLINK
    348 };
    349 
    350 typedef enum {
    351 	CFLAG_NONE = 0,
    352 	CFLAG_ONLY_STATS,
    353 	CFLAG_BOTH
    354 } cflag_t;
    355 extern cflag_t cflag;
    356 extern bool Tflag;
    357 extern bool iflag;
    358 extern bool count_wallclock;
    359 extern unsigned int qflag;
    360 extern bool not_failing_only;
    361 extern unsigned int show_fd_path;
    362 /* are we filtering traces based on paths? */
    363 extern struct path_set {
    364 	const char **paths_selected;
    365 	size_t num_selected;
    366 	size_t size;
    367 } global_path_set;
    368 #define tracing_paths (global_path_set.num_selected != 0)
    369 extern unsigned xflag;
    370 extern unsigned followfork;
    371 #ifdef USE_LIBUNWIND
    372 /* if this is true do the stack trace for every system call */
    373 extern bool stack_trace_enabled;
    374 #endif
    375 extern unsigned ptrace_setoptions;
    376 extern unsigned max_strlen;
    377 extern unsigned os_release;
    378 #undef KERNEL_VERSION
    379 #define KERNEL_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + (c))
    380 
    381 extern int read_int_from_file(struct tcb *, const char *, int *);
    382 
    383 extern void set_sortby(const char *);
    384 extern void set_overhead(int);
    385 extern void print_pc(struct tcb *);
    386 
    387 extern int syscall_entering_decode(struct tcb *);
    388 extern int syscall_entering_trace(struct tcb *, unsigned int *);
    389 extern void syscall_entering_finish(struct tcb *, int);
    390 
    391 extern int syscall_exiting_decode(struct tcb *, struct timeval *);
    392 extern int syscall_exiting_trace(struct tcb *, struct timeval, int);
    393 extern void syscall_exiting_finish(struct tcb *);
    394 
    395 extern void count_syscall(struct tcb *, const struct timeval *);
    396 extern void call_summary(FILE *);
    397 
    398 extern void clear_regs(struct tcb *tcp);
    399 extern int get_scno(struct tcb *);
    400 extern kernel_ulong_t get_rt_sigframe_addr(struct tcb *);
    401 
    402 /**
    403  * Convert a (shuffled) syscall number to the corresponding syscall name.
    404  *
    405  * @param scno Syscall number.
    406  * @return     String literal corresponding to the syscall number in case latter
    407  *             is valid; NULL otherwise.
    408  */
    409 extern const char *syscall_name(kernel_ulong_t scno);
    410 /**
    411  * Convert a syscall name to the corresponding (shuffled) syscall number.
    412  *
    413  * @param s     Syscall name.
    414  * @param p     Personality.
    415  * @param start From which position in syscall entry table resume the search.
    416  * @return      Shuffled syscall number (ready to use against sysent_vec)
    417  *              if syscall name is found; -1 otherwise.
    418  */
    419 extern kernel_long_t scno_by_name(const char *s, unsigned p,
    420 				  kernel_long_t start);
    421 /**
    422  * Shuffle syscall numbers so that we don't have huge gaps in syscall table.
    423  * The shuffling should be an involution: shuffle_scno(shuffle_scno(n)) == n.
    424  *
    425  * @param scno Raw or shuffled syscall number.
    426  * @return     Shuffled or raw syscall number, respectively.
    427  */
    428 extern kernel_ulong_t shuffle_scno(kernel_ulong_t scno);
    429 extern const char *err_name(unsigned long err);
    430 
    431 extern bool is_erestart(struct tcb *);
    432 extern void temporarily_clear_syserror(struct tcb *);
    433 extern void restore_cleared_syserror(struct tcb *);
    434 
    435 extern void *get_tcb_priv_data(const struct tcb *);
    436 extern int set_tcb_priv_data(struct tcb *, void *priv_data,
    437 			     void (*free_priv_data)(void *));
    438 extern void free_tcb_priv_data(struct tcb *);
    439 
    440 static inline unsigned long get_tcb_priv_ulong(const struct tcb *tcp)
    441 {
    442 	return (unsigned long) get_tcb_priv_data(tcp);
    443 }
    444 
    445 static inline int set_tcb_priv_ulong(struct tcb *tcp, unsigned long val)
    446 {
    447 	return set_tcb_priv_data(tcp, (void *) val, 0);
    448 }
    449 
    450 extern int
    451 umoven(struct tcb *, kernel_ulong_t addr, unsigned int len, void *laddr);
    452 #define umove(pid, addr, objp)	\
    453 	umoven((pid), (addr), sizeof(*(objp)), (void *) (objp))
    454 
    455 extern int
    456 umoven_or_printaddr(struct tcb *, kernel_ulong_t addr,
    457 		    unsigned int len, void *laddr);
    458 #define umove_or_printaddr(pid, addr, objp)	\
    459 	umoven_or_printaddr((pid), (addr), sizeof(*(objp)), (void *) (objp))
    460 
    461 extern int
    462 umoven_or_printaddr_ignore_syserror(struct tcb *, kernel_ulong_t addr,
    463 				    unsigned int len, void *laddr);
    464 
    465 extern int
    466 umovestr(struct tcb *, kernel_ulong_t addr, unsigned int len, char *laddr);
    467 
    468 extern int upeek(struct tcb *tcp, unsigned long, kernel_ulong_t *);
    469 extern int upoke(struct tcb *tcp, unsigned long, kernel_ulong_t);
    470 
    471 extern bool
    472 print_array(struct tcb *,
    473 	    kernel_ulong_t start_addr,
    474 	    size_t nmemb,
    475 	    void *elem_buf,
    476 	    size_t elem_size,
    477 	    int (*umoven_func)(struct tcb *,
    478 				     kernel_ulong_t,
    479 				     unsigned int,
    480 				     void *),
    481 	    bool (*print_func)(struct tcb *,
    482 				     void *elem_buf,
    483 				     size_t elem_size,
    484 				     void *opaque_data),
    485 	    void *opaque_data);
    486 
    487 #if HAVE_ARCH_GETRVAL2
    488 extern long getrval2(struct tcb *);
    489 #endif
    490 
    491 extern const char *signame(const int);
    492 extern void pathtrace_select_set(const char *, struct path_set *);
    493 extern bool pathtrace_match_set(struct tcb *, struct path_set *);
    494 #define pathtrace_select(tcp)	\
    495 	pathtrace_select_set(tcp, &global_path_set)
    496 #define pathtrace_match(tcp)	\
    497 	pathtrace_match_set(tcp, &global_path_set)
    498 extern int getfdpath(struct tcb *, int, char *, unsigned);
    499 extern unsigned long getfdinode(struct tcb *, int);
    500 extern enum sock_proto getfdproto(struct tcb *, int);
    501 
    502 extern const char *xlookup(const struct xlat *, const uint64_t);
    503 extern const char *xlat_search(const struct xlat *, const size_t, const uint64_t);
    504 
    505 struct dyxlat;
    506 struct dyxlat *dyxlat_alloc(size_t nmemb);
    507 void dyxlat_free(struct dyxlat *);
    508 const struct xlat *dyxlat_get(const struct dyxlat *);
    509 void dyxlat_add_pair(struct dyxlat *, uint64_t val, const char *str, size_t len);
    510 
    511 const struct xlat *genl_families_xlat(struct tcb *tcp);
    512 
    513 extern unsigned long get_pagesize(void);
    514 extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits);
    515 
    516 /*
    517  * Returns STR if it does not start with PREFIX,
    518  * or a pointer to the first char in STR after PREFIX.
    519  * The length of PREFIX is specified by PREFIX_LEN.
    520  */
    521 static inline const char *
    522 str_strip_prefix_len(const char *str, const char *prefix, size_t prefix_len)
    523 {
    524 	return strncmp(str, prefix, prefix_len) ? str : str + prefix_len;
    525 }
    526 
    527 #define STR_STRIP_PREFIX(str, prefix)	\
    528 	str_strip_prefix_len((str), (prefix), sizeof(prefix) - 1)
    529 
    530 #define QUOTE_0_TERMINATED			0x01
    531 #define QUOTE_OMIT_LEADING_TRAILING_QUOTES	0x02
    532 #define QUOTE_OMIT_TRAILING_0			0x08
    533 #define QUOTE_FORCE_HEX				0x10
    534 #define QUOTE_EMIT_COMMENT			0x20
    535 
    536 extern int string_quote(const char *, char *, unsigned int, unsigned int);
    537 extern int print_quoted_string(const char *, unsigned int, unsigned int);
    538 extern int print_quoted_cstring(const char *, unsigned int);
    539 
    540 /* a refers to the lower numbered u_arg,
    541  * b refers to the higher numbered u_arg
    542  */
    543 #ifdef WORDS_BIGENDIAN
    544 # define ULONG_LONG(a, b) \
    545 	((unsigned long long)(unsigned)(b) | ((unsigned long long)(a)<<32))
    546 #else
    547 # define ULONG_LONG(a, b) \
    548 	((unsigned long long)(unsigned)(a) | ((unsigned long long)(b)<<32))
    549 #endif
    550 extern int getllval(struct tcb *, unsigned long long *, int);
    551 extern int printllval(struct tcb *, const char *, int)
    552 	ATTRIBUTE_FORMAT((printf, 2, 0));
    553 
    554 extern void printaddr(kernel_ulong_t addr);
    555 extern int printxvals(const uint64_t, const char *, const struct xlat *, ...)
    556 	ATTRIBUTE_SENTINEL;
    557 extern int printxval_searchn(const struct xlat *xlat, size_t xlat_size,
    558 	uint64_t val, const char *dflt);
    559 #define printxval_search(xlat__, val__, dflt__) \
    560 	printxval_searchn(xlat__, ARRAY_SIZE(xlat__), val__, dflt__)
    561 extern int sprintxval(char *buf, size_t size, const struct xlat *,
    562 	unsigned int val, const char *dflt);
    563 extern int printargs(struct tcb *);
    564 extern int printargs_u(struct tcb *);
    565 extern int printargs_d(struct tcb *);
    566 
    567 extern void addflags(const struct xlat *, uint64_t);
    568 extern int printflags_ex(uint64_t, const char *, const struct xlat *, ...)
    569 	ATTRIBUTE_SENTINEL;
    570 extern const char *sprintflags(const char *, const struct xlat *, uint64_t);
    571 extern const char *sprinttime(long long sec);
    572 extern const char *sprinttime_nsec(long long sec, unsigned long long nsec);
    573 extern const char *sprinttime_usec(long long sec, unsigned long long usec);
    574 extern void print_symbolic_mode_t(unsigned int);
    575 extern void print_numeric_umode_t(unsigned short);
    576 extern void print_numeric_long_umask(unsigned long);
    577 extern void print_dev_t(unsigned long long dev);
    578 extern void print_abnormal_hi(kernel_ulong_t);
    579 
    580 extern kernel_ulong_t *
    581 fetch_indirect_syscall_args(struct tcb *, kernel_ulong_t addr, unsigned int n_args);
    582 
    583 extern void
    584 dumpiov_in_msghdr(struct tcb *, kernel_ulong_t addr, kernel_ulong_t data_size);
    585 
    586 extern void
    587 dumpiov_in_mmsghdr(struct tcb *, kernel_ulong_t addr);
    588 
    589 extern void
    590 dumpiov_upto(struct tcb *, int len, kernel_ulong_t addr, kernel_ulong_t data_size);
    591 
    592 extern void
    593 dumpstr(struct tcb *, kernel_ulong_t addr, int len);
    594 
    595 extern int
    596 printstr_ex(struct tcb *, kernel_ulong_t addr, kernel_ulong_t len,
    597 	    unsigned int user_style);
    598 
    599 extern int
    600 printpathn(struct tcb *, kernel_ulong_t addr, unsigned int n);
    601 
    602 extern int
    603 printpath(struct tcb *, kernel_ulong_t addr);
    604 
    605 #define TIMESPEC_TEXT_BUFSIZE \
    606 		(sizeof(long long) * 3 * 2 + sizeof("{tv_sec=-, tv_nsec=}"))
    607 extern void printfd(struct tcb *, int);
    608 extern void print_sockaddr(const void *sa, int len);
    609 extern bool
    610 print_inet_addr(int af, const void *addr, unsigned int len, const char *var_name);
    611 extern bool
    612 decode_inet_addr(struct tcb *, kernel_ulong_t addr,
    613 		 unsigned int len, int family, const char *var_name);
    614 extern const char *get_sockaddr_by_inode(struct tcb *, int fd, unsigned long inode);
    615 extern bool print_sockaddr_by_inode(struct tcb *, int fd, unsigned long inode);
    616 extern void print_dirfd(struct tcb *, int);
    617 
    618 extern int
    619 decode_sockaddr(struct tcb *, kernel_ulong_t addr, int addrlen);
    620 
    621 extern void printuid(const char *, const unsigned int);
    622 
    623 extern void
    624 print_sigset_addr_len(struct tcb *, kernel_ulong_t addr, kernel_ulong_t len);
    625 extern void
    626 print_sigset_addr(struct tcb *, kernel_ulong_t addr);
    627 
    628 extern const char *sprintsigmask_n(const char *, const void *, unsigned int);
    629 #define tprintsigmask_addr(prefix, mask) \
    630 	tprints(sprintsigmask_n((prefix), (mask), sizeof(mask)))
    631 extern void printsignal(int);
    632 
    633 extern void
    634 tprint_iov_upto(struct tcb *, kernel_ulong_t len, kernel_ulong_t addr,
    635 		enum iov_decode, kernel_ulong_t data_size);
    636 
    637 extern void
    638 decode_netlink(struct tcb *, int fd, kernel_ulong_t addr, kernel_ulong_t len);
    639 
    640 extern void tprint_open_modes(unsigned int);
    641 extern const char *sprint_open_modes(unsigned int);
    642 
    643 extern void
    644 decode_seccomp_fprog(struct tcb *, kernel_ulong_t addr);
    645 
    646 extern void
    647 print_seccomp_fprog(struct tcb *, kernel_ulong_t addr, unsigned short len);
    648 
    649 extern void
    650 decode_sock_fprog(struct tcb *, kernel_ulong_t addr);
    651 
    652 extern void
    653 print_sock_fprog(struct tcb *, kernel_ulong_t addr, unsigned short len);
    654 
    655 struct strace_stat;
    656 extern void print_struct_stat(struct tcb *, const struct strace_stat *const st);
    657 
    658 struct strace_statfs;
    659 struct strace_keyctl_kdf_params;
    660 
    661 extern void
    662 print_struct_statfs(struct tcb *, kernel_ulong_t addr);
    663 
    664 extern void
    665 print_struct_statfs64(struct tcb *, kernel_ulong_t addr, kernel_ulong_t size);
    666 
    667 extern void print_ifindex(unsigned int);
    668 
    669 extern void qualify(const char *);
    670 extern unsigned int qual_flags(const unsigned int);
    671 
    672 #define DECL_IOCTL(name)						\
    673 extern int								\
    674 name ## _ioctl(struct tcb *, unsigned int request, kernel_ulong_t arg)	\
    675 /* End of DECL_IOCTL definition. */
    676 
    677 DECL_IOCTL(dm);
    678 DECL_IOCTL(file);
    679 DECL_IOCTL(fs_x);
    680 DECL_IOCTL(kvm);
    681 DECL_IOCTL(nsfs);
    682 DECL_IOCTL(ptp);
    683 DECL_IOCTL(scsi);
    684 DECL_IOCTL(term);
    685 DECL_IOCTL(ubi);
    686 DECL_IOCTL(uffdio);
    687 #undef DECL_IOCTL
    688 
    689 extern int decode_sg_io_v4(struct tcb *, const kernel_ulong_t arg);
    690 
    691 struct nlmsghdr;
    692 
    693 typedef bool (*netlink_decoder_t)(struct tcb *, const struct nlmsghdr *,
    694 				  kernel_ulong_t addr, unsigned int len);
    695 
    696 #define DECL_NETLINK(name)						\
    697 extern bool								\
    698 decode_netlink_ ## name(struct tcb *, const struct nlmsghdr *,		\
    699 			kernel_ulong_t addr, unsigned int len)		\
    700 /* End of DECL_NETLINK definition. */
    701 
    702 DECL_NETLINK(crypto);
    703 DECL_NETLINK(route);
    704 DECL_NETLINK(selinux);
    705 DECL_NETLINK(sock_diag);
    706 
    707 extern int tv_nz(const struct timeval *);
    708 extern int tv_cmp(const struct timeval *, const struct timeval *);
    709 extern double tv_float(const struct timeval *);
    710 extern void tv_add(struct timeval *, const struct timeval *, const struct timeval *);
    711 extern void tv_sub(struct timeval *, const struct timeval *, const struct timeval *);
    712 extern void tv_mul(struct timeval *, const struct timeval *, int);
    713 extern void tv_div(struct timeval *, const struct timeval *, int);
    714 
    715 #ifdef USE_LIBUNWIND
    716 extern void unwind_init(void);
    717 extern void unwind_tcb_init(struct tcb *);
    718 extern void unwind_tcb_fin(struct tcb *);
    719 extern void unwind_cache_invalidate(struct tcb *);
    720 extern void unwind_print_stacktrace(struct tcb *);
    721 extern void unwind_capture_stacktrace(struct tcb *);
    722 #endif
    723 
    724 static inline int
    725 printstrn(struct tcb *tcp, kernel_ulong_t addr, kernel_ulong_t len)
    726 {
    727 	return printstr_ex(tcp, addr, len, 0);
    728 }
    729 
    730 static inline int
    731 printstr(struct tcb *tcp, kernel_ulong_t addr)
    732 {
    733 	return printstr_ex(tcp, addr, -1, QUOTE_0_TERMINATED);
    734 }
    735 
    736 static inline int
    737 printflags64(const struct xlat *x, uint64_t flags, const char *dflt)
    738 {
    739 	return printflags_ex(flags, dflt, x, NULL);
    740 }
    741 
    742 static inline int
    743 printflags(const struct xlat *x, unsigned int flags, const char *dflt)
    744 {
    745 	return printflags64(x, flags, dflt);
    746 }
    747 
    748 static inline int
    749 printxval64(const struct xlat *x, const uint64_t val, const char *dflt)
    750 {
    751 	return printxvals(val, dflt, x, NULL);
    752 }
    753 
    754 static inline int
    755 printxval(const struct xlat *x, const unsigned int val, const char *dflt)
    756 {
    757 	return printxvals(val, dflt, x, NULL);
    758 }
    759 
    760 static inline void
    761 tprint_iov(struct tcb *tcp, kernel_ulong_t len, kernel_ulong_t addr,
    762 	   enum iov_decode decode_iov)
    763 {
    764 	tprint_iov_upto(tcp, len, addr, decode_iov, -1);
    765 }
    766 
    767 #ifdef ALPHA
    768 typedef struct {
    769 	int tv_sec, tv_usec;
    770 } timeval32_t;
    771 
    772 extern void print_timeval32_t(const timeval32_t *);
    773 extern void printrusage32(struct tcb *, kernel_ulong_t);
    774 extern const char *sprint_timeval32(struct tcb *, kernel_ulong_t addr);
    775 extern void print_timeval32(struct tcb *, kernel_ulong_t addr);
    776 extern void print_timeval32_utimes(struct tcb *, kernel_ulong_t addr);
    777 extern void print_itimerval32(struct tcb *, kernel_ulong_t addr);
    778 #endif
    779 
    780 #ifdef HAVE_STRUCT_USER_DESC
    781 /**
    782  * Filter what to print from the point of view of the get_thread_area syscall.
    783  * Kernel copies only entry_number field at first and then tries to write the
    784  * whole structure.
    785  */
    786 enum user_desc_print_filter {
    787 	/* Print the "entering" part of struct user_desc - entry_number.  */
    788 	USER_DESC_ENTERING = 1,
    789 	/* Print the "exiting" part of the structure.  */
    790 	USER_DESC_EXITING  = 2,
    791 	USER_DESC_BOTH     = USER_DESC_ENTERING | USER_DESC_EXITING,
    792 };
    793 
    794 extern void print_user_desc(struct tcb *, kernel_ulong_t addr,
    795 			    enum user_desc_print_filter filter);
    796 #endif
    797 
    798 /* Strace log generation machinery.
    799  *
    800  * printing_tcp: tcb which has incomplete line being printed right now.
    801  * NULL if last line has been completed ('\n'-terminated).
    802  * printleader(tcp) examines it, finishes incomplete line if needed,
    803  * the sets it to tcp.
    804  * line_ended() clears printing_tcp and resets ->curcol = 0.
    805  * tcp->curcol == 0 check is also used to detect completeness
    806  * of last line, since in -ff mode just checking printing_tcp for NULL
    807  * is not enough.
    808  *
    809  * If you change this code, test log generation in both -f and -ff modes
    810  * using:
    811  * strace -oLOG -f[f] test/threaded_execve
    812  * strace -oLOG -f[f] test/sigkill_rain
    813  * strace -oLOG -f[f] -p "`pidof web_browser`"
    814  */
    815 extern struct tcb *printing_tcp;
    816 extern void printleader(struct tcb *);
    817 extern void line_ended(void);
    818 extern void tabto(void);
    819 extern void tprintf(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2));
    820 extern void tprints(const char *str);
    821 extern void tprintf_comment(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2));
    822 extern void tprints_comment(const char *str);
    823 
    824 #if SUPPORTED_PERSONALITIES > 1
    825 extern void set_personality(unsigned int personality);
    826 extern unsigned current_personality;
    827 #else
    828 # define set_personality(personality) ((void)0)
    829 # define current_personality 0
    830 #endif
    831 
    832 #if SUPPORTED_PERSONALITIES == 1
    833 # define current_wordsize PERSONALITY0_WORDSIZE
    834 # define current_klongsize PERSONALITY0_KLONGSIZE
    835 #else
    836 # if SUPPORTED_PERSONALITIES == 2 && PERSONALITY0_WORDSIZE == PERSONALITY1_WORDSIZE
    837 #  define current_wordsize PERSONALITY0_WORDSIZE
    838 # else
    839 extern unsigned current_wordsize;
    840 # endif
    841 # if SUPPORTED_PERSONALITIES == 2 && PERSONALITY0_KLONGSIZE == PERSONALITY1_KLONGSIZE
    842 #  define current_klongsize PERSONALITY0_KLONGSIZE
    843 # else
    844 extern unsigned current_klongsize;
    845 # endif
    846 #endif
    847 
    848 #if SIZEOF_KERNEL_LONG_T > 4		\
    849  && (SIZEOF_LONG < SIZEOF_KERNEL_LONG_T || !defined(current_wordsize))
    850 # define ANY_WORDSIZE_LESS_THAN_KERNEL_LONG	1
    851 #else
    852 # define ANY_WORDSIZE_LESS_THAN_KERNEL_LONG	0
    853 #endif
    854 
    855 #define DECL_PRINTNUM(name)						\
    856 extern bool								\
    857 printnum_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt)	\
    858 	ATTRIBUTE_FORMAT((printf, 3, 0))				\
    859 /* End of DECL_PRINTNUM definition. */
    860 
    861 DECL_PRINTNUM(short);
    862 DECL_PRINTNUM(int);
    863 DECL_PRINTNUM(int64);
    864 #undef DECL_PRINTNUM
    865 
    866 #define DECL_PRINTNUM_ADDR(name)					\
    867 extern bool								\
    868 printnum_addr_ ## name(struct tcb *, kernel_ulong_t addr)		\
    869 /* End of DECL_PRINTNUM_ADDR definition. */
    870 
    871 DECL_PRINTNUM_ADDR(int);
    872 DECL_PRINTNUM_ADDR(int64);
    873 #undef DECL_PRINTNUM_ADDR
    874 
    875 #ifndef current_wordsize
    876 extern bool
    877 printnum_long_int(struct tcb *, kernel_ulong_t addr,
    878 		  const char *fmt_long, const char *fmt_int)
    879 	ATTRIBUTE_FORMAT((printf, 3, 0))
    880 	ATTRIBUTE_FORMAT((printf, 4, 0));
    881 extern bool printnum_addr_long_int(struct tcb *, kernel_ulong_t addr);
    882 # define printnum_slong(tcp, addr) \
    883 	printnum_long_int((tcp), (addr), "%" PRId64, "%d")
    884 # define printnum_ulong(tcp, addr) \
    885 	printnum_long_int((tcp), (addr), "%" PRIu64, "%u")
    886 # define printnum_ptr(tcp, addr) \
    887 	printnum_addr_long_int((tcp), (addr))
    888 #elif current_wordsize > 4
    889 # define printnum_slong(tcp, addr) \
    890 	printnum_int64((tcp), (addr), "%" PRId64)
    891 # define printnum_ulong(tcp, addr) \
    892 	printnum_int64((tcp), (addr), "%" PRIu64)
    893 # define printnum_ptr(tcp, addr) \
    894 	printnum_addr_int64((tcp), (addr))
    895 #else /* current_wordsize == 4 */
    896 # define printnum_slong(tcp, addr) \
    897 	printnum_int((tcp), (addr), "%d")
    898 # define printnum_ulong(tcp, addr) \
    899 	printnum_int((tcp), (addr), "%u")
    900 # define printnum_ptr(tcp, addr) \
    901 	printnum_addr_int((tcp), (addr))
    902 #endif
    903 
    904 #ifndef current_klongsize
    905 extern bool printnum_addr_klong_int(struct tcb *, kernel_ulong_t addr);
    906 # define printnum_kptr(tcp, addr) \
    907 	printnum_addr_klong_int((tcp), (addr))
    908 #elif current_klongsize > 4
    909 # define printnum_kptr(tcp, addr) \
    910 	printnum_addr_int64((tcp), (addr))
    911 #else /* current_klongsize == 4 */
    912 # define printnum_kptr(tcp, addr) \
    913 	printnum_addr_int((tcp), (addr))
    914 #endif
    915 
    916 #define DECL_PRINTPAIR(name)						\
    917 extern bool								\
    918 printpair_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt)	\
    919 	ATTRIBUTE_FORMAT((printf, 3, 0))				\
    920 /* End of DECL_PRINTPAIR definition. */
    921 
    922 DECL_PRINTPAIR(int);
    923 DECL_PRINTPAIR(int64);
    924 #undef DECL_PRINTPAIR
    925 
    926 static inline kernel_long_t
    927 truncate_klong_to_current_wordsize(const kernel_long_t v)
    928 {
    929 #if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
    930 	if (current_wordsize < sizeof(v)) {
    931 		return (int) v;
    932 	} else
    933 #endif
    934 	{
    935 		return v;
    936 	}
    937 }
    938 
    939 static inline kernel_ulong_t
    940 truncate_kulong_to_current_wordsize(const kernel_ulong_t v)
    941 {
    942 #if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
    943 	if (current_wordsize < sizeof(v)) {
    944 		return (unsigned int) v;
    945 	} else
    946 #endif
    947 	{
    948 		return v;
    949 	}
    950 }
    951 
    952 /*
    953  * Cast a pointer or a pointer-sized integer to kernel_ulong_t.
    954  */
    955 #define ptr_to_kulong(v) ((kernel_ulong_t) (unsigned long) (v))
    956 
    957 /*
    958  * Zero-extend a signed integer type to unsigned long long.
    959  */
    960 #define zero_extend_signed_to_ull(v) \
    961 	(sizeof(v) == sizeof(char) ? (unsigned long long) (unsigned char) (v) : \
    962 	 sizeof(v) == sizeof(short) ? (unsigned long long) (unsigned short) (v) : \
    963 	 sizeof(v) == sizeof(int) ? (unsigned long long) (unsigned int) (v) : \
    964 	 sizeof(v) == sizeof(long) ? (unsigned long long) (unsigned long) (v) : \
    965 	 (unsigned long long) (v))
    966 
    967 /*
    968  * Sign-extend an unsigned integer type to long long.
    969  */
    970 #define sign_extend_unsigned_to_ll(v) \
    971 	(sizeof(v) == sizeof(char) ? (long long) (char) (v) : \
    972 	 sizeof(v) == sizeof(short) ? (long long) (short) (v) : \
    973 	 sizeof(v) == sizeof(int) ? (long long) (int) (v) : \
    974 	 sizeof(v) == sizeof(long) ? (long long) (long) (v) : \
    975 	 (long long) (v))
    976 
    977 extern const struct_sysent sysent0[];
    978 extern const char *const errnoent0[];
    979 extern const char *const signalent0[];
    980 extern const struct_ioctlent ioctlent0[];
    981 
    982 extern const char *const personality_names[];
    983 
    984 #if SUPPORTED_PERSONALITIES > 1
    985 extern const struct_sysent *sysent;
    986 extern const char *const *errnoent;
    987 extern const char *const *signalent;
    988 extern const struct_ioctlent *ioctlent;
    989 #else
    990 # define sysent     sysent0
    991 # define errnoent   errnoent0
    992 # define signalent  signalent0
    993 # define ioctlent   ioctlent0
    994 #endif
    995 
    996 extern unsigned nsyscalls;
    997 extern unsigned nerrnos;
    998 extern unsigned nsignals;
    999 extern unsigned nioctlents;
   1000 
   1001 extern const unsigned int nsyscall_vec[SUPPORTED_PERSONALITIES];
   1002 extern const struct_sysent *const sysent_vec[SUPPORTED_PERSONALITIES];
   1003 extern struct inject_opts *inject_vec[SUPPORTED_PERSONALITIES];
   1004 
   1005 #ifdef IN_MPERS_BOOTSTRAP
   1006 /* Transform multi-line MPERS_PRINTER_DECL statements to one-liners.  */
   1007 # define MPERS_PRINTER_DECL(type, name, ...) MPERS_PRINTER_DECL(type, name, __VA_ARGS__)
   1008 #else /* !IN_MPERS_BOOTSTRAP */
   1009 # if SUPPORTED_PERSONALITIES > 1
   1010 #  include "printers.h"
   1011 # else
   1012 #  include "native_printer_decls.h"
   1013 # endif
   1014 # define MPERS_PRINTER_DECL(type, name, ...) type MPERS_FUNC_NAME(name)(__VA_ARGS__)
   1015 #endif /* !IN_MPERS_BOOTSTRAP */
   1016 
   1017 /* Checks that sysent[scno] is not out of range. */
   1018 static inline bool
   1019 scno_in_range(kernel_ulong_t scno)
   1020 {
   1021 	return scno < nsyscalls;
   1022 }
   1023 
   1024 /*
   1025  * Checks whether scno is not out of range,
   1026  * its corresponding sysent[scno].sys_func is non-NULL,
   1027  * and its sysent[scno].sys_flags has no TRACE_INDIRECT_SUBCALL flag set.
   1028  */
   1029 static inline bool
   1030 scno_is_valid(kernel_ulong_t scno)
   1031 {
   1032 	return scno_in_range(scno)
   1033 	       && sysent[scno].sys_func
   1034 	       && !(sysent[scno].sys_flags & TRACE_INDIRECT_SUBCALL);
   1035 }
   1036 
   1037 #define MPERS_FUNC_NAME__(prefix, name) prefix ## name
   1038 #define MPERS_FUNC_NAME_(prefix, name) MPERS_FUNC_NAME__(prefix, name)
   1039 #define MPERS_FUNC_NAME(name) MPERS_FUNC_NAME_(MPERS_PREFIX, name)
   1040 
   1041 #define SYS_FUNC_NAME(syscall_name) MPERS_FUNC_NAME(syscall_name)
   1042 
   1043 #define SYS_FUNC(syscall_name) int SYS_FUNC_NAME(sys_ ## syscall_name)(struct tcb *tcp)
   1044 
   1045 #endif /* !STRACE_DEFS_H */
   1046