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  * Copyright (c) 1999-2018 The strace developers.
     10  * All rights reserved.
     11  *
     12  * Redistribution and use in source and binary forms, with or without
     13  * modification, are permitted provided that the following conditions
     14  * are met:
     15  * 1. Redistributions of source code must retain the above copyright
     16  *    notice, this list of conditions and the following disclaimer.
     17  * 2. Redistributions in binary form must reproduce the above copyright
     18  *    notice, this list of conditions and the following disclaimer in the
     19  *    documentation and/or other materials provided with the distribution.
     20  * 3. The name of the author may not be used to endorse or promote products
     21  *    derived from this software without specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     24  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     25  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     26  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     28  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     29  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     30  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     31  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     32  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     33  */
     34 
     35 #include "defs.h"
     36 #include "native_defs.h"
     37 #include "ptrace.h"
     38 #include "nsig.h"
     39 #include "number_set.h"
     40 #include <limits.h>
     41 
     42 /* for struct iovec */
     43 #include <sys/uio.h>
     44 
     45 /* for __X32_SYSCALL_BIT */
     46 #include <asm/unistd.h>
     47 
     48 #include "regs.h"
     49 
     50 #if defined(SPARC64)
     51 # undef PTRACE_GETREGS
     52 # define PTRACE_GETREGS PTRACE_GETREGS64
     53 # undef PTRACE_SETREGS
     54 # define PTRACE_SETREGS PTRACE_SETREGS64
     55 #endif
     56 
     57 #ifndef NT_PRSTATUS
     58 # define NT_PRSTATUS 1
     59 #endif
     60 
     61 #include "syscall.h"
     62 #include "xstring.h"
     63 
     64 /* Define these shorthand notations to simplify the syscallent files. */
     65 #include "sysent_shorthand_defs.h"
     66 
     67 #define SEN(syscall_name) SEN_ ## syscall_name, SYS_FUNC_NAME(sys_ ## syscall_name)
     68 
     69 const struct_sysent sysent0[] = {
     70 #include "syscallent.h"
     71 };
     72 
     73 #if SUPPORTED_PERSONALITIES > 1
     74 # include PERSONALITY1_INCLUDE_FUNCS
     75 static const struct_sysent sysent1[] = {
     76 # include "syscallent1.h"
     77 };
     78 #endif
     79 
     80 #if SUPPORTED_PERSONALITIES > 2
     81 # include PERSONALITY2_INCLUDE_FUNCS
     82 static const struct_sysent sysent2[] = {
     83 # include "syscallent2.h"
     84 };
     85 #endif
     86 
     87 /* Now undef them since short defines cause wicked namespace pollution. */
     88 #include "sysent_shorthand_undefs.h"
     89 
     90 /*
     91  * `ioctlent[012].h' files are automatically generated by the auxiliary
     92  * program `ioctlsort', such that the list is sorted by the `code' field.
     93  * This has the side-effect of resolving the _IO.. macros into
     94  * plain integers, eliminating the need to include here everything
     95  * in "/usr/include".
     96  */
     97 
     98 const char *const errnoent0[] = {
     99 #include "errnoent.h"
    100 };
    101 const char *const signalent0[] = {
    102 #include "signalent.h"
    103 };
    104 const struct_ioctlent ioctlent0[] = {
    105 #include "ioctlent0.h"
    106 };
    107 
    108 #if SUPPORTED_PERSONALITIES > 1
    109 static const char *const errnoent1[] = {
    110 # include "errnoent1.h"
    111 };
    112 static const char *const signalent1[] = {
    113 # include "signalent1.h"
    114 };
    115 static const struct_ioctlent ioctlent1[] = {
    116 # include "ioctlent1.h"
    117 };
    118 # include PERSONALITY0_INCLUDE_PRINTERS_DECLS
    119 static const struct_printers printers0 = {
    120 # include PERSONALITY0_INCLUDE_PRINTERS_DEFS
    121 };
    122 # include PERSONALITY1_INCLUDE_PRINTERS_DECLS
    123 static const struct_printers printers1 = {
    124 # include PERSONALITY1_INCLUDE_PRINTERS_DEFS
    125 };
    126 #endif
    127 
    128 #if SUPPORTED_PERSONALITIES > 2
    129 static const char *const errnoent2[] = {
    130 # include "errnoent2.h"
    131 };
    132 static const char *const signalent2[] = {
    133 # include "signalent2.h"
    134 };
    135 static const struct_ioctlent ioctlent2[] = {
    136 # include "ioctlent2.h"
    137 };
    138 # include PERSONALITY2_INCLUDE_PRINTERS_DECLS
    139 static const struct_printers printers2 = {
    140 # include PERSONALITY2_INCLUDE_PRINTERS_DEFS
    141 };
    142 #endif
    143 
    144 enum {
    145 	nsyscalls0 = ARRAY_SIZE(sysent0)
    146 #if SUPPORTED_PERSONALITIES > 1
    147 	, nsyscalls1 = ARRAY_SIZE(sysent1)
    148 # if SUPPORTED_PERSONALITIES > 2
    149 	, nsyscalls2 = ARRAY_SIZE(sysent2)
    150 # endif
    151 #endif
    152 };
    153 
    154 enum {
    155 	nerrnos0 = ARRAY_SIZE(errnoent0)
    156 #if SUPPORTED_PERSONALITIES > 1
    157 	, nerrnos1 = ARRAY_SIZE(errnoent1)
    158 # if SUPPORTED_PERSONALITIES > 2
    159 	, nerrnos2 = ARRAY_SIZE(errnoent2)
    160 # endif
    161 #endif
    162 };
    163 
    164 enum {
    165 	nsignals0 = ARRAY_SIZE(signalent0)
    166 #if SUPPORTED_PERSONALITIES > 1
    167 	, nsignals1 = ARRAY_SIZE(signalent1)
    168 # if SUPPORTED_PERSONALITIES > 2
    169 	, nsignals2 = ARRAY_SIZE(signalent2)
    170 # endif
    171 #endif
    172 };
    173 
    174 enum {
    175 	nioctlents0 = ARRAY_SIZE(ioctlent0)
    176 #if SUPPORTED_PERSONALITIES > 1
    177 	, nioctlents1 = ARRAY_SIZE(ioctlent1)
    178 # if SUPPORTED_PERSONALITIES > 2
    179 	, nioctlents2 = ARRAY_SIZE(ioctlent2)
    180 # endif
    181 #endif
    182 };
    183 
    184 #if SUPPORTED_PERSONALITIES > 1
    185 const struct_sysent *sysent = sysent0;
    186 const char *const *errnoent = errnoent0;
    187 const char *const *signalent = signalent0;
    188 const struct_ioctlent *ioctlent = ioctlent0;
    189 const struct_printers *printers = &printers0;
    190 #endif
    191 
    192 unsigned nsyscalls = nsyscalls0;
    193 unsigned nerrnos = nerrnos0;
    194 unsigned nsignals = nsignals0;
    195 unsigned nioctlents = nioctlents0;
    196 
    197 const unsigned int nsyscall_vec[SUPPORTED_PERSONALITIES] = {
    198 	nsyscalls0,
    199 #if SUPPORTED_PERSONALITIES > 1
    200 	nsyscalls1,
    201 #endif
    202 #if SUPPORTED_PERSONALITIES > 2
    203 	nsyscalls2,
    204 #endif
    205 };
    206 const struct_sysent *const sysent_vec[SUPPORTED_PERSONALITIES] = {
    207 	sysent0,
    208 #if SUPPORTED_PERSONALITIES > 1
    209 	sysent1,
    210 #endif
    211 #if SUPPORTED_PERSONALITIES > 2
    212 	sysent2,
    213 #endif
    214 };
    215 
    216 const char *const personality_names[] =
    217 # if defined X86_64
    218 	{"64 bit", "32 bit", "x32"}
    219 # elif defined X32
    220 	{"x32", "32 bit"}
    221 # elif SUPPORTED_PERSONALITIES == 2
    222 	{"64 bit", "32 bit"}
    223 # else
    224 	{STRINGIFY_VAL(__WORDSIZE) " bit"}
    225 # endif
    226 	;
    227 
    228 #if SUPPORTED_PERSONALITIES > 1
    229 
    230 unsigned current_personality;
    231 
    232 # ifndef current_wordsize
    233 unsigned current_wordsize = PERSONALITY0_WORDSIZE;
    234 static const int personality_wordsize[SUPPORTED_PERSONALITIES] = {
    235 	PERSONALITY0_WORDSIZE,
    236 	PERSONALITY1_WORDSIZE,
    237 # if SUPPORTED_PERSONALITIES > 2
    238 	PERSONALITY2_WORDSIZE,
    239 # endif
    240 };
    241 # endif
    242 
    243 # ifndef current_klongsize
    244 unsigned current_klongsize = PERSONALITY0_KLONGSIZE;
    245 static const int personality_klongsize[SUPPORTED_PERSONALITIES] = {
    246 	PERSONALITY0_KLONGSIZE,
    247 	PERSONALITY1_KLONGSIZE,
    248 #  if SUPPORTED_PERSONALITIES > 2
    249 	PERSONALITY2_KLONGSIZE,
    250 #  endif
    251 };
    252 # endif
    253 
    254 void
    255 set_personality(unsigned int personality)
    256 {
    257 	if (personality == current_personality)
    258 		return;
    259 
    260 	if (personality >= SUPPORTED_PERSONALITIES)
    261 		error_msg_and_die("Requested switch to unsupported personality "
    262 				  "%u", personality);
    263 
    264 	nsyscalls = nsyscall_vec[personality];
    265 	sysent = sysent_vec[personality];
    266 
    267 	switch (personality) {
    268 	case 0:
    269 		errnoent = errnoent0;
    270 		nerrnos = nerrnos0;
    271 		ioctlent = ioctlent0;
    272 		nioctlents = nioctlents0;
    273 		signalent = signalent0;
    274 		nsignals = nsignals0;
    275 		printers = &printers0;
    276 		break;
    277 
    278 	case 1:
    279 		errnoent = errnoent1;
    280 		nerrnos = nerrnos1;
    281 		ioctlent = ioctlent1;
    282 		nioctlents = nioctlents1;
    283 		signalent = signalent1;
    284 		nsignals = nsignals1;
    285 		printers = &printers1;
    286 		break;
    287 
    288 # if SUPPORTED_PERSONALITIES > 2
    289 	case 2:
    290 		errnoent = errnoent2;
    291 		nerrnos = nerrnos2;
    292 		ioctlent = ioctlent2;
    293 		nioctlents = nioctlents2;
    294 		signalent = signalent2;
    295 		nsignals = nsignals2;
    296 		printers = &printers2;
    297 		break;
    298 # endif
    299 	}
    300 
    301 	current_personality = personality;
    302 # ifndef current_wordsize
    303 	current_wordsize = personality_wordsize[personality];
    304 # endif
    305 # ifndef current_klongsize
    306 	current_klongsize = personality_klongsize[personality];
    307 # endif
    308 }
    309 
    310 static void
    311 update_personality(struct tcb *tcp, unsigned int personality)
    312 {
    313 	static bool need_mpers_warning[] =
    314 		{ false, !HAVE_PERSONALITY_1_MPERS, !HAVE_PERSONALITY_2_MPERS };
    315 
    316 	set_personality(personality);
    317 
    318 	if (personality == tcp->currpers)
    319 		return;
    320 	tcp->currpers = personality;
    321 
    322 	if (!qflag) {
    323 		error_msg("[ Process PID=%d runs in %s mode. ]",
    324 			  tcp->pid, personality_names[personality]);
    325 	}
    326 
    327 	if (need_mpers_warning[personality]) {
    328 		error_msg("WARNING: Proper structure decoding for this "
    329 			  "personality is not supported, please consider "
    330 			  "building strace with mpers support enabled.");
    331 		need_mpers_warning[personality] = false;
    332 	}
    333 }
    334 #endif
    335 
    336 #ifdef SYS_socket_subcall
    337 static void
    338 decode_socket_subcall(struct tcb *tcp)
    339 {
    340 	const int call = tcp->u_arg[0];
    341 
    342 	if (call < 1 || call >= SYS_socket_nsubcalls)
    343 		return;
    344 
    345 	const kernel_ulong_t scno = SYS_socket_subcall + call;
    346 	const unsigned int nargs = sysent[scno].nargs;
    347 	uint64_t buf[nargs];
    348 
    349 	if (umoven(tcp, tcp->u_arg[1], nargs * current_wordsize, buf) < 0)
    350 		return;
    351 
    352 	tcp->scno = scno;
    353 	tcp->qual_flg = qual_flags(scno);
    354 	tcp->s_ent = &sysent[scno];
    355 
    356 	unsigned int i;
    357 	for (i = 0; i < nargs; ++i)
    358 		tcp->u_arg[i] = (sizeof(uint32_t) == current_wordsize)
    359 				? ((uint32_t *) (void *) buf)[i] : buf[i];
    360 }
    361 #endif /* SYS_socket_subcall */
    362 
    363 #ifdef SYS_ipc_subcall
    364 static void
    365 decode_ipc_subcall(struct tcb *tcp)
    366 {
    367 	unsigned int call = tcp->u_arg[0];
    368 	const unsigned int version = call >> 16;
    369 
    370 	if (version) {
    371 # if defined S390 || defined S390X
    372 		return;
    373 # else
    374 #  ifdef SPARC64
    375 		if (current_wordsize == 8)
    376 			return;
    377 #  endif
    378 		set_tcb_priv_ulong(tcp, version);
    379 		call &= 0xffff;
    380 # endif
    381 	}
    382 
    383 	switch (call) {
    384 		case  1: case  2: case  3: case  4:
    385 		case 11: case 12: case 13: case 14:
    386 		case 21: case 22: case 23: case 24:
    387 			break;
    388 		default:
    389 			return;
    390 	}
    391 
    392 	tcp->scno = SYS_ipc_subcall + call;
    393 	tcp->qual_flg = qual_flags(tcp->scno);
    394 	tcp->s_ent = &sysent[tcp->scno];
    395 
    396 	const unsigned int n = tcp->s_ent->nargs;
    397 	unsigned int i;
    398 	for (i = 0; i < n; i++)
    399 		tcp->u_arg[i] = tcp->u_arg[i + 1];
    400 }
    401 #endif /* SYS_ipc_subcall */
    402 
    403 #ifdef SYS_syscall_subcall
    404 static void
    405 decode_syscall_subcall(struct tcb *tcp)
    406 {
    407 	if (!scno_is_valid(tcp->u_arg[0]))
    408 		return;
    409 	tcp->scno = tcp->u_arg[0];
    410 	tcp->qual_flg = qual_flags(tcp->scno);
    411 	tcp->s_ent = &sysent[tcp->scno];
    412 	memmove(&tcp->u_arg[0], &tcp->u_arg[1],
    413 		sizeof(tcp->u_arg) - sizeof(tcp->u_arg[0]));
    414 # ifdef LINUX_MIPSO32
    415 	/*
    416 	 * Fetching the last arg of 7-arg syscalls (fadvise64_64
    417 	 * and sync_file_range) requires additional code,
    418 	 * see linux/mips/get_syscall_args.c
    419 	 */
    420 	if (tcp->s_ent->nargs == MAX_ARGS) {
    421 		if (umoven(tcp,
    422 			   mips_REG_SP + MAX_ARGS * sizeof(tcp->u_arg[0]),
    423 			   sizeof(tcp->u_arg[0]),
    424 			   &tcp->u_arg[MAX_ARGS - 1]) < 0)
    425 		tcp->u_arg[MAX_ARGS - 1] = 0;
    426 	}
    427 # endif /* LINUX_MIPSO32 */
    428 }
    429 #endif /* SYS_syscall_subcall */
    430 
    431 static void
    432 dumpio(struct tcb *tcp)
    433 {
    434 	if (syserror(tcp))
    435 		return;
    436 
    437 	int fd = tcp->u_arg[0];
    438 	if (fd < 0)
    439 		return;
    440 
    441 	if (is_number_in_set(fd, read_set)) {
    442 		switch (tcp->s_ent->sen) {
    443 		case SEN_read:
    444 		case SEN_pread:
    445 		case SEN_recv:
    446 		case SEN_recvfrom:
    447 		case SEN_mq_timedreceive:
    448 			dumpstr(tcp, tcp->u_arg[1], tcp->u_rval);
    449 			return;
    450 		case SEN_readv:
    451 		case SEN_preadv:
    452 		case SEN_preadv2:
    453 			dumpiov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1],
    454 				     tcp->u_rval);
    455 			return;
    456 		case SEN_recvmsg:
    457 			dumpiov_in_msghdr(tcp, tcp->u_arg[1], tcp->u_rval);
    458 			return;
    459 		case SEN_recvmmsg:
    460 			dumpiov_in_mmsghdr(tcp, tcp->u_arg[1]);
    461 			return;
    462 		}
    463 	}
    464 	if (is_number_in_set(fd, write_set)) {
    465 		switch (tcp->s_ent->sen) {
    466 		case SEN_write:
    467 		case SEN_pwrite:
    468 		case SEN_send:
    469 		case SEN_sendto:
    470 		case SEN_mq_timedsend:
    471 			dumpstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
    472 			break;
    473 		case SEN_writev:
    474 		case SEN_pwritev:
    475 		case SEN_pwritev2:
    476 		case SEN_vmsplice:
    477 			dumpiov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1], -1);
    478 			break;
    479 		case SEN_sendmsg:
    480 			dumpiov_in_msghdr(tcp, tcp->u_arg[1], -1);
    481 			break;
    482 		case SEN_sendmmsg:
    483 			dumpiov_in_mmsghdr(tcp, tcp->u_arg[1]);
    484 			break;
    485 		}
    486 	}
    487 }
    488 
    489 const char *
    490 err_name(unsigned long err)
    491 {
    492 	if ((err < nerrnos) && errnoent[err])
    493 		return errnoent[err];
    494 
    495 	return NULL;
    496 }
    497 
    498 static long get_regs(struct tcb *);
    499 static int get_syscall_args(struct tcb *);
    500 static int get_syscall_result(struct tcb *);
    501 static int arch_get_scno(struct tcb *tcp);
    502 static int arch_set_scno(struct tcb *, kernel_ulong_t);
    503 static void get_error(struct tcb *, const bool);
    504 static int arch_set_error(struct tcb *);
    505 static int arch_set_success(struct tcb *);
    506 
    507 struct inject_opts *inject_vec[SUPPORTED_PERSONALITIES];
    508 
    509 static struct inject_opts *
    510 tcb_inject_opts(struct tcb *tcp)
    511 {
    512 	return (scno_in_range(tcp->scno) && tcp->inject_vec[current_personality])
    513 	       ? &tcp->inject_vec[current_personality][tcp->scno] : NULL;
    514 }
    515 
    516 
    517 static long
    518 tamper_with_syscall_entering(struct tcb *tcp, unsigned int *signo)
    519 {
    520 	if (!tcp->inject_vec[current_personality]) {
    521 		tcp->inject_vec[current_personality] =
    522 			xcalloc(nsyscalls, sizeof(**inject_vec));
    523 		memcpy(tcp->inject_vec[current_personality],
    524 		       inject_vec[current_personality],
    525 		       nsyscalls * sizeof(**inject_vec));
    526 	}
    527 
    528 	struct inject_opts *opts = tcb_inject_opts(tcp);
    529 
    530 	if (!opts || opts->first == 0)
    531 		return 0;
    532 
    533 	--opts->first;
    534 
    535 	if (opts->first != 0)
    536 		return 0;
    537 
    538 	opts->first = opts->step;
    539 
    540 	if (!recovering(tcp)) {
    541 		if (opts->data.flags & INJECT_F_SIGNAL)
    542 			*signo = opts->data.signo;
    543 		if (opts->data.flags & INJECT_F_RETVAL &&
    544 		    !arch_set_scno(tcp, -1))
    545 			tcp->flags |= TCB_TAMPERED;
    546 	}
    547 
    548 	return 0;
    549 }
    550 
    551 static long
    552 tamper_with_syscall_exiting(struct tcb *tcp)
    553 {
    554 	if (!syserror(tcp)) {
    555 		error_msg("Failed to tamper with process %d: got no error "
    556 			  "(return value %#" PRI_klx ")",
    557 			  tcp->pid, tcp->u_rval);
    558 
    559 		return 1;
    560 	}
    561 
    562 	struct inject_opts *opts = tcb_inject_opts(tcp);
    563 	bool update_tcb = false;
    564 
    565 	if (!opts)
    566 		return 0;
    567 
    568 	if (opts->data.rval >= 0) {
    569 		kernel_long_t u_rval = tcp->u_rval;
    570 
    571 		tcp->u_rval = opts->data.rval;
    572 		if (arch_set_success(tcp)) {
    573 			tcp->u_rval = u_rval;
    574 		} else {
    575 			update_tcb = true;
    576 			tcp->u_error = 0;
    577 		}
    578 	} else {
    579 		unsigned long new_error = -opts->data.rval;
    580 
    581 		if (new_error != tcp->u_error && new_error <= MAX_ERRNO_VALUE) {
    582 			unsigned long u_error = tcp->u_error;
    583 
    584 			tcp->u_error = new_error;
    585 			if (arch_set_error(tcp)) {
    586 				tcp->u_error = u_error;
    587 			} else {
    588 				update_tcb = true;
    589 			}
    590 		}
    591 	}
    592 
    593 	if (update_tcb) {
    594 		tcp->u_error = 0;
    595 		get_error(tcp, !(tcp->s_ent->sys_flags & SYSCALL_NEVER_FAILS));
    596 	}
    597 
    598 	return 0;
    599 }
    600 
    601 /*
    602  * Returns:
    603  * 0: "ignore this ptrace stop", bail out silently.
    604  * 1: ok, decoded; call
    605  *    syscall_entering_finish(tcp, syscall_entering_trace(tcp, ...)).
    606  * other: error; call syscall_entering_finish(tcp, res), where res is the value
    607  *    returned.
    608  */
    609 int
    610 syscall_entering_decode(struct tcb *tcp)
    611 {
    612 	int res = get_scno(tcp);
    613 	if (res == 0)
    614 		return res;
    615 	int scno_good = res;
    616 	if (res != 1 || (res = get_syscall_args(tcp)) != 1) {
    617 		printleader(tcp);
    618 		tprintf("%s(", scno_good == 1 ? tcp->s_ent->sys_name : "????");
    619 		/*
    620 		 * " <unavailable>" will be added later by the code which
    621 		 * detects ptrace errors.
    622 		 */
    623 		return res;
    624 	}
    625 
    626 #if defined SYS_ipc_subcall	\
    627  || defined SYS_socket_subcall	\
    628  || defined SYS_syscall_subcall
    629 	for (;;) {
    630 		switch (tcp->s_ent->sen) {
    631 # ifdef SYS_ipc_subcall
    632 		case SEN_ipc:
    633 			decode_ipc_subcall(tcp);
    634 			break;
    635 # endif
    636 # ifdef SYS_socket_subcall
    637 		case SEN_socketcall:
    638 			decode_socket_subcall(tcp);
    639 			break;
    640 # endif
    641 # ifdef SYS_syscall_subcall
    642 		case SEN_syscall:
    643 			decode_syscall_subcall(tcp);
    644 			if (tcp->s_ent->sen != SEN_syscall)
    645 				continue;
    646 			break;
    647 # endif
    648 		}
    649 		break;
    650 	}
    651 #endif
    652 
    653 	return 1;
    654 }
    655 
    656 int
    657 syscall_entering_trace(struct tcb *tcp, unsigned int *sig)
    658 {
    659 	/* Restrain from fault injection while the trace executes strace code. */
    660 	if (hide_log(tcp)) {
    661 		tcp->qual_flg &= ~QUAL_INJECT;
    662 	}
    663 
    664 	switch (tcp->s_ent->sen) {
    665 		case SEN_execve:
    666 		case SEN_execveat:
    667 #if defined SPARC || defined SPARC64
    668 		case SEN_execv:
    669 #endif
    670 			tcp->flags &= ~TCB_HIDE_LOG;
    671 			break;
    672 	}
    673 
    674 	if (!traced(tcp) || (tracing_paths && !pathtrace_match(tcp))) {
    675 		tcp->flags |= TCB_FILTERED;
    676 		return 0;
    677 	}
    678 
    679 	tcp->flags &= ~TCB_FILTERED;
    680 
    681 	if (hide_log(tcp)) {
    682 		return 0;
    683 	}
    684 
    685 	if (inject(tcp))
    686 		tamper_with_syscall_entering(tcp, sig);
    687 
    688 	if (cflag == CFLAG_ONLY_STATS) {
    689 		return 0;
    690 	}
    691 
    692 #ifdef USE_LIBUNWIND
    693 	if (stack_trace_enabled) {
    694 		if (tcp->s_ent->sys_flags & STACKTRACE_CAPTURE_ON_ENTER)
    695 			unwind_capture_stacktrace(tcp);
    696 	}
    697 #endif
    698 
    699 	printleader(tcp);
    700 	tprintf("%s(", tcp->s_ent->sys_name);
    701 	int res = raw(tcp) ? printargs(tcp) : tcp->s_ent->sys_func(tcp);
    702 	fflush(tcp->outf);
    703 	return res;
    704 }
    705 
    706 void
    707 syscall_entering_finish(struct tcb *tcp, int res)
    708 {
    709 	tcp->flags |= TCB_INSYSCALL;
    710 	tcp->sys_func_rval = res;
    711 	/* Measure the entrance time as late as possible to avoid errors. */
    712 	if ((Tflag || cflag) && !filtered(tcp))
    713 		gettimeofday(&tcp->etime, NULL);
    714 }
    715 
    716 /* Returns:
    717  * 0: "bail out".
    718  * 1: ok.
    719  * -1: error in one of ptrace ops.
    720  *
    721  * If not 0, call syscall_exiting_trace(tcp, res), where res is the return
    722  *    value. Anyway, call syscall_exiting_finish(tcp) then.
    723  */
    724 int
    725 syscall_exiting_decode(struct tcb *tcp, struct timeval *ptv)
    726 {
    727 	/* Measure the exit time as early as possible to avoid errors. */
    728 	if ((Tflag || cflag) && !(filtered(tcp) || hide_log(tcp)))
    729 		gettimeofday(ptv, NULL);
    730 
    731 #ifdef USE_LIBUNWIND
    732 	if (stack_trace_enabled) {
    733 		if (tcp->s_ent->sys_flags & STACKTRACE_INVALIDATE_CACHE)
    734 			unwind_cache_invalidate(tcp);
    735 	}
    736 #endif
    737 
    738 	if (filtered(tcp) || hide_log(tcp))
    739 		return 0;
    740 
    741 #if SUPPORTED_PERSONALITIES > 1
    742 	update_personality(tcp, tcp->currpers);
    743 #endif
    744 
    745 	return get_syscall_result(tcp);
    746 }
    747 
    748 int
    749 syscall_exiting_trace(struct tcb *tcp, struct timeval tv, int res)
    750 {
    751 	if (syscall_tampered(tcp))
    752 		tamper_with_syscall_exiting(tcp);
    753 
    754 	if (cflag) {
    755 		count_syscall(tcp, &tv);
    756 		if (cflag == CFLAG_ONLY_STATS) {
    757 			return 0;
    758 		}
    759 	}
    760 
    761 	/* If not in -ff mode, and printing_tcp != tcp,
    762 	 * then the log currently does not end with output
    763 	 * of _our syscall entry_, but with something else.
    764 	 * We need to say which syscall's return is this.
    765 	 *
    766 	 * Forced reprinting via TCB_REPRINT is used only by
    767 	 * "strace -ff -oLOG test/threaded_execve" corner case.
    768 	 * It's the only case when -ff mode needs reprinting.
    769 	 */
    770 	if ((followfork < 2 && printing_tcp != tcp) || (tcp->flags & TCB_REPRINT)) {
    771 		tcp->flags &= ~TCB_REPRINT;
    772 		printleader(tcp);
    773 		tprintf("<... %s resumed> ", tcp->s_ent->sys_name);
    774 	}
    775 	printing_tcp = tcp;
    776 
    777 	tcp->s_prev_ent = NULL;
    778 	if (res != 1) {
    779 		/* There was error in one of prior ptrace ops */
    780 		tprints(") ");
    781 		tabto();
    782 		tprints("= ? <unavailable>\n");
    783 		line_ended();
    784 		return res;
    785 	}
    786 	tcp->s_prev_ent = tcp->s_ent;
    787 
    788 	int sys_res = 0;
    789 	if (raw(tcp)) {
    790 		/* sys_res = printargs(tcp); - but it's nop on sysexit */
    791 	} else {
    792 	/* FIXME: not_failing_only (IOW, option -z) is broken:
    793 	 * failure of syscall is known only after syscall return.
    794 	 * Thus we end up with something like this on, say, ENOENT:
    795 	 *     open("does_not_exist", O_RDONLY <unfinished ...>
    796 	 *     {next syscall decode}
    797 	 * whereas the intended result is that open(...) line
    798 	 * is not shown at all.
    799 	 */
    800 		if (not_failing_only && tcp->u_error)
    801 			return 0;	/* ignore failed syscalls */
    802 		if (tcp->sys_func_rval & RVAL_DECODED)
    803 			sys_res = tcp->sys_func_rval;
    804 		else
    805 			sys_res = tcp->s_ent->sys_func(tcp);
    806 	}
    807 
    808 	tprints(") ");
    809 	tabto();
    810 	unsigned long u_error = tcp->u_error;
    811 	kernel_long_t u_rval;
    812 
    813 	if (raw(tcp)) {
    814 		if (u_error) {
    815 			tprintf("= -1 (errno %lu)", u_error);
    816 		} else {
    817 			tprintf("= %#" PRI_klx, tcp->u_rval);
    818 		}
    819 		if (syscall_tampered(tcp))
    820 			tprints(" (INJECTED)");
    821 	} else if (!(sys_res & RVAL_NONE) && u_error) {
    822 		const char *u_error_str;
    823 
    824 		switch (u_error) {
    825 		/* Blocked signals do not interrupt any syscalls.
    826 		 * In this case syscalls don't return ERESTARTfoo codes.
    827 		 *
    828 		 * Deadly signals set to SIG_DFL interrupt syscalls
    829 		 * and kill the process regardless of which of the codes below
    830 		 * is returned by the interrupted syscall.
    831 		 * In some cases, kernel forces a kernel-generated deadly
    832 		 * signal to be unblocked and set to SIG_DFL (and thus cause
    833 		 * death) if it is blocked or SIG_IGNed: for example, SIGSEGV
    834 		 * or SIGILL. (The alternative is to leave process spinning
    835 		 * forever on the faulty instruction - not useful).
    836 		 *
    837 		 * SIG_IGNed signals and non-deadly signals set to SIG_DFL
    838 		 * (for example, SIGCHLD, SIGWINCH) interrupt syscalls,
    839 		 * but kernel will always restart them.
    840 		 */
    841 		case ERESTARTSYS:
    842 			/* Most common type of signal-interrupted syscall exit code.
    843 			 * The system call will be restarted with the same arguments
    844 			 * if SA_RESTART is set; otherwise, it will fail with EINTR.
    845 			 */
    846 			tprints("= ? ERESTARTSYS (To be restarted if SA_RESTART is set)");
    847 			break;
    848 		case ERESTARTNOINTR:
    849 			/* Rare. For example, fork() returns this if interrupted.
    850 			 * SA_RESTART is ignored (assumed set): the restart is unconditional.
    851 			 */
    852 			tprints("= ? ERESTARTNOINTR (To be restarted)");
    853 			break;
    854 		case ERESTARTNOHAND:
    855 			/* pause(), rt_sigsuspend() etc use this code.
    856 			 * SA_RESTART is ignored (assumed not set):
    857 			 * syscall won't restart (will return EINTR instead)
    858 			 * even after signal with SA_RESTART set. However,
    859 			 * after SIG_IGN or SIG_DFL signal it will restart
    860 			 * (thus the name "restart only if has no handler").
    861 			 */
    862 			tprints("= ? ERESTARTNOHAND (To be restarted if no handler)");
    863 			break;
    864 		case ERESTART_RESTARTBLOCK:
    865 			/* Syscalls like nanosleep(), poll() which can't be
    866 			 * restarted with their original arguments use this
    867 			 * code. Kernel will execute restart_syscall() instead,
    868 			 * which changes arguments before restarting syscall.
    869 			 * SA_RESTART is ignored (assumed not set) similarly
    870 			 * to ERESTARTNOHAND. (Kernel can't honor SA_RESTART
    871 			 * since restart data is saved in "restart block"
    872 			 * in task struct, and if signal handler uses a syscall
    873 			 * which in turn saves another such restart block,
    874 			 * old data is lost and restart becomes impossible)
    875 			 */
    876 			tprints("= ? ERESTART_RESTARTBLOCK (Interrupted by signal)");
    877 			break;
    878 		default:
    879 			u_rval = sys_res & RVAL_PRINT_ERR_VAL ?
    880 				 tcp->u_rval : -1;
    881 			u_error_str = err_name(u_error);
    882 			if (u_error_str)
    883 				tprintf("= %" PRI_kld " %s (%s)",
    884 					u_rval, u_error_str, strerror(u_error));
    885 			else
    886 				tprintf("= %" PRI_kld " %lu (%s)",
    887 					u_rval, u_error, strerror(u_error));
    888 			break;
    889 		}
    890 		if (syscall_tampered(tcp))
    891 			tprints(" (INJECTED)");
    892 		if ((sys_res & RVAL_STR) && tcp->auxstr)
    893 			tprintf(" (%s)", tcp->auxstr);
    894 	} else {
    895 		if (sys_res & RVAL_NONE)
    896 			tprints("= ?");
    897 		else {
    898 			switch (sys_res & RVAL_MASK) {
    899 			case RVAL_HEX:
    900 #if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
    901 				if (current_klongsize < sizeof(tcp->u_rval)) {
    902 					tprintf("= %#x",
    903 						(unsigned int) tcp->u_rval);
    904 				} else
    905 #endif
    906 				{
    907 					tprintf("= %#" PRI_klx, tcp->u_rval);
    908 				}
    909 				break;
    910 			case RVAL_OCTAL:
    911 				tprints("= ");
    912 				print_numeric_long_umask(tcp->u_rval);
    913 				break;
    914 			case RVAL_UDECIMAL:
    915 #if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
    916 				if (current_klongsize < sizeof(tcp->u_rval)) {
    917 					tprintf("= %u",
    918 						(unsigned int) tcp->u_rval);
    919 				} else
    920 #endif
    921 				{
    922 					tprintf("= %" PRI_klu, tcp->u_rval);
    923 				}
    924 				break;
    925 			case RVAL_DECIMAL:
    926 				tprintf("= %" PRI_kld, tcp->u_rval);
    927 				break;
    928 			case RVAL_FD:
    929 				if (show_fd_path) {
    930 					tprints("= ");
    931 					printfd(tcp, tcp->u_rval);
    932 				} else
    933 					tprintf("= %" PRI_kld, tcp->u_rval);
    934 				break;
    935 			default:
    936 				error_msg("invalid rval format");
    937 				break;
    938 			}
    939 		}
    940 		if ((sys_res & RVAL_STR) && tcp->auxstr)
    941 			tprintf(" (%s)", tcp->auxstr);
    942 		if (syscall_tampered(tcp))
    943 			tprints(" (INJECTED)");
    944 	}
    945 	if (Tflag) {
    946 		tv_sub(&tv, &tv, &tcp->etime);
    947 		tprintf(" <%ld.%06ld>",
    948 			(long) tv.tv_sec, (long) tv.tv_usec);
    949 	}
    950 	tprints("\n");
    951 	dumpio(tcp);
    952 	line_ended();
    953 
    954 #ifdef USE_LIBUNWIND
    955 	if (stack_trace_enabled)
    956 		unwind_print_stacktrace(tcp);
    957 #endif
    958 	return 0;
    959 }
    960 
    961 void
    962 syscall_exiting_finish(struct tcb *tcp)
    963 {
    964 	tcp->flags &= ~(TCB_INSYSCALL | TCB_TAMPERED);
    965 	tcp->sys_func_rval = 0;
    966 	free_tcb_priv_data(tcp);
    967 }
    968 
    969 bool
    970 is_erestart(struct tcb *tcp)
    971 {
    972 	switch (tcp->u_error) {
    973 		case ERESTARTSYS:
    974 		case ERESTARTNOINTR:
    975 		case ERESTARTNOHAND:
    976 		case ERESTART_RESTARTBLOCK:
    977 			return true;
    978 		default:
    979 			return false;
    980 	}
    981 }
    982 
    983 static unsigned long saved_u_error;
    984 
    985 void
    986 temporarily_clear_syserror(struct tcb *tcp)
    987 {
    988 	saved_u_error = tcp->u_error;
    989 	tcp->u_error = 0;
    990 }
    991 
    992 void
    993 restore_cleared_syserror(struct tcb *tcp)
    994 {
    995 	tcp->u_error = saved_u_error;
    996 }
    997 
    998 #include "arch_regs.c"
    999 
   1000 #if HAVE_ARCH_GETRVAL2
   1001 # include "arch_getrval2.c"
   1002 #endif
   1003 
   1004 void
   1005 print_pc(struct tcb *tcp)
   1006 {
   1007 #if defined ARCH_PC_REG
   1008 # define ARCH_GET_PC 0
   1009 #elif defined ARCH_PC_PEEK_ADDR
   1010 	kernel_ulong_t pc;
   1011 # define ARCH_PC_REG pc
   1012 # define ARCH_GET_PC upeek(tcp, ARCH_PC_PEEK_ADDR, &pc)
   1013 #else
   1014 # error Neither ARCH_PC_REG nor ARCH_PC_PEEK_ADDR is defined
   1015 #endif
   1016 	if (get_regs(tcp) < 0 || ARCH_GET_PC)
   1017 		tprints(current_wordsize == 4 ? "[????????] "
   1018 					      : "[????????????????] ");
   1019 	else
   1020 		tprintf(current_wordsize == 4
   1021 			? "[%08" PRI_klx "] " : "[%016" PRI_klx "] ",
   1022 			(kernel_ulong_t) ARCH_PC_REG);
   1023 }
   1024 
   1025 #include "getregs_old.h"
   1026 
   1027 #undef ptrace_getregset_or_getregs
   1028 #undef ptrace_setregset_or_setregs
   1029 #ifdef ARCH_REGS_FOR_GETREGSET
   1030 
   1031 # define ptrace_getregset_or_getregs ptrace_getregset
   1032 static long
   1033 ptrace_getregset(pid_t pid)
   1034 {
   1035 # ifdef ARCH_IOVEC_FOR_GETREGSET
   1036 	/* variable iovec */
   1037 	ARCH_IOVEC_FOR_GETREGSET.iov_len = sizeof(ARCH_REGS_FOR_GETREGSET);
   1038 	return ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS,
   1039 		      &ARCH_IOVEC_FOR_GETREGSET);
   1040 # else
   1041 	/* constant iovec */
   1042 	static struct iovec io = {
   1043 		.iov_base = &ARCH_REGS_FOR_GETREGSET,
   1044 		.iov_len = sizeof(ARCH_REGS_FOR_GETREGSET)
   1045 	};
   1046 	return ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &io);
   1047 
   1048 # endif
   1049 }
   1050 
   1051 # ifndef HAVE_GETREGS_OLD
   1052 #  define ptrace_setregset_or_setregs ptrace_setregset
   1053 static int
   1054 ptrace_setregset(pid_t pid)
   1055 {
   1056 #  ifdef ARCH_IOVEC_FOR_GETREGSET
   1057 	/* variable iovec */
   1058 	return ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS,
   1059 		      &ARCH_IOVEC_FOR_GETREGSET);
   1060 #  else
   1061 	/* constant iovec */
   1062 	static struct iovec io = {
   1063 		.iov_base = &ARCH_REGS_FOR_GETREGSET,
   1064 		.iov_len = sizeof(ARCH_REGS_FOR_GETREGSET)
   1065 	};
   1066 	return ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS, &io);
   1067 #  endif
   1068 }
   1069 # endif /* !HAVE_GETREGS_OLD */
   1070 
   1071 #elif defined ARCH_REGS_FOR_GETREGS
   1072 
   1073 # define ptrace_getregset_or_getregs ptrace_getregs
   1074 static long
   1075 ptrace_getregs(pid_t pid)
   1076 {
   1077 # if defined SPARC || defined SPARC64
   1078 	/* SPARC systems have the meaning of data and addr reversed */
   1079 	return ptrace(PTRACE_GETREGS, pid, (void *) &ARCH_REGS_FOR_GETREGS, 0);
   1080 # else
   1081 	return ptrace(PTRACE_GETREGS, pid, NULL, &ARCH_REGS_FOR_GETREGS);
   1082 # endif
   1083 }
   1084 
   1085 # ifndef HAVE_GETREGS_OLD
   1086 #  define ptrace_setregset_or_setregs ptrace_setregs
   1087 static int
   1088 ptrace_setregs(pid_t pid)
   1089 {
   1090 #  if defined SPARC || defined SPARC64
   1091 	/* SPARC systems have the meaning of data and addr reversed */
   1092 	return ptrace(PTRACE_SETREGS, pid, (void *) &ARCH_REGS_FOR_GETREGS, 0);
   1093 #  else
   1094 	return ptrace(PTRACE_SETREGS, pid, NULL, &ARCH_REGS_FOR_GETREGS);
   1095 #  endif
   1096 }
   1097 # endif /* !HAVE_GETREGS_OLD */
   1098 
   1099 #endif /* ARCH_REGS_FOR_GETREGSET || ARCH_REGS_FOR_GETREGS */
   1100 
   1101 #ifdef ptrace_getregset_or_getregs
   1102 static long get_regs_error;
   1103 #endif
   1104 
   1105 void
   1106 clear_regs(struct tcb *tcp)
   1107 {
   1108 #ifdef ptrace_getregset_or_getregs
   1109 	get_regs_error = -1;
   1110 #endif
   1111 }
   1112 
   1113 static long
   1114 get_regs(struct tcb *const tcp)
   1115 {
   1116 #ifdef ptrace_getregset_or_getregs
   1117 
   1118 	if (get_regs_error != -1)
   1119 		return get_regs_error;
   1120 
   1121 # ifdef HAVE_GETREGS_OLD
   1122 	/*
   1123 	 * Try PTRACE_GETREGSET/PTRACE_GETREGS first,
   1124 	 * fallback to getregs_old.
   1125 	 */
   1126 	static int use_getregs_old;
   1127 	if (use_getregs_old < 0) {
   1128 		return get_regs_error = ptrace_getregset_or_getregs(tcp->pid);
   1129 	} else if (use_getregs_old == 0) {
   1130 		get_regs_error = ptrace_getregset_or_getregs(tcp->pid);
   1131 		if (get_regs_error >= 0) {
   1132 			use_getregs_old = -1;
   1133 			return get_regs_error;
   1134 		}
   1135 		if (errno == EPERM || errno == ESRCH)
   1136 			return get_regs_error;
   1137 		use_getregs_old = 1;
   1138 	}
   1139 	return get_regs_error = getregs_old(tcp);
   1140 # else /* !HAVE_GETREGS_OLD */
   1141 	/* Assume that PTRACE_GETREGSET/PTRACE_GETREGS works. */
   1142 	get_regs_error = ptrace_getregset_or_getregs(tcp->pid);
   1143 
   1144 #  if defined ARCH_PERSONALITY_0_IOV_SIZE
   1145 	if (get_regs_error)
   1146 		return get_regs_error;
   1147 
   1148 	switch (ARCH_IOVEC_FOR_GETREGSET.iov_len) {
   1149 	case ARCH_PERSONALITY_0_IOV_SIZE:
   1150 		update_personality(tcp, 0);
   1151 		break;
   1152 	case ARCH_PERSONALITY_1_IOV_SIZE:
   1153 		update_personality(tcp, 1);
   1154 		break;
   1155 	default: {
   1156 		static bool printed = false;
   1157 
   1158 		if (!printed) {
   1159 			error_msg("Unsupported regset size returned by "
   1160 				  "PTRACE_GETREGSET: %zu",
   1161 				  ARCH_IOVEC_FOR_GETREGSET.iov_len);
   1162 
   1163 			printed = true;
   1164 		}
   1165 
   1166 		update_personality(tcp, 0);
   1167 	}
   1168 	}
   1169 #  endif /* ARCH_PERSONALITY_0_IOV_SIZE */
   1170 
   1171 	return get_regs_error;
   1172 
   1173 # endif /* !HAVE_GETREGS_OLD */
   1174 
   1175 #else /* !ptrace_getregset_or_getregs */
   1176 
   1177 # warning get_regs is not implemented for this architecture yet
   1178 	return 0;
   1179 
   1180 #endif /* !ptrace_getregset_or_getregs */
   1181 }
   1182 
   1183 #ifdef ptrace_setregset_or_setregs
   1184 static int
   1185 set_regs(pid_t pid)
   1186 {
   1187 	return ptrace_setregset_or_setregs(pid);
   1188 }
   1189 #endif /* ptrace_setregset_or_setregs */
   1190 
   1191 struct sysent_buf {
   1192 	struct tcb *tcp;
   1193 	struct_sysent ent;
   1194 	char buf[sizeof("syscall_0x") + sizeof(kernel_ulong_t) * 2];
   1195 };
   1196 
   1197 static void
   1198 free_sysent_buf(void *ptr)
   1199 {
   1200 	struct sysent_buf *s = ptr;
   1201 	s->tcp->s_prev_ent = s->tcp->s_ent = NULL;
   1202 	free(ptr);
   1203 }
   1204 
   1205 /*
   1206  * Returns:
   1207  * 0: "ignore this ptrace stop", syscall_entering_decode() should return a "bail
   1208  *    out silently" code.
   1209  * 1: ok, continue in syscall_entering_decode().
   1210  * other: error, syscall_entering_decode() should print error indicator
   1211  *    ("????" etc) and return an appropriate code.
   1212  */
   1213 int
   1214 get_scno(struct tcb *tcp)
   1215 {
   1216 	if (get_regs(tcp) < 0)
   1217 		return -1;
   1218 
   1219 	int rc = arch_get_scno(tcp);
   1220 	if (rc != 1)
   1221 		return rc;
   1222 
   1223 	tcp->scno = shuffle_scno(tcp->scno);
   1224 
   1225 	if (scno_is_valid(tcp->scno)) {
   1226 		tcp->s_ent = &sysent[tcp->scno];
   1227 		tcp->qual_flg = qual_flags(tcp->scno);
   1228 	} else {
   1229 		struct sysent_buf *s = xcalloc(1, sizeof(*s));
   1230 
   1231 		s->tcp = tcp;
   1232 		s->ent.nargs = MAX_ARGS;
   1233 		s->ent.sen = SEN_printargs;
   1234 		s->ent.sys_func = printargs;
   1235 		s->ent.sys_name = s->buf;
   1236 		xsprintf(s->buf, "syscall_%#" PRI_klx, shuffle_scno(tcp->scno));
   1237 
   1238 		tcp->s_ent = &s->ent;
   1239 		tcp->qual_flg = QUAL_RAW | DEFAULT_QUAL_FLAGS;
   1240 
   1241 		set_tcb_priv_data(tcp, s, free_sysent_buf);
   1242 
   1243 		debug_msg("pid %d invalid syscall %#" PRI_klx,
   1244 			  tcp->pid, shuffle_scno(tcp->scno));
   1245 	}
   1246 
   1247 	/*
   1248 	 * We refrain from argument decoding during recovering
   1249 	 * as tracee memory mappings has changed and the registers
   1250 	 * are very likely pointing to garbage already.
   1251 	 */
   1252 	if (recovering(tcp))
   1253 		tcp->qual_flg |= QUAL_RAW;
   1254 
   1255 	return 1;
   1256 }
   1257 
   1258 #ifdef ptrace_getregset_or_getregs
   1259 # define get_syscall_result_regs get_regs
   1260 #else
   1261 static int get_syscall_result_regs(struct tcb *);
   1262 #endif
   1263 
   1264 /* Returns:
   1265  * 1: ok, continue in syscall_exiting_trace().
   1266  * -1: error, syscall_exiting_trace() should print error indicator
   1267  *    ("????" etc) and bail out.
   1268  */
   1269 static int
   1270 get_syscall_result(struct tcb *tcp)
   1271 {
   1272 	if (get_syscall_result_regs(tcp) < 0)
   1273 		return -1;
   1274 	tcp->u_error = 0;
   1275 	get_error(tcp,
   1276 		  !(tcp->s_ent->sys_flags & SYSCALL_NEVER_FAILS)
   1277 			|| syscall_tampered(tcp));
   1278 
   1279 	return 1;
   1280 }
   1281 
   1282 #include "get_scno.c"
   1283 #include "set_scno.c"
   1284 #include "get_syscall_args.c"
   1285 #ifndef ptrace_getregset_or_getregs
   1286 # include "get_syscall_result.c"
   1287 #endif
   1288 #include "get_error.c"
   1289 #include "set_error.c"
   1290 #ifdef HAVE_GETREGS_OLD
   1291 # include "getregs_old.c"
   1292 #endif
   1293 #include "shuffle_scno.c"
   1294 
   1295 const char *
   1296 syscall_name(kernel_ulong_t scno)
   1297 {
   1298 	return scno_is_valid(scno) ? sysent[scno].sys_name : NULL;
   1299 }
   1300