| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 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 |  | 
| Roland McGrath | 795edb1 | 2005-02-02 04:44:57 +0000 | [diff] [blame] | 32 | #ifdef HAVE_CONFIG_H | 
 | 33 | #include "config.h" | 
 | 34 | #endif | 
 | 35 |  | 
| Wichert Akkerman | b859bea | 1999-04-18 22:50:50 +0000 | [diff] [blame] | 36 | #ifdef linux | 
 | 37 | #include <features.h> | 
 | 38 | #endif | 
 | 39 |  | 
| Roland McGrath | e6d3a29 | 2003-01-14 09:46:18 +0000 | [diff] [blame] | 40 | #ifdef _LARGEFILE64_SOURCE | 
 | 41 | /* This is the macro everything checks before using foo64 names.  */ | 
 | 42 | # ifndef _LFS64_LARGEFILE | 
 | 43 | #  define _LFS64_LARGEFILE 1 | 
 | 44 | # endif | 
 | 45 | #endif | 
 | 46 |  | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 47 | /* configuration section */ | 
 | 48 | #ifndef MAX_QUALS | 
| Roland McGrath | 63d0146 | 2002-12-30 00:25:36 +0000 | [diff] [blame] | 49 | #if defined(LINUX) && defined(MIPS) | 
 | 50 | #define MAX_QUALS	5000	/* maximum number of syscalls, signals, etc. */ | 
| Wichert Akkerman | fd89ced | 2000-04-13 17:06:09 +0000 | [diff] [blame] | 51 | #else | 
| Wichert Akkerman | 8b1b40c | 2000-02-03 21:58:30 +0000 | [diff] [blame] | 52 | #define MAX_QUALS	2048	/* maximum number of syscalls, signals, etc. */ | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 53 | #endif | 
| Wichert Akkerman | 5ae21ea | 2000-05-01 01:53:59 +0000 | [diff] [blame] | 54 | #endif | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 55 | #ifndef DEFAULT_STRLEN | 
 | 56 | #define DEFAULT_STRLEN	32	/* default maximum # of bytes printed in | 
 | 57 | 				  `printstr', change with `-s' switch */ | 
 | 58 | #endif | 
 | 59 | #ifndef DEFAULT_ACOLUMN | 
 | 60 | #define DEFAULT_ACOLUMN	40	/* default alignment column for results */ | 
 | 61 | #endif | 
 | 62 | #ifndef MAX_ARGS | 
 | 63 | #define MAX_ARGS	32	/* maximum number of args to a syscall */ | 
 | 64 | #endif | 
 | 65 | #ifndef DEFAULT_SORTBY | 
 | 66 | #define DEFAULT_SORTBY "time"	/* default sorting method for call profiling */ | 
 | 67 | #endif | 
 | 68 |  | 
 | 69 | #include <sys/types.h> | 
 | 70 | #include <unistd.h> | 
 | 71 | #include <stdlib.h> | 
 | 72 | #include <stdio.h> | 
 | 73 | #include <ctype.h> | 
 | 74 | #include <string.h> | 
| Wichert Akkerman | 8c7122c | 2001-02-16 19:59:55 +0000 | [diff] [blame] | 75 | #include <time.h> | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 76 | #include <sys/time.h> | 
 | 77 | #include <errno.h> | 
 | 78 |  | 
 | 79 | #ifdef STDC_HEADERS | 
 | 80 | #include <stddef.h> | 
 | 81 | #endif /* STDC_HEADERS */ | 
 | 82 |  | 
| John Hughes | 5826589 | 2001-10-18 15:13:53 +0000 | [diff] [blame] | 83 | #ifdef HAVE_SIGINFO_T | 
 | 84 | #include <signal.h> | 
 | 85 | #endif | 
 | 86 |  | 
| Wichert Akkerman | f5eeabb | 1999-11-18 17:09:47 +0000 | [diff] [blame] | 87 | #if defined(LINUX) | 
| Roland McGrath | 6d1a65c | 2004-07-12 07:44:08 +0000 | [diff] [blame] | 88 | #  if defined(SPARC) || defined(SPARC64) | 
| Wichert Akkerman | f5eeabb | 1999-11-18 17:09:47 +0000 | [diff] [blame] | 89 | #     define LINUXSPARC | 
 | 90 | #  endif | 
 | 91 | #  if defined(ALPHA) | 
 | 92 | #     define LINUX_64BIT | 
 | 93 | #  endif | 
| Michal Ludvig | 0e03550 | 2002-09-23 15:41:01 +0000 | [diff] [blame] | 94 | #  if defined(X86_64) | 
 | 95 | #     define LINUX_X86_64 | 
 | 96 | #  endif | 
| Roland McGrath | ee9d435 | 2002-12-18 04:16:10 +0000 | [diff] [blame] | 97 | #endif | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 98 |  | 
| Wichert Akkerman | bf79f2e | 2000-09-01 21:03:06 +0000 | [diff] [blame] | 99 | #if defined(SVR4) || defined(FREEBSD) | 
 | 100 | #define USE_PROCFS | 
 | 101 | #else | 
 | 102 | #undef USE_PROCFS | 
 | 103 | #endif | 
 | 104 |  | 
 | 105 | #ifdef FREEBSD | 
 | 106 | #ifndef I386 | 
 | 107 | #error "FreeBSD support is only for i386 arch right now." | 
 | 108 | #endif | 
 | 109 | #include <machine/psl.h> | 
 | 110 | #include <machine/reg.h> | 
 | 111 | #include <sys/syscall.h> | 
 | 112 | #endif | 
 | 113 |  | 
 | 114 | #ifdef USE_PROCFS | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 115 | #include <sys/procfs.h> | 
| Wichert Akkerman | ea78f0f | 1999-11-29 15:34:02 +0000 | [diff] [blame] | 116 | #ifdef HAVE_MP_PROCFS | 
| Wichert Akkerman | 9ce1a63 | 1999-08-29 23:15:07 +0000 | [diff] [blame] | 117 | #include <sys/uio.h> | 
 | 118 | #endif | 
| Wichert Akkerman | bf79f2e | 2000-09-01 21:03:06 +0000 | [diff] [blame] | 119 | #ifdef FREEBSD | 
 | 120 | #include <sys/pioctl.h> | 
 | 121 | #endif /* FREEBSD */ | 
 | 122 | #else /* !USE_PROCFS */ | 
| Michal Ludvig | 0e03550 | 2002-09-23 15:41:01 +0000 | [diff] [blame] | 123 | #if (defined(LINUXSPARC) || defined (LINUX_X86_64)) && defined(__GLIBC__) | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 124 | #include <sys/ptrace.h> | 
 | 125 | #else | 
 | 126 | /* Work around awkward prototype in ptrace.h. */ | 
 | 127 | #define ptrace xptrace | 
 | 128 | #include <sys/ptrace.h> | 
 | 129 | #undef ptrace | 
 | 130 | #ifdef POWERPC | 
 | 131 | #define __KERNEL__ | 
 | 132 | #include <asm/ptrace.h> | 
 | 133 | #undef __KERNEL__ | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 134 | #endif | 
 | 135 | #ifdef __STDC__ | 
 | 136 | #ifdef LINUX | 
 | 137 | extern long ptrace(int, int, char *, long); | 
 | 138 | #else /* !LINUX */ | 
 | 139 | extern int ptrace(int, int, char *, int, ...); | 
 | 140 | #endif /* !LINUX */ | 
 | 141 | #else /* !__STDC__ */ | 
 | 142 | extern int ptrace(); | 
 | 143 | #endif /* !__STDC__ */ | 
 | 144 | #endif /* !LINUXSPARC */ | 
 | 145 | #endif /* !SVR4 */ | 
 | 146 |  | 
 | 147 | #ifdef LINUX | 
| Wichert Akkerman | b859bea | 1999-04-18 22:50:50 +0000 | [diff] [blame] | 148 | #if !defined(__GLIBC__) | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 149 | #define	PTRACE_PEEKUSER	PTRACE_PEEKUSR | 
 | 150 | #define	PTRACE_POKEUSER	PTRACE_POKEUSR | 
 | 151 | #endif | 
 | 152 | #ifdef ALPHA | 
| Wichert Akkerman | f90da01 | 1999-10-31 21:15:38 +0000 | [diff] [blame] | 153 | #  define REG_R0 0 | 
 | 154 | #  define REG_A0 16 | 
 | 155 | #  define REG_A3 19 | 
 | 156 | #  define REG_FP 30 | 
 | 157 | #  define REG_PC 64 | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 158 | #endif /* ALPHA */ | 
| Wichert Akkerman | f90da01 | 1999-10-31 21:15:38 +0000 | [diff] [blame] | 159 | #ifdef MIPS | 
 | 160 | #  define REG_V0 2 | 
 | 161 | #  define REG_A0 4 | 
 | 162 | #  define REG_A3 7 | 
 | 163 | #  define REG_SP 29 | 
 | 164 | #  define REG_EPC 64 | 
 | 165 | #endif /* MIPS */ | 
| Wichert Akkerman | c1652e2 | 2001-03-27 12:17:16 +0000 | [diff] [blame] | 166 | #ifdef HPPA | 
 | 167 | #  define PT_GR20 (20*4) | 
 | 168 | #  define PT_GR26 (26*4) | 
 | 169 | #  define PT_GR28 (28*4) | 
 | 170 | #  define PT_IAOQ0 (106*4) | 
 | 171 | #  define PT_IAOQ1 (107*4) | 
 | 172 | #endif /* HPPA */ | 
| Roland McGrath | f5a4777 | 2003-06-26 22:40:42 +0000 | [diff] [blame] | 173 | #ifdef SH64 | 
 | 174 |    /* SH64 Linux - this code assumes the following kernel API for system calls: | 
| Roland McGrath | e1e584b | 2003-06-02 19:18:58 +0000 | [diff] [blame] | 175 |           PC           Offset 0 | 
 | 176 |           System Call  Offset 16 (actually, (syscall no.) | (0x1n << 16), | 
 | 177 |                        where n = no. of parameters. | 
 | 178 |           Other regs   Offset 24+ | 
 | 179 |  | 
 | 180 |           On entry:    R2-7 = parameters 1-6 (as many as necessary) | 
 | 181 |           On return:   R9   = result. */ | 
 | 182 |  | 
 | 183 |    /* Offset for peeks of registers */ | 
 | 184 | #  define REG_OFFSET         (24) | 
 | 185 | #  define REG_GENERAL(x)     (8*(x)+REG_OFFSET) | 
 | 186 | #  define REG_PC             (0*8) | 
 | 187 | #  define REG_SYSCALL        (2*8) | 
| Roland McGrath | f5a4777 | 2003-06-26 22:40:42 +0000 | [diff] [blame] | 188 | #endif /* SH64 */ | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 189 | #endif /* LINUX */ | 
 | 190 |  | 
 | 191 | #define SUPPORTED_PERSONALITIES 1 | 
 | 192 | #define DEFAULT_PERSONALITY 0 | 
 | 193 |  | 
 | 194 | #ifdef LINUXSPARC | 
 | 195 | #include <linux/a.out.h> | 
 | 196 | #include <asm/psr.h> | 
| Roland McGrath | 4b2dcca | 2006-01-12 10:18:53 +0000 | [diff] [blame] | 197 | #define PERSONALITY0_WORDSIZE 4 | 
 | 198 | #define PERSONALITY1_WORDSIZE 4 | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 199 | #undef  SUPPORTED_PERSONALITIES | 
| Roland McGrath | 6d1a65c | 2004-07-12 07:44:08 +0000 | [diff] [blame] | 200 | #if defined(SPARC64) | 
 | 201 | #define SUPPORTED_PERSONALITIES 3 | 
| Roland McGrath | 4b2dcca | 2006-01-12 10:18:53 +0000 | [diff] [blame] | 202 | #define PERSONALITY2_WORDSIZE 8 | 
| Roland McGrath | 6d1a65c | 2004-07-12 07:44:08 +0000 | [diff] [blame] | 203 | #else | 
| Wichert Akkerman | b859bea | 1999-04-18 22:50:50 +0000 | [diff] [blame] | 204 | #define SUPPORTED_PERSONALITIES 2 | 
| Roland McGrath | 6d1a65c | 2004-07-12 07:44:08 +0000 | [diff] [blame] | 205 | #endif /* SPARC64 */ | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 206 | #endif /* LINUXSPARC */ | 
 | 207 |  | 
| Michal Ludvig | 0e03550 | 2002-09-23 15:41:01 +0000 | [diff] [blame] | 208 | #ifdef X86_64 | 
 | 209 | #undef SUPPORTED_PERSONALITIES | 
 | 210 | #define SUPPORTED_PERSONALITIES 2 | 
| Roland McGrath | 4b2dcca | 2006-01-12 10:18:53 +0000 | [diff] [blame] | 211 | #define PERSONALITY0_WORDSIZE 8 | 
 | 212 | #define PERSONALITY1_WORDSIZE 4 | 
| Roland McGrath | ee9d435 | 2002-12-18 04:16:10 +0000 | [diff] [blame] | 213 | #endif | 
 | 214 |  | 
| Wichert Akkerman | 9ce1a63 | 1999-08-29 23:15:07 +0000 | [diff] [blame] | 215 | #ifdef SVR4 | 
| Wichert Akkerman | ea78f0f | 1999-11-29 15:34:02 +0000 | [diff] [blame] | 216 | #ifdef HAVE_MP_PROCFS | 
| Wichert Akkerman | 9ce1a63 | 1999-08-29 23:15:07 +0000 | [diff] [blame] | 217 | extern int mp_ioctl (int f, int c, void *a, int s); | 
 | 218 | #define IOCTL(f,c,a)	mp_ioctl (f, c, a, sizeof *a) | 
 | 219 | #define IOCTL_STATUS(t) \ | 
 | 220 | 	 pread (t->pfd_stat, &t->status, sizeof t->status, 0) | 
 | 221 | #define IOCTL_WSTOP(t)						\ | 
| Wichert Akkerman | 16a03d2 | 2000-08-10 02:14:04 +0000 | [diff] [blame] | 222 | 	(IOCTL (t->pfd, PCWSTOP, (char *)NULL) < 0 ? -1 :		\ | 
| Wichert Akkerman | 9ce1a63 | 1999-08-29 23:15:07 +0000 | [diff] [blame] | 223 | 	 IOCTL_STATUS (t)) | 
 | 224 | #define PR_WHY		pr_lwp.pr_why | 
 | 225 | #define PR_WHAT		pr_lwp.pr_what | 
 | 226 | #define PR_REG		pr_lwp.pr_context.uc_mcontext.gregs | 
 | 227 | #define PR_FLAGS	pr_lwp.pr_flags | 
| John Hughes | 2529971 | 2001-03-06 10:10:06 +0000 | [diff] [blame] | 228 | #define PR_SYSCALL	pr_lwp.pr_syscall | 
| John Hughes | 5826589 | 2001-10-18 15:13:53 +0000 | [diff] [blame] | 229 | #define PR_INFO		pr_lwp.pr_info | 
| Wichert Akkerman | 9ce1a63 | 1999-08-29 23:15:07 +0000 | [diff] [blame] | 230 | #define PIOCSTIP	PCSTOP | 
 | 231 | #define PIOCSET		PCSET | 
 | 232 | #define PIOCRESET	PCRESET | 
 | 233 | #define PIOCSTRACE	PCSTRACE | 
 | 234 | #define PIOCSFAULT	PCSFAULT | 
 | 235 | #define PIOCWSTOP	PCWSTOP | 
 | 236 | #define PIOCSTOP	PCSTOP | 
 | 237 | #define PIOCSENTRY	PCSENTRY | 
 | 238 | #define PIOCSEXIT	PCSEXIT | 
 | 239 | #define PIOCRUN		PCRUN | 
 | 240 | #else | 
 | 241 | #define IOCTL		ioctl | 
 | 242 | #define IOCTL_STATUS(t)	ioctl (t->pfd, PIOCSTATUS, &t->status) | 
| Roland McGrath | ee9d435 | 2002-12-18 04:16:10 +0000 | [diff] [blame] | 243 | #define IOCTL_WSTOP(t)	ioctl (t->pfd, PIOCWSTOP, &t->status) | 
| Wichert Akkerman | 9ce1a63 | 1999-08-29 23:15:07 +0000 | [diff] [blame] | 244 | #define PR_WHY		pr_why | 
 | 245 | #define PR_WHAT		pr_what | 
 | 246 | #define PR_REG		pr_reg | 
 | 247 | #define PR_FLAGS	pr_flags | 
| John Hughes | 2529971 | 2001-03-06 10:10:06 +0000 | [diff] [blame] | 248 | #define PR_SYSCALL	pr_syscall | 
| John Hughes | 5826589 | 2001-10-18 15:13:53 +0000 | [diff] [blame] | 249 | #define PR_INFO		pr_info | 
| Wichert Akkerman | 9ce1a63 | 1999-08-29 23:15:07 +0000 | [diff] [blame] | 250 | #endif | 
 | 251 | #endif | 
| Wichert Akkerman | bf79f2e | 2000-09-01 21:03:06 +0000 | [diff] [blame] | 252 | #ifdef FREEBSD | 
 | 253 | #define IOCTL		ioctl | 
 | 254 | #define IOCTL_STATUS(t)	ioctl (t->pfd, PIOCSTATUS, &t->status) | 
 | 255 | #define IOCTL_WSTOP(t)	ioctl (t->pfd, PIOCWAIT, &t->status) | 
 | 256 | #define PIOCRUN         PIOCCONT | 
 | 257 | #define PIOCWSTOP       PIOCWAIT | 
 | 258 | #define PR_WHY		why | 
 | 259 | #define PR_WHAT		val | 
| Wichert Akkerman | 2e4ffe5 | 2000-09-03 23:57:48 +0000 | [diff] [blame] | 260 | #define PR_FLAGS	state | 
| Wichert Akkerman | bf79f2e | 2000-09-01 21:03:06 +0000 | [diff] [blame] | 261 | /* from /usr/src/sys/miscfs/procfs/procfs_vnops.c, | 
 | 262 |    status.state = 0 for running, 1 for stopped */ | 
| Wichert Akkerman | 2e4ffe5 | 2000-09-03 23:57:48 +0000 | [diff] [blame] | 263 | #define PR_ASLEEP	1 | 
| Wichert Akkerman | bf79f2e | 2000-09-01 21:03:06 +0000 | [diff] [blame] | 264 | #define PR_SYSENTRY     S_SCE | 
 | 265 | #define PR_SYSEXIT      S_SCX | 
 | 266 | #define PR_SIGNALLED    S_SIG | 
 | 267 | #define PR_FAULTED      S_CORE | 
 | 268 | #endif | 
| Wichert Akkerman | 9ce1a63 | 1999-08-29 23:15:07 +0000 | [diff] [blame] | 269 |  | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 270 | /* Trace Control Block */ | 
 | 271 | struct tcb { | 
 | 272 | 	short flags;		/* See below for TCB_ values */ | 
 | 273 | 	int pid;		/* Process Id of this entry */ | 
 | 274 | 	long scno;		/* System call number */ | 
 | 275 | 	int u_nargs;		/* System call arguments */ | 
 | 276 | 	long u_arg[MAX_ARGS];	/* System call arguments */ | 
 | 277 | 	int u_error;		/* Error code */ | 
 | 278 | 	long u_rval;		/* (first) return value */ | 
| Wichert Akkerman | 16a03d2 | 2000-08-10 02:14:04 +0000 | [diff] [blame] | 279 | #ifdef HAVE_LONG_LONG | 
 | 280 | 	long long u_lrval;	/* long long return value */ | 
 | 281 | #endif | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 282 | 	FILE *outf;		/* Output file for this process */ | 
| Wichert Akkerman | 43a7482 | 2000-06-27 17:33:32 +0000 | [diff] [blame] | 283 | 	const char *auxstr;	/* Auxiliary info from syscall (see RVAL_STR) */ | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 284 | 	struct timeval stime;	/* System time usage as of last process wait */ | 
 | 285 | 	struct timeval dtime;	/* Delta for system time usage */ | 
 | 286 | 	struct timeval etime;	/* Syscall entry time */ | 
 | 287 | 				/* Support for tracing forked processes */ | 
 | 288 | 	struct tcb *parent;	/* Parent of this process */ | 
 | 289 | 	int nchildren;		/* # of traced children */ | 
 | 290 | 	int waitpid;		/* pid(s) this process is waiting for */ | 
| Roland McGrath | 0962345 | 2003-05-23 02:27:13 +0000 | [diff] [blame] | 291 | 	int nzombies;		/* # of formerly traced children now dead */ | 
| Roland McGrath | 923f750 | 2003-01-09 06:53:27 +0000 | [diff] [blame] | 292 | #ifdef LINUX | 
 | 293 | 	int nclone_threads;	/* # of nchildren with CLONE_THREAD */ | 
 | 294 | 	int nclone_detached;	/* # of nchildren with CLONE_DETACHED */ | 
 | 295 | 	int nclone_waiting;	/* clone threads in wait4 (TCB_SUSPENDED) */ | 
 | 296 | #endif | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 297 | 				/* (1st arg of wait4()) */ | 
 | 298 | 	long baddr;		/* `Breakpoint' address */ | 
 | 299 | 	long inst[2];		/* Instructions on above */ | 
 | 300 | 	int pfd;		/* proc file descriptor */ | 
 | 301 | #ifdef SVR4 | 
| Wichert Akkerman | ea78f0f | 1999-11-29 15:34:02 +0000 | [diff] [blame] | 302 | #ifdef HAVE_MP_PROCFS | 
| Wichert Akkerman | 9ce1a63 | 1999-08-29 23:15:07 +0000 | [diff] [blame] | 303 | 	int pfd_stat; | 
 | 304 | 	int pfd_as; | 
 | 305 | 	pstatus_t status; | 
 | 306 | #else | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 307 | 	prstatus_t status;	/* procfs status structure */ | 
 | 308 | #endif | 
| Wichert Akkerman | 9ce1a63 | 1999-08-29 23:15:07 +0000 | [diff] [blame] | 309 | #endif | 
| Wichert Akkerman | bf79f2e | 2000-09-01 21:03:06 +0000 | [diff] [blame] | 310 | #ifdef FREEBSD | 
 | 311 | 	struct procfs_status status; | 
 | 312 | 	int pfd_reg; | 
 | 313 | 	int pfd_status; | 
 | 314 | #endif | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 315 | }; | 
 | 316 |  | 
 | 317 | /* TCB flags */ | 
 | 318 | #define TCB_STARTUP	00001	/* We have just begun ptracing this process */ | 
 | 319 | #define TCB_INUSE	00002	/* This table entry is in use */ | 
 | 320 | #define TCB_INSYSCALL	00004	/* A system call is in progress */ | 
 | 321 | #define TCB_ATTACHED	00010	/* Process is not our own child */ | 
 | 322 | #define TCB_EXITING	00020	/* As far as we know, this process is exiting */ | 
 | 323 | #define TCB_SUSPENDED	00040	/* Process has done a wait(4), that can | 
 | 324 | 				   not be allowed to complete just now */ | 
 | 325 | #define TCB_BPTSET	00100	/* "Breakpoint" set after fork(2) */ | 
 | 326 | #define TCB_SIGTRAPPED	00200	/* Process wanted to block SIGTRAP */ | 
 | 327 | #define TCB_FOLLOWFORK	00400	/* Process should have forks followed */ | 
 | 328 | #define TCB_REPRINT	01000	/* We should reprint this syscall on exit */ | 
 | 329 | #ifdef LINUX | 
| Roland McGrath | 6d1a65c | 2004-07-12 07:44:08 +0000 | [diff] [blame] | 330 | # if defined(ALPHA) || defined(SPARC) || defined(SPARC64) || defined(POWERPC) || defined(IA64) || defined(HPPA) || defined(SH) || defined(SH64) || defined(S390) || defined(S390X) || defined(ARM) | 
| Wichert Akkerman | 7b3346b | 2001-10-09 23:47:38 +0000 | [diff] [blame] | 331 | #  define TCB_WAITEXECVE 02000	/* ignore SIGTRAP after exceve */ | 
 | 332 | # endif | 
| Roland McGrath | 923f750 | 2003-01-09 06:53:27 +0000 | [diff] [blame] | 333 | # define TCB_CLONE_DETACHED 04000 /* CLONE_DETACHED set in creating syscall */ | 
 | 334 | # define TCB_CLONE_THREAD  010000 /* CLONE_THREAD set in creating syscall */ | 
 | 335 | # define TCB_GROUP_EXITING 020000 /* TCB_EXITING was exit_group, not _exit */ | 
 | 336 | # include <sys/syscall.h> | 
 | 337 | # ifndef __NR_exit_group | 
 | 338 | # /* Hack: Most headers around are too old to have __NR_exit_group.  */ | 
 | 339 | #  ifdef ALPHA | 
 | 340 | #   define __NR_exit_group 405 | 
 | 341 | #  elif defined I386 | 
 | 342 | #   define __NR_exit_group 252 | 
| Dmitry V. Levin | aca9a74 | 2006-10-11 22:56:49 +0000 | [diff] [blame] | 343 | #  elif defined X86_64 | 
 | 344 | #   define __NR_exit_group 231 | 
| Roland McGrath | 923f750 | 2003-01-09 06:53:27 +0000 | [diff] [blame] | 345 | #  elif defined IA64 | 
 | 346 | #   define __NR_exit_group 1236 | 
 | 347 | #  elif defined POWERPC | 
 | 348 | #   define __NR_exit_group 234 | 
 | 349 | #  elif defined S390 || defined S390X | 
 | 350 | #   define __NR_exit_group 248 | 
| Roland McGrath | 6d1a65c | 2004-07-12 07:44:08 +0000 | [diff] [blame] | 351 | #  elif defined SPARC || defined SPARC64 | 
| Roland McGrath | 923f750 | 2003-01-09 06:53:27 +0000 | [diff] [blame] | 352 | #   define __NR_exit_group 188 | 
| Roland McGrath | 165155a | 2005-07-19 07:42:17 +0000 | [diff] [blame] | 353 | #  elif defined M68K | 
 | 354 | #   define __NR_exit_group 247 | 
| Roland McGrath | 923f750 | 2003-01-09 06:53:27 +0000 | [diff] [blame] | 355 | #  endif /* ALPHA et al */ | 
 | 356 | # endif	/* !__NR_exit_group */ | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 357 | #endif /* LINUX */ | 
 | 358 |  | 
 | 359 | /* qualifier flags */ | 
 | 360 | #define QUAL_TRACE	0001	/* this system call should be traced */ | 
 | 361 | #define QUAL_ABBREV	0002	/* abbreviate the structures of this syscall */ | 
 | 362 | #define QUAL_VERBOSE	0004	/* decode the structures of this syscall */ | 
 | 363 | #define QUAL_RAW	0010	/* print all args in hex for this syscall */ | 
 | 364 | #define QUAL_SIGNAL	0020	/* report events with this signal */ | 
 | 365 | #define QUAL_FAULT	0040	/* report events with this fault */ | 
 | 366 | #define QUAL_READ	0100	/* dump data read on this file descriptor */ | 
 | 367 | #define QUAL_WRITE	0200	/* dump data written to this file descriptor */ | 
 | 368 |  | 
 | 369 | #define entering(tcp)	(!((tcp)->flags & TCB_INSYSCALL)) | 
 | 370 | #define exiting(tcp)	((tcp)->flags & TCB_INSYSCALL) | 
 | 371 | #define syserror(tcp)	((tcp)->u_error != 0) | 
 | 372 | #define verbose(tcp)	(qual_flags[(tcp)->scno] & QUAL_VERBOSE) | 
 | 373 | #define abbrev(tcp)	(qual_flags[(tcp)->scno] & QUAL_ABBREV) | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 374 |  | 
 | 375 | struct xlat { | 
 | 376 | 	int val; | 
 | 377 | 	char *str; | 
 | 378 | }; | 
 | 379 |  | 
 | 380 | /* Format of syscall return values */ | 
 | 381 | #define RVAL_DECIMAL	000	/* decimal format */ | 
 | 382 | #define RVAL_HEX	001	/* hex format */ | 
 | 383 | #define RVAL_OCTAL	002	/* octal format */ | 
 | 384 | #define RVAL_UDECIMAL	003	/* unsigned decimal format */ | 
| Wichert Akkerman | bf79f2e | 2000-09-01 21:03:06 +0000 | [diff] [blame] | 385 | #define RVAL_LDECIMAL	004	/* long decimal format */ | 
 | 386 | #define RVAL_LHEX	005	/* long hex format */ | 
 | 387 | #define RVAL_LOCTAL	006	/* long octal format */ | 
 | 388 | #define RVAL_LUDECIMAL	007	/* long unsigned decimal format */ | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 389 | #define RVAL_MASK	007	/* mask for these values */ | 
 | 390 |  | 
 | 391 | #define RVAL_STR	010	/* Print `auxstr' field after return val */ | 
 | 392 | #define RVAL_NONE	020	/* Print nothing */ | 
 | 393 |  | 
 | 394 | #ifndef offsetof | 
 | 395 | #define offsetof(type, member)	(((char *) &(((type *) NULL)->member)) - \ | 
 | 396 | 				 ((char *) (type *) NULL)) | 
 | 397 | #endif /* !offsetof */ | 
 | 398 |  | 
 | 399 | /* get offset of member within a user struct */ | 
 | 400 | #define uoff(member)	offsetof(struct user, member) | 
 | 401 |  | 
 | 402 | #define TRACE_FILE	001	/* Trace file-related syscalls. */ | 
 | 403 | #define TRACE_IPC	002	/* Trace IPC-related syscalls. */ | 
 | 404 | #define TRACE_NETWORK	004	/* Trace network-related syscalls. */ | 
 | 405 | #define TRACE_PROCESS	010	/* Trace process-related syscalls. */ | 
 | 406 | #define TRACE_SIGNAL	020	/* Trace signal-related syscalls. */ | 
| Roland McGrath | 2fe7b13 | 2005-07-05 03:25:35 +0000 | [diff] [blame] | 407 | #define TRACE_DESC	040	/* Trace file descriptor-related syscalls. */ | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 408 |  | 
| Roland McGrath | ee9d435 | 2002-12-18 04:16:10 +0000 | [diff] [blame] | 409 | extern struct tcb **tcbtab; | 
| Roland McGrath | 138c6a3 | 2006-01-12 09:50:49 +0000 | [diff] [blame] | 410 | extern int *qual_flags; | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 411 | extern int debug, followfork, followvfork; | 
| Dmitry V. Levin | b9fe011 | 2006-12-13 16:59:44 +0000 | [diff] [blame] | 412 | extern int dtime, cflag, xflag, qflag; | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 413 | extern int acolumn; | 
| Roland McGrath | ee9d435 | 2002-12-18 04:16:10 +0000 | [diff] [blame] | 414 | extern unsigned int nprocs, tcbtabsize; | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 415 | extern int max_strlen; | 
 | 416 | extern struct tcb *tcp_last; | 
 | 417 |  | 
 | 418 | #ifdef __STDC__ | 
 | 419 | #define P(args) args | 
 | 420 | #else | 
 | 421 | #define P(args) () | 
 | 422 | #endif | 
 | 423 |  | 
| Dmitry V. Levin | a7945a3 | 2006-12-13 17:10:11 +0000 | [diff] [blame^] | 424 | enum bitness_t { BITNESS_CURRENT = 0, BITNESS_32 }; | 
 | 425 |  | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 426 | extern int set_personality P((int personality)); | 
| Roland McGrath | d9f816f | 2004-09-04 03:39:20 +0000 | [diff] [blame] | 427 | extern char *xlookup P((const struct xlat *, int)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 428 | extern struct tcb *alloctcb P((int)); | 
| Roland McGrath | 923f750 | 2003-01-09 06:53:27 +0000 | [diff] [blame] | 429 | extern struct tcb *pid2tcb P((int)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 430 | extern void droptcb P((struct tcb *)); | 
| Roland McGrath | 7b54a7a | 2004-06-04 01:50:45 +0000 | [diff] [blame] | 431 | extern int expand_tcbtab P((void)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 432 |  | 
 | 433 | extern void set_sortby P((char *)); | 
 | 434 | extern void set_overhead P((int)); | 
 | 435 | extern void qualify P((char *)); | 
 | 436 | extern void newoutf P((struct tcb *)); | 
| Wichert Akkerman | bf79f2e | 2000-09-01 21:03:06 +0000 | [diff] [blame] | 437 | extern int get_scno P((struct tcb *)); | 
| Roland McGrath | 76989d7 | 2005-06-07 23:21:31 +0000 | [diff] [blame] | 438 | extern long known_scno P((struct tcb *)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 439 | extern int trace_syscall P((struct tcb *)); | 
| Roland McGrath | b2dee13 | 2005-06-01 19:02:36 +0000 | [diff] [blame] | 440 | extern void printxval P((const struct xlat *, int, const char *)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 441 | extern int printargs P((struct tcb *)); | 
| Roland McGrath | d9f816f | 2004-09-04 03:39:20 +0000 | [diff] [blame] | 442 | extern int addflags P((const struct xlat *, int)); | 
| Roland McGrath | b2dee13 | 2005-06-01 19:02:36 +0000 | [diff] [blame] | 443 | extern int printflags P((const struct xlat *, int, const char *)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 444 | extern int umoven P((struct tcb *, long, int, char *)); | 
 | 445 | extern int umovestr P((struct tcb *, long, int, char *)); | 
 | 446 | extern int upeek P((int, long, long *)); | 
| John Hughes | 1d08dcf | 2001-07-10 13:48:44 +0000 | [diff] [blame] | 447 | extern void dumpiov P((struct tcb *, int, long)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 448 | extern void dumpstr P((struct tcb *, long, int)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 449 | extern void printstr P((struct tcb *, long, int)); | 
 | 450 | extern void printnum P((struct tcb *, long, char *)); | 
| Roland McGrath | 9814a94 | 2005-07-04 23:28:10 +0000 | [diff] [blame] | 451 | extern void printnum_int P((struct tcb *, long, char *)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 452 | extern void printpath P((struct tcb *, long)); | 
 | 453 | extern void printpathn P((struct tcb *, long, int)); | 
| Dmitry V. Levin | a7945a3 | 2006-12-13 17:10:11 +0000 | [diff] [blame^] | 454 | extern void printtv_bitness P((struct tcb *, long, enum bitness_t)); | 
 | 455 | extern void sprinttv P((struct tcb *, long, enum bitness_t, char *)); | 
| John Hughes | 5826589 | 2001-10-18 15:13:53 +0000 | [diff] [blame] | 456 | #ifdef HAVE_SIGINFO_T | 
 | 457 | extern void printsiginfo P((siginfo_t *, int)); | 
 | 458 | #endif | 
| Wichert Akkerman | f5eeabb | 1999-11-18 17:09:47 +0000 | [diff] [blame] | 459 | extern void printsock P((struct tcb *, long, int)); | 
| John Hughes | 38ae88d | 2002-05-23 11:48:58 +0000 | [diff] [blame] | 460 | extern void print_sock_optmgmt P((struct tcb *, long, int)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 461 | extern void printrusage P((struct tcb *, long)); | 
| Roland McGrath | 6bc1220 | 2003-11-13 22:32:27 +0000 | [diff] [blame] | 462 | extern void printuid P((const char *, unsigned long)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 463 | extern int clearbpt P((struct tcb *)); | 
 | 464 | extern int setbpt P((struct tcb *)); | 
 | 465 | extern int sigishandled P((struct tcb *, int)); | 
 | 466 | extern void printcall P((struct tcb *)); | 
| Roland McGrath | ee36ce1 | 2004-09-04 03:53:10 +0000 | [diff] [blame] | 467 | extern const char *signame P((int)); | 
| Dmitry V. Levin | 95ebf5a | 2006-10-13 20:25:12 +0000 | [diff] [blame] | 468 | extern void print_sigset P((struct tcb *, long, int)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 469 | extern void printsignal P((int)); | 
 | 470 | extern void printleader P((struct tcb *)); | 
 | 471 | extern void printtrailer P((struct tcb *)); | 
 | 472 | extern void tabto P((int)); | 
 | 473 | extern void call_summary P((FILE *)); | 
| Roland McGrath | aa524c8 | 2005-06-01 19:22:06 +0000 | [diff] [blame] | 474 | extern void tprint_iov P((struct tcb *, unsigned long, unsigned long)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 475 |  | 
| Wichert Akkerman | 7a0b649 | 1999-12-23 15:08:17 +0000 | [diff] [blame] | 476 | #ifdef LINUX | 
 | 477 | extern int internal_clone P((struct tcb *)); | 
 | 478 | #endif | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 479 | extern int internal_fork P((struct tcb *)); | 
 | 480 | extern int internal_exec P((struct tcb *)); | 
| Roland McGrath | c74c0b7 | 2004-09-01 19:39:46 +0000 | [diff] [blame] | 481 | extern int internal_wait P((struct tcb *, int)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 482 | extern int internal_exit P((struct tcb *)); | 
 | 483 |  | 
| Roland McGrath | ee36ce1 | 2004-09-04 03:53:10 +0000 | [diff] [blame] | 484 | extern const struct ioctlent *ioctl_lookup P((long)); | 
 | 485 | extern const struct ioctlent *ioctl_next_match P((const struct ioctlent *)); | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 486 | extern int ioctl_decode P((struct tcb *, long, long)); | 
 | 487 | extern int term_ioctl P((struct tcb *, long, long)); | 
 | 488 | extern int sock_ioctl P((struct tcb *, long, long)); | 
 | 489 | extern int proc_ioctl P((struct tcb *, int, int)); | 
 | 490 | extern int stream_ioctl P((struct tcb *, int, int)); | 
| Roland McGrath | d83c50b | 2004-10-06 22:27:43 +0000 | [diff] [blame] | 491 | #ifdef LINUX | 
 | 492 | extern int rtc_ioctl P((struct tcb *, long, long)); | 
 | 493 | #endif | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 494 |  | 
 | 495 | extern void tv_tv P((struct timeval *, int, int)); | 
 | 496 | extern int tv_nz P((struct timeval *)); | 
 | 497 | extern int tv_cmp P((struct timeval *, struct timeval *)); | 
 | 498 | extern double tv_float P((struct timeval *)); | 
 | 499 | extern void tv_add P((struct timeval *, struct timeval *, struct timeval *)); | 
 | 500 | extern void tv_sub P((struct timeval *, struct timeval *, struct timeval *)); | 
 | 501 | extern void tv_mul P((struct timeval *, struct timeval *, int)); | 
 | 502 | extern void tv_div P((struct timeval *, struct timeval *, int)); | 
 | 503 |  | 
 | 504 | #ifdef SUNOS4 | 
 | 505 | extern int fixvfork P((struct tcb *)); | 
 | 506 | #endif | 
| Roland McGrath | 6d1a65c | 2004-07-12 07:44:08 +0000 | [diff] [blame] | 507 | #if !(defined(LINUX) && !defined(SPARC) && !defined(SPARC64) && !defined(IA64)) | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 508 | extern long getrval2 P((struct tcb *)); | 
 | 509 | #endif | 
| Wichert Akkerman | bf79f2e | 2000-09-01 21:03:06 +0000 | [diff] [blame] | 510 | #ifdef USE_PROCFS | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 511 | extern int proc_open P((struct tcb *tcp, int attaching)); | 
 | 512 | #endif | 
 | 513 |  | 
 | 514 | #define umove(pid, addr, objp)	\ | 
 | 515 | 	umoven((pid), (addr), sizeof *(objp), (char *) (objp)) | 
 | 516 |  | 
| Dmitry V. Levin | a7945a3 | 2006-12-13 17:10:11 +0000 | [diff] [blame^] | 517 | #define printtv(tcp, addr)	\ | 
 | 518 | 	printtv_bitness((tcp), (addr), BITNESS_CURRENT) | 
 | 519 |  | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 520 | #ifdef __STDC__ | 
 | 521 | #ifdef __GNUC__ | 
 | 522 | extern void tprintf(const char *fmt, ...) | 
 | 523 | 	__attribute__ ((format (printf, 1, 2))); | 
 | 524 | #else | 
 | 525 | extern void tprintf(const char *fmt, ...); | 
 | 526 | #endif | 
 | 527 | #else | 
 | 528 | extern void tprintf(); | 
 | 529 | #endif | 
 | 530 |  | 
 | 531 | #ifndef HAVE_STRERROR | 
 | 532 | const char *strerror P((int)); | 
 | 533 | #endif | 
 | 534 | #ifndef HAVE_STRSIGNAL | 
 | 535 | const char *strsignal P((int)); | 
 | 536 | #endif | 
 | 537 |  | 
 | 538 | extern int current_personality; | 
| Dmitry V. Levin | 4ebb4e3 | 2006-12-13 17:08:08 +0000 | [diff] [blame] | 539 | extern const int personality_wordsize[]; | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 540 |  | 
 | 541 | struct sysent { | 
 | 542 | 	int	nargs; | 
 | 543 | 	int	sys_flags; | 
 | 544 | 	int	(*sys_func)(); | 
| Roland McGrath | ee36ce1 | 2004-09-04 03:53:10 +0000 | [diff] [blame] | 545 | 	const char *sys_name; | 
| Roland McGrath | 76989d7 | 2005-06-07 23:21:31 +0000 | [diff] [blame] | 546 | 	long	native_scno;	/* Match against SYS_* constants.  */ | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 547 | }; | 
 | 548 |  | 
| Roland McGrath | ee36ce1 | 2004-09-04 03:53:10 +0000 | [diff] [blame] | 549 | extern const struct sysent *sysent; | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 550 | extern int nsyscalls; | 
 | 551 |  | 
| Roland McGrath | ee36ce1 | 2004-09-04 03:53:10 +0000 | [diff] [blame] | 552 | extern const char *const *errnoent; | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 553 | extern int nerrnos; | 
 | 554 |  | 
 | 555 | struct ioctlent { | 
| Roland McGrath | ee36ce1 | 2004-09-04 03:53:10 +0000 | [diff] [blame] | 556 | 	const char *doth; | 
 | 557 | 	const char *symbol; | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 558 | 	unsigned long code; | 
 | 559 | }; | 
 | 560 |  | 
| Roland McGrath | ee36ce1 | 2004-09-04 03:53:10 +0000 | [diff] [blame] | 561 | extern const struct ioctlent *ioctlent; | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 562 | extern int nioctlents; | 
| Roland McGrath | ee36ce1 | 2004-09-04 03:53:10 +0000 | [diff] [blame] | 563 |  | 
 | 564 | extern const char *const *signalent; | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 565 | extern int nsignals; | 
 | 566 |  | 
| Roland McGrath | ee36ce1 | 2004-09-04 03:53:10 +0000 | [diff] [blame] | 567 | extern const struct ioctlent ioctlent0[]; | 
 | 568 | extern const int nioctlents0; | 
 | 569 | extern const char *const signalent0[]; | 
 | 570 | extern const int nsignals0; | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 571 |  | 
 | 572 | #if SUPPORTED_PERSONALITIES >= 2 | 
| Roland McGrath | ee36ce1 | 2004-09-04 03:53:10 +0000 | [diff] [blame] | 573 | extern const struct ioctlent ioctlent1[]; | 
| Michal Ludvig | 51d1ebc | 2004-09-07 14:06:03 +0000 | [diff] [blame] | 574 | extern const int nioctlents1; | 
| Roland McGrath | ee36ce1 | 2004-09-04 03:53:10 +0000 | [diff] [blame] | 575 | extern const char *const signalent1[]; | 
 | 576 | extern const int nsignals1; | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 577 | #endif /* SUPPORTED_PERSONALITIES >= 2 */ | 
 | 578 |  | 
 | 579 | #if SUPPORTED_PERSONALITIES >= 3 | 
| Roland McGrath | ee36ce1 | 2004-09-04 03:53:10 +0000 | [diff] [blame] | 580 | extern const struct ioctlent ioctlent2[]; | 
 | 581 | extern const int nioctlents2; | 
 | 582 | extern const char *const signalent2[]; | 
| Michal Ludvig | 51d1ebc | 2004-09-07 14:06:03 +0000 | [diff] [blame] | 583 | extern const int nsignals2; | 
| Wichert Akkerman | 76baf7c | 1999-02-19 00:21:36 +0000 | [diff] [blame] | 584 | #endif /* SUPPORTED_PERSONALITIES >= 3 */ | 
| John Hughes | bdf48f5 | 2001-03-06 15:08:09 +0000 | [diff] [blame] | 585 |  | 
| Roland McGrath | e6d3a29 | 2003-01-14 09:46:18 +0000 | [diff] [blame] | 586 | #if defined(FREEBSD) || (defined(LINUX) \ | 
| Roland McGrath | c0f8bbd | 2003-08-21 09:58:00 +0000 | [diff] [blame] | 587 | 			 && defined(POWERPC) && !defined(__powerpc64__)) \ | 
 | 588 |   || (defined (LINUX) && defined (MIPS) && !defined(__mips64)) | 
| John Hughes | 5a826b8 | 2001-03-07 13:21:24 +0000 | [diff] [blame] | 589 | /* ARRGH!  off_t args are aligned on 64 bit boundaries! */ | 
 | 590 | #define ALIGN64(tcp,arg)						\ | 
 | 591 | do {									\ | 
 | 592 | 	if (arg % 2)							\ | 
 | 593 | 	    memmove (&tcp->u_arg[arg], &tcp->u_arg[arg + 1],		\ | 
 | 594 | 		     (tcp->u_nargs - arg - 1) * sizeof tcp->u_arg[0]);	\ | 
 | 595 | } while (0) | 
 | 596 | #else | 
 | 597 | #define ALIGN64(tcp,arg) do { } while (0) | 
 | 598 | #endif | 
 | 599 |  | 
| John Hughes | 0c79e01 | 2001-03-08 14:40:06 +0000 | [diff] [blame] | 600 | #if HAVE_LONG_LONG | 
| John Hughes | 5a826b8 | 2001-03-07 13:21:24 +0000 | [diff] [blame] | 601 |  | 
| John Hughes | bdf48f5 | 2001-03-06 15:08:09 +0000 | [diff] [blame] | 602 | /* _l refers to the lower numbered u_arg, | 
 | 603 |  * _h refers to the higher numbered u_arg | 
 | 604 |  */ | 
| John Hughes | 5a826b8 | 2001-03-07 13:21:24 +0000 | [diff] [blame] | 605 |  | 
| John Hughes | b8a85a4 | 2001-03-28 08:05:27 +0000 | [diff] [blame] | 606 | #if HAVE_LITTLE_ENDIAN_LONG_LONG | 
| John Hughes | 0c79e01 | 2001-03-08 14:40:06 +0000 | [diff] [blame] | 607 | #define LONG_LONG(_l,_h) \ | 
| Wichert Akkerman | 7ab47b6 | 2002-03-31 19:00:02 +0000 | [diff] [blame] | 608 |     ((long long)((unsigned long long)(unsigned)(_l) | ((unsigned long long)(_h)<<32))) | 
| John Hughes | bdf48f5 | 2001-03-06 15:08:09 +0000 | [diff] [blame] | 609 | #else | 
| John Hughes | 0c79e01 | 2001-03-08 14:40:06 +0000 | [diff] [blame] | 610 | #define LONG_LONG(_l,_h) \ | 
| Wichert Akkerman | 7ab47b6 | 2002-03-31 19:00:02 +0000 | [diff] [blame] | 611 |     ((long long)((unsigned long long)(unsigned)(_h) | ((unsigned long long)(_l)<<32))) | 
| John Hughes | bdf48f5 | 2001-03-06 15:08:09 +0000 | [diff] [blame] | 612 | #endif | 
 | 613 | #endif | 
| Wichert Akkerman | 7b3346b | 2001-10-09 23:47:38 +0000 | [diff] [blame] | 614 |  | 
 | 615 | #ifdef IA64 | 
 | 616 | extern long ia32; | 
 | 617 | #endif | 
| Michal Ludvig | 17f8fb3 | 2002-11-06 13:17:21 +0000 | [diff] [blame] | 618 |  | 
 | 619 | extern int not_failing_only; |