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) 1996-1999 Wichert Akkerman <wichert (at) cistron.nl>
      6  * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
      7  *                     Linux for s390 port by D.J. Barrow
      8  *                    <barrow_dj (at) mail.yahoo.com,djbarrow (at) de.ibm.com>
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions and the following disclaimer.
     16  * 2. Redistributions in binary form must reproduce the above copyright
     17  *    notice, this list of conditions and the following disclaimer in the
     18  *    documentation and/or other materials provided with the distribution.
     19  * 3. The name of the author may not be used to endorse or promote products
     20  *    derived from this software without specific prior written permission.
     21  *
     22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  */
     33 
     34 #include "defs.h"
     35 #include <sys/user.h>
     36 #include <sys/param.h>
     37 #include <fcntl.h>
     38 #if HAVE_SYS_UIO_H
     39 # include <sys/uio.h>
     40 #endif
     41 
     42 #if defined(IA64)
     43 # include <asm/ptrace_offsets.h>
     44 # include <asm/rse.h>
     45 #endif
     46 
     47 #ifdef HAVE_SYS_REG_H
     48 # include <sys/reg.h>
     49 #elif defined(HAVE_LINUX_PTRACE_H)
     50 # undef PTRACE_SYSCALL
     51 # ifdef HAVE_STRUCT_IA64_FPREG
     52 #  define ia64_fpreg XXX_ia64_fpreg
     53 # endif
     54 # ifdef HAVE_STRUCT_PT_ALL_USER_REGS
     55 #  define pt_all_user_regs XXX_pt_all_user_regs
     56 # endif
     57 # ifdef HAVE_STRUCT_PTRACE_PEEKSIGINFO_ARGS
     58 #  define ptrace_peeksiginfo_args XXX_ptrace_peeksiginfo_args
     59 # endif
     60 # include <linux/ptrace.h>
     61 # undef ptrace_peeksiginfo_args
     62 # undef ia64_fpreg
     63 # undef pt_all_user_regs
     64 #endif
     65 
     66 int
     67 string_to_uint(const char *str)
     68 {
     69 	char *error;
     70 	long value;
     71 
     72 	if (!*str)
     73 		return -1;
     74 	errno = 0;
     75 	value = strtol(str, &error, 10);
     76 	if (errno || *error || value < 0 || (long)(int)value != value)
     77 		return -1;
     78 	return (int)value;
     79 }
     80 
     81 int
     82 tv_nz(const struct timeval *a)
     83 {
     84 	return a->tv_sec || a->tv_usec;
     85 }
     86 
     87 int
     88 tv_cmp(const struct timeval *a, const struct timeval *b)
     89 {
     90 	if (a->tv_sec < b->tv_sec
     91 	    || (a->tv_sec == b->tv_sec && a->tv_usec < b->tv_usec))
     92 		return -1;
     93 	if (a->tv_sec > b->tv_sec
     94 	    || (a->tv_sec == b->tv_sec && a->tv_usec > b->tv_usec))
     95 		return 1;
     96 	return 0;
     97 }
     98 
     99 double
    100 tv_float(const struct timeval *tv)
    101 {
    102 	return tv->tv_sec + tv->tv_usec/1000000.0;
    103 }
    104 
    105 void
    106 tv_add(struct timeval *tv, const struct timeval *a, const struct timeval *b)
    107 {
    108 	tv->tv_sec = a->tv_sec + b->tv_sec;
    109 	tv->tv_usec = a->tv_usec + b->tv_usec;
    110 	if (tv->tv_usec >= 1000000) {
    111 		tv->tv_sec++;
    112 		tv->tv_usec -= 1000000;
    113 	}
    114 }
    115 
    116 void
    117 tv_sub(struct timeval *tv, const struct timeval *a, const struct timeval *b)
    118 {
    119 	tv->tv_sec = a->tv_sec - b->tv_sec;
    120 	tv->tv_usec = a->tv_usec - b->tv_usec;
    121 	if (((long) tv->tv_usec) < 0) {
    122 		tv->tv_sec--;
    123 		tv->tv_usec += 1000000;
    124 	}
    125 }
    126 
    127 void
    128 tv_div(struct timeval *tv, const struct timeval *a, int n)
    129 {
    130 	tv->tv_usec = (a->tv_sec % n * 1000000 + a->tv_usec + n / 2) / n;
    131 	tv->tv_sec = a->tv_sec / n + tv->tv_usec / 1000000;
    132 	tv->tv_usec %= 1000000;
    133 }
    134 
    135 void
    136 tv_mul(struct timeval *tv, const struct timeval *a, int n)
    137 {
    138 	tv->tv_usec = a->tv_usec * n;
    139 	tv->tv_sec = a->tv_sec * n + tv->tv_usec / 1000000;
    140 	tv->tv_usec %= 1000000;
    141 }
    142 
    143 const char *
    144 xlookup(const struct xlat *xlat, int val)
    145 {
    146 	for (; xlat->str != NULL; xlat++)
    147 		if (xlat->val == val)
    148 			return xlat->str;
    149 	return NULL;
    150 }
    151 
    152 #if !defined HAVE_STPCPY
    153 char *
    154 stpcpy(char *dst, const char *src)
    155 {
    156 	while ((*dst = *src++) != '\0')
    157 		dst++;
    158 	return dst;
    159 }
    160 #endif
    161 
    162 /* Find a next bit which is set.
    163  * Starts testing at cur_bit.
    164  * Returns -1 if no more bits are set.
    165  *
    166  * We never touch bytes we don't need to.
    167  * On big-endian, array is assumed to consist of
    168  * current_wordsize wide words: for example, is current_wordsize is 4,
    169  * the bytes are walked in 3,2,1,0, 7,6,5,4, 11,10,9,8 ... sequence.
    170  * On little-endian machines, word size is immaterial.
    171  */
    172 int
    173 next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits)
    174 {
    175 	const unsigned endian = 1;
    176 	int little_endian = *(char*)&endian;
    177 
    178 	const uint8_t *array = bit_array;
    179 	unsigned pos = cur_bit / 8;
    180 	unsigned pos_xor_mask = little_endian ? 0 : current_wordsize-1;
    181 
    182 	for (;;) {
    183 		uint8_t bitmask;
    184 		uint8_t cur_byte;
    185 
    186 		if (cur_bit >= size_bits)
    187 			return -1;
    188 		cur_byte = array[pos ^ pos_xor_mask];
    189 		if (cur_byte == 0) {
    190 			cur_bit = (cur_bit + 8) & (-8);
    191 			pos++;
    192 			continue;
    193 		}
    194 		bitmask = 1 << (cur_bit & 7);
    195 		for (;;) {
    196 			if (cur_byte & bitmask)
    197 				return cur_bit;
    198 			cur_bit++;
    199 			if (cur_bit >= size_bits)
    200 				return -1;
    201 			bitmask <<= 1;
    202 			/* This check *can't be* optimized out: */
    203 			if (bitmask == 0)
    204 				break;
    205 		}
    206 		pos++;
    207 	}
    208 }
    209 /*
    210  * Print entry in struct xlat table, if there.
    211  */
    212 void
    213 printxval(const struct xlat *xlat, int val, const char *dflt)
    214 {
    215 	const char *str = xlookup(xlat, val);
    216 
    217 	if (str)
    218 		tprints(str);
    219 	else
    220 		tprintf("%#x /* %s */", val, dflt);
    221 }
    222 
    223 /*
    224  * Print 64bit argument at position arg_no and return the index of the next
    225  * argument.
    226  */
    227 int
    228 printllval(struct tcb *tcp, const char *format, int arg_no, bool align)
    229 {
    230 #if SIZEOF_LONG > 4 && SIZEOF_LONG == SIZEOF_LONG_LONG
    231 # if SUPPORTED_PERSONALITIES > 1
    232 	if (current_wordsize > 4) {
    233 # endif
    234 		tprintf(format, tcp->u_arg[arg_no]);
    235 		arg_no++;
    236 # if SUPPORTED_PERSONALITIES > 1
    237 	} else {
    238 #  if defined(AARCH64) || defined(POWERPC64)
    239 		if (align) {
    240 			/* Align arg_no to the next even number. */
    241 			arg_no = (arg_no + 1) & 0xe;
    242 		}
    243 #  endif
    244 		tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]));
    245 		arg_no += 2;
    246 	}
    247 # endif /* SUPPORTED_PERSONALITIES */
    248 #elif SIZEOF_LONG > 4
    249 #  error Unsupported configuration: SIZEOF_LONG > 4 && SIZEOF_LONG_LONG > SIZEOF_LONG
    250 #elif defined LINUX_MIPSN32
    251 	tprintf(format, tcp->ext_arg[arg_no]);
    252 	arg_no++;
    253 #elif defined X32
    254 	if (current_personality == 0) {
    255 		tprintf(format, tcp->ext_arg[arg_no]);
    256 		arg_no++;
    257 	} else {
    258 		tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]));
    259 		arg_no += 2;
    260 	}
    261 #else
    262 # if defined __ARM_EABI__ || \
    263      defined LINUX_MIPSO32 || \
    264      defined POWERPC || \
    265      defined XTENSA
    266 	if (align) {
    267 		/* Align arg_no to the next even number. */
    268 		arg_no = (arg_no + 1) & 0xe;
    269 	}
    270 # endif
    271 	tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]));
    272 	arg_no += 2;
    273 #endif
    274 
    275 	return arg_no;
    276 }
    277 
    278 /*
    279  * Interpret `xlat' as an array of flags
    280  * print the entries whose bits are on in `flags'
    281  * return # of flags printed.
    282  */
    283 void
    284 addflags(const struct xlat *xlat, int flags)
    285 {
    286 	for (; xlat->str; xlat++) {
    287 		if (xlat->val && (flags & xlat->val) == xlat->val) {
    288 			tprintf("|%s", xlat->str);
    289 			flags &= ~xlat->val;
    290 		}
    291 	}
    292 	if (flags) {
    293 		tprintf("|%#x", flags);
    294 	}
    295 }
    296 
    297 /*
    298  * Interpret `xlat' as an array of flags.
    299  * Print to static string the entries whose bits are on in `flags'
    300  * Return static string.
    301  */
    302 const char *
    303 sprintflags(const char *prefix, const struct xlat *xlat, int flags)
    304 {
    305 	static char outstr[1024];
    306 	char *outptr;
    307 	int found = 0;
    308 
    309 	outptr = stpcpy(outstr, prefix);
    310 
    311 	for (; xlat->str; xlat++) {
    312 		if ((flags & xlat->val) == xlat->val) {
    313 			if (found)
    314 				*outptr++ = '|';
    315 			outptr = stpcpy(outptr, xlat->str);
    316 			found = 1;
    317 			flags &= ~xlat->val;
    318 			if (!flags)
    319 				break;
    320 		}
    321 	}
    322 	if (flags) {
    323 		if (found)
    324 			*outptr++ = '|';
    325 		outptr += sprintf(outptr, "%#x", flags);
    326 	}
    327 
    328 	return outstr;
    329 }
    330 
    331 int
    332 printflags(const struct xlat *xlat, int flags, const char *dflt)
    333 {
    334 	int n;
    335 	const char *sep;
    336 
    337 	if (flags == 0 && xlat->val == 0) {
    338 		tprints(xlat->str);
    339 		return 1;
    340 	}
    341 
    342 	sep = "";
    343 	for (n = 0; xlat->str; xlat++) {
    344 		if (xlat->val && (flags & xlat->val) == xlat->val) {
    345 			tprintf("%s%s", sep, xlat->str);
    346 			flags &= ~xlat->val;
    347 			sep = "|";
    348 			n++;
    349 		}
    350 	}
    351 
    352 	if (n) {
    353 		if (flags) {
    354 			tprintf("%s%#x", sep, flags);
    355 			n++;
    356 		}
    357 	} else {
    358 		if (flags) {
    359 			tprintf("%#x", flags);
    360 			if (dflt)
    361 				tprintf(" /* %s */", dflt);
    362 		} else {
    363 			if (dflt)
    364 				tprints("0");
    365 		}
    366 	}
    367 
    368 	return n;
    369 }
    370 
    371 void
    372 printnum(struct tcb *tcp, long addr, const char *fmt)
    373 {
    374 	long num;
    375 
    376 	if (!addr) {
    377 		tprints("NULL");
    378 		return;
    379 	}
    380 	if (umove(tcp, addr, &num) < 0) {
    381 		tprintf("%#lx", addr);
    382 		return;
    383 	}
    384 	tprints("[");
    385 	tprintf(fmt, num);
    386 	tprints("]");
    387 }
    388 
    389 void
    390 printnum_int(struct tcb *tcp, long addr, const char *fmt)
    391 {
    392 	int num;
    393 
    394 	if (!addr) {
    395 		tprints("NULL");
    396 		return;
    397 	}
    398 	if (umove(tcp, addr, &num) < 0) {
    399 		tprintf("%#lx", addr);
    400 		return;
    401 	}
    402 	tprints("[");
    403 	tprintf(fmt, num);
    404 	tprints("]");
    405 }
    406 
    407 void
    408 printfd(struct tcb *tcp, int fd)
    409 {
    410 	char path[PATH_MAX + 1];
    411 
    412 	if (show_fd_path && getfdpath(tcp, fd, path, sizeof(path)) >= 0)
    413 		tprintf("%d<%s>", fd, path);
    414 	else
    415 		tprintf("%d", fd);
    416 }
    417 
    418 void
    419 printuid(const char *text, unsigned long uid)
    420 {
    421 	tprintf((uid == -1) ? "%s%ld" : "%s%lu", text, uid);
    422 }
    423 
    424 /*
    425  * Quote string `instr' of length `size'
    426  * Write up to (3 + `size' * 4) bytes to `outstr' buffer.
    427  * If `len' is -1, treat `instr' as a NUL-terminated string
    428  * and quote at most (`size' - 1) bytes.
    429  *
    430  * Returns 0 if len == -1 and NUL was seen, 1 otherwise.
    431  * Note that if len >= 0, always returns 1.
    432  */
    433 int
    434 string_quote(const char *instr, char *outstr, long len, int size)
    435 {
    436 	const unsigned char *ustr = (const unsigned char *) instr;
    437 	char *s = outstr;
    438 	int usehex, c, i, eol;
    439 
    440 	eol = 0x100; /* this can never match a char */
    441 	if (len == -1) {
    442 		size--;
    443 		eol = '\0';
    444 	}
    445 
    446 	usehex = 0;
    447 	if (xflag > 1)
    448 		usehex = 1;
    449 	else if (xflag) {
    450 		/* Check for presence of symbol which require
    451 		   to hex-quote the whole string. */
    452 		for (i = 0; i < size; ++i) {
    453 			c = ustr[i];
    454 			/* Check for NUL-terminated string. */
    455 			if (c == eol)
    456 				break;
    457 
    458 			/* Force hex unless c is printable or whitespace */
    459 			if (c > 0x7e) {
    460 				usehex = 1;
    461 				break;
    462 			}
    463 			/* In ASCII isspace is only these chars: "\t\n\v\f\r".
    464 			 * They happen to have ASCII codes 9,10,11,12,13.
    465 			 */
    466 			if (c < ' ' && (unsigned)(c - 9) >= 5) {
    467 				usehex = 1;
    468 				break;
    469 			}
    470 		}
    471 	}
    472 
    473 	*s++ = '\"';
    474 
    475 	if (usehex) {
    476 		/* Hex-quote the whole string. */
    477 		for (i = 0; i < size; ++i) {
    478 			c = ustr[i];
    479 			/* Check for NUL-terminated string. */
    480 			if (c == eol)
    481 				goto asciz_ended;
    482 			*s++ = '\\';
    483 			*s++ = 'x';
    484 			*s++ = "0123456789abcdef"[c >> 4];
    485 			*s++ = "0123456789abcdef"[c & 0xf];
    486 		}
    487 	} else {
    488 		for (i = 0; i < size; ++i) {
    489 			c = ustr[i];
    490 			/* Check for NUL-terminated string. */
    491 			if (c == eol)
    492 				goto asciz_ended;
    493 			switch (c) {
    494 				case '\"': case '\\':
    495 					*s++ = '\\';
    496 					*s++ = c;
    497 					break;
    498 				case '\f':
    499 					*s++ = '\\';
    500 					*s++ = 'f';
    501 					break;
    502 				case '\n':
    503 					*s++ = '\\';
    504 					*s++ = 'n';
    505 					break;
    506 				case '\r':
    507 					*s++ = '\\';
    508 					*s++ = 'r';
    509 					break;
    510 				case '\t':
    511 					*s++ = '\\';
    512 					*s++ = 't';
    513 					break;
    514 				case '\v':
    515 					*s++ = '\\';
    516 					*s++ = 'v';
    517 					break;
    518 				default:
    519 					if (c >= ' ' && c <= 0x7e)
    520 						*s++ = c;
    521 					else {
    522 						/* Print \octal */
    523 						*s++ = '\\';
    524 						if (i + 1 < size
    525 						    && ustr[i + 1] >= '0'
    526 						    && ustr[i + 1] <= '9'
    527 						) {
    528 							/* Print \ooo */
    529 							*s++ = '0' + (c >> 6);
    530 							*s++ = '0' + ((c >> 3) & 0x7);
    531 						} else {
    532 							/* Print \[[o]o]o */
    533 							if ((c >> 3) != 0) {
    534 								if ((c >> 6) != 0)
    535 									*s++ = '0' + (c >> 6);
    536 								*s++ = '0' + ((c >> 3) & 0x7);
    537 							}
    538 						}
    539 						*s++ = '0' + (c & 0x7);
    540 					}
    541 					break;
    542 			}
    543 		}
    544 	}
    545 
    546 	*s++ = '\"';
    547 	*s = '\0';
    548 
    549 	/* Return zero if we printed entire ASCIZ string (didn't truncate it) */
    550 	if (len == -1 && ustr[i] == '\0') {
    551 		/* We didn't see NUL yet (otherwise we'd jump to 'asciz_ended')
    552 		 * but next char is NUL.
    553 		 */
    554 		return 0;
    555 	}
    556 
    557 	return 1;
    558 
    559  asciz_ended:
    560 	*s++ = '\"';
    561 	*s = '\0';
    562 	/* Return zero: we printed entire ASCIZ string (didn't truncate it) */
    563 	return 0;
    564 }
    565 
    566 /*
    567  * Print path string specified by address `addr' and length `n'.
    568  * If path length exceeds `n', append `...' to the output.
    569  */
    570 void
    571 printpathn(struct tcb *tcp, long addr, int n)
    572 {
    573 	char path[MAXPATHLEN + 1];
    574 	int nul_seen;
    575 
    576 	if (!addr) {
    577 		tprints("NULL");
    578 		return;
    579 	}
    580 
    581 	/* Cap path length to the path buffer size */
    582 	if (n > sizeof path - 1)
    583 		n = sizeof path - 1;
    584 
    585 	/* Fetch one byte more to find out whether path length > n. */
    586 	nul_seen = umovestr(tcp, addr, n + 1, path);
    587 	if (nul_seen < 0)
    588 		tprintf("%#lx", addr);
    589 	else {
    590 		char *outstr;
    591 
    592 		path[n] = '\0';
    593 		n++;
    594 		outstr = alloca(4 * n); /* 4*(n-1) + 3 for quotes and NUL */
    595 		string_quote(path, outstr, -1, n);
    596 		tprints(outstr);
    597 		if (!nul_seen)
    598 			tprints("...");
    599 	}
    600 }
    601 
    602 void
    603 printpath(struct tcb *tcp, long addr)
    604 {
    605 	/* Size must correspond to char path[] size in printpathn */
    606 	printpathn(tcp, addr, MAXPATHLEN);
    607 }
    608 
    609 /*
    610  * Print string specified by address `addr' and length `len'.
    611  * If `len' < 0, treat the string as a NUL-terminated string.
    612  * If string length exceeds `max_strlen', append `...' to the output.
    613  */
    614 void
    615 printstr(struct tcb *tcp, long addr, long len)
    616 {
    617 	static char *str = NULL;
    618 	static char *outstr;
    619 	int size;
    620 	int ellipsis;
    621 
    622 	if (!addr) {
    623 		tprints("NULL");
    624 		return;
    625 	}
    626 	/* Allocate static buffers if they are not allocated yet. */
    627 	if (!str) {
    628 		unsigned int outstr_size = 4 * max_strlen + /*for quotes and NUL:*/ 3;
    629 
    630 		if (outstr_size / 4 != max_strlen)
    631 			die_out_of_memory();
    632 		str = malloc(max_strlen + 1);
    633 		if (!str)
    634 			die_out_of_memory();
    635 		outstr = malloc(outstr_size);
    636 		if (!outstr)
    637 			die_out_of_memory();
    638 	}
    639 
    640 	if (len == -1) {
    641 		/*
    642 		 * Treat as a NUL-terminated string: fetch one byte more
    643 		 * because string_quote() quotes one byte less.
    644 		 */
    645 		size = max_strlen + 1;
    646 		if (umovestr(tcp, addr, size, str) < 0) {
    647 			tprintf("%#lx", addr);
    648 			return;
    649 		}
    650 	}
    651 	else {
    652 		size = max_strlen;
    653 		if (size > (unsigned long)len)
    654 			size = (unsigned long)len;
    655 		if (umoven(tcp, addr, size, str) < 0) {
    656 			tprintf("%#lx", addr);
    657 			return;
    658 		}
    659 	}
    660 
    661 	/* If string_quote didn't see NUL and (it was supposed to be ASCIZ str
    662 	 * or we were requested to print more than -s NUM chars)...
    663 	 */
    664 	ellipsis = (string_quote(str, outstr, len, size) &&
    665 			(len < 0 || len > max_strlen));
    666 
    667 	tprints(outstr);
    668 	if (ellipsis)
    669 		tprints("...");
    670 }
    671 
    672 #if HAVE_SYS_UIO_H
    673 void
    674 dumpiov(struct tcb *tcp, int len, long addr)
    675 {
    676 #if SUPPORTED_PERSONALITIES > 1
    677 	union {
    678 		struct { u_int32_t base; u_int32_t len; } *iov32;
    679 		struct { u_int64_t base; u_int64_t len; } *iov64;
    680 	} iovu;
    681 #define iov iovu.iov64
    682 #define sizeof_iov \
    683 	(current_wordsize == 4 ? sizeof(*iovu.iov32) : sizeof(*iovu.iov64))
    684 #define iov_iov_base(i) \
    685 	(current_wordsize == 4 ? (uint64_t) iovu.iov32[i].base : iovu.iov64[i].base)
    686 #define iov_iov_len(i) \
    687 	(current_wordsize == 4 ? (uint64_t) iovu.iov32[i].len : iovu.iov64[i].len)
    688 #else
    689 	struct iovec *iov;
    690 #define sizeof_iov sizeof(*iov)
    691 #define iov_iov_base(i) iov[i].iov_base
    692 #define iov_iov_len(i) iov[i].iov_len
    693 #endif
    694 	int i;
    695 	unsigned size;
    696 
    697 	size = sizeof_iov * len;
    698 	/* Assuming no sane program has millions of iovs */
    699 	if ((unsigned)len > 1024*1024 /* insane or negative size? */
    700 	    || (iov = malloc(size)) == NULL) {
    701 		fprintf(stderr, "Out of memory\n");
    702 		return;
    703 	}
    704 	if (umoven(tcp, addr, size, (char *) iov) >= 0) {
    705 		for (i = 0; i < len; i++) {
    706 			/* include the buffer number to make it easy to
    707 			 * match up the trace with the source */
    708 			tprintf(" * %lu bytes in buffer %d\n",
    709 				(unsigned long)iov_iov_len(i), i);
    710 			dumpstr(tcp, (long) iov_iov_base(i),
    711 				iov_iov_len(i));
    712 		}
    713 	}
    714 	free(iov);
    715 #undef sizeof_iov
    716 #undef iov_iov_base
    717 #undef iov_iov_len
    718 #undef iov
    719 }
    720 #endif
    721 
    722 void
    723 dumpstr(struct tcb *tcp, long addr, int len)
    724 {
    725 	static int strsize = -1;
    726 	static unsigned char *str;
    727 
    728 	char outbuf[
    729 		(
    730 			(sizeof(
    731 			"xx xx xx xx xx xx xx xx  xx xx xx xx xx xx xx xx  "
    732 			"1234567890123456") + /*in case I'm off by few:*/ 4)
    733 		/*align to 8 to make memset easier:*/ + 7) & -8
    734 	];
    735 	const unsigned char *src;
    736 	int i;
    737 
    738 	memset(outbuf, ' ', sizeof(outbuf));
    739 
    740 	if (strsize < len + 16) {
    741 		free(str);
    742 		str = malloc(len + 16);
    743 		if (!str) {
    744 			strsize = -1;
    745 			fprintf(stderr, "Out of memory\n");
    746 			return;
    747 		}
    748 		strsize = len + 16;
    749 	}
    750 
    751 	if (umoven(tcp, addr, len, (char *) str) < 0)
    752 		return;
    753 
    754 	/* Space-pad to 16 bytes */
    755 	i = len;
    756 	while (i & 0xf)
    757 		str[i++] = ' ';
    758 
    759 	i = 0;
    760 	src = str;
    761 	while (i < len) {
    762 		char *dst = outbuf;
    763 		/* Hex dump */
    764 		do {
    765 			if (i < len) {
    766 				*dst++ = "0123456789abcdef"[*src >> 4];
    767 				*dst++ = "0123456789abcdef"[*src & 0xf];
    768 			}
    769 			else {
    770 				*dst++ = ' ';
    771 				*dst++ = ' ';
    772 			}
    773 			dst++; /* space is there by memset */
    774 			i++;
    775 			if ((i & 7) == 0)
    776 				dst++; /* space is there by memset */
    777 			src++;
    778 		} while (i & 0xf);
    779 		/* ASCII dump */
    780 		i -= 16;
    781 		src -= 16;
    782 		do {
    783 			if (*src >= ' ' && *src < 0x7f)
    784 				*dst++ = *src;
    785 			else
    786 				*dst++ = '.';
    787 			src++;
    788 		} while (++i & 0xf);
    789 		*dst = '\0';
    790 		tprintf(" | %05x  %s |\n", i - 16, outbuf);
    791 	}
    792 }
    793 
    794 #ifdef HAVE_PROCESS_VM_READV
    795 /* C library supports this, but the kernel might not. */
    796 static bool process_vm_readv_not_supported = 0;
    797 #else
    798 
    799 /* Need to do this since process_vm_readv() is not yet available in libc.
    800  * When libc is be updated, only "static bool process_vm_readv_not_supported"
    801  * line should remain.
    802  */
    803 #if !defined(__NR_process_vm_readv)
    804 # if defined(I386)
    805 #  define __NR_process_vm_readv  347
    806 # elif defined(X86_64)
    807 #  define __NR_process_vm_readv  310
    808 # elif defined(POWERPC)
    809 #  define __NR_process_vm_readv  351
    810 # endif
    811 #endif
    812 
    813 #if defined(__NR_process_vm_readv)
    814 static bool process_vm_readv_not_supported = 0;
    815 /* Have to avoid duplicating with the C library headers. */
    816 static ssize_t strace_process_vm_readv(pid_t pid,
    817 		 const struct iovec *lvec,
    818 		 unsigned long liovcnt,
    819 		 const struct iovec *rvec,
    820 		 unsigned long riovcnt,
    821 		 unsigned long flags)
    822 {
    823 	return syscall(__NR_process_vm_readv, (long)pid, lvec, liovcnt, rvec, riovcnt, flags);
    824 }
    825 #define process_vm_readv strace_process_vm_readv
    826 #else
    827 static bool process_vm_readv_not_supported = 1;
    828 # define process_vm_readv(...) (errno = ENOSYS, -1)
    829 #endif
    830 
    831 #endif /* end of hack */
    832 
    833 #define PAGMASK	(~(PAGSIZ - 1))
    834 /*
    835  * move `len' bytes of data from process `pid'
    836  * at address `addr' to our space at `laddr'
    837  */
    838 int
    839 umoven(struct tcb *tcp, long addr, int len, char *laddr)
    840 {
    841 	int pid = tcp->pid;
    842 	int n, m, nread;
    843 	union {
    844 		long val;
    845 		char x[sizeof(long)];
    846 	} u;
    847 
    848 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
    849 	if (current_wordsize < sizeof(addr))
    850 		addr &= (1ul << 8 * current_wordsize) - 1;
    851 #endif
    852 
    853 	if (!process_vm_readv_not_supported) {
    854 		struct iovec local[1], remote[1];
    855 		int r;
    856 
    857 		local[0].iov_base = laddr;
    858 		remote[0].iov_base = (void*)addr;
    859 		local[0].iov_len = remote[0].iov_len = len;
    860 		r = process_vm_readv(pid, local, 1, remote, 1, 0);
    861 		if (r == len)
    862 			return 0;
    863 		if (r >= 0) {
    864 			error_msg("umoven: short read (%d < %d) @0x%lx",
    865 				  r, len, addr);
    866 			return -1;
    867 		}
    868 		switch (errno) {
    869 			case ENOSYS:
    870 				process_vm_readv_not_supported = 1;
    871 				break;
    872 			case ESRCH:
    873 				/* the process is gone */
    874 				return -1;
    875 			case EFAULT: case EIO: case EPERM:
    876 				/* address space is inaccessible */
    877 				return -1;
    878 			default:
    879 				/* all the rest is strange and should be reported */
    880 				perror_msg("process_vm_readv");
    881 				return -1;
    882 		}
    883 	}
    884 
    885 	nread = 0;
    886 	if (addr & (sizeof(long) - 1)) {
    887 		/* addr not a multiple of sizeof(long) */
    888 		n = addr - (addr & -sizeof(long)); /* residue */
    889 		addr &= -sizeof(long); /* residue */
    890 		errno = 0;
    891 		u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);
    892 		switch (errno) {
    893 			case 0:
    894 				break;
    895 			case ESRCH: case EINVAL:
    896 				/* these could be seen if the process is gone */
    897 				return -1;
    898 			case EFAULT: case EIO: case EPERM:
    899 				/* address space is inaccessible */
    900 				return -1;
    901 			default:
    902 				/* all the rest is strange and should be reported */
    903 				perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%lx",
    904 					    pid, addr);
    905 				return -1;
    906 		}
    907 		m = MIN(sizeof(long) - n, len);
    908 		memcpy(laddr, &u.x[n], m);
    909 		addr += sizeof(long);
    910 		laddr += m;
    911 		nread += m;
    912 		len -= m;
    913 	}
    914 	while (len) {
    915 		errno = 0;
    916 		u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);
    917 		switch (errno) {
    918 			case 0:
    919 				break;
    920 			case ESRCH: case EINVAL:
    921 				/* these could be seen if the process is gone */
    922 				return -1;
    923 			case EFAULT: case EIO: case EPERM:
    924 				/* address space is inaccessible */
    925 				if (nread) {
    926 					perror_msg("umoven: short read (%d < %d) @0x%lx",
    927 						   nread, nread + len, addr - nread);
    928 				}
    929 				return -1;
    930 			default:
    931 				/* all the rest is strange and should be reported */
    932 				perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%lx",
    933 					    pid, addr);
    934 				return -1;
    935 		}
    936 		m = MIN(sizeof(long), len);
    937 		memcpy(laddr, u.x, m);
    938 		addr += sizeof(long);
    939 		laddr += m;
    940 		nread += m;
    941 		len -= m;
    942 	}
    943 
    944 	return 0;
    945 }
    946 
    947 /*
    948  * Like `umove' but make the additional effort of looking
    949  * for a terminating zero byte.
    950  *
    951  * Returns < 0 on error, > 0 if NUL was seen,
    952  * (TODO if useful: return count of bytes including NUL),
    953  * else 0 if len bytes were read but no NUL byte seen.
    954  *
    955  * Note: there is no guarantee we won't overwrite some bytes
    956  * in laddr[] _after_ terminating NUL (but, of course,
    957  * we never write past laddr[len-1]).
    958  */
    959 int
    960 umovestr(struct tcb *tcp, long addr, int len, char *laddr)
    961 {
    962 #if SIZEOF_LONG == 4
    963 	const unsigned long x01010101 = 0x01010101ul;
    964 	const unsigned long x80808080 = 0x80808080ul;
    965 #elif SIZEOF_LONG == 8
    966 	const unsigned long x01010101 = 0x0101010101010101ul;
    967 	const unsigned long x80808080 = 0x8080808080808080ul;
    968 #else
    969 # error SIZEOF_LONG > 8
    970 #endif
    971 
    972 	int pid = tcp->pid;
    973 	int n, m, nread;
    974 	union {
    975 		unsigned long val;
    976 		char x[sizeof(long)];
    977 	} u;
    978 
    979 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
    980 	if (current_wordsize < sizeof(addr))
    981 		addr &= (1ul << 8 * current_wordsize) - 1;
    982 #endif
    983 
    984 	nread = 0;
    985 	if (!process_vm_readv_not_supported) {
    986 		struct iovec local[1], remote[1];
    987 
    988 		local[0].iov_base = laddr;
    989 		remote[0].iov_base = (void*)addr;
    990 
    991 		while (len > 0) {
    992 			int end_in_page;
    993 			int r;
    994 			int chunk_len;
    995 
    996 			/* Don't read kilobytes: most strings are short */
    997 			chunk_len = len;
    998 			if (chunk_len > 256)
    999 				chunk_len = 256;
   1000 			/* Don't cross pages. I guess otherwise we can get EFAULT
   1001 			 * and fail to notice that terminating NUL lies
   1002 			 * in the existing (first) page.
   1003 			 * (I hope there aren't arches with pages < 4K)
   1004 			 */
   1005 			end_in_page = ((addr + chunk_len) & 4095);
   1006 			r = chunk_len - end_in_page;
   1007 			if (r > 0) /* if chunk_len > end_in_page */
   1008 				chunk_len = r; /* chunk_len -= end_in_page */
   1009 
   1010 			local[0].iov_len = remote[0].iov_len = chunk_len;
   1011 			r = process_vm_readv(pid, local, 1, remote, 1, 0);
   1012 			if (r > 0) {
   1013 				if (memchr(local[0].iov_base, '\0', r))
   1014 					return 1;
   1015 				local[0].iov_base += r;
   1016 				remote[0].iov_base += r;
   1017 				len -= r;
   1018 				nread += r;
   1019 				continue;
   1020 			}
   1021 			switch (errno) {
   1022 				case ENOSYS:
   1023 					process_vm_readv_not_supported = 1;
   1024 					goto vm_readv_didnt_work;
   1025 				case ESRCH:
   1026 					/* the process is gone */
   1027 					return -1;
   1028 				case EFAULT: case EIO: case EPERM:
   1029 					/* address space is inaccessible */
   1030 					if (nread) {
   1031 						perror_msg("umovestr: short read (%d < %d) @0x%lx",
   1032 							   nread, nread + len, addr);
   1033 					}
   1034 					return -1;
   1035 				default:
   1036 					/* all the rest is strange and should be reported */
   1037 					perror_msg("process_vm_readv");
   1038 					return -1;
   1039 			}
   1040 		}
   1041 		return 0;
   1042 	}
   1043  vm_readv_didnt_work:
   1044 
   1045 	if (addr & (sizeof(long) - 1)) {
   1046 		/* addr not a multiple of sizeof(long) */
   1047 		n = addr - (addr & -sizeof(long)); /* residue */
   1048 		addr &= -sizeof(long); /* residue */
   1049 		errno = 0;
   1050 		u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);
   1051 		switch (errno) {
   1052 			case 0:
   1053 				break;
   1054 			case ESRCH: case EINVAL:
   1055 				/* these could be seen if the process is gone */
   1056 				return -1;
   1057 			case EFAULT: case EIO: case EPERM:
   1058 				/* address space is inaccessible */
   1059 				return -1;
   1060 			default:
   1061 				/* all the rest is strange and should be reported */
   1062 				perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%lx",
   1063 					    pid, addr);
   1064 				return -1;
   1065 		}
   1066 		m = MIN(sizeof(long) - n, len);
   1067 		memcpy(laddr, &u.x[n], m);
   1068 		while (n & (sizeof(long) - 1))
   1069 			if (u.x[n++] == '\0')
   1070 				return 1;
   1071 		addr += sizeof(long);
   1072 		laddr += m;
   1073 		nread += m;
   1074 		len -= m;
   1075 	}
   1076 
   1077 	while (len) {
   1078 		errno = 0;
   1079 		u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);
   1080 		switch (errno) {
   1081 			case 0:
   1082 				break;
   1083 			case ESRCH: case EINVAL:
   1084 				/* these could be seen if the process is gone */
   1085 				return -1;
   1086 			case EFAULT: case EIO: case EPERM:
   1087 				/* address space is inaccessible */
   1088 				if (nread) {
   1089 					perror_msg("umovestr: short read (%d < %d) @0x%lx",
   1090 						   nread, nread + len, addr - nread);
   1091 				}
   1092 				return -1;
   1093 			default:
   1094 				/* all the rest is strange and should be reported */
   1095 				perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%lx",
   1096 					   pid, addr);
   1097 				return -1;
   1098 		}
   1099 		m = MIN(sizeof(long), len);
   1100 		memcpy(laddr, u.x, m);
   1101 		/* "If a NUL char exists in this word" */
   1102 		if ((u.val - x01010101) & ~u.val & x80808080)
   1103 			return 1;
   1104 		addr += sizeof(long);
   1105 		laddr += m;
   1106 		nread += m;
   1107 		len -= m;
   1108 	}
   1109 	return 0;
   1110 }
   1111 
   1112 int
   1113 upeek(int pid, long off, long *res)
   1114 {
   1115 	long val;
   1116 
   1117 	errno = 0;
   1118 	val = ptrace(PTRACE_PEEKUSER, (pid_t)pid, (char *) off, 0);
   1119 	if (val == -1 && errno) {
   1120 		if (errno != ESRCH) {
   1121 			perror_msg("upeek: PTRACE_PEEKUSER pid:%d @0x%lx)", pid, off);
   1122 		}
   1123 		return -1;
   1124 	}
   1125 	*res = val;
   1126 	return 0;
   1127 }
   1128 
   1129 /* Note! On new kernels (about 2.5.46+), we use PTRACE_O_TRACECLONE
   1130  * and PTRACE_O_TRACE[V]FORK for tracing children.
   1131  * If you are adding a new arch which is only supported by newer kernels,
   1132  * you most likely don't need to add any code below
   1133  * beside a dummy "return 0" block in change_syscall().
   1134  */
   1135 
   1136 /*
   1137  * These #if's are huge, please indent them correctly.
   1138  * It's easy to get confused otherwise.
   1139  */
   1140 
   1141 #include "syscall.h"
   1142 
   1143 #ifndef CLONE_PTRACE
   1144 # define CLONE_PTRACE    0x00002000
   1145 #endif
   1146 #ifndef CLONE_VFORK
   1147 # define CLONE_VFORK     0x00004000
   1148 #endif
   1149 #ifndef CLONE_VM
   1150 # define CLONE_VM        0x00000100
   1151 #endif
   1152 
   1153 #ifdef IA64
   1154 
   1155 typedef unsigned long *arg_setup_state;
   1156 
   1157 static int
   1158 arg_setup(struct tcb *tcp, arg_setup_state *state)
   1159 {
   1160 	unsigned long cfm, sof, sol;
   1161 	long bsp;
   1162 
   1163 	if (ia64_ia32mode) {
   1164 		/* Satisfy a false GCC warning.  */
   1165 		*state = NULL;
   1166 		return 0;
   1167 	}
   1168 
   1169 	if (upeek(tcp->pid, PT_AR_BSP, &bsp) < 0)
   1170 		return -1;
   1171 	if (upeek(tcp->pid, PT_CFM, (long *) &cfm) < 0)
   1172 		return -1;
   1173 
   1174 	sof = (cfm >> 0) & 0x7f;
   1175 	sol = (cfm >> 7) & 0x7f;
   1176 	bsp = (long) ia64_rse_skip_regs((unsigned long *) bsp, -sof + sol);
   1177 
   1178 	*state = (unsigned long *) bsp;
   1179 	return 0;
   1180 }
   1181 
   1182 # define arg_finish_change(tcp, state)	0
   1183 
   1184 static int
   1185 get_arg0(struct tcb *tcp, arg_setup_state *state, long *valp)
   1186 {
   1187 	int ret;
   1188 
   1189 	if (ia64_ia32mode)
   1190 		ret = upeek(tcp->pid, PT_R11, valp);
   1191 	else
   1192 		ret = umoven(tcp,
   1193 			      (unsigned long) ia64_rse_skip_regs(*state, 0),
   1194 			      sizeof(long), (void *) valp);
   1195 	return ret;
   1196 }
   1197 
   1198 static int
   1199 get_arg1(struct tcb *tcp, arg_setup_state *state, long *valp)
   1200 {
   1201 	int ret;
   1202 
   1203 	if (ia64_ia32mode)
   1204 		ret = upeek(tcp->pid, PT_R9, valp);
   1205 	else
   1206 		ret = umoven(tcp,
   1207 			      (unsigned long) ia64_rse_skip_regs(*state, 1),
   1208 			      sizeof(long), (void *) valp);
   1209 	return ret;
   1210 }
   1211 
   1212 static int
   1213 set_arg0(struct tcb *tcp, arg_setup_state *state, long val)
   1214 {
   1215 	int req = PTRACE_POKEDATA;
   1216 	void *ap;
   1217 
   1218 	if (ia64_ia32mode) {
   1219 		ap = (void *) (intptr_t) PT_R11;	 /* r11 == EBX */
   1220 		req = PTRACE_POKEUSER;
   1221 	} else
   1222 		ap = ia64_rse_skip_regs(*state, 0);
   1223 	errno = 0;
   1224 	ptrace(req, tcp->pid, ap, val);
   1225 	return errno ? -1 : 0;
   1226 }
   1227 
   1228 static int
   1229 set_arg1(struct tcb *tcp, arg_setup_state *state, long val)
   1230 {
   1231 	int req = PTRACE_POKEDATA;
   1232 	void *ap;
   1233 
   1234 	if (ia64_ia32mode) {
   1235 		ap = (void *) (intptr_t) PT_R9;		/* r9 == ECX */
   1236 		req = PTRACE_POKEUSER;
   1237 	} else
   1238 		ap = ia64_rse_skip_regs(*state, 1);
   1239 	errno = 0;
   1240 	ptrace(req, tcp->pid, ap, val);
   1241 	return errno ? -1 : 0;
   1242 }
   1243 
   1244 /* ia64 does not return the input arguments from functions (and syscalls)
   1245    according to ia64 RSE (Register Stack Engine) behavior.  */
   1246 
   1247 # define restore_arg0(tcp, state, val) ((void) (state), 0)
   1248 # define restore_arg1(tcp, state, val) ((void) (state), 0)
   1249 
   1250 #elif defined(SPARC) || defined(SPARC64)
   1251 
   1252 # if defined(SPARC64)
   1253 #  undef PTRACE_GETREGS
   1254 #  define PTRACE_GETREGS PTRACE_GETREGS64
   1255 #  undef PTRACE_SETREGS
   1256 #  define PTRACE_SETREGS PTRACE_SETREGS64
   1257 # endif
   1258 
   1259 typedef struct pt_regs arg_setup_state;
   1260 
   1261 # define arg_setup(tcp, state) \
   1262     (ptrace(PTRACE_GETREGS, (tcp)->pid, (char *) (state), 0))
   1263 # define arg_finish_change(tcp, state) \
   1264     (ptrace(PTRACE_SETREGS, (tcp)->pid, (char *) (state), 0))
   1265 
   1266 # define get_arg0(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O0], 0)
   1267 # define get_arg1(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O1], 0)
   1268 # define set_arg0(tcp, state, val)  ((state)->u_regs[U_REG_O0] = (val), 0)
   1269 # define set_arg1(tcp, state, val)  ((state)->u_regs[U_REG_O1] = (val), 0)
   1270 # define restore_arg0(tcp, state, val) 0
   1271 
   1272 #else /* other architectures */
   1273 
   1274 # if defined S390 || defined S390X
   1275 /* Note: this is only true for the `clone' system call, which handles
   1276    arguments specially.  We could as well say that its first two arguments
   1277    are swapped relative to other architectures, but that would just be
   1278    another #ifdef in the calls.  */
   1279 #  define arg0_offset	PT_GPR3
   1280 #  define arg1_offset	PT_ORIGGPR2
   1281 #  define restore_arg0(tcp, state, val) ((void) (state), 0)
   1282 #  define restore_arg1(tcp, state, val) ((void) (state), 0)
   1283 #  define arg0_index	1
   1284 #  define arg1_index	0
   1285 # elif defined(ALPHA) || defined(MIPS)
   1286 #  define arg0_offset	REG_A0
   1287 #  define arg1_offset	(REG_A0+1)
   1288 # elif defined(POWERPC)
   1289 #  define arg0_offset	(sizeof(unsigned long)*PT_R3)
   1290 #  define arg1_offset	(sizeof(unsigned long)*PT_R4)
   1291 #  define restore_arg0(tcp, state, val) ((void) (state), 0)
   1292 # elif defined(HPPA)
   1293 #  define arg0_offset	PT_GR26
   1294 #  define arg1_offset	(PT_GR26-4)
   1295 # elif defined(X86_64) || defined(X32)
   1296 #  define arg0_offset	((long)(8*(current_personality ? RBX : RDI)))
   1297 #  define arg1_offset	((long)(8*(current_personality ? RCX : RSI)))
   1298 # elif defined(SH)
   1299 #  define arg0_offset	(4*(REG_REG0+4))
   1300 #  define arg1_offset	(4*(REG_REG0+5))
   1301 # elif defined(SH64)
   1302    /* ABI defines arg0 & 1 in r2 & r3 */
   1303 #  define arg0_offset	(REG_OFFSET+16)
   1304 #  define arg1_offset	(REG_OFFSET+24)
   1305 #  define restore_arg0(tcp, state, val) 0
   1306 # elif defined CRISV10 || defined CRISV32
   1307 #  define arg0_offset	(4*PT_R11)
   1308 #  define arg1_offset	(4*PT_ORIG_R10)
   1309 #  define restore_arg0(tcp, state, val) 0
   1310 #  define restore_arg1(tcp, state, val) 0
   1311 #  define arg0_index	1
   1312 #  define arg1_index	0
   1313 # else
   1314 #  define arg0_offset	0
   1315 #  define arg1_offset	4
   1316 #  if defined ARM
   1317 #   define restore_arg0(tcp, state, val) 0
   1318 #  endif
   1319 # endif
   1320 
   1321 typedef int arg_setup_state;
   1322 
   1323 # define arg_setup(tcp, state)         (0)
   1324 # define arg_finish_change(tcp, state) 0
   1325 # define get_arg0(tcp, cookie, valp)   (upeek((tcp)->pid, arg0_offset, (valp)))
   1326 # define get_arg1(tcp, cookie, valp)   (upeek((tcp)->pid, arg1_offset, (valp)))
   1327 
   1328 static int
   1329 set_arg0(struct tcb *tcp, void *cookie, long val)
   1330 {
   1331 	return ptrace(PTRACE_POKEUSER, tcp->pid, (char*)arg0_offset, val);
   1332 }
   1333 
   1334 static int
   1335 set_arg1(struct tcb *tcp, void *cookie, long val)
   1336 {
   1337 	return ptrace(PTRACE_POKEUSER, tcp->pid, (char*)arg1_offset, val);
   1338 }
   1339 
   1340 #endif /* architectures */
   1341 
   1342 #ifndef restore_arg0
   1343 # define restore_arg0(tcp, state, val) set_arg0((tcp), (state), (val))
   1344 #endif
   1345 #ifndef restore_arg1
   1346 # define restore_arg1(tcp, state, val) set_arg1((tcp), (state), (val))
   1347 #endif
   1348 
   1349 #ifndef arg0_index
   1350 # define arg0_index 0
   1351 # define arg1_index 1
   1352 #endif
   1353 
   1354 static int
   1355 change_syscall(struct tcb *tcp, arg_setup_state *state, int new)
   1356 {
   1357 #if defined(I386)
   1358 	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
   1359 		return -1;
   1360 	return 0;
   1361 #elif defined(X86_64)
   1362 	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
   1363 		return -1;
   1364 	return 0;
   1365 #elif defined(X32)
   1366 	/* setbpt/clearbpt never used: */
   1367 	/* X32 is only supported since about linux-3.0.30 */
   1368 #elif defined(POWERPC)
   1369 	if (ptrace(PTRACE_POKEUSER, tcp->pid,
   1370 		   (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
   1371 		return -1;
   1372 	return 0;
   1373 #elif defined(S390) || defined(S390X)
   1374 	/* s390 linux after 2.4.7 has a hook in entry.S to allow this */
   1375 	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new) < 0)
   1376 		return -1;
   1377 	return 0;
   1378 #elif defined(M68K)
   1379 	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new) < 0)
   1380 		return -1;
   1381 	return 0;
   1382 #elif defined(SPARC) || defined(SPARC64)
   1383 	state->u_regs[U_REG_G1] = new;
   1384 	return 0;
   1385 #elif defined(MIPS)
   1386 	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new) < 0)
   1387 		return -1;
   1388 	return 0;
   1389 #elif defined(ALPHA)
   1390 	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new) < 0)
   1391 		return -1;
   1392 	return 0;
   1393 #elif defined(AVR32)
   1394 	/* setbpt/clearbpt never used: */
   1395 	/* AVR32 is only supported since about linux-2.6.19 */
   1396 #elif defined(BFIN)
   1397 	/* setbpt/clearbpt never used: */
   1398 	/* Blackfin is only supported since about linux-2.6.23 */
   1399 #elif defined(IA64)
   1400 	if (ia64_ia32mode) {
   1401 		switch (new) {
   1402 		case 2:
   1403 			break;	/* x86 SYS_fork */
   1404 		case SYS_clone:
   1405 			new = 120;
   1406 			break;
   1407 		default:
   1408 			fprintf(stderr, "%s: unexpected syscall %d\n",
   1409 				__FUNCTION__, new);
   1410 			return -1;
   1411 		}
   1412 		if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new) < 0)
   1413 			return -1;
   1414 	} else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new) < 0)
   1415 		return -1;
   1416 	return 0;
   1417 #elif defined(HPPA)
   1418 	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new) < 0)
   1419 		return -1;
   1420 	return 0;
   1421 #elif defined(SH)
   1422 	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new) < 0)
   1423 		return -1;
   1424 	return 0;
   1425 #elif defined(SH64)
   1426 	/* Top half of reg encodes the no. of args n as 0x1n.
   1427 	   Assume 0 args as kernel never actually checks... */
   1428 	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
   1429 				0x100000 | new) < 0)
   1430 		return -1;
   1431 	return 0;
   1432 #elif defined(CRISV10) || defined(CRISV32)
   1433 	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
   1434 		return -1;
   1435 	return 0;
   1436 #elif defined(ARM)
   1437 	/* Some kernels support this, some (pre-2.6.16 or so) don't.  */
   1438 # ifndef PTRACE_SET_SYSCALL
   1439 #  define PTRACE_SET_SYSCALL 23
   1440 # endif
   1441 	if (ptrace(PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0)
   1442 		return -1;
   1443 	return 0;
   1444 #elif defined(AARCH64)
   1445 	/* setbpt/clearbpt never used: */
   1446 	/* AARCH64 is only supported since about linux-3.0.31 */
   1447 #elif defined(TILE)
   1448 	/* setbpt/clearbpt never used: */
   1449 	/* Tilera CPUs are only supported since about linux-2.6.34 */
   1450 #elif defined(MICROBLAZE)
   1451 	/* setbpt/clearbpt never used: */
   1452 	/* microblaze is only supported since about linux-2.6.30 */
   1453 #elif defined(OR1K)
   1454 	/* never reached; OR1K is only supported by kernels since 3.1.0. */
   1455 #elif defined(METAG)
   1456 	/* setbpt/clearbpt never used: */
   1457 	/* Meta is only supported since linux-3.7 */
   1458 #elif defined(XTENSA)
   1459 	/* setbpt/clearbpt never used: */
   1460 	/* Xtensa is only supported since linux 2.6.13 */
   1461 #elif defined(ARC)
   1462 	/* setbpt/clearbpt never used: */
   1463 	/* ARC only supported since 3.9 */
   1464 #else
   1465 #warning Do not know how to handle change_syscall for this architecture
   1466 #endif /* architecture */
   1467 	return -1;
   1468 }
   1469 
   1470 int
   1471 setbpt(struct tcb *tcp)
   1472 {
   1473 	static int clone_scno[SUPPORTED_PERSONALITIES] = { SYS_clone };
   1474 	arg_setup_state state;
   1475 
   1476 	if (tcp->flags & TCB_BPTSET) {
   1477 		fprintf(stderr, "PANIC: TCB already set in pid %u\n", tcp->pid);
   1478 		return -1;
   1479 	}
   1480 
   1481 	/*
   1482 	 * It's a silly kludge to initialize this with a search at runtime.
   1483 	 * But it's better than maintaining another magic thing in the
   1484 	 * godforsaken tables.
   1485 	 */
   1486 	if (clone_scno[current_personality] == 0) {
   1487 		int i;
   1488 		for (i = 0; i < nsyscalls; ++i)
   1489 			if (sysent[i].sys_func == sys_clone) {
   1490 				clone_scno[current_personality] = i;
   1491 				break;
   1492 			}
   1493 	}
   1494 
   1495 	if (tcp->s_ent->sys_func == sys_fork) {
   1496 		if (arg_setup(tcp, &state) < 0
   1497 		    || get_arg0(tcp, &state, &tcp->inst[0]) < 0
   1498 		    || get_arg1(tcp, &state, &tcp->inst[1]) < 0
   1499 		    || change_syscall(tcp, &state,
   1500 				      clone_scno[current_personality]) < 0
   1501 		    || set_arg0(tcp, &state, CLONE_PTRACE|SIGCHLD) < 0
   1502 		    || set_arg1(tcp, &state, 0) < 0
   1503 		    || arg_finish_change(tcp, &state) < 0)
   1504 			return -1;
   1505 		tcp->u_arg[arg0_index] = CLONE_PTRACE|SIGCHLD;
   1506 		tcp->u_arg[arg1_index] = 0;
   1507 		tcp->flags |= TCB_BPTSET;
   1508 		return 0;
   1509 	}
   1510 
   1511 	if (tcp->s_ent->sys_func == sys_clone) {
   1512 		/* ia64 calls directly `clone (CLONE_VFORK | CLONE_VM)'
   1513 		   contrary to x86 vfork above.  Even on x86 we turn the
   1514 		   vfork semantics into plain fork - each application must not
   1515 		   depend on the vfork specifics according to POSIX.  We would
   1516 		   hang waiting for the parent resume otherwise.  We need to
   1517 		   clear also CLONE_VM but only in the CLONE_VFORK case as
   1518 		   otherwise we would break pthread_create.  */
   1519 
   1520 		long new_arg0 = (tcp->u_arg[arg0_index] | CLONE_PTRACE);
   1521 		if (new_arg0 & CLONE_VFORK)
   1522 			new_arg0 &= ~(unsigned long)(CLONE_VFORK | CLONE_VM);
   1523 		if (arg_setup(tcp, &state) < 0
   1524 		 || set_arg0(tcp, &state, new_arg0) < 0
   1525 		 || arg_finish_change(tcp, &state) < 0)
   1526 			return -1;
   1527 		tcp->inst[0] = tcp->u_arg[arg0_index];
   1528 		tcp->inst[1] = tcp->u_arg[arg1_index];
   1529 		tcp->flags |= TCB_BPTSET;
   1530 		return 0;
   1531 	}
   1532 
   1533 	fprintf(stderr, "PANIC: setbpt for syscall %ld on %u???\n",
   1534 		tcp->scno, tcp->pid);
   1535 	return -1;
   1536 }
   1537 
   1538 int
   1539 clearbpt(struct tcb *tcp)
   1540 {
   1541 	arg_setup_state state;
   1542 	if (arg_setup(tcp, &state) < 0
   1543 	    || change_syscall(tcp, &state, tcp->scno) < 0
   1544 	    || restore_arg0(tcp, &state, tcp->inst[0]) < 0
   1545 	    || restore_arg1(tcp, &state, tcp->inst[1]) < 0
   1546 	    || arg_finish_change(tcp, &state))
   1547 		if (errno != ESRCH)
   1548 			return -1;
   1549 	tcp->flags &= ~TCB_BPTSET;
   1550 	return 0;
   1551 }
   1552