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