defs.h revision 114aefd6183b8c073453f8def73270c42255f974
1/* 2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl> 3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl> 4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * $Id$ 30 */ 31 32#ifdef HAVE_CONFIG_H 33# include "config.h" 34#endif 35 36#ifdef MIPS 37# include <sgidefs.h> 38#endif 39 40#include <features.h> 41 42#ifdef _LARGEFILE64_SOURCE 43/* This is the macro everything checks before using foo64 names. */ 44# ifndef _LFS64_LARGEFILE 45# define _LFS64_LARGEFILE 1 46# endif 47#endif 48 49/* Configuration section */ 50#ifndef MAX_QUALS 51# if defined(MIPS) 52# define MAX_QUALS 7000 /* maximum number of syscalls, signals, etc. */ 53# else 54# define MAX_QUALS 2048 /* maximum number of syscalls, signals, etc. */ 55# endif 56#endif 57#ifndef DEFAULT_STRLEN 58/* default maximum # of bytes printed in `printstr', change with -s switch */ 59# define DEFAULT_STRLEN 32 60#endif 61#ifndef DEFAULT_ACOLUMN 62# define DEFAULT_ACOLUMN 40 /* default alignment column for results */ 63#endif 64 65/* Maximum number of args to a syscall. 66 * 67 * Make sure that all entries in all syscallent.h files have nargs <= MAX_ARGS! 68 * linux/<ARCH>/syscallent.h: all have nargs <= 6. 69 */ 70#ifndef MAX_ARGS 71# define MAX_ARGS 6 72#endif 73 74#ifndef DEFAULT_SORTBY 75# define DEFAULT_SORTBY "time" /* default sorting method for call profiling */ 76#endif 77 78#include <sys/types.h> 79#include <unistd.h> 80#include <stdlib.h> 81#include <stdio.h> 82#include <ctype.h> 83#include <string.h> 84#include <time.h> 85#include <sys/time.h> 86#include <errno.h> 87 88#ifdef HAVE_STDBOOL_H 89# include <stdbool.h> 90#endif 91 92#ifdef STDC_HEADERS 93# include <stddef.h> 94#endif /* STDC_HEADERS */ 95 96#ifdef HAVE_SIGINFO_T 97# include <signal.h> 98#endif 99 100#if defined(SPARC) || defined(SPARC64) 101# define LINUXSPARC 102#endif 103#if defined(MIPS) && _MIPS_SIM == _MIPS_SIM_ABI32 104# define LINUX_MIPSO32 105#endif 106#if defined(MIPS) && _MIPS_SIM == _MIPS_SIM_NABI32 107# define LINUX_MIPSN32 108# define LINUX_MIPS64 109#endif 110#if defined(MIPS) && _MIPS_SIM == _MIPS_SIM_ABI64 111# define LINUX_MIPSN64 112# define LINUX_MIPS64 113#endif 114 115#if (defined(LINUXSPARC) || defined(X86_64) || defined(ARM) || defined(AVR32)) && defined(__GLIBC__) 116# include <sys/ptrace.h> 117#else 118/* Work around awkward prototype in ptrace.h. */ 119# define ptrace xptrace 120# include <sys/ptrace.h> 121# undef ptrace 122# ifdef POWERPC 123# define __KERNEL__ 124# include <asm/ptrace.h> 125# undef __KERNEL__ 126# endif 127extern long ptrace(int, int, char *, long); 128#endif 129 130#if !defined(__GLIBC__) 131# define PTRACE_PEEKUSER PTRACE_PEEKUSR 132# define PTRACE_POKEUSER PTRACE_POKEUSR 133#endif 134#if defined(X86_64) || defined(I386) 135/* For struct pt_regs. x86 strace uses PTRACE_GETREGS. 136 * PTRACE_GETREGS returns registers in the layout of this struct. 137 */ 138# include <asm/ptrace.h> 139#endif 140#ifdef ALPHA 141# define REG_R0 0 142# define REG_A0 16 143# define REG_A3 19 144# define REG_FP 30 145# define REG_PC 64 146#endif /* ALPHA */ 147#ifdef MIPS 148# define REG_V0 2 149# define REG_A0 4 150# define REG_A3 7 151# define REG_SP 29 152# define REG_EPC 64 153#endif /* MIPS */ 154#ifdef HPPA 155# define PT_GR20 (20*4) 156# define PT_GR26 (26*4) 157# define PT_GR28 (28*4) 158# define PT_IAOQ0 (106*4) 159# define PT_IAOQ1 (107*4) 160#endif /* HPPA */ 161#ifdef SH64 162 /* SH64 Linux - this code assumes the following kernel API for system calls: 163 PC Offset 0 164 System Call Offset 16 (actually, (syscall no.) | (0x1n << 16), 165 where n = no. of parameters. 166 Other regs Offset 24+ 167 168 On entry: R2-7 = parameters 1-6 (as many as necessary) 169 On return: R9 = result. */ 170 171 /* Offset for peeks of registers */ 172# define REG_OFFSET (24) 173# define REG_GENERAL(x) (8*(x)+REG_OFFSET) 174# define REG_PC (0*8) 175# define REG_SYSCALL (2*8) 176#endif /* SH64 */ 177 178#define SUPPORTED_PERSONALITIES 1 179#define DEFAULT_PERSONALITY 0 180 181#ifdef LINUXSPARC 182/* Indexes into the pt_regs.u_reg[] array -- UREG_XX from kernel are all off 183 * by 1 and use Ix instead of Ox. These work for both 32 and 64 bit Linux. */ 184# define U_REG_G1 0 185# define U_REG_O0 7 186# define U_REG_O1 8 187# define PERSONALITY0_WORDSIZE 4 188# define PERSONALITY1_WORDSIZE 4 189# undef SUPPORTED_PERSONALITIES 190# if defined(SPARC64) 191# include <asm/psrcompat.h> 192# define SUPPORTED_PERSONALITIES 3 193# define PERSONALITY2_WORDSIZE 8 194# else 195# include <asm/psr.h> 196# define SUPPORTED_PERSONALITIES 2 197# endif /* SPARC64 */ 198#endif /* LINUXSPARC */ 199 200#ifdef X86_64 201# undef SUPPORTED_PERSONALITIES 202# define SUPPORTED_PERSONALITIES 2 203# define PERSONALITY0_WORDSIZE 8 204# define PERSONALITY1_WORDSIZE 4 205#endif 206 207#ifdef ARM 208# undef SUPPORTED_PERSONALITIES 209# define SUPPORTED_PERSONALITIES 2 210# define PERSONALITY0_WORDSIZE 4 211# define PERSONALITY1_WORDSIZE 4 212#endif 213 214#ifdef POWERPC64 215# undef SUPPORTED_PERSONALITIES 216# define SUPPORTED_PERSONALITIES 2 217# define PERSONALITY0_WORDSIZE 8 218# define PERSONALITY1_WORDSIZE 4 219#endif 220 221#if !HAVE_DECL_PTRACE_SETOPTIONS 222# define PTRACE_SETOPTIONS 0x4200 223#endif 224#if !HAVE_DECL_PTRACE_GETEVENTMSG 225# define PTRACE_GETEVENTMSG 0x4201 226#endif 227#if !HAVE_DECL_PTRACE_GETSIGINFO 228# define PTRACE_GETSIGINFO 0x4202 229#endif 230 231#if !HAVE_DECL_PTRACE_O_TRACESYSGOOD 232# define PTRACE_O_TRACESYSGOOD 0x00000001 233#endif 234#if !HAVE_DECL_PTRACE_O_TRACEFORK 235# define PTRACE_O_TRACEFORK 0x00000002 236#endif 237#if !HAVE_DECL_PTRACE_O_TRACEVFORK 238# define PTRACE_O_TRACEVFORK 0x00000004 239#endif 240#if !HAVE_DECL_PTRACE_O_TRACECLONE 241# define PTRACE_O_TRACECLONE 0x00000008 242#endif 243#if !HAVE_DECL_PTRACE_O_TRACEEXEC 244# define PTRACE_O_TRACEEXEC 0x00000010 245#endif 246#if !HAVE_DECL_PTRACE_O_TRACEEXIT 247# define PTRACE_O_TRACEEXIT 0x00000040 248#endif 249 250#if !HAVE_DECL_PTRACE_EVENT_FORK 251# define PTRACE_EVENT_FORK 1 252#endif 253#if !HAVE_DECL_PTRACE_EVENT_VFORK 254# define PTRACE_EVENT_VFORK 2 255#endif 256#if !HAVE_DECL_PTRACE_EVENT_CLONE 257# define PTRACE_EVENT_CLONE 3 258#endif 259#if !HAVE_DECL_PTRACE_EVENT_EXEC 260# define PTRACE_EVENT_EXEC 4 261#endif 262#if !HAVE_DECL_PTRACE_EVENT_VFORK_DONE 263# define PTRACE_EVENT_VFORK_DONE 5 264#endif 265#if !HAVE_DECL_PTRACE_EVENT_EXIT 266# define PTRACE_EVENT_EXIT 6 267#endif 268 269/* Experimental code using PTRACE_SEIZE can be enabled here: */ 270//# define USE_SEIZE 1 271 272#ifdef USE_SEIZE 273# undef PTRACE_SEIZE 274# define PTRACE_SEIZE 0x4206 275# undef PTRACE_INTERRUPT 276# define PTRACE_INTERRUPT 0x4207 277# undef PTRACE_LISTEN 278# define PTRACE_LISTEN 0x4208 279# undef PTRACE_SEIZE_DEVEL 280# define PTRACE_SEIZE_DEVEL 0x80000000 281# undef PTRACE_EVENT_STOP 282# define PTRACE_EVENT_STOP 7 283# define PTRACE_EVENT_STOP1 128 284#endif 285 286#if !defined __GNUC__ 287# define __attribute__(x) /*nothing*/ 288#endif 289 290#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) 291 292#if defined(I386) 293extern struct pt_regs i386_regs; 294#endif 295 296/* Trace Control Block */ 297struct tcb { 298 int flags; /* See below for TCB_ values */ 299 int pid; /* Process Id of this entry */ 300 int u_nargs; /* System call argument count */ 301 int u_error; /* Error code */ 302 long scno; /* System call number */ 303 long u_arg[MAX_ARGS]; /* System call arguments */ 304#if defined(LINUX_MIPSN32) 305 long long ext_arg[MAX_ARGS]; /* System call arguments */ 306#endif 307 long u_rval; /* (first) return value */ 308#ifdef HAVE_LONG_LONG 309 long long u_lrval; /* long long return value */ 310#endif 311 int ptrace_errno; 312#if SUPPORTED_PERSONALITIES > 1 313 int currpers; /* Personality at the time of scno update */ 314#endif 315 int curcol; /* Output column for this process */ 316 FILE *outf; /* Output file for this process */ 317 const char *auxstr; /* Auxiliary info from syscall (see RVAL_STR) */ 318 struct timeval stime; /* System time usage as of last process wait */ 319 struct timeval dtime; /* Delta for system time usage */ 320 struct timeval etime; /* Syscall entry time */ 321 /* Support for tracing forked processes */ 322 long baddr; /* `Breakpoint' address */ 323 long inst[2]; /* Instructions on above */ 324}; 325 326/* TCB flags */ 327#define TCB_INUSE 00001 /* This table entry is in use */ 328/* We have attached to this process, but did not see it stopping yet. 329 * (If this bit is not set, we either didn't attach yet, 330 * or we did attach to it, already saw it stopping at least once, 331 * did some init work on it and cleared this bit. TODO: maybe it makes sense 332 * to split these two states?) 333 */ 334#define TCB_STARTUP 00002 335#define TCB_IGNORE_ONE_SIGSTOP 00004 /* Next SIGSTOP is to be ignored */ 336/* 337 * Are we in system call entry or in syscall exit? 338 * 339 * This bit is set after all syscall entry processing is done. 340 * Therefore, this bit will be set when next ptrace stop occurs, 341 * which should be syscall exit stop. Other stops which are possible 342 * directly after syscall entry (death, ptrace event stop) 343 * are simpler and handled without calling trace_syscall(), therefore 344 * the places where TCB_INSYSCALL can be set but we aren't in syscall stop 345 * are limited to trace(), this condition is never observed in trace_syscall() 346 * and below. 347 * The bit is cleared after all syscall exit processing is done. 348 * User-generated SIGTRAPs and post-execve SIGTRAP make it necessary 349 * to be very careful and NOT set TCB_INSYSCALL bit when they are encountered. 350 * TCB_WAITEXECVE bit is used for this purpose (see below). 351 * 352 * Use entering(tcp) / exiting(tcp) to check this bit to make code more readable. 353 */ 354#define TCB_INSYSCALL 00010 355#define TCB_ATTACHED 00020 /* Process is not our own child */ 356#define TCB_BPTSET 00100 /* "Breakpoint" set after fork(2) */ 357#define TCB_REPRINT 01000 /* We should reprint this syscall on exit */ 358#define TCB_FILTERED 02000 /* This system call has been filtered out */ 359/* x86 does not need TCB_WAITEXECVE. 360 * It can detect SIGTRAP by looking at eax/rax. 361 * See "not a syscall entry (eax = %ld)\n" message 362 * in syscall_fixup_on_sysenter(). 363 */ 364#if defined(ALPHA) || defined(AVR32) || defined(SPARC) || defined(SPARC64) \ 365 || defined(POWERPC) || defined(IA64) || defined(HPPA) \ 366 || defined(SH) || defined(SH64) || defined(S390) || defined(S390X) \ 367 || defined(ARM) || defined(MIPS) || defined(BFIN) || defined(TILE) 368/* This tracee has entered into execve syscall. Expect post-execve SIGTRAP 369 * to happen. (When it is detected, tracee is continued and this bit is cleared.) 370 */ 371# define TCB_WAITEXECVE 04000 372#endif 373#include <sys/syscall.h> 374 375/* qualifier flags */ 376#define QUAL_TRACE 0001 /* this system call should be traced */ 377#define QUAL_ABBREV 0002 /* abbreviate the structures of this syscall */ 378#define QUAL_VERBOSE 0004 /* decode the structures of this syscall */ 379#define QUAL_RAW 0010 /* print all args in hex for this syscall */ 380#define QUAL_SIGNAL 0020 /* report events with this signal */ 381#define QUAL_FAULT 0040 /* report events with this fault */ 382#define QUAL_READ 0100 /* dump data read on this file descriptor */ 383#define QUAL_WRITE 0200 /* dump data written to this file descriptor */ 384 385#define entering(tcp) (!((tcp)->flags & TCB_INSYSCALL)) 386#define exiting(tcp) ((tcp)->flags & TCB_INSYSCALL) 387#define syserror(tcp) ((tcp)->u_error != 0) 388#define verbose(tcp) (qual_flags[(tcp)->scno] & QUAL_VERBOSE) 389#define abbrev(tcp) (qual_flags[(tcp)->scno] & QUAL_ABBREV) 390#define filtered(tcp) ((tcp)->flags & TCB_FILTERED) 391 392struct xlat { 393 int val; 394 const char *str; 395}; 396 397extern const struct xlat open_mode_flags[]; 398extern const struct xlat addrfams[]; 399extern const struct xlat struct_user_offsets[]; 400extern const struct xlat open_access_modes[]; 401 402/* Format of syscall return values */ 403#define RVAL_DECIMAL 000 /* decimal format */ 404#define RVAL_HEX 001 /* hex format */ 405#define RVAL_OCTAL 002 /* octal format */ 406#define RVAL_UDECIMAL 003 /* unsigned decimal format */ 407#define RVAL_LDECIMAL 004 /* long decimal format */ 408#define RVAL_LHEX 005 /* long hex format */ 409#define RVAL_LOCTAL 006 /* long octal format */ 410#define RVAL_LUDECIMAL 007 /* long unsigned decimal format */ 411#define RVAL_MASK 007 /* mask for these values */ 412 413#define RVAL_STR 010 /* Print `auxstr' field after return val */ 414#define RVAL_NONE 020 /* Print nothing */ 415 416#ifndef offsetof 417# define offsetof(type, member) (((char *) &(((type *) NULL)->member)) - \ 418 ((char *) (type *) NULL)) 419#endif 420 421/* get offset of member within a user struct */ 422#define uoff(member) offsetof(struct user, member) 423 424#define TRACE_FILE 001 /* Trace file-related syscalls. */ 425#define TRACE_IPC 002 /* Trace IPC-related syscalls. */ 426#define TRACE_NETWORK 004 /* Trace network-related syscalls. */ 427#define TRACE_PROCESS 010 /* Trace process-related syscalls. */ 428#define TRACE_SIGNAL 020 /* Trace signal-related syscalls. */ 429#define TRACE_DESC 040 /* Trace file descriptor-related syscalls. */ 430#define SYSCALL_NEVER_FAILS 0100 /* Syscall is always successful. */ 431 432typedef enum { 433 CFLAG_NONE = 0, 434 CFLAG_ONLY_STATS, 435 CFLAG_BOTH 436} cflag_t; 437 438extern int *qual_flags; 439extern int debug, followfork; 440extern unsigned int ptrace_setoptions; 441extern int dtime, xflag, qflag; 442extern cflag_t cflag; 443extern int max_strlen; 444/* 445 * Which tcb has incomplete line being printed right now? 446 * NULL if last line has been completed ('\n'-terminated). 447 * printleader(tcp) sets it. Clearing is open-coded. 448 */ 449extern struct tcb *printing_tcp; 450 451enum bitness_t { BITNESS_CURRENT = 0, BITNESS_32 }; 452 453void error_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2))); 454void perror_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2))); 455void error_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2))); 456void perror_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2))); 457void die_out_of_memory(void) __attribute__ ((noreturn)); 458 459extern void set_personality(int personality); 460extern const char *xlookup(const struct xlat *, int); 461extern struct tcb *alloc_tcb(int, int); 462extern void droptcb(struct tcb *); 463 464#define alloctcb(pid) alloc_tcb((pid), 1) 465 466extern void set_sortby(const char *); 467extern void set_overhead(int); 468extern void qualify(const char *); 469extern int ptrace_restart(int request, struct tcb *tcp, int sig); 470extern int trace_syscall(struct tcb *); 471extern void count_syscall(struct tcb *, struct timeval *); 472extern void printxval(const struct xlat *, int, const char *); 473extern int printargs(struct tcb *); 474extern int printargs_lu(struct tcb *); 475extern int printargs_ld(struct tcb *); 476extern void addflags(const struct xlat *, int); 477extern int printflags(const struct xlat *, int, const char *); 478extern const char *sprintflags(const char *, const struct xlat *, int); 479extern int umoven(struct tcb *, long, int, char *); 480extern int umovestr(struct tcb *, long, int, char *); 481extern int upeek(struct tcb *, long, long *); 482extern void dumpiov(struct tcb *, int, long); 483extern void dumpstr(struct tcb *, long, int); 484extern void printstr(struct tcb *, long, int); 485extern void printnum(struct tcb *, long, const char *); 486extern void printnum_int(struct tcb *, long, const char *); 487extern void printpath(struct tcb *, long); 488extern void printpathn(struct tcb *, long, int); 489#define TIMESPEC_TEXT_BUFSIZE (sizeof(long)*3 * 2 + sizeof("{%u, %u}")) 490#define TIMEVAL_TEXT_BUFSIZE TIMESPEC_TEXT_BUFSIZE 491extern void printtv_bitness(struct tcb *, long, enum bitness_t, int); 492extern char *sprinttv(char *, struct tcb *, long, enum bitness_t, int special); 493extern void print_timespec(struct tcb *, long); 494extern void sprint_timespec(char *, struct tcb *, long); 495#ifdef HAVE_SIGINFO_T 496extern void printsiginfo(siginfo_t *, int); 497#endif 498extern const char *getfdpath(struct tcb *, int); 499extern void printfd(struct tcb *, int); 500extern void printsock(struct tcb *, long, int); 501extern void print_sock_optmgmt(struct tcb *, long, int); 502extern void printrusage(struct tcb *, long); 503#ifdef ALPHA 504extern void printrusage32(struct tcb *, long); 505#endif 506extern void printuid(const char *, unsigned long); 507extern int clearbpt(struct tcb *); 508/* 509 * On Linux, "setbpt" is a misnomer: we don't set a breakpoint 510 * (IOW: no poking in user's text segment), 511 * instead we change fork/vfork/clone into clone(CLONE_PTRACE). 512 * On newer kernels, we use PTRACE_O_TRACECLONE/TRACE[V]FORK instead. 513 */ 514extern int setbpt(struct tcb *); 515extern void printcall(struct tcb *); 516extern const char *signame(int); 517extern void print_sigset(struct tcb *, long, int); 518extern void printsignal(int); 519extern void printleader(struct tcb *); 520extern void tabto(void); 521extern void call_summary(FILE *); 522extern void tprint_iov(struct tcb *, unsigned long, unsigned long, int decode_iov); 523extern void tprint_open_modes(mode_t); 524extern const char *sprint_open_modes(mode_t); 525extern int is_restart_error(struct tcb *); 526 527extern int pathtrace_select(const char *); 528extern int pathtrace_match(struct tcb *); 529 530extern int change_syscall(struct tcb *, int); 531extern int internal_fork(struct tcb *); 532extern int internal_exec(struct tcb *); 533 534extern const struct ioctlent *ioctl_lookup(long); 535extern const struct ioctlent *ioctl_next_match(const struct ioctlent *); 536extern int ioctl_decode(struct tcb *, long, long); 537extern int term_ioctl(struct tcb *, long, long); 538extern int sock_ioctl(struct tcb *, long, long); 539extern int proc_ioctl(struct tcb *, int, int); 540extern int rtc_ioctl(struct tcb *, long, long); 541extern int scsi_ioctl(struct tcb *, long, long); 542extern int block_ioctl(struct tcb *, long, long); 543 544extern int tv_nz(struct timeval *); 545extern int tv_cmp(struct timeval *, struct timeval *); 546extern double tv_float(struct timeval *); 547extern void tv_add(struct timeval *, struct timeval *, struct timeval *); 548extern void tv_sub(struct timeval *, struct timeval *, struct timeval *); 549extern void tv_mul(struct timeval *, struct timeval *, int); 550extern void tv_div(struct timeval *, struct timeval *, int); 551 552#if !defined HAVE_STPCPY 553/* Some libc have stpcpy, some don't. Sigh... 554 * Roll our private implementation... 555 */ 556#undef stpcpy 557#define stpcpy strace_stpcpy 558extern char *stpcpy(char *dst, const char *src); 559#endif 560 561#if defined(SPARC) || defined(SPARC64) || defined(IA64) || defined(SH) 562extern long getrval2(struct tcb *); 563#endif 564 565#define umove(pid, addr, objp) \ 566 umoven((pid), (addr), sizeof *(objp), (char *) (objp)) 567 568#define printtv(tcp, addr) \ 569 printtv_bitness((tcp), (addr), BITNESS_CURRENT, 0) 570#define printtv_special(tcp, addr) \ 571 printtv_bitness((tcp), (addr), BITNESS_CURRENT, 1) 572 573extern void tprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); 574extern void tprints(const char *str); 575 576#ifndef HAVE_STRERROR 577const char *strerror(int); 578#endif 579#ifndef HAVE_STRSIGNAL 580const char *strsignal(int); 581#endif 582 583extern int current_personality; 584extern const int personality_wordsize[]; 585 586struct sysent { 587 unsigned nargs; 588 int sys_flags; 589 int (*sys_func)(); 590 const char *sys_name; 591}; 592 593struct ioctlent { 594 const char *doth; 595 const char *symbol; 596 unsigned long code; 597}; 598 599extern const struct sysent *sysent; 600extern unsigned nsyscalls; 601extern const char *const *errnoent; 602extern unsigned nerrnos; 603extern const struct ioctlent *ioctlent; 604extern unsigned nioctlents; 605extern const char *const *signalent; 606extern unsigned nsignals; 607 608#define SCNO_IN_RANGE(scno) \ 609 ((unsigned long)(scno) < nsyscalls && sysent[scno].sys_func) 610 611#if HAVE_LONG_LONG 612 613/* _l refers to the lower numbered u_arg, 614 * _h refers to the higher numbered u_arg 615 */ 616 617#if HAVE_LITTLE_ENDIAN_LONG_LONG 618#define LONG_LONG(_l,_h) \ 619 ((long long)((unsigned long long)(unsigned)(_l) | ((unsigned long long)(_h)<<32))) 620#else 621#define LONG_LONG(_l,_h) \ 622 ((long long)((unsigned long long)(unsigned)(_h) | ((unsigned long long)(_l)<<32))) 623#endif 624 625extern int printllval(struct tcb *, const char *, int); 626#endif 627 628#ifdef IA64 629extern long ia32; 630#endif 631 632extern int not_failing_only; 633extern int show_fd_path; 634extern int tracing_paths; 635