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>
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
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.
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.
42 #include <sys/syscall.h>
43 #include <sys/param.h>
47 # ifndef PTRACE_PEEKUSR
48 # define PTRACE_PEEKUSR PTRACE_PEEKUSER
50 #elif defined(HAVE_LINUX_PTRACE_H)
51 # undef PTRACE_SYSCALL
52 # ifdef HAVE_STRUCT_IA64_FPREG
53 # define ia64_fpreg XXX_ia64_fpreg
55 # ifdef HAVE_STRUCT_PT_ALL_USER_REGS
56 # define pt_all_user_regs XXX_pt_all_user_regs
58 # include <linux/ptrace.h>
60 # undef pt_all_user_regs
64 # undef PTRACE_GETREGS
65 # define PTRACE_GETREGS PTRACE_GETREGS64
66 # undef PTRACE_SETREGS
67 # define PTRACE_SETREGS PTRACE_SETREGS64
71 # include <asm/ptrace_offsets.h>
76 # define ERESTARTSYS 512
78 # ifndef ERESTARTNOINTR
79 # define ERESTARTNOINTR 513
81 # ifndef ERESTARTNOHAND
82 # define ERESTARTNOHAND 514 /* restart if no handler.. */
85 # define ENOIOCTLCMD 515 /* No ioctl command */
87 # ifndef ERESTART_RESTARTBLOCK
88 # define ERESTART_RESTARTBLOCK 516 /* restart by calling sys_restart_syscall */
92 # warning: NSIG is not defined, using 32
96 /* Ugh. Is this really correct? ARM has no RT signals?! */
103 /* Define these shorthand notations to simplify the syscallent files. */
104 #define TD TRACE_DESC
105 #define TF TRACE_FILE
107 #define TN TRACE_NETWORK
108 #define TP TRACE_PROCESS
109 #define TS TRACE_SIGNAL
110 #define NF SYSCALL_NEVER_FAILS
113 static const struct sysent sysent0[] = {
114 #include "syscallent.h"
117 #if SUPPORTED_PERSONALITIES >= 2
118 static const struct sysent sysent1[] = {
119 # include "syscallent1.h"
123 #if SUPPORTED_PERSONALITIES >= 3
124 static const struct sysent sysent2[] = {
125 # include "syscallent2.h"
129 /* Now undef them since short defines cause wicked namespace pollution. */
141 * `ioctlent.h' may be generated from `ioctlent.raw' by the auxiliary
142 * program `ioctlsort', such that the list is sorted by the `code' field.
143 * This has the side-effect of resolving the _IO.. macros into
144 * plain integers, eliminating the need to include here everything
149 static const char *const errnoent0[] = {
150 #include "errnoent.h"
152 static const char *const signalent0[] = {
153 #include "signalent.h"
155 static const struct ioctlent ioctlent0[] = {
156 #include "ioctlent.h"
158 enum { nsyscalls0 = ARRAY_SIZE(sysent0) };
159 enum { nerrnos0 = ARRAY_SIZE(errnoent0) };
160 enum { nsignals0 = ARRAY_SIZE(signalent0) };
161 enum { nioctlents0 = ARRAY_SIZE(ioctlent0) };
162 int qual_flags0[MAX_QUALS];
164 #if SUPPORTED_PERSONALITIES >= 2
165 static const char *const errnoent1[] = {
166 # include "errnoent1.h"
168 static const char *const signalent1[] = {
169 # include "signalent1.h"
171 static const struct ioctlent ioctlent1[] = {
172 # include "ioctlent1.h"
174 enum { nsyscalls1 = ARRAY_SIZE(sysent1) };
175 enum { nerrnos1 = ARRAY_SIZE(errnoent1) };
176 enum { nsignals1 = ARRAY_SIZE(signalent1) };
177 enum { nioctlents1 = ARRAY_SIZE(ioctlent1) };
178 int qual_flags1[MAX_QUALS];
181 #if SUPPORTED_PERSONALITIES >= 3
182 static const char *const errnoent2[] = {
183 # include "errnoent2.h"
185 static const char *const signalent2[] = {
186 # include "signalent2.h"
188 static const struct ioctlent ioctlent2[] = {
189 # include "ioctlent2.h"
191 enum { nsyscalls2 = ARRAY_SIZE(sysent2) };
192 enum { nerrnos2 = ARRAY_SIZE(errnoent2) };
193 enum { nsignals2 = ARRAY_SIZE(signalent2) };
194 enum { nioctlents2 = ARRAY_SIZE(ioctlent2) };
195 int qual_flags2[MAX_QUALS];
199 const struct sysent *sysent;
200 const char *const *errnoent;
201 const char *const *signalent;
202 const struct ioctlent *ioctlent;
209 int current_personality;
211 #ifndef PERSONALITY0_WORDSIZE
212 # define PERSONALITY0_WORDSIZE sizeof(long)
214 const int personality_wordsize[SUPPORTED_PERSONALITIES] = {
215 PERSONALITY0_WORDSIZE,
216 #if SUPPORTED_PERSONALITIES > 1
217 PERSONALITY1_WORDSIZE,
219 #if SUPPORTED_PERSONALITIES > 2
220 PERSONALITY2_WORDSIZE,
225 set_personality(int personality)
227 switch (personality) {
229 errnoent = errnoent0;
232 nsyscalls = nsyscalls0;
233 ioctlent = ioctlent0;
234 nioctlents = nioctlents0;
235 signalent = signalent0;
236 nsignals = nsignals0;
237 qual_flags = qual_flags0;
240 #if SUPPORTED_PERSONALITIES >= 2
242 errnoent = errnoent1;
245 nsyscalls = nsyscalls1;
246 ioctlent = ioctlent1;
247 nioctlents = nioctlents1;
248 signalent = signalent1;
249 nsignals = nsignals1;
250 qual_flags = qual_flags1;
254 #if SUPPORTED_PERSONALITIES >= 3
256 errnoent = errnoent2;
259 nsyscalls = nsyscalls2;
260 ioctlent = ioctlent2;
261 nioctlents = nioctlents2;
262 signalent = signalent2;
263 nsignals = nsignals2;
264 qual_flags = qual_flags2;
269 current_personality = personality;
272 #if SUPPORTED_PERSONALITIES > 1
274 update_personality(struct tcb *tcp, int personality)
276 if (personality == current_personality)
278 set_personality(personality);
280 if (personality == tcp->currpers)
282 tcp->currpers = personality;
284 # if defined(POWERPC64) || defined(X86_64)
286 static const char *const names[] = {"64 bit", "32 bit"};
287 fprintf(stderr, "[ Process PID=%d runs in %s mode. ]\n",
288 tcp->pid, names[personality]);
294 static int qual_syscall(), qual_signal(), qual_fault(), qual_desc();
296 static const struct qual_options {
298 const char *option_name;
299 int (*qualify)(const char *, int, int);
300 const char *argument_name;
302 { QUAL_TRACE, "trace", qual_syscall, "system call" },
303 { QUAL_TRACE, "t", qual_syscall, "system call" },
304 { QUAL_ABBREV, "abbrev", qual_syscall, "system call" },
305 { QUAL_ABBREV, "a", qual_syscall, "system call" },
306 { QUAL_VERBOSE, "verbose", qual_syscall, "system call" },
307 { QUAL_VERBOSE, "v", qual_syscall, "system call" },
308 { QUAL_RAW, "raw", qual_syscall, "system call" },
309 { QUAL_RAW, "x", qual_syscall, "system call" },
310 { QUAL_SIGNAL, "signal", qual_signal, "signal" },
311 { QUAL_SIGNAL, "signals", qual_signal, "signal" },
312 { QUAL_SIGNAL, "s", qual_signal, "signal" },
313 { QUAL_FAULT, "fault", qual_fault, "fault" },
314 { QUAL_FAULT, "faults", qual_fault, "fault" },
315 { QUAL_FAULT, "m", qual_fault, "fault" },
316 { QUAL_READ, "read", qual_desc, "descriptor" },
317 { QUAL_READ, "reads", qual_desc, "descriptor" },
318 { QUAL_READ, "r", qual_desc, "descriptor" },
319 { QUAL_WRITE, "write", qual_desc, "descriptor" },
320 { QUAL_WRITE, "writes", qual_desc, "descriptor" },
321 { QUAL_WRITE, "w", qual_desc, "descriptor" },
322 { 0, NULL, NULL, NULL },
326 qualify_one(int n, int bitflag, int not, int pers)
328 if (pers == 0 || pers < 0) {
330 qual_flags0[n] &= ~bitflag;
332 qual_flags0[n] |= bitflag;
335 #if SUPPORTED_PERSONALITIES >= 2
336 if (pers == 1 || pers < 0) {
338 qual_flags1[n] &= ~bitflag;
340 qual_flags1[n] |= bitflag;
344 #if SUPPORTED_PERSONALITIES >= 3
345 if (pers == 2 || pers < 0) {
347 qual_flags2[n] &= ~bitflag;
349 qual_flags2[n] |= bitflag;
355 qual_syscall(const char *s, int bitflag, int not)
360 if (isdigit((unsigned char)*s)) {
362 if (i < 0 || i >= MAX_QUALS)
364 qualify_one(i, bitflag, not, -1);
367 for (i = 0; i < nsyscalls0; i++)
368 if (strcmp(s, sysent0[i].sys_name) == 0) {
369 qualify_one(i, bitflag, not, 0);
373 #if SUPPORTED_PERSONALITIES >= 2
374 for (i = 0; i < nsyscalls1; i++)
375 if (strcmp(s, sysent1[i].sys_name) == 0) {
376 qualify_one(i, bitflag, not, 1);
381 #if SUPPORTED_PERSONALITIES >= 3
382 for (i = 0; i < nsyscalls2; i++)
383 if (strcmp(s, sysent2[i].sys_name) == 0) {
384 qualify_one(i, bitflag, not, 2);
393 qual_signal(const char *s, int bitflag, int not)
398 if (isdigit((unsigned char)*s)) {
400 if (signo < 0 || signo >= MAX_QUALS)
402 qualify_one(signo, bitflag, not, -1);
405 if (strlen(s) >= sizeof buf)
409 if (strncasecmp(s, "SIG", 3) == 0)
411 for (i = 0; i <= NSIG; i++)
412 if (strcasecmp(s, signame(i) + 3) == 0) {
413 qualify_one(i, bitflag, not, -1);
420 qual_fault(const char *s, int bitflag, int not)
426 qual_desc(const char *s, int bitflag, int not)
428 if (isdigit((unsigned char)*s)) {
430 if (desc < 0 || desc >= MAX_QUALS)
432 qualify_one(desc, bitflag, not, -1);
439 lookup_class(const char *s)
441 if (strcmp(s, "file") == 0)
443 if (strcmp(s, "ipc") == 0)
445 if (strcmp(s, "network") == 0)
446 return TRACE_NETWORK;
447 if (strcmp(s, "process") == 0)
448 return TRACE_PROCESS;
449 if (strcmp(s, "signal") == 0)
451 if (strcmp(s, "desc") == 0)
457 qualify(const char *s)
459 const struct qual_options *opt;
465 opt = &qual_options[0];
466 for (i = 0; (p = qual_options[i].option_name); i++) {
468 if (strncmp(s, p, n) == 0 && s[n] == '=') {
469 opt = &qual_options[i];
479 if (strcmp(s, "none") == 0) {
483 if (strcmp(s, "all") == 0) {
484 for (i = 0; i < MAX_QUALS; i++) {
485 qualify_one(i, opt->bitflag, not, -1);
489 for (i = 0; i < MAX_QUALS; i++) {
490 qualify_one(i, opt->bitflag, !not, -1);
495 for (p = strtok(copy, ","); p; p = strtok(NULL, ",")) {
496 if (opt->bitflag == QUAL_TRACE && (n = lookup_class(p)) > 0) {
497 for (i = 0; i < nsyscalls0; i++)
498 if (sysent0[i].sys_flags & n)
499 qualify_one(i, opt->bitflag, not, 0);
501 #if SUPPORTED_PERSONALITIES >= 2
502 for (i = 0; i < nsyscalls1; i++)
503 if (sysent1[i].sys_flags & n)
504 qualify_one(i, opt->bitflag, not, 1);
507 #if SUPPORTED_PERSONALITIES >= 3
508 for (i = 0; i < nsyscalls2; i++)
509 if (sysent2[i].sys_flags & n)
510 qualify_one(i, opt->bitflag, not, 2);
515 if (opt->qualify(p, opt->bitflag, not)) {
516 fprintf(stderr, "strace: invalid %s `%s'\n",
517 opt->argument_name, p);
525 enum subcall_style { shift_style, deref_style, mask_style, door_style };
527 #if !(defined(ALPHA) || defined(MIPS) || defined(__ARM_EABI__))
530 decode_subcall(struct tcb *tcp, int subcall, int nsubcalls, enum subcall_style style)
532 unsigned long addr, mask;
534 int size = personality_wordsize[current_personality];
538 if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= nsubcalls)
540 tcp->scno = subcall + tcp->u_arg[0];
541 tcp->u_nargs = n = sysent[tcp->scno].nargs;
542 for (i = 0; i < n; i++)
543 tcp->u_arg[i] = tcp->u_arg[i + 1];
546 if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= nsubcalls)
548 tcp->scno = subcall + tcp->u_arg[0];
549 addr = tcp->u_arg[1];
550 tcp->u_nargs = n = sysent[tcp->scno].nargs;
551 for (i = 0; i < n; i++) {
552 if (size == sizeof(int)) {
554 if (umove(tcp, addr, &arg) < 0)
558 else if (size == sizeof(long)) {
560 if (umove(tcp, addr, &arg) < 0)
570 mask = (tcp->u_arg[0] >> 8) & 0xff;
571 for (i = 0; mask; i++)
575 tcp->u_arg[0] &= 0xff;
576 tcp->scno = subcall + i;
577 tcp->u_nargs = sysent[tcp->scno].nargs;
581 * Oh, yuck. The call code is the *sixth* argument.
582 * (don't you mean the *last* argument? - JH)
584 if (tcp->u_arg[5] < 0 || tcp->u_arg[5] >= nsubcalls)
586 tcp->scno = subcall + tcp->u_arg[5];
587 tcp->u_nargs = sysent[tcp->scno].nargs;
594 printargs(struct tcb *tcp)
599 for (i = 0; i < tcp->u_nargs; i++)
600 tprintf("%s%#lx", i ? ", " : "", tcp->u_arg[i]);
606 getrval2(struct tcb *tcp)
610 #if defined(SPARC) || defined(SPARC64)
612 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0)
614 val = regs.u_regs[U_REG_O1];
616 if (upeek(tcp, 4*(REG_REG0+1), &val) < 0)
619 if (upeek(tcp, PT_R9, &val) < 0)
627 is_restart_error(struct tcb *tcp)
629 switch (tcp->u_error) {
633 case ERESTART_RESTARTBLOCK:
642 struct pt_regs i386_regs;
643 #elif defined(X86_64)
645 * On 32 bits, pt_regs and user_regs_struct are the same,
646 * but on 64 bits, user_regs_struct has six more fields:
647 * fs_base, gs_base, ds, es, fs, gs.
648 * PTRACE_GETREGS fills them too, so struct pt_regs would overflow.
650 static struct user_regs_struct x86_64_regs;
652 long r8, r10, psr; /* TODO: make static? */
653 long ia32 = 0; /* not static */
654 #elif defined(POWERPC)
661 static struct pt_regs regs;
666 static struct pt_regs regs;
667 #elif defined(SPARC) || defined(SPARC64)
668 static struct pt_regs regs;
669 static unsigned long trap;
670 #elif defined(LINUX_MIPSN32)
676 #elif defined(S390) || defined(S390X)
679 static long syscall_mode;
686 #elif defined(CRISV10) || defined(CRISV32)
688 #elif defined(MICROBLAZE)
693 * 0: "ignore this ptrace stop", bail out of trace_syscall() silently.
694 * 1: ok, continue in trace_syscall().
695 * other: error, trace_syscall() should print error indicator
696 * ("????" etc) and bail out.
700 get_scno(struct tcb *tcp)
704 #if defined(S390) || defined(S390X)
705 if (upeek(tcp, PT_GPR2, &syscall_mode) < 0)
708 if (syscall_mode != -ENOSYS) {
710 * Since kernel version 2.5.44 the scno gets passed in gpr2.
715 * Old style of "passing" the scno via the SVC instruction.
717 long opcode, offset_reg, tmp;
719 static const int gpr_offset[16] = {
720 PT_GPR0, PT_GPR1, PT_ORIGGPR2, PT_GPR3,
721 PT_GPR4, PT_GPR5, PT_GPR6, PT_GPR7,
722 PT_GPR8, PT_GPR9, PT_GPR10, PT_GPR11,
723 PT_GPR12, PT_GPR13, PT_GPR14, PT_GPR15
726 if (upeek(tcp, PT_PSWADDR, &pc) < 0)
729 opcode = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)(pc-sizeof(long)), 0);
731 perror("peektext(pc-oneword)");
736 * We have to check if the SVC got executed directly or via an
737 * EXECUTE instruction. In case of EXECUTE it is necessary to do
738 * instruction decoding to derive the system call number.
739 * Unfortunately the opcode sizes of EXECUTE and SVC are differently,
740 * so that this doesn't work if a SVC opcode is part of an EXECUTE
741 * opcode. Since there is no way to find out the opcode size this
742 * is the best we can do...
744 if ((opcode & 0xff00) == 0x0a00) {
746 scno = opcode & 0xff;
749 /* SVC got executed by EXECUTE instruction */
752 * Do instruction decoding of EXECUTE. If you really want to
753 * understand this, read the Principles of Operations.
755 svc_addr = (void *) (opcode & 0xfff);
758 offset_reg = (opcode & 0x000f0000) >> 16;
759 if (offset_reg && (upeek(tcp, gpr_offset[offset_reg], &tmp) < 0))
764 offset_reg = (opcode & 0x0000f000) >> 12;
765 if (offset_reg && (upeek(tcp, gpr_offset[offset_reg], &tmp) < 0))
769 scno = ptrace(PTRACE_PEEKTEXT, tcp->pid, svc_addr, 0);
778 offset_reg = (opcode & 0x00f00000) >> 20;
779 if (offset_reg && (upeek(tcp, gpr_offset[offset_reg], &tmp) < 0))
782 scno = (scno | tmp) & 0xff;
785 #elif defined(POWERPC)
786 if (upeek(tcp, sizeof(unsigned long)*PT_R0, &scno) < 0)
789 /* TODO: speed up strace by not doing this at every syscall.
790 * We only need to do it after execve.
796 /* Check for 64/32 bit mode. */
797 if (upeek(tcp, sizeof(unsigned long)*PT_MSR, &val) < 0)
799 /* SF is bit 0 of MSR */
804 update_personality(tcp, currpers);
807 /* Read complete register set in one go. */
808 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, ®s) < 0)
812 if (upeek(tcp, PT_ORIG_P0, &scno))
815 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &i386_regs) < 0)
817 scno = i386_regs.orig_eax;
818 #elif defined(X86_64)
820 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &x86_64_regs) < 0)
822 scno = x86_64_regs.orig_rax;
824 /* Check CS register value. On x86-64 linux it is:
825 * 0x33 for long mode (64 bit)
826 * 0x23 for compatibility mode (32 bit)
828 switch (x86_64_regs.cs) {
829 case 0x23: currpers = 1; break;
830 case 0x33: currpers = 0; break;
832 fprintf(stderr, "Unknown value CS=0x%08X while "
833 "detecting personality of process "
834 "PID=%d\n", (int)x86_64_regs.cs, tcp->pid);
835 currpers = current_personality;
839 /* This version analyzes the opcode of a syscall instruction.
840 * (int 0x80 on i386 vs. syscall on x86-64)
841 * It works, but is too complicated.
843 unsigned long val, rip, i;
845 rip = x86_64_regs.rip;
847 /* sizeof(syscall) == sizeof(int 0x80) == 2 */
851 call = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)rip, (char *)0);
853 fprintf(stderr, "ptrace_peektext failed: %s\n",
855 switch (call & 0xffff) {
856 /* x86-64: syscall = 0x0f 0x05 */
857 case 0x050f: currpers = 0; break;
858 /* i386: int 0x80 = 0xcd 0x80 */
859 case 0x80cd: currpers = 1; break;
861 currpers = current_personality;
863 "Unknown syscall opcode (0x%04X) while "
864 "detecting personality of process "
865 "PID=%d\n", (int)call, tcp->pid);
869 update_personality(tcp, currpers);
871 # define IA64_PSR_IS ((long)1 << 34)
872 if (upeek(tcp, PT_CR_IPSR, &psr) >= 0)
873 ia32 = (psr & IA64_PSR_IS) != 0;
875 if (upeek(tcp, PT_R1, &scno) < 0)
878 if (upeek(tcp, PT_R15, &scno) < 0)
882 /* Read complete register set in one go. */
883 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (void *)®s) == -1)
887 * We only need to grab the syscall number on syscall entry.
889 if (regs.ARM_ip == 0) {
891 * Note: we only deal with only 32-bit CPUs here.
893 if (regs.ARM_cpsr & 0x20) {
895 * Get the Thumb-mode system call number
900 * Get the ARM-mode system call number
903 scno = ptrace(PTRACE_PEEKTEXT, tcp->pid, (void *)(regs.ARM_pc - 4), NULL);
907 /* Handle the EABI syscall convention. We do not
908 bother converting structures between the two
909 ABIs, but basic functionality should work even
910 if strace and the traced program have different
912 if (scno == 0xef000000) {
915 if ((scno & 0x0ff00000) != 0x0f900000) {
916 fprintf(stderr, "syscall: unknown syscall trap 0x%08lx\n",
922 * Fixup the syscall number
927 if (scno & 0x0f0000) {
929 * Handle ARM specific syscall
931 update_personality(tcp, 1);
934 update_personality(tcp, 0);
937 fprintf(stderr, "pid %d stray syscall entry\n", tcp->pid);
938 tcp->flags |= TCB_INSYSCALL;
941 if (upeek(tcp, 4*PT_ORIG_D0, &scno) < 0)
943 #elif defined(LINUX_MIPSN32)
944 unsigned long long regs[38];
946 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) ®s) < 0)
952 if (!SCNO_IN_RANGE(scno)) {
953 if (a3 == 0 || a3 == -1) {
955 fprintf(stderr, "stray syscall exit: v0 = %ld\n", scno);
960 if (upeek(tcp, REG_A3, &a3) < 0)
962 if (upeek(tcp, REG_V0, &scno) < 0)
965 if (!SCNO_IN_RANGE(scno)) {
966 if (a3 == 0 || a3 == -1) {
968 fprintf(stderr, "stray syscall exit: v0 = %ld\n", scno);
973 if (upeek(tcp, REG_A3, &a3) < 0)
975 if (upeek(tcp, REG_R0, &scno) < 0)
979 * Do some sanity checks to figure out if it's
980 * really a syscall entry
982 if (!SCNO_IN_RANGE(scno)) {
983 if (a3 == 0 || a3 == -1) {
985 fprintf(stderr, "stray syscall exit: r0 = %ld\n", scno);
989 #elif defined(SPARC) || defined(SPARC64)
990 /* Everything we need is in the current register set. */
991 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0)
994 /* Disassemble the syscall trap. */
995 /* Retrieve the syscall trap instruction. */
997 # if defined(SPARC64)
998 trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)regs.tpc, 0);
1001 trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)regs.pc, 0);
1006 /* Disassemble the trap to see what personality to use. */
1009 /* Linux/SPARC syscall trap. */
1010 update_personality(tcp, 0);
1013 /* Linux/SPARC64 syscall trap. */
1014 update_personality(tcp, 2);
1017 /* SunOS syscall trap. (pers 1) */
1018 fprintf(stderr, "syscall: SunOS no support\n");
1021 /* Solaris 2.x syscall trap. (per 2) */
1022 update_personality(tcp, 1);
1025 /* NetBSD/FreeBSD syscall trap. */
1026 fprintf(stderr, "syscall: NetBSD/FreeBSD not supported\n");
1029 /* Solaris 2.x gettimeofday */
1030 update_personality(tcp, 1);
1033 # if defined(SPARC64)
1034 fprintf(stderr, "syscall: unknown syscall trap %08lx %016lx\n", trap, regs.tpc);
1036 fprintf(stderr, "syscall: unknown syscall trap %08lx %08lx\n", trap, regs.pc);
1041 /* Extract the system call number from the registers. */
1042 if (trap == 0x91d02027)
1045 scno = regs.u_regs[U_REG_G1];
1047 scno = regs.u_regs[U_REG_O0];
1048 memmove(®s.u_regs[U_REG_O0], ®s.u_regs[U_REG_O1], 7*sizeof(regs.u_regs[0]));
1051 if (upeek(tcp, PT_GR20, &scno) < 0)
1055 * In the new syscall ABI, the system call number is in R3.
1057 if (upeek(tcp, 4*(REG_REG0+3), &scno) < 0)
1061 /* Odd as it may seem, a glibc bug has been known to cause
1062 glibc to issue bogus negative syscall numbers. So for
1063 our purposes, make strace print what it *should* have been */
1064 long correct_scno = (scno & 0xff);
1067 "Detected glibc bug: bogus system call"
1068 " number = %ld, correcting to %ld\n",
1071 scno = correct_scno;
1074 if (upeek(tcp, REG_SYSCALL, &scno) < 0)
1077 #elif defined(CRISV10) || defined(CRISV32)
1078 if (upeek(tcp, 4*PT_R9, &scno) < 0)
1081 if (upeek(tcp, PTREGS_OFFSET_REG(10), &scno) < 0)
1083 #elif defined(MICROBLAZE)
1084 if (upeek(tcp, 0, &scno) < 0)
1089 /* new syscall ABI returns result in R0 */
1090 if (upeek(tcp, 4*REG_REG0, (long *)&r0) < 0)
1093 /* ABI defines result returned in r9 */
1094 if (upeek(tcp, REG_GENERAL(9), (long *)&r9) < 0)
1102 /* Called at each syscall entry.
1104 * 0: "ignore this ptrace stop", bail out of trace_syscall() silently.
1105 * 1: ok, continue in trace_syscall().
1106 * other: error, trace_syscall() should print error indicator
1107 * ("????" etc) and bail out.
1110 syscall_fixup_on_sysenter(struct tcb *tcp)
1112 /* A common case of "not a syscall entry" is post-execve SIGTRAP */
1114 if (i386_regs.eax != -ENOSYS) {
1116 fprintf(stderr, "not a syscall entry (eax = %ld)\n", i386_regs.eax);
1119 #elif defined(X86_64)
1121 long rax = x86_64_regs.rax;
1122 if (current_personality == 1)
1123 rax = (int)rax; /* sign extend from 32 bits */
1124 if (rax != -ENOSYS) {
1126 fprintf(stderr, "not a syscall entry (rax = %ld)\n", rax);
1130 #elif defined(S390) || defined(S390X)
1131 /* TODO: we already fetched PT_GPR2 in get_scno
1132 * and stored it in syscall_mode, reuse it here
1133 * instead of re-fetching?
1135 if (upeek(tcp, PT_GPR2, &gpr2) < 0)
1137 if (syscall_mode != -ENOSYS)
1138 syscall_mode = tcp->scno;
1139 if (gpr2 != syscall_mode) {
1141 fprintf(stderr, "not a syscall entry (gpr2 = %ld)\n", gpr2);
1145 /* TODO? Eliminate upeek's in arches below like we did in x86 */
1146 if (upeek(tcp, 4*PT_D0, &d0) < 0)
1148 if (d0 != -ENOSYS) {
1150 fprintf(stderr, "not a syscall entry (d0 = %ld)\n", d0);
1154 if (upeek(tcp, PT_R10, &r10) < 0)
1156 if (upeek(tcp, PT_R8, &r8) < 0)
1158 if (ia32 && r8 != -ENOSYS) {
1160 fprintf(stderr, "not a syscall entry (r8 = %ld)\n", r8);
1163 #elif defined(CRISV10) || defined(CRISV32)
1164 if (upeek(tcp, 4*PT_R10, &r10) < 0)
1166 if (r10 != -ENOSYS) {
1168 fprintf(stderr, "not a syscall entry (r10 = %ld)\n", r10);
1171 #elif defined(MICROBLAZE)
1172 if (upeek(tcp, 3 * 4, &r3) < 0)
1174 if (r3 != -ENOSYS) {
1176 fprintf(stderr, "not a syscall entry (r3 = %ld)\n", r3);
1184 internal_syscall(struct tcb *tcp)
1187 * We must always trace a few critical system calls in order to
1188 * correctly support following forks in the presence of tracing
1193 if (!SCNO_IN_RANGE(tcp->scno))
1196 func = sysent[tcp->scno].sys_func;
1198 if ( sys_fork == func
1199 || sys_vfork == func
1200 || sys_clone == func
1202 return internal_fork(tcp);
1204 #if defined(TCB_WAITEXECVE)
1205 if ( sys_execve == func
1206 # if defined(SPARC) || defined(SPARC64)
1207 || sys_execv == func
1210 return internal_exec(tcp);
1217 syscall_enter(struct tcb *tcp)
1221 if (SCNO_IN_RANGE(tcp->scno))
1222 nargs = tcp->u_nargs = sysent[tcp->scno].nargs;
1224 nargs = tcp->u_nargs = MAX_ARGS;
1226 #if defined(S390) || defined(S390X)
1227 for (i = 0; i < nargs; ++i)
1228 if (upeek(tcp, i==0 ? PT_ORIGGPR2 : PT_GPR2 + i*sizeof(long), &tcp->u_arg[i]) < 0)
1230 #elif defined(ALPHA)
1231 for (i = 0; i < nargs; ++i)
1232 if (upeek(tcp, REG_A0+i, &tcp->u_arg[i]) < 0)
1236 unsigned long *out0, cfm, sof, sol;
1238 /* be backwards compatible with kernel < 2.4.4... */
1240 # define PT_RBS_END PT_AR_BSP
1243 if (upeek(tcp, PT_RBS_END, &rbs_end) < 0)
1245 if (upeek(tcp, PT_CFM, (long *) &cfm) < 0)
1248 sof = (cfm >> 0) & 0x7f;
1249 sol = (cfm >> 7) & 0x7f;
1250 out0 = ia64_rse_skip_regs((unsigned long *) rbs_end, -sof + sol);
1252 for (i = 0; i < nargs; ++i) {
1253 if (umoven(tcp, (unsigned long) ia64_rse_skip_regs(out0, i),
1254 sizeof(long), (char *) &tcp->u_arg[i]) < 0)
1258 static const int argreg[MAX_ARGS] = { PT_R11 /* EBX = out0 */,
1259 PT_R9 /* ECX = out1 */,
1260 PT_R10 /* EDX = out2 */,
1261 PT_R14 /* ESI = out3 */,
1262 PT_R15 /* EDI = out4 */,
1263 PT_R13 /* EBP = out5 */};
1265 for (i = 0; i < nargs; ++i) {
1266 if (upeek(tcp, argreg[i], &tcp->u_arg[i]) < 0)
1268 /* truncate away IVE sign-extension */
1269 tcp->u_arg[i] &= 0xffffffff;
1272 #elif defined(LINUX_MIPSN32) || defined(LINUX_MIPSN64)
1273 /* N32 and N64 both use up to six registers. */
1274 unsigned long long regs[38];
1276 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) ®s) < 0)
1279 for (i = 0; i < nargs; ++i) {
1280 tcp->u_arg[i] = regs[REG_A0 + i];
1281 # if defined(LINUX_MIPSN32)
1282 tcp->ext_arg[i] = regs[REG_A0 + i];
1289 if (upeek(tcp, REG_SP, &sp) < 0)
1291 for (i = 0; i < 4; ++i)
1292 if (upeek(tcp, REG_A0 + i, &tcp->u_arg[i]) < 0)
1294 umoven(tcp, sp + 16, (nargs - 4) * sizeof(tcp->u_arg[0]),
1295 (char *)(tcp->u_arg + 4));
1297 for (i = 0; i < nargs; ++i)
1298 if (upeek(tcp, REG_A0 + i, &tcp->u_arg[i]) < 0)
1301 #elif defined(POWERPC)
1303 # define PT_ORIG_R3 34
1305 for (i = 0; i < nargs; ++i) {
1306 if (upeek(tcp, (i==0) ?
1307 (sizeof(unsigned long) * PT_ORIG_R3) :
1308 ((i+PT_R3) * sizeof(unsigned long)),
1309 &tcp->u_arg[i]) < 0)
1312 #elif defined(SPARC) || defined(SPARC64)
1313 for (i = 0; i < nargs; ++i)
1314 tcp->u_arg[i] = regs.u_regs[U_REG_O0 + i];
1316 for (i = 0; i < nargs; ++i)
1317 if (upeek(tcp, PT_GR26-4*i, &tcp->u_arg[i]) < 0)
1320 for (i = 0; i < nargs; ++i)
1321 tcp->u_arg[i] = regs.uregs[i];
1322 #elif defined(AVR32)
1325 tcp->u_arg[0] = regs.r12;
1326 tcp->u_arg[1] = regs.r11;
1327 tcp->u_arg[2] = regs.r10;
1328 tcp->u_arg[3] = regs.r9;
1329 tcp->u_arg[4] = regs.r5;
1330 tcp->u_arg[5] = regs.r3;
1332 static const int argreg[MAX_ARGS] = { PT_R0, PT_R1, PT_R2, PT_R3, PT_R4, PT_R5 };
1334 for (i = 0; i < nargs; ++i)
1335 if (upeek(tcp, argreg[i], &tcp->u_arg[i]) < 0)
1338 static const int syscall_regs[MAX_ARGS] = {
1339 4 * (REG_REG0+4), 4 * (REG_REG0+5), 4 * (REG_REG0+6),
1340 4 * (REG_REG0+7), 4 * (REG_REG0 ), 4 * (REG_REG0+1)
1343 for (i = 0; i < nargs; ++i)
1344 if (upeek(tcp, syscall_regs[i], &tcp->u_arg[i]) < 0)
1348 /* Registers used by SH5 Linux system calls for parameters */
1349 static const int syscall_regs[MAX_ARGS] = { 2, 3, 4, 5, 6, 7 };
1351 for (i = 0; i < nargs; ++i)
1352 if (upeek(tcp, REG_GENERAL(syscall_regs[i]), &tcp->u_arg[i]) < 0)
1354 #elif defined(X86_64)
1357 if (current_personality == 0) { /* x86-64 ABI */
1358 tcp->u_arg[0] = x86_64_regs.rdi;
1359 tcp->u_arg[1] = x86_64_regs.rsi;
1360 tcp->u_arg[2] = x86_64_regs.rdx;
1361 tcp->u_arg[3] = x86_64_regs.r10;
1362 tcp->u_arg[4] = x86_64_regs.r8;
1363 tcp->u_arg[5] = x86_64_regs.r9;
1364 } else { /* i386 ABI */
1365 /* Sign-extend lower 32 bits */
1366 tcp->u_arg[0] = (long)(int)x86_64_regs.rbx;
1367 tcp->u_arg[1] = (long)(int)x86_64_regs.rcx;
1368 tcp->u_arg[2] = (long)(int)x86_64_regs.rdx;
1369 tcp->u_arg[3] = (long)(int)x86_64_regs.rsi;
1370 tcp->u_arg[4] = (long)(int)x86_64_regs.rdi;
1371 tcp->u_arg[5] = (long)(int)x86_64_regs.rbp;
1373 #elif defined(MICROBLAZE)
1374 for (i = 0; i < nargs; ++i)
1375 if (upeek(tcp, (5 + i) * 4, &tcp->u_arg[i]) < 0)
1377 #elif defined(CRISV10) || defined(CRISV32)
1378 static const int crisregs[MAX_ARGS] = {
1379 4*PT_ORIG_R10, 4*PT_R11, 4*PT_R12,
1380 4*PT_R13 , 4*PT_MOF, 4*PT_SRP
1383 for (i = 0; i < nargs; ++i)
1384 if (upeek(tcp, crisregs[i], &tcp->u_arg[i]) < 0)
1387 for (i = 0; i < nargs; ++i)
1388 if (upeek(tcp, PTREGS_OFFSET_REG(i), &tcp->u_arg[i]) < 0)
1391 for (i = 0; i < nargs; ++i)
1392 if (upeek(tcp, (i < 5 ? i : i + 2)*4, &tcp->u_arg[i]) < 0)
1397 tcp->u_arg[0] = i386_regs.ebx;
1398 tcp->u_arg[1] = i386_regs.ecx;
1399 tcp->u_arg[2] = i386_regs.edx;
1400 tcp->u_arg[3] = i386_regs.esi;
1401 tcp->u_arg[4] = i386_regs.edi;
1402 tcp->u_arg[5] = i386_regs.ebp;
1403 #else /* Other architecture (32bits specific) */
1404 for (i = 0; i < nargs; ++i)
1405 if (upeek(tcp, i*4, &tcp->u_arg[i]) < 0)
1412 trace_syscall_entering(struct tcb *tcp)
1416 #if defined TCB_WAITEXECVE
1417 if (tcp->flags & TCB_WAITEXECVE) {
1418 /* This is the post-execve SIGTRAP. */
1419 tcp->flags &= ~TCB_WAITEXECVE;
1424 scno_good = res = get_scno(tcp);
1428 res = syscall_fixup_on_sysenter(tcp);
1432 res = syscall_enter(tcp);
1438 tcp->flags &= ~TCB_REPRINT;
1440 tprintf("????" /* anti-trigraph gap */ "(");
1441 else if (!SCNO_IN_RANGE(tcp->scno))
1442 tprintf("syscall_%lu(", tcp->scno);
1444 tprintf("%s(", sysent[tcp->scno].sys_name);
1446 * " <unavailable>" will be added later by the code which
1447 * detects ptrace errors.
1452 #if defined(SYS_socket_subcall) || defined(SYS_ipc_subcall)
1453 while (SCNO_IN_RANGE(tcp->scno)) {
1454 # ifdef SYS_socket_subcall
1455 if (sysent[tcp->scno].sys_func == sys_socketcall) {
1456 decode_subcall(tcp, SYS_socket_subcall,
1457 SYS_socket_nsubcalls, deref_style);
1461 # ifdef SYS_ipc_subcall
1462 if (sysent[tcp->scno].sys_func == sys_ipc) {
1463 decode_subcall(tcp, SYS_ipc_subcall,
1464 SYS_ipc_nsubcalls, shift_style);
1470 #endif /* SYS_socket_subcall || SYS_ipc_subcall */
1472 internal_syscall(tcp);
1474 if ((SCNO_IN_RANGE(tcp->scno) &&
1475 !(qual_flags[tcp->scno] & QUAL_TRACE)) ||
1476 (tracing_paths && !pathtrace_match(tcp))) {
1477 tcp->flags |= TCB_INSYSCALL | TCB_FILTERED;
1481 tcp->flags &= ~TCB_FILTERED;
1483 if (cflag == CFLAG_ONLY_STATS) {
1489 tcp->flags &= ~TCB_REPRINT;
1490 if (!SCNO_IN_RANGE(tcp->scno))
1491 tprintf("syscall_%lu(", tcp->scno);
1493 tprintf("%s(", sysent[tcp->scno].sys_name);
1494 if (!SCNO_IN_RANGE(tcp->scno) ||
1495 ((qual_flags[tcp->scno] & QUAL_RAW) &&
1496 sysent[tcp->scno].sys_func != sys_exit))
1497 res = printargs(tcp);
1499 res = (*sysent[tcp->scno].sys_func)(tcp);
1501 if (fflush(tcp->outf) == EOF)
1504 tcp->flags |= TCB_INSYSCALL;
1505 /* Measure the entrance time as late as possible to avoid errors. */
1507 gettimeofday(&tcp->etime, NULL);
1512 * 0: "ignore this ptrace stop", bail out of trace_syscall() silently.
1513 * 1: ok, continue in trace_syscall().
1514 * other: error, trace_syscall() should print error indicator
1515 * ("????" etc) and bail out.
1518 get_syscall_result(struct tcb *tcp)
1520 #if defined(S390) || defined(S390X)
1521 if (upeek(tcp, PT_GPR2, &gpr2) < 0)
1523 #elif defined(POWERPC)
1524 # define SO_MASK 0x10000000
1527 if (upeek(tcp, sizeof(unsigned long)*PT_CCR, &flags) < 0)
1529 if (upeek(tcp, sizeof(unsigned long)*PT_R3, &result) < 0)
1531 if (flags & SO_MASK)
1534 #elif defined(AVR32)
1535 /* Read complete register set in one go. */
1536 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, ®s) < 0)
1539 if (upeek(tcp, PT_R0, &r0) < 0)
1542 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &i386_regs) < 0)
1544 #elif defined(X86_64)
1545 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &x86_64_regs) < 0)
1548 # define IA64_PSR_IS ((long)1 << 34)
1549 if (upeek(tcp, PT_CR_IPSR, &psr) >= 0)
1550 ia32 = (psr & IA64_PSR_IS) != 0;
1551 if (upeek(tcp, PT_R8, &r8) < 0)
1553 if (upeek(tcp, PT_R10, &r10) < 0)
1556 /* Read complete register set in one go. */
1557 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (void *)®s) == -1)
1560 if (upeek(tcp, 4*PT_D0, &d0) < 0)
1562 #elif defined(LINUX_MIPSN32)
1563 unsigned long long regs[38];
1565 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) ®s) < 0)
1570 if (upeek(tcp, REG_A3, &a3) < 0)
1572 if (upeek(tcp, REG_V0, &r2) < 0)
1574 #elif defined(ALPHA)
1575 if (upeek(tcp, REG_A3, &a3) < 0)
1577 if (upeek(tcp, REG_R0, &r0) < 0)
1579 #elif defined(SPARC) || defined(SPARC64)
1580 /* Everything we need is in the current register set. */
1581 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0)
1584 if (upeek(tcp, PT_GR28, &r28) < 0)
1588 #elif defined(CRISV10) || defined(CRISV32)
1589 if (upeek(tcp, 4*PT_R10, &r10) < 0)
1592 #elif defined(MICROBLAZE)
1593 if (upeek(tcp, 3 * 4, &r3) < 0)
1598 /* new syscall ABI returns result in R0 */
1599 if (upeek(tcp, 4*REG_REG0, (long *)&r0) < 0)
1602 /* ABI defines result returned in r9 */
1603 if (upeek(tcp, REG_GENERAL(9), (long *)&r9) < 0)
1610 /* Called at each syscall exit.
1612 * 0: "ignore this ptrace stop", bail out of trace_syscall() silently.
1613 * 1: ok, continue in trace_syscall().
1614 * other: error, trace_syscall() should print error indicator
1615 * ("????" etc) and bail out.
1618 syscall_fixup_on_sysexit(struct tcb *tcp)
1620 #if defined(S390) || defined(S390X)
1621 if (syscall_mode != -ENOSYS)
1622 syscall_mode = tcp->scno;
1623 if ((tcp->flags & TCB_WAITEXECVE)
1624 && (gpr2 == -ENOSYS || gpr2 == tcp->scno)) {
1626 * Return from execve.
1627 * Fake a return value of zero. We leave the TCB_WAITEXECVE
1628 * flag set for the post-execve SIGTRAP to see and reset.
1637 * Check the syscall return value register value for whether it is
1638 * a negated errno code indicating an error, or a success return value.
1641 is_negated_errno(unsigned long int val)
1643 unsigned long int max = -(long int) nerrnos;
1644 #if SUPPORTED_PERSONALITIES > 1
1645 if (personality_wordsize[current_personality] < sizeof(val)) {
1646 val = (unsigned int) val;
1647 max = (unsigned int) max;
1654 get_error(struct tcb *tcp)
1657 int check_errno = 1;
1658 if (SCNO_IN_RANGE(tcp->scno) &&
1659 sysent[tcp->scno].sys_flags & SYSCALL_NEVER_FAILS) {
1662 #if defined(S390) || defined(S390X)
1663 if (check_errno && is_negated_errno(gpr2)) {
1671 if (check_errno && is_negated_errno(i386_regs.eax)) {
1673 u_error = -i386_regs.eax;
1676 tcp->u_rval = i386_regs.eax;
1678 #elif defined(X86_64)
1679 if (check_errno && is_negated_errno(x86_64_regs.rax)) {
1681 u_error = -x86_64_regs.rax;
1684 tcp->u_rval = x86_64_regs.rax;
1691 if (check_errno && is_negated_errno(err)) {
1699 if (check_errno && r10) {
1707 if (check_errno && a3) {
1713 #elif defined(POWERPC)
1714 if (check_errno && is_negated_errno(result)) {
1719 tcp->u_rval = result;
1722 if (check_errno && is_negated_errno(d0)) {
1730 if (check_errno && is_negated_errno(regs.ARM_r0)) {
1732 u_error = -regs.ARM_r0;
1735 tcp->u_rval = regs.ARM_r0;
1737 #elif defined(AVR32)
1738 if (check_errno && regs.r12 && (unsigned) -regs.r12 < nerrnos) {
1740 u_error = -regs.r12;
1743 tcp->u_rval = regs.r12;
1746 if (check_errno && is_negated_errno(r0)) {
1752 #elif defined(ALPHA)
1753 if (check_errno && a3) {
1760 #elif defined(SPARC)
1761 if (check_errno && regs.psr & PSR_C) {
1763 u_error = regs.u_regs[U_REG_O0];
1766 tcp->u_rval = regs.u_regs[U_REG_O0];
1768 #elif defined(SPARC64)
1769 if (check_errno && regs.tstate & 0x1100000000UL) {
1771 u_error = regs.u_regs[U_REG_O0];
1774 tcp->u_rval = regs.u_regs[U_REG_O0];
1777 if (check_errno && is_negated_errno(r28)) {
1785 if (check_errno && is_negated_errno(r0)) {
1793 if (check_errno && is_negated_errno(r9)) {
1800 #elif defined(CRISV10) || defined(CRISV32)
1801 if (check_errno && r10 && (unsigned) -r10 < nerrnos) {
1810 if (upeek(tcp, PTREGS_OFFSET_REG(0), &rval) < 0)
1812 if (check_errno && rval < 0 && rval > -nerrnos) {
1819 #elif defined(MICROBLAZE)
1820 if (check_errno && is_negated_errno(r3)) {
1828 tcp->u_error = u_error;
1833 dumpio(struct tcb *tcp)
1837 if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= MAX_QUALS)
1839 if (!SCNO_IN_RANGE(tcp->scno))
1841 if (sysent[tcp->scno].sys_func == printargs)
1843 if (qual_flags[tcp->u_arg[0]] & QUAL_READ) {
1844 if (sysent[tcp->scno].sys_func == sys_read ||
1845 sysent[tcp->scno].sys_func == sys_pread ||
1846 sysent[tcp->scno].sys_func == sys_recv ||
1847 sysent[tcp->scno].sys_func == sys_recvfrom)
1848 dumpstr(tcp, tcp->u_arg[1], tcp->u_rval);
1849 else if (sysent[tcp->scno].sys_func == sys_readv)
1850 dumpiov(tcp, tcp->u_arg[2], tcp->u_arg[1]);
1853 if (qual_flags[tcp->u_arg[0]] & QUAL_WRITE) {
1854 if (sysent[tcp->scno].sys_func == sys_write ||
1855 sysent[tcp->scno].sys_func == sys_pwrite ||
1856 sysent[tcp->scno].sys_func == sys_send ||
1857 sysent[tcp->scno].sys_func == sys_sendto)
1858 dumpstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1859 else if (sysent[tcp->scno].sys_func == sys_writev)
1860 dumpiov(tcp, tcp->u_arg[2], tcp->u_arg[1]);
1866 trace_syscall_exiting(struct tcb *tcp)
1873 /* Measure the exit time as early as possible to avoid errors. */
1875 gettimeofday(&tv, NULL);
1877 #if SUPPORTED_PERSONALITIES > 1
1878 update_personality(tcp, tcp->currpers);
1880 res = get_syscall_result(tcp);
1884 res = syscall_fixup_on_sysexit(tcp);
1888 res = get_error(tcp);
1892 internal_syscall(tcp);
1894 if (res == 1 && filtered(tcp)) {
1898 if (tcp->flags & TCB_REPRINT) {
1900 if (!SCNO_IN_RANGE(tcp->scno))
1901 tprintf("<... syscall_%lu resumed> ", tcp->scno);
1903 tprintf("<... %s resumed> ", sysent[tcp->scno].sys_name);
1907 struct timeval t = tv;
1908 count_syscall(tcp, &t);
1909 if (cflag == CFLAG_ONLY_STATS) {
1917 tprints("= ? <unavailable>\n");
1918 printing_tcp = NULL;
1919 tcp->flags &= ~TCB_INSYSCALL;
1923 if (!SCNO_IN_RANGE(tcp->scno)
1924 || (qual_flags[tcp->scno] & QUAL_RAW))
1925 sys_res = printargs(tcp);
1927 /* FIXME: not_failing_only (IOW, option -z) is broken:
1928 * failure of syscall is known only after syscall return.
1929 * Thus we end up with something like this on, say, ENOENT:
1930 * open("doesnt_exist", O_RDONLY <unfinished ...>
1931 * {next syscall decode}
1932 * whereas the intended result is that open(...) line
1933 * is not shown at all.
1935 if (not_failing_only && tcp->u_error)
1936 goto ret; /* ignore failed syscalls */
1937 sys_res = (*sysent[tcp->scno].sys_func)(tcp);
1942 u_error = tcp->u_error;
1943 if (!SCNO_IN_RANGE(tcp->scno) ||
1944 qual_flags[tcp->scno] & QUAL_RAW) {
1946 tprintf("= -1 (errno %ld)", u_error);
1948 tprintf("= %#lx", tcp->u_rval);
1950 else if (!(sys_res & RVAL_NONE) && u_error) {
1952 /* Blocked signals do not interrupt any syscalls.
1953 * In this case syscalls don't return ERESTARTfoo codes.
1955 * Deadly signals set to SIG_DFL interrupt syscalls
1956 * and kill the process regardless of which of the codes below
1957 * is returned by the interrupted syscall.
1958 * In some cases, kernel forces a kernel-generated deadly
1959 * signal to be unblocked and set to SIG_DFL (and thus cause
1960 * death) if it is blocked or SIG_IGNed: for example, SIGSEGV
1961 * or SIGILL. (The alternative is to leave process spinning
1962 * forever on the faulty instruction - not useful).
1964 * SIG_IGNed signals and non-deadly signals set to SIG_DFL
1965 * (for example, SIGCHLD, SIGWINCH) interrupt syscalls,
1966 * but kernel will always restart them.
1969 /* Most common type of signal-interrupted syscall exit code.
1970 * The system call will be restarted with the same arguments
1971 * if SA_RESTART is set; otherwise, it will fail with EINTR.
1973 tprints("= ? ERESTARTSYS (To be restarted if SA_RESTART is set)");
1975 case ERESTARTNOINTR:
1976 /* Rare. For example, fork() returns this if interrupted.
1977 * SA_RESTART is ignored (assumed set): the restart is unconditional.
1979 tprints("= ? ERESTARTNOINTR (To be restarted)");
1981 case ERESTARTNOHAND:
1982 /* pause(), rt_sigsuspend() etc use this code.
1983 * SA_RESTART is ignored (assumed not set):
1984 * syscall won't restart (will return EINTR instead)
1985 * even after signal with SA_RESTART set.
1986 * However, after SIG_IGN or SIG_DFL signal it will.
1988 tprints("= ? ERESTARTNOHAND (Interrupted by signal)");
1990 case ERESTART_RESTARTBLOCK:
1991 /* Syscalls like nanosleep(), poll() which can't be
1992 * restarted with their original arguments use this
1993 * code. Kernel will execute restart_syscall() instead,
1994 * which changes arguments before restarting syscall.
1995 * SA_RESTART is ignored (assumed not set) similarly
1996 * to ERESTARTNOHAND. (Kernel can't honor SA_RESTART
1997 * since restart data is saved in "restart block"
1998 * in task struct, and if signal handler uses a syscall
1999 * which in turn saves another such restart block,
2000 * old data is lost and restart becomes impossible)
2002 tprints("= ? ERESTART_RESTARTBLOCK (Interrupted by signal)");
2006 tprintf("= -1 E??? (errno %ld)", u_error);
2007 else if (u_error < nerrnos)
2008 tprintf("= -1 %s (%s)", errnoent[u_error],
2011 tprintf("= -1 ERRNO_%ld (%s)", u_error,
2015 if ((sys_res & RVAL_STR) && tcp->auxstr)
2016 tprintf(" (%s)", tcp->auxstr);
2019 if (sys_res & RVAL_NONE)
2022 switch (sys_res & RVAL_MASK) {
2024 tprintf("= %#lx", tcp->u_rval);
2027 tprintf("= %#lo", tcp->u_rval);
2030 tprintf("= %lu", tcp->u_rval);
2033 tprintf("= %ld", tcp->u_rval);
2035 #ifdef HAVE_LONG_LONG
2037 tprintf("= %#llx", tcp->u_lrval);
2040 tprintf("= %#llo", tcp->u_lrval);
2042 case RVAL_LUDECIMAL:
2043 tprintf("= %llu", tcp->u_lrval);
2046 tprintf("= %lld", tcp->u_lrval);
2051 "invalid rval format\n");
2055 if ((sys_res & RVAL_STR) && tcp->auxstr)
2056 tprintf(" (%s)", tcp->auxstr);
2059 tv_sub(&tv, &tv, &tcp->etime);
2060 tprintf(" <%ld.%06ld>",
2061 (long) tv.tv_sec, (long) tv.tv_usec);
2064 printing_tcp = NULL;
2067 if (fflush(tcp->outf) == EOF)
2070 tcp->flags &= ~TCB_INSYSCALL;
2075 trace_syscall(struct tcb *tcp)
2077 return exiting(tcp) ?
2078 trace_syscall_exiting(tcp) : trace_syscall_entering(tcp);