]> granicus.if.org Git - strace/blob - syscall.c
Remove redundant checks in syscall entry/exit, rename badly named function
[strace] / syscall.c
1 /*
2  * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3  * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5  * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6  * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7  *                     Linux for s390 port by D.J. Barrow
8  *                    <barrow_dj@mail.yahoo.com,djbarrow@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
38 #ifdef HAVE_SYS_REG_H
39 # include <sys/reg.h>
40 # ifndef PTRACE_PEEKUSR
41 #  define PTRACE_PEEKUSR PTRACE_PEEKUSER
42 # endif
43 #elif defined(HAVE_LINUX_PTRACE_H)
44 # undef PTRACE_SYSCALL
45 # ifdef HAVE_STRUCT_IA64_FPREG
46 #  define ia64_fpreg XXX_ia64_fpreg
47 # endif
48 # ifdef HAVE_STRUCT_PT_ALL_USER_REGS
49 #  define pt_all_user_regs XXX_pt_all_user_regs
50 # endif
51 # include <linux/ptrace.h>
52 # undef ia64_fpreg
53 # undef pt_all_user_regs
54 #endif
55
56 #if defined(SPARC64)
57 # undef PTRACE_GETREGS
58 # define PTRACE_GETREGS PTRACE_GETREGS64
59 # undef PTRACE_SETREGS
60 # define PTRACE_SETREGS PTRACE_SETREGS64
61 #endif
62
63 #if defined(IA64)
64 # include <asm/ptrace_offsets.h>
65 # include <asm/rse.h>
66 #endif
67
68 #ifndef ERESTARTSYS
69 # define ERESTARTSYS    512
70 #endif
71 #ifndef ERESTARTNOINTR
72 # define ERESTARTNOINTR 513
73 #endif
74 #ifndef ERESTARTNOHAND
75 # define ERESTARTNOHAND 514     /* restart if no handler */
76 #endif
77 #ifndef ERESTART_RESTARTBLOCK
78 # define ERESTART_RESTARTBLOCK 516      /* restart by calling sys_restart_syscall */
79 #endif
80
81 #ifndef NSIG
82 # warning: NSIG is not defined, using 32
83 # define NSIG 32
84 #endif
85 #ifdef ARM
86 /* Ugh. Is this really correct? ARM has no RT signals?! */
87 # undef NSIG
88 # define NSIG 32
89 #endif
90
91 #include "syscall.h"
92
93 /* Define these shorthand notations to simplify the syscallent files. */
94 #define TD TRACE_DESC
95 #define TF TRACE_FILE
96 #define TI TRACE_IPC
97 #define TN TRACE_NETWORK
98 #define TP TRACE_PROCESS
99 #define TS TRACE_SIGNAL
100 #define NF SYSCALL_NEVER_FAILS
101 #define MA MAX_ARGS
102
103 static const struct sysent sysent0[] = {
104 #include "syscallent.h"
105 };
106
107 #if SUPPORTED_PERSONALITIES >= 2
108 static const struct sysent sysent1[] = {
109 # include "syscallent1.h"
110 };
111 #endif
112
113 #if SUPPORTED_PERSONALITIES >= 3
114 static const struct sysent sysent2[] = {
115 # include "syscallent2.h"
116 };
117 #endif
118
119 /* Now undef them since short defines cause wicked namespace pollution. */
120 #undef TD
121 #undef TF
122 #undef TI
123 #undef TN
124 #undef TP
125 #undef TS
126 #undef NF
127 #undef MA
128
129 /*
130  * `ioctlent.h' may be generated from `ioctlent.raw' by the auxiliary
131  * program `ioctlsort', such that the list is sorted by the `code' field.
132  * This has the side-effect of resolving the _IO.. macros into
133  * plain integers, eliminating the need to include here everything
134  * in "/usr/include".
135  */
136
137 static const char *const errnoent0[] = {
138 #include "errnoent.h"
139 };
140 static const char *const signalent0[] = {
141 #include "signalent.h"
142 };
143 static const struct ioctlent ioctlent0[] = {
144 #include "ioctlent.h"
145 };
146 enum { nsyscalls0 = ARRAY_SIZE(sysent0) };
147 enum { nerrnos0 = ARRAY_SIZE(errnoent0) };
148 enum { nsignals0 = ARRAY_SIZE(signalent0) };
149 enum { nioctlents0 = ARRAY_SIZE(ioctlent0) };
150 int qual_flags0[MAX_QUALS];
151
152 #if SUPPORTED_PERSONALITIES >= 2
153 static const char *const errnoent1[] = {
154 # include "errnoent1.h"
155 };
156 static const char *const signalent1[] = {
157 # include "signalent1.h"
158 };
159 static const struct ioctlent ioctlent1[] = {
160 # include "ioctlent1.h"
161 };
162 enum { nsyscalls1 = ARRAY_SIZE(sysent1) };
163 enum { nerrnos1 = ARRAY_SIZE(errnoent1) };
164 enum { nsignals1 = ARRAY_SIZE(signalent1) };
165 enum { nioctlents1 = ARRAY_SIZE(ioctlent1) };
166 int qual_flags1[MAX_QUALS];
167 #endif
168
169 #if SUPPORTED_PERSONALITIES >= 3
170 static const char *const errnoent2[] = {
171 # include "errnoent2.h"
172 };
173 static const char *const signalent2[] = {
174 # include "signalent2.h"
175 };
176 static const struct ioctlent ioctlent2[] = {
177 # include "ioctlent2.h"
178 };
179 enum { nsyscalls2 = ARRAY_SIZE(sysent2) };
180 enum { nerrnos2 = ARRAY_SIZE(errnoent2) };
181 enum { nsignals2 = ARRAY_SIZE(signalent2) };
182 enum { nioctlents2 = ARRAY_SIZE(ioctlent2) };
183 int qual_flags2[MAX_QUALS];
184 #endif
185
186 const struct sysent *sysent = sysent0;
187 const char *const *errnoent = errnoent0;
188 const char *const *signalent = signalent0;
189 const struct ioctlent *ioctlent = ioctlent0;
190 unsigned nsyscalls = nsyscalls0;
191 unsigned nerrnos = nerrnos0;
192 unsigned nsignals = nsignals0;
193 unsigned nioctlents = nioctlents0;
194 int *qual_flags = qual_flags0;
195
196 #if SUPPORTED_PERSONALITIES > 1
197 int current_personality;
198
199 const int personality_wordsize[SUPPORTED_PERSONALITIES] = {
200         PERSONALITY0_WORDSIZE,
201         PERSONALITY1_WORDSIZE,
202 # if SUPPORTED_PERSONALITIES > 2
203         PERSONALITY2_WORDSIZE,
204 # endif
205 };
206
207 void
208 set_personality(int personality)
209 {
210         switch (personality) {
211         case 0:
212                 errnoent = errnoent0;
213                 nerrnos = nerrnos0;
214                 sysent = sysent0;
215                 nsyscalls = nsyscalls0;
216                 ioctlent = ioctlent0;
217                 nioctlents = nioctlents0;
218                 signalent = signalent0;
219                 nsignals = nsignals0;
220                 qual_flags = qual_flags0;
221                 break;
222
223         case 1:
224                 errnoent = errnoent1;
225                 nerrnos = nerrnos1;
226                 sysent = sysent1;
227                 nsyscalls = nsyscalls1;
228                 ioctlent = ioctlent1;
229                 nioctlents = nioctlents1;
230                 signalent = signalent1;
231                 nsignals = nsignals1;
232                 qual_flags = qual_flags1;
233                 break;
234
235 # if SUPPORTED_PERSONALITIES >= 3
236         case 2:
237                 errnoent = errnoent2;
238                 nerrnos = nerrnos2;
239                 sysent = sysent2;
240                 nsyscalls = nsyscalls2;
241                 ioctlent = ioctlent2;
242                 nioctlents = nioctlents2;
243                 signalent = signalent2;
244                 nsignals = nsignals2;
245                 qual_flags = qual_flags2;
246                 break;
247 # endif
248         }
249
250         current_personality = personality;
251 }
252
253 static void
254 update_personality(struct tcb *tcp, int personality)
255 {
256         if (personality == current_personality)
257                 return;
258         set_personality(personality);
259
260         if (personality == tcp->currpers)
261                 return;
262         tcp->currpers = personality;
263
264 # if defined(POWERPC64) || defined(X86_64)
265         if (!qflag) {
266                 static const char *const names[] = {"64 bit", "32 bit"};
267                 fprintf(stderr, "[ Process PID=%d runs in %s mode. ]\n",
268                         tcp->pid, names[personality]);
269         }
270 # endif
271 }
272 #endif
273
274 static int qual_syscall(), qual_signal(), qual_fault(), qual_desc();
275
276 static const struct qual_options {
277         int bitflag;
278         const char *option_name;
279         int (*qualify)(const char *, int, int);
280         const char *argument_name;
281 } qual_options[] = {
282         { QUAL_TRACE,   "trace",        qual_syscall,   "system call"   },
283         { QUAL_TRACE,   "t",            qual_syscall,   "system call"   },
284         { QUAL_ABBREV,  "abbrev",       qual_syscall,   "system call"   },
285         { QUAL_ABBREV,  "a",            qual_syscall,   "system call"   },
286         { QUAL_VERBOSE, "verbose",      qual_syscall,   "system call"   },
287         { QUAL_VERBOSE, "v",            qual_syscall,   "system call"   },
288         { QUAL_RAW,     "raw",          qual_syscall,   "system call"   },
289         { QUAL_RAW,     "x",            qual_syscall,   "system call"   },
290         { QUAL_SIGNAL,  "signal",       qual_signal,    "signal"        },
291         { QUAL_SIGNAL,  "signals",      qual_signal,    "signal"        },
292         { QUAL_SIGNAL,  "s",            qual_signal,    "signal"        },
293         { QUAL_FAULT,   "fault",        qual_fault,     "fault"         },
294         { QUAL_FAULT,   "faults",       qual_fault,     "fault"         },
295         { QUAL_FAULT,   "m",            qual_fault,     "fault"         },
296         { QUAL_READ,    "read",         qual_desc,      "descriptor"    },
297         { QUAL_READ,    "reads",        qual_desc,      "descriptor"    },
298         { QUAL_READ,    "r",            qual_desc,      "descriptor"    },
299         { QUAL_WRITE,   "write",        qual_desc,      "descriptor"    },
300         { QUAL_WRITE,   "writes",       qual_desc,      "descriptor"    },
301         { QUAL_WRITE,   "w",            qual_desc,      "descriptor"    },
302         { 0,            NULL,           NULL,           NULL            },
303 };
304
305 static void
306 qualify_one(int n, int bitflag, int not, int pers)
307 {
308         if (pers == 0 || pers < 0) {
309                 if (not)
310                         qual_flags0[n] &= ~bitflag;
311                 else
312                         qual_flags0[n] |= bitflag;
313         }
314
315 #if SUPPORTED_PERSONALITIES >= 2
316         if (pers == 1 || pers < 0) {
317                 if (not)
318                         qual_flags1[n] &= ~bitflag;
319                 else
320                         qual_flags1[n] |= bitflag;
321         }
322 #endif
323
324 #if SUPPORTED_PERSONALITIES >= 3
325         if (pers == 2 || pers < 0) {
326                 if (not)
327                         qual_flags2[n] &= ~bitflag;
328                 else
329                         qual_flags2[n] |= bitflag;
330         }
331 #endif
332 }
333
334 static int
335 qual_syscall(const char *s, int bitflag, int not)
336 {
337         int i;
338         int rc = -1;
339
340         if (isdigit((unsigned char)*s)) {
341                 int i = atoi(s);
342                 if (i < 0 || i >= MAX_QUALS)
343                         return -1;
344                 qualify_one(i, bitflag, not, -1);
345                 return 0;
346         }
347         for (i = 0; i < nsyscalls0; i++)
348                 if (strcmp(s, sysent0[i].sys_name) == 0) {
349                         qualify_one(i, bitflag, not, 0);
350                         rc = 0;
351                 }
352
353 #if SUPPORTED_PERSONALITIES >= 2
354         for (i = 0; i < nsyscalls1; i++)
355                 if (strcmp(s, sysent1[i].sys_name) == 0) {
356                         qualify_one(i, bitflag, not, 1);
357                         rc = 0;
358                 }
359 #endif
360
361 #if SUPPORTED_PERSONALITIES >= 3
362         for (i = 0; i < nsyscalls2; i++)
363                 if (strcmp(s, sysent2[i].sys_name) == 0) {
364                         qualify_one(i, bitflag, not, 2);
365                         rc = 0;
366                 }
367 #endif
368
369         return rc;
370 }
371
372 static int
373 qual_signal(const char *s, int bitflag, int not)
374 {
375         int i;
376         char buf[32];
377
378         if (isdigit((unsigned char)*s)) {
379                 int signo = atoi(s);
380                 if (signo < 0 || signo >= MAX_QUALS)
381                         return -1;
382                 qualify_one(signo, bitflag, not, -1);
383                 return 0;
384         }
385         if (strlen(s) >= sizeof buf)
386                 return -1;
387         strcpy(buf, s);
388         s = buf;
389         if (strncasecmp(s, "SIG", 3) == 0)
390                 s += 3;
391         for (i = 0; i <= NSIG; i++)
392                 if (strcasecmp(s, signame(i) + 3) == 0) {
393                         qualify_one(i, bitflag, not, -1);
394                         return 0;
395                 }
396         return -1;
397 }
398
399 static int
400 qual_fault(const char *s, int bitflag, int not)
401 {
402         return -1;
403 }
404
405 static int
406 qual_desc(const char *s, int bitflag, int not)
407 {
408         if (isdigit((unsigned char)*s)) {
409                 int desc = atoi(s);
410                 if (desc < 0 || desc >= MAX_QUALS)
411                         return -1;
412                 qualify_one(desc, bitflag, not, -1);
413                 return 0;
414         }
415         return -1;
416 }
417
418 static int
419 lookup_class(const char *s)
420 {
421         if (strcmp(s, "file") == 0)
422                 return TRACE_FILE;
423         if (strcmp(s, "ipc") == 0)
424                 return TRACE_IPC;
425         if (strcmp(s, "network") == 0)
426                 return TRACE_NETWORK;
427         if (strcmp(s, "process") == 0)
428                 return TRACE_PROCESS;
429         if (strcmp(s, "signal") == 0)
430                 return TRACE_SIGNAL;
431         if (strcmp(s, "desc") == 0)
432                 return TRACE_DESC;
433         return -1;
434 }
435
436 void
437 qualify(const char *s)
438 {
439         const struct qual_options *opt;
440         int not;
441         char *copy;
442         const char *p;
443         int i, n;
444
445         opt = &qual_options[0];
446         for (i = 0; (p = qual_options[i].option_name); i++) {
447                 n = strlen(p);
448                 if (strncmp(s, p, n) == 0 && s[n] == '=') {
449                         opt = &qual_options[i];
450                         s += n + 1;
451                         break;
452                 }
453         }
454         not = 0;
455         if (*s == '!') {
456                 not = 1;
457                 s++;
458         }
459         if (strcmp(s, "none") == 0) {
460                 not = 1 - not;
461                 s = "all";
462         }
463         if (strcmp(s, "all") == 0) {
464                 for (i = 0; i < MAX_QUALS; i++) {
465                         qualify_one(i, opt->bitflag, not, -1);
466                 }
467                 return;
468         }
469         for (i = 0; i < MAX_QUALS; i++) {
470                 qualify_one(i, opt->bitflag, !not, -1);
471         }
472         copy = strdup(s);
473         if (!copy)
474                 die_out_of_memory();
475         for (p = strtok(copy, ","); p; p = strtok(NULL, ",")) {
476                 if (opt->bitflag == QUAL_TRACE && (n = lookup_class(p)) > 0) {
477                         for (i = 0; i < nsyscalls0; i++)
478                                 if (sysent0[i].sys_flags & n)
479                                         qualify_one(i, opt->bitflag, not, 0);
480
481 #if SUPPORTED_PERSONALITIES >= 2
482                         for (i = 0; i < nsyscalls1; i++)
483                                 if (sysent1[i].sys_flags & n)
484                                         qualify_one(i, opt->bitflag, not, 1);
485 #endif
486
487 #if SUPPORTED_PERSONALITIES >= 3
488                         for (i = 0; i < nsyscalls2; i++)
489                                 if (sysent2[i].sys_flags & n)
490                                         qualify_one(i, opt->bitflag, not, 2);
491 #endif
492
493                         continue;
494                 }
495                 if (opt->qualify(p, opt->bitflag, not)) {
496                         error_msg_and_die("invalid %s '%s'",
497                                 opt->argument_name, p);
498                 }
499         }
500         free(copy);
501         return;
502 }
503
504 #ifdef SYS_socket_subcall
505 static void
506 decode_socket_subcall(struct tcb *tcp)
507 {
508         unsigned long addr;
509         unsigned int i, size;
510
511         if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= SYS_socket_nsubcalls)
512                 return;
513
514         tcp->scno = SYS_socket_subcall + tcp->u_arg[0];
515         addr = tcp->u_arg[1];
516         tcp->u_nargs = sysent[tcp->scno].nargs;
517         size = current_wordsize;
518         for (i = 0; i < tcp->u_nargs; ++i) {
519                 if (size == sizeof(int)) {
520                         unsigned int arg;
521                         if (umove(tcp, addr, &arg) < 0)
522                                 arg = 0;
523                         tcp->u_arg[i] = arg;
524                 }
525                 else {
526                         unsigned long arg;
527                         if (umove(tcp, addr, &arg) < 0)
528                                 arg = 0;
529                         tcp->u_arg[i] = arg;
530                 }
531                 addr += size;
532         }
533 }
534 #endif
535
536 #ifdef SYS_ipc_subcall
537 static void
538 decode_ipc_subcall(struct tcb *tcp)
539 {
540         unsigned int i;
541
542         if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= SYS_ipc_nsubcalls)
543                 return;
544
545         tcp->scno = SYS_ipc_subcall + tcp->u_arg[0];
546         tcp->u_nargs = sysent[tcp->scno].nargs;
547         for (i = 0; i < tcp->u_nargs; i++)
548                 tcp->u_arg[i] = tcp->u_arg[i + 1];
549 }
550 #endif
551
552 int
553 printargs(struct tcb *tcp)
554 {
555         if (entering(tcp)) {
556                 int i;
557
558                 for (i = 0; i < tcp->u_nargs; i++)
559                         tprintf("%s%#lx", i ? ", " : "", tcp->u_arg[i]);
560         }
561         return 0;
562 }
563
564 int
565 printargs_lu(struct tcb *tcp)
566 {
567         if (entering(tcp)) {
568                 int i;
569
570                 for (i = 0; i < tcp->u_nargs; i++)
571                         tprintf("%s%lu", i ? ", " : "", tcp->u_arg[i]);
572         }
573         return 0;
574 }
575
576 int
577 printargs_ld(struct tcb *tcp)
578 {
579         if (entering(tcp)) {
580                 int i;
581
582                 for (i = 0; i < tcp->u_nargs; i++)
583                         tprintf("%s%ld", i ? ", " : "", tcp->u_arg[i]);
584         }
585         return 0;
586 }
587
588 long
589 getrval2(struct tcb *tcp)
590 {
591         long val = -1;
592
593 #if defined(SPARC) || defined(SPARC64)
594         struct pt_regs regs;
595         if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)&regs, 0) < 0)
596                 return -1;
597         val = regs.u_regs[U_REG_O1];
598 #elif defined(SH)
599         if (upeek(tcp, 4*(REG_REG0+1), &val) < 0)
600                 return -1;
601 #elif defined(IA64)
602         if (upeek(tcp, PT_R9, &val) < 0)
603                 return -1;
604 #endif
605
606         return val;
607 }
608
609 int
610 is_restart_error(struct tcb *tcp)
611 {
612         switch (tcp->u_error) {
613                 case ERESTARTSYS:
614                 case ERESTARTNOINTR:
615                 case ERESTARTNOHAND:
616                 case ERESTART_RESTARTBLOCK:
617                         return 1;
618                 default:
619                         break;
620         }
621         return 0;
622 }
623
624 #if defined(I386)
625 struct pt_regs i386_regs;
626 #elif defined(X86_64)
627 /*
628  * On 32 bits, pt_regs and user_regs_struct are the same,
629  * but on 64 bits, user_regs_struct has six more fields:
630  * fs_base, gs_base, ds, es, fs, gs.
631  * PTRACE_GETREGS fills them too, so struct pt_regs would overflow.
632  */
633 static struct user_regs_struct x86_64_regs;
634 #elif defined(IA64)
635 long r8, r10, psr; /* TODO: make static? */
636 long ia32 = 0; /* not static */
637 #elif defined(POWERPC)
638 static long result;
639 #elif defined(M68K)
640 static long d0;
641 #elif defined(BFIN)
642 static long r0;
643 #elif defined(ARM)
644 static struct pt_regs regs;
645 #elif defined(ALPHA)
646 static long r0;
647 static long a3;
648 #elif defined(AVR32)
649 static struct pt_regs regs;
650 #elif defined(SPARC) || defined(SPARC64)
651 static struct pt_regs regs;
652 static unsigned long trap;
653 #elif defined(LINUX_MIPSN32)
654 static long long a3;
655 static long long r2;
656 #elif defined(MIPS)
657 static long a3;
658 static long r2;
659 #elif defined(S390) || defined(S390X)
660 static long gpr2;
661 static long pc;
662 static long syscall_mode;
663 #elif defined(HPPA)
664 static long r28;
665 #elif defined(SH)
666 static long r0;
667 #elif defined(SH64)
668 static long r9;
669 #elif defined(CRISV10) || defined(CRISV32)
670 static long r10;
671 #elif defined(MICROBLAZE)
672 static long r3;
673 #endif
674
675 /* Returns:
676  * 0: "ignore this ptrace stop", bail out of trace_syscall() silently.
677  * 1: ok, continue in trace_syscall().
678  * other: error, trace_syscall() should print error indicator
679  *    ("????" etc) and bail out.
680  */
681 static int
682 get_scno(struct tcb *tcp)
683 {
684         long scno = 0;
685
686 #if defined(S390) || defined(S390X)
687         if (upeek(tcp, PT_GPR2, &syscall_mode) < 0)
688                 return -1;
689
690         if (syscall_mode != -ENOSYS) {
691                 /*
692                  * Since kernel version 2.5.44 the scno gets passed in gpr2.
693                  */
694                 scno = syscall_mode;
695         } else {
696                 /*
697                  * Old style of "passing" the scno via the SVC instruction.
698                  */
699                 long opcode, offset_reg, tmp;
700                 void *svc_addr;
701                 static const int gpr_offset[16] = {
702                                 PT_GPR0,  PT_GPR1,  PT_ORIGGPR2, PT_GPR3,
703                                 PT_GPR4,  PT_GPR5,  PT_GPR6,     PT_GPR7,
704                                 PT_GPR8,  PT_GPR9,  PT_GPR10,    PT_GPR11,
705                                 PT_GPR12, PT_GPR13, PT_GPR14,    PT_GPR15
706                 };
707
708                 if (upeek(tcp, PT_PSWADDR, &pc) < 0)
709                         return -1;
710                 errno = 0;
711                 opcode = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)(pc-sizeof(long)), 0);
712                 if (errno) {
713                         perror("peektext(pc-oneword)");
714                         return -1;
715                 }
716
717                 /*
718                  *  We have to check if the SVC got executed directly or via an
719                  *  EXECUTE instruction. In case of EXECUTE it is necessary to do
720                  *  instruction decoding to derive the system call number.
721                  *  Unfortunately the opcode sizes of EXECUTE and SVC are differently,
722                  *  so that this doesn't work if a SVC opcode is part of an EXECUTE
723                  *  opcode. Since there is no way to find out the opcode size this
724                  *  is the best we can do...
725                  */
726                 if ((opcode & 0xff00) == 0x0a00) {
727                         /* SVC opcode */
728                         scno = opcode & 0xff;
729                 }
730                 else {
731                         /* SVC got executed by EXECUTE instruction */
732
733                         /*
734                          *  Do instruction decoding of EXECUTE. If you really want to
735                          *  understand this, read the Principles of Operations.
736                          */
737                         svc_addr = (void *) (opcode & 0xfff);
738
739                         tmp = 0;
740                         offset_reg = (opcode & 0x000f0000) >> 16;
741                         if (offset_reg && (upeek(tcp, gpr_offset[offset_reg], &tmp) < 0))
742                                 return -1;
743                         svc_addr += tmp;
744
745                         tmp = 0;
746                         offset_reg = (opcode & 0x0000f000) >> 12;
747                         if (offset_reg && (upeek(tcp, gpr_offset[offset_reg], &tmp) < 0))
748                                 return -1;
749                         svc_addr += tmp;
750
751                         scno = ptrace(PTRACE_PEEKTEXT, tcp->pid, svc_addr, 0);
752                         if (errno)
753                                 return -1;
754 # if defined(S390X)
755                         scno >>= 48;
756 # else
757                         scno >>= 16;
758 # endif
759                         tmp = 0;
760                         offset_reg = (opcode & 0x00f00000) >> 20;
761                         if (offset_reg && (upeek(tcp, gpr_offset[offset_reg], &tmp) < 0))
762                                 return -1;
763
764                         scno = (scno | tmp) & 0xff;
765                 }
766         }
767 #elif defined(POWERPC)
768         if (upeek(tcp, sizeof(unsigned long)*PT_R0, &scno) < 0)
769                 return -1;
770 # ifdef POWERPC64
771         /* TODO: speed up strace by not doing this at every syscall.
772          * We only need to do it after execve.
773          */
774         int currpers;
775         long val;
776
777         /* Check for 64/32 bit mode. */
778         if (upeek(tcp, sizeof(unsigned long)*PT_MSR, &val) < 0)
779                 return -1;
780         /* SF is bit 0 of MSR */
781         if (val < 0)
782                 currpers = 0;
783         else
784                 currpers = 1;
785         update_personality(tcp, currpers);
786 # endif
787 #elif defined(AVR32)
788         /* Read complete register set in one go. */
789         if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, &regs) < 0)
790                 return -1;
791         scno = regs.r8;
792 #elif defined(BFIN)
793         if (upeek(tcp, PT_ORIG_P0, &scno))
794                 return -1;
795 #elif defined(I386)
796         if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &i386_regs) < 0)
797                 return -1;
798         scno = i386_regs.orig_eax;
799 #elif defined(X86_64)
800         int currpers;
801         if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &x86_64_regs) < 0)
802                 return -1;
803         scno = x86_64_regs.orig_rax;
804
805         /* Check CS register value. On x86-64 linux it is:
806          *      0x33    for long mode (64 bit)
807          *      0x23    for compatibility mode (32 bit)
808          */
809         switch (x86_64_regs.cs) {
810                 case 0x23: currpers = 1; break;
811                 case 0x33: currpers = 0; break;
812                 default:
813                         fprintf(stderr, "Unknown value CS=0x%08X while "
814                                  "detecting personality of process "
815                                  "PID=%d\n", (int)x86_64_regs.cs, tcp->pid);
816                         currpers = current_personality;
817                         break;
818         }
819 # if 0
820         /* This version analyzes the opcode of a syscall instruction.
821          * (int 0x80 on i386 vs. syscall on x86-64)
822          * It works, but is too complicated.
823          */
824         unsigned long val, rip, i;
825
826         rip = x86_64_regs.rip;
827
828         /* sizeof(syscall) == sizeof(int 0x80) == 2 */
829         rip -= 2;
830         errno = 0;
831
832         call = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)rip, (char *)0);
833         if (errno)
834                 fprintf(stderr, "ptrace_peektext failed: %s\n",
835                                 strerror(errno));
836         switch (call & 0xffff) {
837                 /* x86-64: syscall = 0x0f 0x05 */
838                 case 0x050f: currpers = 0; break;
839                 /* i386: int 0x80 = 0xcd 0x80 */
840                 case 0x80cd: currpers = 1; break;
841                 default:
842                         currpers = current_personality;
843                         fprintf(stderr,
844                                 "Unknown syscall opcode (0x%04X) while "
845                                 "detecting personality of process "
846                                 "PID=%d\n", (int)call, tcp->pid);
847                         break;
848         }
849 # endif
850         update_personality(tcp, currpers);
851 #elif defined(IA64)
852 #       define IA64_PSR_IS      ((long)1 << 34)
853         if (upeek(tcp, PT_CR_IPSR, &psr) >= 0)
854                 ia32 = (psr & IA64_PSR_IS) != 0;
855         if (ia32) {
856                 if (upeek(tcp, PT_R1, &scno) < 0)
857                         return -1;
858         } else {
859                 if (upeek(tcp, PT_R15, &scno) < 0)
860                         return -1;
861         }
862 #elif defined(ARM)
863         /* Read complete register set in one go. */
864         if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (void *)&regs) == -1)
865                 return -1;
866
867         /*
868          * We only need to grab the syscall number on syscall entry.
869          */
870         if (regs.ARM_ip == 0) {
871                 /*
872                  * Note: we only deal with only 32-bit CPUs here.
873                  */
874                 if (regs.ARM_cpsr & 0x20) {
875                         /*
876                          * Get the Thumb-mode system call number
877                          */
878                         scno = regs.ARM_r7;
879                 } else {
880                         /*
881                          * Get the ARM-mode system call number
882                          */
883                         errno = 0;
884                         scno = ptrace(PTRACE_PEEKTEXT, tcp->pid, (void *)(regs.ARM_pc - 4), NULL);
885                         if (errno)
886                                 return -1;
887
888                         /* Handle the EABI syscall convention.  We do not
889                            bother converting structures between the two
890                            ABIs, but basic functionality should work even
891                            if strace and the traced program have different
892                            ABIs.  */
893                         if (scno == 0xef000000) {
894                                 scno = regs.ARM_r7;
895                         } else {
896                                 if ((scno & 0x0ff00000) != 0x0f900000) {
897                                         fprintf(stderr, "syscall: unknown syscall trap 0x%08lx\n",
898                                                 scno);
899                                         return -1;
900                                 }
901
902                                 /*
903                                  * Fixup the syscall number
904                                  */
905                                 scno &= 0x000fffff;
906                         }
907                 }
908                 if (scno & 0x0f0000) {
909                         /*
910                          * Handle ARM specific syscall
911                          */
912                         update_personality(tcp, 1);
913                         scno &= 0x0000ffff;
914                 } else
915                         update_personality(tcp, 0);
916
917         } else {
918                 fprintf(stderr, "pid %d stray syscall entry\n", tcp->pid);
919                 tcp->flags |= TCB_INSYSCALL;
920         }
921 #elif defined(M68K)
922         if (upeek(tcp, 4*PT_ORIG_D0, &scno) < 0)
923                 return -1;
924 #elif defined(LINUX_MIPSN32)
925         unsigned long long regs[38];
926
927         if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &regs) < 0)
928                 return -1;
929         a3 = regs[REG_A3];
930         r2 = regs[REG_V0];
931
932         scno = r2;
933         if (!SCNO_IN_RANGE(scno)) {
934                 if (a3 == 0 || a3 == -1) {
935                         if (debug_flag)
936                                 fprintf(stderr, "stray syscall exit: v0 = %ld\n", scno);
937                         return 0;
938                 }
939         }
940 #elif defined(MIPS)
941         if (upeek(tcp, REG_A3, &a3) < 0)
942                 return -1;
943         if (upeek(tcp, REG_V0, &scno) < 0)
944                 return -1;
945
946         if (!SCNO_IN_RANGE(scno)) {
947                 if (a3 == 0 || a3 == -1) {
948                         if (debug_flag)
949                                 fprintf(stderr, "stray syscall exit: v0 = %ld\n", scno);
950                         return 0;
951                 }
952         }
953 #elif defined(ALPHA)
954         if (upeek(tcp, REG_A3, &a3) < 0)
955                 return -1;
956         if (upeek(tcp, REG_R0, &scno) < 0)
957                 return -1;
958
959         /*
960          * Do some sanity checks to figure out if it's
961          * really a syscall entry
962          */
963         if (!SCNO_IN_RANGE(scno)) {
964                 if (a3 == 0 || a3 == -1) {
965                         if (debug_flag)
966                                 fprintf(stderr, "stray syscall exit: r0 = %ld\n", scno);
967                         return 0;
968                 }
969         }
970 #elif defined(SPARC) || defined(SPARC64)
971         /* Everything we need is in the current register set. */
972         if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)&regs, 0) < 0)
973                 return -1;
974
975         /* Disassemble the syscall trap. */
976         /* Retrieve the syscall trap instruction. */
977         errno = 0;
978 # if defined(SPARC64)
979         trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)regs.tpc, 0);
980         trap >>= 32;
981 # else
982         trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)regs.pc, 0);
983 # endif
984         if (errno)
985                 return -1;
986
987         /* Disassemble the trap to see what personality to use. */
988         switch (trap) {
989         case 0x91d02010:
990                 /* Linux/SPARC syscall trap. */
991                 update_personality(tcp, 0);
992                 break;
993         case 0x91d0206d:
994                 /* Linux/SPARC64 syscall trap. */
995                 update_personality(tcp, 2);
996                 break;
997         case 0x91d02000:
998                 /* SunOS syscall trap. (pers 1) */
999                 fprintf(stderr, "syscall: SunOS no support\n");
1000                 return -1;
1001         case 0x91d02008:
1002                 /* Solaris 2.x syscall trap. (per 2) */
1003                 update_personality(tcp, 1);
1004                 break;
1005         case 0x91d02009:
1006                 /* NetBSD/FreeBSD syscall trap. */
1007                 fprintf(stderr, "syscall: NetBSD/FreeBSD not supported\n");
1008                 return -1;
1009         case 0x91d02027:
1010                 /* Solaris 2.x gettimeofday */
1011                 update_personality(tcp, 1);
1012                 break;
1013         default:
1014 # if defined(SPARC64)
1015                 fprintf(stderr, "syscall: unknown syscall trap %08lx %016lx\n", trap, regs.tpc);
1016 # else
1017                 fprintf(stderr, "syscall: unknown syscall trap %08lx %08lx\n", trap, regs.pc);
1018 # endif
1019                 return -1;
1020         }
1021
1022         /* Extract the system call number from the registers. */
1023         if (trap == 0x91d02027)
1024                 scno = 156;
1025         else
1026                 scno = regs.u_regs[U_REG_G1];
1027         if (scno == 0) {
1028                 scno = regs.u_regs[U_REG_O0];
1029                 memmove(&regs.u_regs[U_REG_O0], &regs.u_regs[U_REG_O1], 7*sizeof(regs.u_regs[0]));
1030         }
1031 #elif defined(HPPA)
1032         if (upeek(tcp, PT_GR20, &scno) < 0)
1033                 return -1;
1034 #elif defined(SH)
1035         /*
1036          * In the new syscall ABI, the system call number is in R3.
1037          */
1038         if (upeek(tcp, 4*(REG_REG0+3), &scno) < 0)
1039                 return -1;
1040
1041         if (scno < 0) {
1042                 /* Odd as it may seem, a glibc bug has been known to cause
1043                    glibc to issue bogus negative syscall numbers.  So for
1044                    our purposes, make strace print what it *should* have been */
1045                 long correct_scno = (scno & 0xff);
1046                 if (debug_flag)
1047                         fprintf(stderr,
1048                                 "Detected glibc bug: bogus system call"
1049                                 " number = %ld, correcting to %ld\n",
1050                                 scno,
1051                                 correct_scno);
1052                 scno = correct_scno;
1053         }
1054 #elif defined(SH64)
1055         if (upeek(tcp, REG_SYSCALL, &scno) < 0)
1056                 return -1;
1057         scno &= 0xFFFF;
1058 #elif defined(CRISV10) || defined(CRISV32)
1059         if (upeek(tcp, 4*PT_R9, &scno) < 0)
1060                 return -1;
1061 #elif defined(TILE)
1062         if (upeek(tcp, PTREGS_OFFSET_REG(10), &scno) < 0)
1063                 return -1;
1064 #elif defined(MICROBLAZE)
1065         if (upeek(tcp, 0, &scno) < 0)
1066                 return -1;
1067 #endif
1068
1069 #if defined(SH)
1070         /* new syscall ABI returns result in R0 */
1071         if (upeek(tcp, 4*REG_REG0, (long *)&r0) < 0)
1072                 return -1;
1073 #elif defined(SH64)
1074         /* ABI defines result returned in r9 */
1075         if (upeek(tcp, REG_GENERAL(9), (long *)&r9) < 0)
1076                 return -1;
1077 #endif
1078
1079         tcp->scno = scno;
1080         return 1;
1081 }
1082
1083 /* Called at each syscall entry.
1084  * Returns:
1085  * 0: "ignore this ptrace stop", bail out of trace_syscall() silently.
1086  * 1: ok, continue in trace_syscall().
1087  * other: error, trace_syscall() should print error indicator
1088  *    ("????" etc) and bail out.
1089  */
1090 static int
1091 syscall_fixup_on_sysenter(struct tcb *tcp)
1092 {
1093         /* A common case of "not a syscall entry" is post-execve SIGTRAP */
1094 #if defined(I386)
1095         if (i386_regs.eax != -ENOSYS) {
1096                 if (debug_flag)
1097                         fprintf(stderr, "not a syscall entry (eax = %ld)\n", i386_regs.eax);
1098                 return 0;
1099         }
1100 #elif defined(X86_64)
1101         {
1102                 long rax = x86_64_regs.rax;
1103                 if (current_personality == 1)
1104                         rax = (int)rax; /* sign extend from 32 bits */
1105                 if (rax != -ENOSYS) {
1106                         if (debug_flag)
1107                                 fprintf(stderr, "not a syscall entry (rax = %ld)\n", rax);
1108                         return 0;
1109                 }
1110         }
1111 #elif defined(S390) || defined(S390X)
1112         /* TODO: we already fetched PT_GPR2 in get_scno
1113          * and stored it in syscall_mode, reuse it here
1114          * instead of re-fetching?
1115          */
1116         if (upeek(tcp, PT_GPR2, &gpr2) < 0)
1117                 return -1;
1118         if (syscall_mode != -ENOSYS)
1119                 syscall_mode = tcp->scno;
1120         if (gpr2 != syscall_mode) {
1121                 if (debug_flag)
1122                         fprintf(stderr, "not a syscall entry (gpr2 = %ld)\n", gpr2);
1123                 return 0;
1124         }
1125 #elif defined(M68K)
1126         /* TODO? Eliminate upeek's in arches below like we did in x86 */
1127         if (upeek(tcp, 4*PT_D0, &d0) < 0)
1128                 return -1;
1129         if (d0 != -ENOSYS) {
1130                 if (debug_flag)
1131                         fprintf(stderr, "not a syscall entry (d0 = %ld)\n", d0);
1132                 return 0;
1133         }
1134 #elif defined(IA64)
1135         if (upeek(tcp, PT_R10, &r10) < 0)
1136                 return -1;
1137         if (upeek(tcp, PT_R8, &r8) < 0)
1138                 return -1;
1139         if (ia32 && r8 != -ENOSYS) {
1140                 if (debug_flag)
1141                         fprintf(stderr, "not a syscall entry (r8 = %ld)\n", r8);
1142                 return 0;
1143         }
1144 #elif defined(CRISV10) || defined(CRISV32)
1145         if (upeek(tcp, 4*PT_R10, &r10) < 0)
1146                 return -1;
1147         if (r10 != -ENOSYS) {
1148                 if (debug_flag)
1149                         fprintf(stderr, "not a syscall entry (r10 = %ld)\n", r10);
1150                 return 0;
1151         }
1152 #elif defined(MICROBLAZE)
1153         if (upeek(tcp, 3 * 4, &r3) < 0)
1154                 return -1;
1155         if (r3 != -ENOSYS) {
1156                 if (debug_flag)
1157                         fprintf(stderr, "not a syscall entry (r3 = %ld)\n", r3);
1158                 return 0;
1159         }
1160 #endif
1161         return 1;
1162 }
1163
1164 static void
1165 internal_fork(struct tcb *tcp)
1166 {
1167 #if defined S390 || defined S390X || defined CRISV10 || defined CRISV32
1168 # define ARG_FLAGS      1
1169 #else
1170 # define ARG_FLAGS      0
1171 #endif
1172 #ifndef CLONE_UNTRACED
1173 # define CLONE_UNTRACED 0x00800000
1174 #endif
1175         if ((ptrace_setoptions
1176             & (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
1177            == (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
1178                 return;
1179
1180         if (!followfork)
1181                 return;
1182
1183         if (entering(tcp)) {
1184                 /*
1185                  * We won't see the new child if clone is called with
1186                  * CLONE_UNTRACED, so we keep the same logic with that option
1187                  * and don't trace it.
1188                  */
1189                 if ((sysent[tcp->scno].sys_func == sys_clone) &&
1190                     (tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED))
1191                         return;
1192                 setbpt(tcp);
1193         } else {
1194                 if (tcp->flags & TCB_BPTSET)
1195                         clearbpt(tcp);
1196         }
1197 }
1198
1199 #if defined(TCB_WAITEXECVE)
1200 static void
1201 internal_exec(struct tcb *tcp)
1202 {
1203         /* Maybe we have post-execve SIGTRAP suppressed? */
1204         if (ptrace_setoptions & PTRACE_O_TRACEEXEC)
1205                 return; /* yes, no need to do anything */
1206
1207         if (exiting(tcp) && syserror(tcp))
1208                 /* Error in execve, no post-execve SIGTRAP expected */
1209                 tcp->flags &= ~TCB_WAITEXECVE;
1210         else
1211                 tcp->flags |= TCB_WAITEXECVE;
1212 }
1213 #endif
1214
1215 static void
1216 internal_syscall(struct tcb *tcp)
1217 {
1218         /*
1219          * We must always trace a few critical system calls in order to
1220          * correctly support following forks in the presence of tracing
1221          * qualifiers.
1222          */
1223         int (*func)();
1224
1225         if (!SCNO_IN_RANGE(tcp->scno))
1226                 return;
1227
1228         func = sysent[tcp->scno].sys_func;
1229
1230         if (   sys_fork == func
1231             || sys_vfork == func
1232             || sys_clone == func
1233            ) {
1234                 internal_fork(tcp);
1235                 return;
1236         }
1237
1238 #if defined(TCB_WAITEXECVE)
1239         if (   sys_execve == func
1240 # if defined(SPARC) || defined(SPARC64)
1241             || sys_execv == func
1242 # endif
1243            ) {
1244                 internal_exec(tcp);
1245                 return;
1246         }
1247 #endif
1248 }
1249
1250 /* Return -1 on error or 1 on success (never 0!) */
1251 static int
1252 get_syscall_args(struct tcb *tcp)
1253 {
1254         int i, nargs;
1255
1256         if (SCNO_IN_RANGE(tcp->scno))
1257                 nargs = tcp->u_nargs = sysent[tcp->scno].nargs;
1258         else
1259                 nargs = tcp->u_nargs = MAX_ARGS;
1260
1261 #if defined(S390) || defined(S390X)
1262         for (i = 0; i < nargs; ++i)
1263                 if (upeek(tcp, i==0 ? PT_ORIGGPR2 : PT_GPR2 + i*sizeof(long), &tcp->u_arg[i]) < 0)
1264                         return -1;
1265 #elif defined(ALPHA)
1266         for (i = 0; i < nargs; ++i)
1267                 if (upeek(tcp, REG_A0+i, &tcp->u_arg[i]) < 0)
1268                         return -1;
1269 #elif defined(IA64)
1270         if (!ia32) {
1271                 unsigned long *out0, cfm, sof, sol;
1272                 long rbs_end;
1273                 /* be backwards compatible with kernel < 2.4.4... */
1274 #               ifndef PT_RBS_END
1275 #                 define PT_RBS_END     PT_AR_BSP
1276 #               endif
1277
1278                 if (upeek(tcp, PT_RBS_END, &rbs_end) < 0)
1279                         return -1;
1280                 if (upeek(tcp, PT_CFM, (long *) &cfm) < 0)
1281                         return -1;
1282
1283                 sof = (cfm >> 0) & 0x7f;
1284                 sol = (cfm >> 7) & 0x7f;
1285                 out0 = ia64_rse_skip_regs((unsigned long *) rbs_end, -sof + sol);
1286
1287                 for (i = 0; i < nargs; ++i) {
1288                         if (umoven(tcp, (unsigned long) ia64_rse_skip_regs(out0, i),
1289                                    sizeof(long), (char *) &tcp->u_arg[i]) < 0)
1290                                 return -1;
1291                 }
1292         } else {
1293                 static const int argreg[MAX_ARGS] = { PT_R11 /* EBX = out0 */,
1294                                                       PT_R9  /* ECX = out1 */,
1295                                                       PT_R10 /* EDX = out2 */,
1296                                                       PT_R14 /* ESI = out3 */,
1297                                                       PT_R15 /* EDI = out4 */,
1298                                                       PT_R13 /* EBP = out5 */};
1299
1300                 for (i = 0; i < nargs; ++i) {
1301                         if (upeek(tcp, argreg[i], &tcp->u_arg[i]) < 0)
1302                                 return -1;
1303                         /* truncate away IVE sign-extension */
1304                         tcp->u_arg[i] &= 0xffffffff;
1305                 }
1306         }
1307 #elif defined(LINUX_MIPSN32) || defined(LINUX_MIPSN64)
1308         /* N32 and N64 both use up to six registers.  */
1309         unsigned long long regs[38];
1310
1311         if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &regs) < 0)
1312                 return -1;
1313
1314         for (i = 0; i < nargs; ++i) {
1315                 tcp->u_arg[i] = regs[REG_A0 + i];
1316 # if defined(LINUX_MIPSN32)
1317                 tcp->ext_arg[i] = regs[REG_A0 + i];
1318 # endif
1319         }
1320 #elif defined(MIPS)
1321         if (nargs > 4) {
1322                 long sp;
1323
1324                 if (upeek(tcp, REG_SP, &sp) < 0)
1325                         return -1;
1326                 for (i = 0; i < 4; ++i)
1327                         if (upeek(tcp, REG_A0 + i, &tcp->u_arg[i]) < 0)
1328                                 return -1;
1329                 umoven(tcp, sp + 16, (nargs - 4) * sizeof(tcp->u_arg[0]),
1330                        (char *)(tcp->u_arg + 4));
1331         } else {
1332                 for (i = 0; i < nargs; ++i)
1333                         if (upeek(tcp, REG_A0 + i, &tcp->u_arg[i]) < 0)
1334                                 return -1;
1335         }
1336 #elif defined(POWERPC)
1337 # ifndef PT_ORIG_R3
1338 #  define PT_ORIG_R3 34
1339 # endif
1340         for (i = 0; i < nargs; ++i) {
1341                 if (upeek(tcp, (i==0) ?
1342                         (sizeof(unsigned long) * PT_ORIG_R3) :
1343                         ((i+PT_R3) * sizeof(unsigned long)),
1344                                 &tcp->u_arg[i]) < 0)
1345                         return -1;
1346         }
1347 #elif defined(SPARC) || defined(SPARC64)
1348         for (i = 0; i < nargs; ++i)
1349                 tcp->u_arg[i] = regs.u_regs[U_REG_O0 + i];
1350 #elif defined(HPPA)
1351         for (i = 0; i < nargs; ++i)
1352                 if (upeek(tcp, PT_GR26-4*i, &tcp->u_arg[i]) < 0)
1353                         return -1;
1354 #elif defined(ARM)
1355         for (i = 0; i < nargs; ++i)
1356                 tcp->u_arg[i] = regs.uregs[i];
1357 #elif defined(AVR32)
1358         (void)i;
1359         (void)nargs;
1360         tcp->u_arg[0] = regs.r12;
1361         tcp->u_arg[1] = regs.r11;
1362         tcp->u_arg[2] = regs.r10;
1363         tcp->u_arg[3] = regs.r9;
1364         tcp->u_arg[4] = regs.r5;
1365         tcp->u_arg[5] = regs.r3;
1366 #elif defined(BFIN)
1367         static const int argreg[MAX_ARGS] = { PT_R0, PT_R1, PT_R2, PT_R3, PT_R4, PT_R5 };
1368
1369         for (i = 0; i < nargs; ++i)
1370                 if (upeek(tcp, argreg[i], &tcp->u_arg[i]) < 0)
1371                         return -1;
1372 #elif defined(SH)
1373         static const int syscall_regs[MAX_ARGS] = {
1374                 4 * (REG_REG0+4), 4 * (REG_REG0+5), 4 * (REG_REG0+6),
1375                 4 * (REG_REG0+7), 4 * (REG_REG0  ), 4 * (REG_REG0+1)
1376         };
1377
1378         for (i = 0; i < nargs; ++i)
1379                 if (upeek(tcp, syscall_regs[i], &tcp->u_arg[i]) < 0)
1380                         return -1;
1381 #elif defined(SH64)
1382         int i;
1383         /* Registers used by SH5 Linux system calls for parameters */
1384         static const int syscall_regs[MAX_ARGS] = { 2, 3, 4, 5, 6, 7 };
1385
1386         for (i = 0; i < nargs; ++i)
1387                 if (upeek(tcp, REG_GENERAL(syscall_regs[i]), &tcp->u_arg[i]) < 0)
1388                         return -1;
1389 #elif defined(X86_64)
1390         (void)i;
1391         (void)nargs;
1392         if (current_personality == 0) { /* x86-64 ABI */
1393                 tcp->u_arg[0] = x86_64_regs.rdi;
1394                 tcp->u_arg[1] = x86_64_regs.rsi;
1395                 tcp->u_arg[2] = x86_64_regs.rdx;
1396                 tcp->u_arg[3] = x86_64_regs.r10;
1397                 tcp->u_arg[4] = x86_64_regs.r8;
1398                 tcp->u_arg[5] = x86_64_regs.r9;
1399         } else { /* i386 ABI */
1400                 /* Sign-extend lower 32 bits */
1401                 tcp->u_arg[0] = (long)(int)x86_64_regs.rbx;
1402                 tcp->u_arg[1] = (long)(int)x86_64_regs.rcx;
1403                 tcp->u_arg[2] = (long)(int)x86_64_regs.rdx;
1404                 tcp->u_arg[3] = (long)(int)x86_64_regs.rsi;
1405                 tcp->u_arg[4] = (long)(int)x86_64_regs.rdi;
1406                 tcp->u_arg[5] = (long)(int)x86_64_regs.rbp;
1407         }
1408 #elif defined(MICROBLAZE)
1409         for (i = 0; i < nargs; ++i)
1410                 if (upeek(tcp, (5 + i) * 4, &tcp->u_arg[i]) < 0)
1411                         return -1;
1412 #elif defined(CRISV10) || defined(CRISV32)
1413         static const int crisregs[MAX_ARGS] = {
1414                 4*PT_ORIG_R10, 4*PT_R11, 4*PT_R12,
1415                 4*PT_R13     , 4*PT_MOF, 4*PT_SRP
1416         };
1417
1418         for (i = 0; i < nargs; ++i)
1419                 if (upeek(tcp, crisregs[i], &tcp->u_arg[i]) < 0)
1420                         return -1;
1421 #elif defined(TILE)
1422         for (i = 0; i < nargs; ++i)
1423                 if (upeek(tcp, PTREGS_OFFSET_REG(i), &tcp->u_arg[i]) < 0)
1424                         return -1;
1425 #elif defined(M68K)
1426         for (i = 0; i < nargs; ++i)
1427                 if (upeek(tcp, (i < 5 ? i : i + 2)*4, &tcp->u_arg[i]) < 0)
1428                         return -1;
1429 #elif defined(I386)
1430         (void)i;
1431         (void)nargs;
1432         tcp->u_arg[0] = i386_regs.ebx;
1433         tcp->u_arg[1] = i386_regs.ecx;
1434         tcp->u_arg[2] = i386_regs.edx;
1435         tcp->u_arg[3] = i386_regs.esi;
1436         tcp->u_arg[4] = i386_regs.edi;
1437         tcp->u_arg[5] = i386_regs.ebp;
1438 #else /* Other architecture (32bits specific) */
1439         for (i = 0; i < nargs; ++i)
1440                 if (upeek(tcp, i*4, &tcp->u_arg[i]) < 0)
1441                         return -1;
1442 #endif
1443         return 1;
1444 }
1445
1446 static int
1447 trace_syscall_entering(struct tcb *tcp)
1448 {
1449         int res, scno_good;
1450
1451 #if defined TCB_WAITEXECVE
1452         if (tcp->flags & TCB_WAITEXECVE) {
1453                 /* This is the post-execve SIGTRAP. */
1454                 tcp->flags &= ~TCB_WAITEXECVE;
1455                 return 0;
1456         }
1457 #endif
1458
1459         scno_good = res = get_scno(tcp);
1460         if (res == 0)
1461                 return res;
1462         if (res == 1)
1463                 res = syscall_fixup_on_sysenter(tcp);
1464         if (res == 0)
1465                 return res;
1466         if (res == 1)
1467                 res = get_syscall_args(tcp);
1468
1469         if (res != 1) {
1470                 printleader(tcp);
1471                 tcp->flags &= ~TCB_REPRINT;
1472                 if (scno_good != 1)
1473                         tprints("????" /* anti-trigraph gap */ "(");
1474                 else if (!SCNO_IN_RANGE(tcp->scno))
1475                         tprintf("syscall_%lu(", tcp->scno);
1476                 else
1477                         tprintf("%s(", sysent[tcp->scno].sys_name);
1478                 /*
1479                  * " <unavailable>" will be added later by the code which
1480                  * detects ptrace errors.
1481                  */
1482                 goto ret;
1483         }
1484
1485 #if defined(SYS_socket_subcall) || defined(SYS_ipc_subcall)
1486         while (SCNO_IN_RANGE(tcp->scno)) {
1487 # ifdef SYS_socket_subcall
1488                 if (sysent[tcp->scno].sys_func == sys_socketcall) {
1489                         decode_socket_subcall(tcp);
1490                         break;
1491                 }
1492 # endif
1493 # ifdef SYS_ipc_subcall
1494                 if (sysent[tcp->scno].sys_func == sys_ipc) {
1495                         decode_ipc_subcall(tcp);
1496                         break;
1497                 }
1498 # endif
1499                 break;
1500         }
1501 #endif /* SYS_socket_subcall || SYS_ipc_subcall */
1502
1503         internal_syscall(tcp);
1504
1505         if ((SCNO_IN_RANGE(tcp->scno) &&
1506              !(qual_flags[tcp->scno] & QUAL_TRACE)) ||
1507             (tracing_paths && !pathtrace_match(tcp))) {
1508                 tcp->flags |= TCB_INSYSCALL | TCB_FILTERED;
1509                 return 0;
1510         }
1511
1512         tcp->flags &= ~TCB_FILTERED;
1513
1514         if (cflag == CFLAG_ONLY_STATS) {
1515                 res = 0;
1516                 goto ret;
1517         }
1518
1519         printleader(tcp);
1520         tcp->flags &= ~TCB_REPRINT;
1521         if (!SCNO_IN_RANGE(tcp->scno))
1522                 tprintf("syscall_%lu(", tcp->scno);
1523         else
1524                 tprintf("%s(", sysent[tcp->scno].sys_name);
1525         if (!SCNO_IN_RANGE(tcp->scno) ||
1526             ((qual_flags[tcp->scno] & QUAL_RAW) &&
1527              sysent[tcp->scno].sys_func != sys_exit))
1528                 res = printargs(tcp);
1529         else
1530                 res = (*sysent[tcp->scno].sys_func)(tcp);
1531
1532         if (fflush(tcp->outf) == EOF)
1533                 return -1;
1534  ret:
1535         tcp->flags |= TCB_INSYSCALL;
1536         /* Measure the entrance time as late as possible to avoid errors. */
1537         if (Tflag || cflag)
1538                 gettimeofday(&tcp->etime, NULL);
1539         return res;
1540 }
1541
1542 /* Returns:
1543  * 0: "ignore this ptrace stop", bail out of trace_syscall() silently.
1544  * 1: ok, continue in trace_syscall().
1545  * other: error, trace_syscall() should print error indicator
1546  *    ("????" etc) and bail out.
1547  */
1548 static int
1549 get_syscall_result(struct tcb *tcp)
1550 {
1551 #if defined(S390) || defined(S390X)
1552         if (upeek(tcp, PT_GPR2, &gpr2) < 0)
1553                 return -1;
1554 #elif defined(POWERPC)
1555 # define SO_MASK 0x10000000
1556         {
1557                 long flags;
1558                 if (upeek(tcp, sizeof(unsigned long)*PT_CCR, &flags) < 0)
1559                         return -1;
1560                 if (upeek(tcp, sizeof(unsigned long)*PT_R3, &result) < 0)
1561                         return -1;
1562                 if (flags & SO_MASK)
1563                         result = -result;
1564         }
1565 #elif defined(AVR32)
1566         /* Read complete register set in one go. */
1567         if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, &regs) < 0)
1568                 return -1;
1569 #elif defined(BFIN)
1570         if (upeek(tcp, PT_R0, &r0) < 0)
1571                 return -1;
1572 #elif defined(I386)
1573         if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &i386_regs) < 0)
1574                 return -1;
1575 #elif defined(X86_64)
1576         if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &x86_64_regs) < 0)
1577                 return -1;
1578 #elif defined(IA64)
1579 #       define IA64_PSR_IS      ((long)1 << 34)
1580         if (upeek(tcp, PT_CR_IPSR, &psr) >= 0)
1581                 ia32 = (psr & IA64_PSR_IS) != 0;
1582         if (upeek(tcp, PT_R8, &r8) < 0)
1583                 return -1;
1584         if (upeek(tcp, PT_R10, &r10) < 0)
1585                 return -1;
1586 #elif defined(ARM)
1587         /* Read complete register set in one go. */
1588         if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (void *)&regs) == -1)
1589                 return -1;
1590 #elif defined(M68K)
1591         if (upeek(tcp, 4*PT_D0, &d0) < 0)
1592                 return -1;
1593 #elif defined(LINUX_MIPSN32)
1594         unsigned long long regs[38];
1595
1596         if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &regs) < 0)
1597                 return -1;
1598         a3 = regs[REG_A3];
1599         r2 = regs[REG_V0];
1600 #elif defined(MIPS)
1601         if (upeek(tcp, REG_A3, &a3) < 0)
1602                 return -1;
1603         if (upeek(tcp, REG_V0, &r2) < 0)
1604                 return -1;
1605 #elif defined(ALPHA)
1606         if (upeek(tcp, REG_A3, &a3) < 0)
1607                 return -1;
1608         if (upeek(tcp, REG_R0, &r0) < 0)
1609                 return -1;
1610 #elif defined(SPARC) || defined(SPARC64)
1611         /* Everything we need is in the current register set. */
1612         if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)&regs, 0) < 0)
1613                 return -1;
1614 #elif defined(HPPA)
1615         if (upeek(tcp, PT_GR28, &r28) < 0)
1616                 return -1;
1617 #elif defined(SH)
1618 #elif defined(SH64)
1619 #elif defined(CRISV10) || defined(CRISV32)
1620         if (upeek(tcp, 4*PT_R10, &r10) < 0)
1621                 return -1;
1622 #elif defined(TILE)
1623 #elif defined(MICROBLAZE)
1624         if (upeek(tcp, 3 * 4, &r3) < 0)
1625                 return -1;
1626 #endif
1627
1628 #if defined(SH)
1629         /* new syscall ABI returns result in R0 */
1630         if (upeek(tcp, 4*REG_REG0, (long *)&r0) < 0)
1631                 return -1;
1632 #elif defined(SH64)
1633         /* ABI defines result returned in r9 */
1634         if (upeek(tcp, REG_GENERAL(9), (long *)&r9) < 0)
1635                 return -1;
1636 #endif
1637
1638         return 1;
1639 }
1640
1641 /* Called at each syscall exit */
1642 static void
1643 syscall_fixup_on_sysexit(struct tcb *tcp)
1644 {
1645 #if defined(S390) || defined(S390X)
1646         if (syscall_mode != -ENOSYS)
1647                 syscall_mode = tcp->scno;
1648         if ((tcp->flags & TCB_WAITEXECVE)
1649                  && (gpr2 == -ENOSYS || gpr2 == tcp->scno)) {
1650                 /*
1651                  * Return from execve.
1652                  * Fake a return value of zero.  We leave the TCB_WAITEXECVE
1653                  * flag set for the post-execve SIGTRAP to see and reset.
1654                  */
1655                 gpr2 = 0;
1656         }
1657 #endif
1658 }
1659
1660 /*
1661  * Check the syscall return value register value for whether it is
1662  * a negated errno code indicating an error, or a success return value.
1663  */
1664 static inline int
1665 is_negated_errno(unsigned long int val)
1666 {
1667         unsigned long int max = -(long int) nerrnos;
1668 #if SUPPORTED_PERSONALITIES > 1
1669         if (current_wordsize < sizeof(val)) {
1670                 val = (unsigned int) val;
1671                 max = (unsigned int) max;
1672         }
1673 #endif
1674         return val > max;
1675 }
1676
1677 static int
1678 get_error(struct tcb *tcp)
1679 {
1680         int u_error = 0;
1681         int check_errno = 1;
1682         if (SCNO_IN_RANGE(tcp->scno) &&
1683             sysent[tcp->scno].sys_flags & SYSCALL_NEVER_FAILS) {
1684                 check_errno = 0;
1685         }
1686 #if defined(S390) || defined(S390X)
1687         if (check_errno && is_negated_errno(gpr2)) {
1688                 tcp->u_rval = -1;
1689                 u_error = -gpr2;
1690         }
1691         else {
1692                 tcp->u_rval = gpr2;
1693         }
1694 #elif defined(I386)
1695         if (check_errno && is_negated_errno(i386_regs.eax)) {
1696                 tcp->u_rval = -1;
1697                 u_error = -i386_regs.eax;
1698         }
1699         else {
1700                 tcp->u_rval = i386_regs.eax;
1701         }
1702 #elif defined(X86_64)
1703         if (check_errno && is_negated_errno(x86_64_regs.rax)) {
1704                 tcp->u_rval = -1;
1705                 u_error = -x86_64_regs.rax;
1706         }
1707         else {
1708                 tcp->u_rval = x86_64_regs.rax;
1709         }
1710 #elif defined(IA64)
1711         if (ia32) {
1712                 int err;
1713
1714                 err = (int)r8;
1715                 if (check_errno && is_negated_errno(err)) {
1716                         tcp->u_rval = -1;
1717                         u_error = -err;
1718                 }
1719                 else {
1720                         tcp->u_rval = err;
1721                 }
1722         } else {
1723                 if (check_errno && r10) {
1724                         tcp->u_rval = -1;
1725                         u_error = r8;
1726                 } else {
1727                         tcp->u_rval = r8;
1728                 }
1729         }
1730 #elif defined(MIPS)
1731         if (check_errno && a3) {
1732                 tcp->u_rval = -1;
1733                 u_error = r2;
1734         } else {
1735                 tcp->u_rval = r2;
1736         }
1737 #elif defined(POWERPC)
1738         if (check_errno && is_negated_errno(result)) {
1739                 tcp->u_rval = -1;
1740                 u_error = -result;
1741         }
1742         else {
1743                 tcp->u_rval = result;
1744         }
1745 #elif defined(M68K)
1746         if (check_errno && is_negated_errno(d0)) {
1747                 tcp->u_rval = -1;
1748                 u_error = -d0;
1749         }
1750         else {
1751                 tcp->u_rval = d0;
1752         }
1753 #elif defined(ARM)
1754         if (check_errno && is_negated_errno(regs.ARM_r0)) {
1755                 tcp->u_rval = -1;
1756                 u_error = -regs.ARM_r0;
1757         }
1758         else {
1759                 tcp->u_rval = regs.ARM_r0;
1760         }
1761 #elif defined(AVR32)
1762         if (check_errno && regs.r12 && (unsigned) -regs.r12 < nerrnos) {
1763                 tcp->u_rval = -1;
1764                 u_error = -regs.r12;
1765         }
1766         else {
1767                 tcp->u_rval = regs.r12;
1768         }
1769 #elif defined(BFIN)
1770         if (check_errno && is_negated_errno(r0)) {
1771                 tcp->u_rval = -1;
1772                 u_error = -r0;
1773         } else {
1774                 tcp->u_rval = r0;
1775         }
1776 #elif defined(ALPHA)
1777         if (check_errno && a3) {
1778                 tcp->u_rval = -1;
1779                 u_error = r0;
1780         }
1781         else {
1782                 tcp->u_rval = r0;
1783         }
1784 #elif defined(SPARC)
1785         if (check_errno && regs.psr & PSR_C) {
1786                 tcp->u_rval = -1;
1787                 u_error = regs.u_regs[U_REG_O0];
1788         }
1789         else {
1790                 tcp->u_rval = regs.u_regs[U_REG_O0];
1791         }
1792 #elif defined(SPARC64)
1793         if (check_errno && regs.tstate & 0x1100000000UL) {
1794                 tcp->u_rval = -1;
1795                 u_error = regs.u_regs[U_REG_O0];
1796         }
1797         else {
1798                 tcp->u_rval = regs.u_regs[U_REG_O0];
1799         }
1800 #elif defined(HPPA)
1801         if (check_errno && is_negated_errno(r28)) {
1802                 tcp->u_rval = -1;
1803                 u_error = -r28;
1804         }
1805         else {
1806                 tcp->u_rval = r28;
1807         }
1808 #elif defined(SH)
1809         if (check_errno && is_negated_errno(r0)) {
1810                 tcp->u_rval = -1;
1811                 u_error = -r0;
1812         }
1813         else {
1814                 tcp->u_rval = r0;
1815         }
1816 #elif defined(SH64)
1817         if (check_errno && is_negated_errno(r9)) {
1818                 tcp->u_rval = -1;
1819                 u_error = -r9;
1820         }
1821         else {
1822                 tcp->u_rval = r9;
1823         }
1824 #elif defined(CRISV10) || defined(CRISV32)
1825         if (check_errno && r10 && (unsigned) -r10 < nerrnos) {
1826                 tcp->u_rval = -1;
1827                 u_error = -r10;
1828         }
1829         else {
1830                 tcp->u_rval = r10;
1831         }
1832 #elif defined(TILE)
1833         long rval;
1834         if (upeek(tcp, PTREGS_OFFSET_REG(0), &rval) < 0)
1835                 return -1;
1836         if (check_errno && rval < 0 && rval > -nerrnos) {
1837                 tcp->u_rval = -1;
1838                 u_error = -rval;
1839         }
1840         else {
1841                 tcp->u_rval = rval;
1842         }
1843 #elif defined(MICROBLAZE)
1844         if (check_errno && is_negated_errno(r3)) {
1845                 tcp->u_rval = -1;
1846                 u_error = -r3;
1847         }
1848         else {
1849                 tcp->u_rval = r3;
1850         }
1851 #endif
1852         tcp->u_error = u_error;
1853         return 1;
1854 }
1855
1856 static void
1857 dumpio(struct tcb *tcp)
1858 {
1859         if (syserror(tcp))
1860                 return;
1861         if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= MAX_QUALS)
1862                 return;
1863         if (!SCNO_IN_RANGE(tcp->scno))
1864                 return;
1865         if (sysent[tcp->scno].sys_func == printargs)
1866                 return;
1867         if (qual_flags[tcp->u_arg[0]] & QUAL_READ) {
1868                 if (sysent[tcp->scno].sys_func == sys_read ||
1869                     sysent[tcp->scno].sys_func == sys_pread ||
1870                     sysent[tcp->scno].sys_func == sys_recv ||
1871                     sysent[tcp->scno].sys_func == sys_recvfrom)
1872                         dumpstr(tcp, tcp->u_arg[1], tcp->u_rval);
1873                 else if (sysent[tcp->scno].sys_func == sys_readv)
1874                         dumpiov(tcp, tcp->u_arg[2], tcp->u_arg[1]);
1875                 return;
1876         }
1877         if (qual_flags[tcp->u_arg[0]] & QUAL_WRITE) {
1878                 if (sysent[tcp->scno].sys_func == sys_write ||
1879                     sysent[tcp->scno].sys_func == sys_pwrite ||
1880                     sysent[tcp->scno].sys_func == sys_send ||
1881                     sysent[tcp->scno].sys_func == sys_sendto)
1882                         dumpstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1883                 else if (sysent[tcp->scno].sys_func == sys_writev)
1884                         dumpiov(tcp, tcp->u_arg[2], tcp->u_arg[1]);
1885                 return;
1886         }
1887 }
1888
1889 static int
1890 trace_syscall_exiting(struct tcb *tcp)
1891 {
1892         int sys_res;
1893         struct timeval tv;
1894         int res;
1895         long u_error;
1896
1897         /* Measure the exit time as early as possible to avoid errors. */
1898         if (Tflag || cflag)
1899                 gettimeofday(&tv, NULL);
1900
1901 #if SUPPORTED_PERSONALITIES > 1
1902         update_personality(tcp, tcp->currpers);
1903 #endif
1904         res = get_syscall_result(tcp);
1905         if (res == 0)
1906                 return res;
1907         if (res == 1) {
1908                 syscall_fixup_on_sysexit(tcp); /* never fails */
1909                 res = get_error(tcp);
1910         }
1911         if (res == 0)
1912                 return res;
1913         if (res == 1)
1914                 internal_syscall(tcp);
1915
1916         if (res == 1 && filtered(tcp)) {
1917                 goto ret;
1918         }
1919
1920         /* TODO: TCB_REPRINT is probably not necessary:
1921          * we can determine whether reprinting is needed
1922          * by examining printing_tcp. Something like:
1923          * if not in -ff mode, and printing_tcp != tcp,
1924          * then the log is not currenlty ends with *our*
1925          * syscall entry output, but with something else,
1926          * and we need to reprint.
1927          * If we'd implement this, printing_tcp = tcp
1928          * assignments in code below can be made more logical.
1929          */
1930
1931         if (tcp->flags & TCB_REPRINT) {
1932                 printleader(tcp);
1933                 if (!SCNO_IN_RANGE(tcp->scno))
1934                         tprintf("<... syscall_%lu resumed> ", tcp->scno);
1935                 else
1936                         tprintf("<... %s resumed> ", sysent[tcp->scno].sys_name);
1937         }
1938
1939         if (cflag) {
1940                 struct timeval t = tv;
1941                 count_syscall(tcp, &t);
1942                 if (cflag == CFLAG_ONLY_STATS) {
1943                         goto ret;
1944                 }
1945         }
1946
1947         if (res != 1) {
1948                 printing_tcp = tcp;
1949                 tprints(") ");
1950                 tabto();
1951                 tprints("= ? <unavailable>\n");
1952                 line_ended();
1953                 tcp->flags &= ~TCB_INSYSCALL;
1954                 return res;
1955         }
1956
1957         if (!SCNO_IN_RANGE(tcp->scno)
1958             || (qual_flags[tcp->scno] & QUAL_RAW)) {
1959                 printing_tcp = tcp;
1960                 sys_res = printargs(tcp);
1961         } else {
1962         /* FIXME: not_failing_only (IOW, option -z) is broken:
1963          * failure of syscall is known only after syscall return.
1964          * Thus we end up with something like this on, say, ENOENT:
1965          *     open("doesnt_exist", O_RDONLY <unfinished ...>
1966          *     {next syscall decode}
1967          * whereas the intended result is that open(...) line
1968          * is not shown at all.
1969          */
1970                 if (not_failing_only && tcp->u_error)
1971                         goto ret;       /* ignore failed syscalls */
1972                 printing_tcp = tcp;
1973                 sys_res = (*sysent[tcp->scno].sys_func)(tcp);
1974         }
1975
1976         tprints(") ");
1977         tabto();
1978         u_error = tcp->u_error;
1979         if (!SCNO_IN_RANGE(tcp->scno) ||
1980             qual_flags[tcp->scno] & QUAL_RAW) {
1981                 if (u_error)
1982                         tprintf("= -1 (errno %ld)", u_error);
1983                 else
1984                         tprintf("= %#lx", tcp->u_rval);
1985         }
1986         else if (!(sys_res & RVAL_NONE) && u_error) {
1987                 switch (u_error) {
1988                 /* Blocked signals do not interrupt any syscalls.
1989                  * In this case syscalls don't return ERESTARTfoo codes.
1990                  *
1991                  * Deadly signals set to SIG_DFL interrupt syscalls
1992                  * and kill the process regardless of which of the codes below
1993                  * is returned by the interrupted syscall.
1994                  * In some cases, kernel forces a kernel-generated deadly
1995                  * signal to be unblocked and set to SIG_DFL (and thus cause
1996                  * death) if it is blocked or SIG_IGNed: for example, SIGSEGV
1997                  * or SIGILL. (The alternative is to leave process spinning
1998                  * forever on the faulty instruction - not useful).
1999                  *
2000                  * SIG_IGNed signals and non-deadly signals set to SIG_DFL
2001                  * (for example, SIGCHLD, SIGWINCH) interrupt syscalls,
2002                  * but kernel will always restart them.
2003                  */
2004                 case ERESTARTSYS:
2005                         /* Most common type of signal-interrupted syscall exit code.
2006                          * The system call will be restarted with the same arguments
2007                          * if SA_RESTART is set; otherwise, it will fail with EINTR.
2008                          */
2009                         tprints("= ? ERESTARTSYS (To be restarted if SA_RESTART is set)");
2010                         break;
2011                 case ERESTARTNOINTR:
2012                         /* Rare. For example, fork() returns this if interrupted.
2013                          * SA_RESTART is ignored (assumed set): the restart is unconditional.
2014                          */
2015                         tprints("= ? ERESTARTNOINTR (To be restarted)");
2016                         break;
2017                 case ERESTARTNOHAND:
2018                         /* pause(), rt_sigsuspend() etc use this code.
2019                          * SA_RESTART is ignored (assumed not set):
2020                          * syscall won't restart (will return EINTR instead)
2021                          * even after signal with SA_RESTART set.
2022                          * However, after SIG_IGN or SIG_DFL signal it will.
2023                          */
2024                         tprints("= ? ERESTARTNOHAND (Interrupted by signal)");
2025                         break;
2026                 case ERESTART_RESTARTBLOCK:
2027                         /* Syscalls like nanosleep(), poll() which can't be
2028                          * restarted with their original arguments use this
2029                          * code. Kernel will execute restart_syscall() instead,
2030                          * which changes arguments before restarting syscall.
2031                          * SA_RESTART is ignored (assumed not set) similarly
2032                          * to ERESTARTNOHAND. (Kernel can't honor SA_RESTART
2033                          * since restart data is saved in "restart block"
2034                          * in task struct, and if signal handler uses a syscall
2035                          * which in turn saves another such restart block,
2036                          * old data is lost and restart becomes impossible)
2037                          */
2038                         tprints("= ? ERESTART_RESTARTBLOCK (Interrupted by signal)");
2039                         break;
2040                 default:
2041                         if (u_error < 0)
2042                                 tprintf("= -1 E??? (errno %ld)", u_error);
2043                         else if (u_error < nerrnos)
2044                                 tprintf("= -1 %s (%s)", errnoent[u_error],
2045                                         strerror(u_error));
2046                         else
2047                                 tprintf("= -1 ERRNO_%ld (%s)", u_error,
2048                                         strerror(u_error));
2049                         break;
2050                 }
2051                 if ((sys_res & RVAL_STR) && tcp->auxstr)
2052                         tprintf(" (%s)", tcp->auxstr);
2053         }
2054         else {
2055                 if (sys_res & RVAL_NONE)
2056                         tprints("= ?");
2057                 else {
2058                         switch (sys_res & RVAL_MASK) {
2059                         case RVAL_HEX:
2060                                 tprintf("= %#lx", tcp->u_rval);
2061                                 break;
2062                         case RVAL_OCTAL:
2063                                 tprintf("= %#lo", tcp->u_rval);
2064                                 break;
2065                         case RVAL_UDECIMAL:
2066                                 tprintf("= %lu", tcp->u_rval);
2067                                 break;
2068                         case RVAL_DECIMAL:
2069                                 tprintf("= %ld", tcp->u_rval);
2070                                 break;
2071                         default:
2072                                 fprintf(stderr,
2073                                         "invalid rval format\n");
2074                                 break;
2075                         }
2076                 }
2077                 if ((sys_res & RVAL_STR) && tcp->auxstr)
2078                         tprintf(" (%s)", tcp->auxstr);
2079         }
2080         if (Tflag) {
2081                 tv_sub(&tv, &tv, &tcp->etime);
2082                 tprintf(" <%ld.%06ld>",
2083                         (long) tv.tv_sec, (long) tv.tv_usec);
2084         }
2085         tprints("\n");
2086         dumpio(tcp);
2087         line_ended();
2088
2089  ret:
2090         tcp->flags &= ~TCB_INSYSCALL;
2091         return 0;
2092 }
2093
2094 int
2095 trace_syscall(struct tcb *tcp)
2096 {
2097         return exiting(tcp) ?
2098                 trace_syscall_exiting(tcp) : trace_syscall_entering(tcp);
2099 }