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.
36 #include <sys/param.h>
40 # ifndef PTRACE_PEEKUSR
41 # define PTRACE_PEEKUSR PTRACE_PEEKUSER
43 #elif defined(HAVE_LINUX_PTRACE_H)
44 # undef PTRACE_SYSCALL
45 # ifdef HAVE_STRUCT_IA64_FPREG
46 # define ia64_fpreg XXX_ia64_fpreg
48 # ifdef HAVE_STRUCT_PT_ALL_USER_REGS
49 # define pt_all_user_regs XXX_pt_all_user_regs
51 # include <linux/ptrace.h>
53 # undef pt_all_user_regs
57 # undef PTRACE_GETREGS
58 # define PTRACE_GETREGS PTRACE_GETREGS64
59 # undef PTRACE_SETREGS
60 # define PTRACE_SETREGS PTRACE_SETREGS64
64 # include <asm/ptrace_offsets.h>
69 # define ERESTARTSYS 512
71 #ifndef ERESTARTNOINTR
72 # define ERESTARTNOINTR 513
74 #ifndef ERESTARTNOHAND
75 # define ERESTARTNOHAND 514 /* restart if no handler */
77 #ifndef ERESTART_RESTARTBLOCK
78 # define ERESTART_RESTARTBLOCK 516 /* restart by calling sys_restart_syscall */
82 # warning: NSIG is not defined, using 32
86 /* Ugh. Is this really correct? ARM has no RT signals?! */
93 /* Define these shorthand notations to simplify the syscallent files. */
97 #define TN TRACE_NETWORK
98 #define TP TRACE_PROCESS
99 #define TS TRACE_SIGNAL
100 #define NF SYSCALL_NEVER_FAILS
103 static const struct sysent sysent0[] = {
104 #include "syscallent.h"
107 #if SUPPORTED_PERSONALITIES >= 2
108 static const struct sysent sysent1[] = {
109 # include "syscallent1.h"
113 #if SUPPORTED_PERSONALITIES >= 3
114 static const struct sysent sysent2[] = {
115 # include "syscallent2.h"
119 /* Now undef them since short defines cause wicked namespace pollution. */
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
137 static const char *const errnoent0[] = {
138 #include "errnoent.h"
140 static const char *const signalent0[] = {
141 #include "signalent.h"
143 static const struct ioctlent ioctlent0[] = {
144 #include "ioctlent.h"
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];
152 #if SUPPORTED_PERSONALITIES >= 2
153 static const char *const errnoent1[] = {
154 # include "errnoent1.h"
156 static const char *const signalent1[] = {
157 # include "signalent1.h"
159 static const struct ioctlent ioctlent1[] = {
160 # include "ioctlent1.h"
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];
169 #if SUPPORTED_PERSONALITIES >= 3
170 static const char *const errnoent2[] = {
171 # include "errnoent2.h"
173 static const char *const signalent2[] = {
174 # include "signalent2.h"
176 static const struct ioctlent ioctlent2[] = {
177 # include "ioctlent2.h"
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];
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;
196 #if SUPPORTED_PERSONALITIES > 1
197 int current_personality;
199 const int personality_wordsize[SUPPORTED_PERSONALITIES] = {
200 PERSONALITY0_WORDSIZE,
201 PERSONALITY1_WORDSIZE,
202 # if SUPPORTED_PERSONALITIES > 2
203 PERSONALITY2_WORDSIZE,
208 set_personality(int personality)
210 switch (personality) {
212 errnoent = errnoent0;
215 nsyscalls = nsyscalls0;
216 ioctlent = ioctlent0;
217 nioctlents = nioctlents0;
218 signalent = signalent0;
219 nsignals = nsignals0;
220 qual_flags = qual_flags0;
224 errnoent = errnoent1;
227 nsyscalls = nsyscalls1;
228 ioctlent = ioctlent1;
229 nioctlents = nioctlents1;
230 signalent = signalent1;
231 nsignals = nsignals1;
232 qual_flags = qual_flags1;
235 # if SUPPORTED_PERSONALITIES >= 3
237 errnoent = errnoent2;
240 nsyscalls = nsyscalls2;
241 ioctlent = ioctlent2;
242 nioctlents = nioctlents2;
243 signalent = signalent2;
244 nsignals = nsignals2;
245 qual_flags = qual_flags2;
250 current_personality = personality;
254 update_personality(struct tcb *tcp, int personality)
256 if (personality == current_personality)
258 set_personality(personality);
260 if (personality == tcp->currpers)
262 tcp->currpers = personality;
264 # if defined(POWERPC64) || defined(X86_64)
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]);
274 static int qual_syscall(), qual_signal(), qual_fault(), qual_desc();
276 static const struct qual_options {
278 const char *option_name;
279 int (*qualify)(const char *, int, int);
280 const char *argument_name;
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 },
306 qualify_one(int n, int bitflag, int not, int pers)
308 if (pers == 0 || pers < 0) {
310 qual_flags0[n] &= ~bitflag;
312 qual_flags0[n] |= bitflag;
315 #if SUPPORTED_PERSONALITIES >= 2
316 if (pers == 1 || pers < 0) {
318 qual_flags1[n] &= ~bitflag;
320 qual_flags1[n] |= bitflag;
324 #if SUPPORTED_PERSONALITIES >= 3
325 if (pers == 2 || pers < 0) {
327 qual_flags2[n] &= ~bitflag;
329 qual_flags2[n] |= bitflag;
335 qual_syscall(const char *s, int bitflag, int not)
340 if (*s >= '0' && *s <= '9') {
341 int i = string_to_uint(s);
342 if (i < 0 || i >= MAX_QUALS)
344 qualify_one(i, bitflag, not, -1);
347 for (i = 0; i < nsyscalls0; i++)
348 if (strcmp(s, sysent0[i].sys_name) == 0) {
349 qualify_one(i, bitflag, not, 0);
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);
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);
373 qual_signal(const char *s, int bitflag, int not)
377 if (*s >= '0' && *s <= '9') {
378 int signo = string_to_uint(s);
379 if (signo < 0 || signo >= MAX_QUALS)
381 qualify_one(signo, bitflag, not, -1);
384 if (strncasecmp(s, "SIG", 3) == 0)
386 for (i = 0; i <= NSIG; i++) {
387 if (strcasecmp(s, signame(i) + 3) == 0) {
388 qualify_one(i, bitflag, not, -1);
396 qual_fault(const char *s, int bitflag, int not)
402 qual_desc(const char *s, int bitflag, int not)
404 if (*s >= '0' && *s <= '9') {
405 int desc = string_to_uint(s);
406 if (desc < 0 || desc >= MAX_QUALS)
408 qualify_one(desc, bitflag, not, -1);
415 lookup_class(const char *s)
417 if (strcmp(s, "file") == 0)
419 if (strcmp(s, "ipc") == 0)
421 if (strcmp(s, "network") == 0)
422 return TRACE_NETWORK;
423 if (strcmp(s, "process") == 0)
424 return TRACE_PROCESS;
425 if (strcmp(s, "signal") == 0)
427 if (strcmp(s, "desc") == 0)
433 qualify(const char *s)
435 const struct qual_options *opt;
441 opt = &qual_options[0];
442 for (i = 0; (p = qual_options[i].option_name); i++) {
444 if (strncmp(s, p, n) == 0 && s[n] == '=') {
445 opt = &qual_options[i];
455 if (strcmp(s, "none") == 0) {
459 if (strcmp(s, "all") == 0) {
460 for (i = 0; i < MAX_QUALS; i++) {
461 qualify_one(i, opt->bitflag, not, -1);
465 for (i = 0; i < MAX_QUALS; i++) {
466 qualify_one(i, opt->bitflag, !not, -1);
471 for (p = strtok(copy, ","); p; p = strtok(NULL, ",")) {
472 if (opt->bitflag == QUAL_TRACE && (n = lookup_class(p)) > 0) {
473 for (i = 0; i < nsyscalls0; i++)
474 if (sysent0[i].sys_flags & n)
475 qualify_one(i, opt->bitflag, not, 0);
477 #if SUPPORTED_PERSONALITIES >= 2
478 for (i = 0; i < nsyscalls1; i++)
479 if (sysent1[i].sys_flags & n)
480 qualify_one(i, opt->bitflag, not, 1);
483 #if SUPPORTED_PERSONALITIES >= 3
484 for (i = 0; i < nsyscalls2; i++)
485 if (sysent2[i].sys_flags & n)
486 qualify_one(i, opt->bitflag, not, 2);
491 if (opt->qualify(p, opt->bitflag, not)) {
492 error_msg_and_die("invalid %s '%s'",
493 opt->argument_name, p);
500 #ifdef SYS_socket_subcall
502 decode_socket_subcall(struct tcb *tcp)
505 unsigned int i, size;
507 if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= SYS_socket_nsubcalls)
510 tcp->scno = SYS_socket_subcall + tcp->u_arg[0];
511 addr = tcp->u_arg[1];
512 tcp->u_nargs = sysent[tcp->scno].nargs;
513 size = current_wordsize;
514 for (i = 0; i < tcp->u_nargs; ++i) {
515 if (size == sizeof(int)) {
517 if (umove(tcp, addr, &arg) < 0)
523 if (umove(tcp, addr, &arg) < 0)
532 #ifdef SYS_ipc_subcall
534 decode_ipc_subcall(struct tcb *tcp)
538 if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= SYS_ipc_nsubcalls)
541 tcp->scno = SYS_ipc_subcall + tcp->u_arg[0];
542 tcp->u_nargs = sysent[tcp->scno].nargs;
543 for (i = 0; i < tcp->u_nargs; i++)
544 tcp->u_arg[i] = tcp->u_arg[i + 1];
549 printargs(struct tcb *tcp)
554 for (i = 0; i < tcp->u_nargs; i++)
555 tprintf("%s%#lx", i ? ", " : "", tcp->u_arg[i]);
561 printargs_lu(struct tcb *tcp)
566 for (i = 0; i < tcp->u_nargs; i++)
567 tprintf("%s%lu", i ? ", " : "", tcp->u_arg[i]);
573 printargs_ld(struct tcb *tcp)
578 for (i = 0; i < tcp->u_nargs; i++)
579 tprintf("%s%ld", i ? ", " : "", tcp->u_arg[i]);
585 getrval2(struct tcb *tcp)
589 #if defined(SPARC) || defined(SPARC64)
591 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0)
593 val = regs.u_regs[U_REG_O1];
595 if (upeek(tcp, 4*(REG_REG0+1), &val) < 0)
598 if (upeek(tcp, PT_R9, &val) < 0)
606 is_restart_error(struct tcb *tcp)
608 switch (tcp->u_error) {
612 case ERESTART_RESTARTBLOCK:
621 struct pt_regs i386_regs;
622 #elif defined(X86_64)
624 * On 32 bits, pt_regs and user_regs_struct are the same,
625 * but on 64 bits, user_regs_struct has six more fields:
626 * fs_base, gs_base, ds, es, fs, gs.
627 * PTRACE_GETREGS fills them too, so struct pt_regs would overflow.
629 static struct user_regs_struct x86_64_regs;
631 long r8, r10, psr; /* TODO: make static? */
632 long ia32 = 0; /* not static */
633 #elif defined(POWERPC)
634 static long ppc_result;
640 static struct pt_regs regs;
645 static struct pt_regs regs;
646 #elif defined(SPARC) || defined(SPARC64)
647 static struct pt_regs regs;
648 static unsigned long trap;
649 #elif defined(LINUX_MIPSN32)
655 #elif defined(S390) || defined(S390X)
658 static long syscall_mode;
665 #elif defined(CRISV10) || defined(CRISV32)
667 #elif defined(MICROBLAZE)
672 * 0: "ignore this ptrace stop", bail out of trace_syscall_entering() silently.
673 * 1: ok, continue in trace_syscall_entering().
674 * other: error, trace_syscall_entering() should print error indicator
675 * ("????" etc) and bail out.
678 get_scno(struct tcb *tcp)
682 #if defined(S390) || defined(S390X)
683 if (upeek(tcp, PT_GPR2, &syscall_mode) < 0)
686 if (syscall_mode != -ENOSYS) {
688 * Since kernel version 2.5.44 the scno gets passed in gpr2.
693 * Old style of "passing" the scno via the SVC instruction.
695 long opcode, offset_reg, tmp;
697 static const int gpr_offset[16] = {
698 PT_GPR0, PT_GPR1, PT_ORIGGPR2, PT_GPR3,
699 PT_GPR4, PT_GPR5, PT_GPR6, PT_GPR7,
700 PT_GPR8, PT_GPR9, PT_GPR10, PT_GPR11,
701 PT_GPR12, PT_GPR13, PT_GPR14, PT_GPR15
704 if (upeek(tcp, PT_PSWADDR, &pc) < 0)
707 opcode = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)(pc-sizeof(long)), 0);
709 perror("peektext(pc-oneword)");
714 * We have to check if the SVC got executed directly or via an
715 * EXECUTE instruction. In case of EXECUTE it is necessary to do
716 * instruction decoding to derive the system call number.
717 * Unfortunately the opcode sizes of EXECUTE and SVC are differently,
718 * so that this doesn't work if a SVC opcode is part of an EXECUTE
719 * opcode. Since there is no way to find out the opcode size this
720 * is the best we can do...
722 if ((opcode & 0xff00) == 0x0a00) {
724 scno = opcode & 0xff;
727 /* SVC got executed by EXECUTE instruction */
730 * Do instruction decoding of EXECUTE. If you really want to
731 * understand this, read the Principles of Operations.
733 svc_addr = (void *) (opcode & 0xfff);
736 offset_reg = (opcode & 0x000f0000) >> 16;
737 if (offset_reg && (upeek(tcp, gpr_offset[offset_reg], &tmp) < 0))
742 offset_reg = (opcode & 0x0000f000) >> 12;
743 if (offset_reg && (upeek(tcp, gpr_offset[offset_reg], &tmp) < 0))
747 scno = ptrace(PTRACE_PEEKTEXT, tcp->pid, svc_addr, 0);
756 offset_reg = (opcode & 0x00f00000) >> 20;
757 if (offset_reg && (upeek(tcp, gpr_offset[offset_reg], &tmp) < 0))
760 scno = (scno | tmp) & 0xff;
763 #elif defined(POWERPC)
764 if (upeek(tcp, sizeof(unsigned long)*PT_R0, &scno) < 0)
767 /* TODO: speed up strace by not doing this at every syscall.
768 * We only need to do it after execve.
773 /* Check for 64/32 bit mode. */
774 if (upeek(tcp, sizeof(unsigned long)*PT_MSR, &val) < 0)
776 /* SF is bit 0 of MSR */
781 update_personality(tcp, currpers);
784 /* Read complete register set in one go. */
785 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, ®s) < 0)
789 if (upeek(tcp, PT_ORIG_P0, &scno))
792 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &i386_regs) < 0)
794 scno = i386_regs.orig_eax;
795 #elif defined(X86_64)
797 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &x86_64_regs) < 0)
799 scno = x86_64_regs.orig_rax;
801 /* Check CS register value. On x86-64 linux it is:
802 * 0x33 for long mode (64 bit)
803 * 0x23 for compatibility mode (32 bit)
805 switch (x86_64_regs.cs) {
806 case 0x23: currpers = 1; break;
807 case 0x33: currpers = 0; break;
809 fprintf(stderr, "Unknown value CS=0x%08X while "
810 "detecting personality of process "
811 "PID=%d\n", (int)x86_64_regs.cs, tcp->pid);
812 currpers = current_personality;
816 /* This version analyzes the opcode of a syscall instruction.
817 * (int 0x80 on i386 vs. syscall on x86-64)
818 * It works, but is too complicated.
820 unsigned long val, rip, i;
822 rip = x86_64_regs.rip;
824 /* sizeof(syscall) == sizeof(int 0x80) == 2 */
828 call = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)rip, (char *)0);
830 fprintf(stderr, "ptrace_peektext failed: %s\n",
832 switch (call & 0xffff) {
833 /* x86-64: syscall = 0x0f 0x05 */
834 case 0x050f: currpers = 0; break;
835 /* i386: int 0x80 = 0xcd 0x80 */
836 case 0x80cd: currpers = 1; break;
838 currpers = current_personality;
840 "Unknown syscall opcode (0x%04X) while "
841 "detecting personality of process "
842 "PID=%d\n", (int)call, tcp->pid);
846 update_personality(tcp, currpers);
848 # define IA64_PSR_IS ((long)1 << 34)
849 if (upeek(tcp, PT_CR_IPSR, &psr) >= 0)
850 ia32 = (psr & IA64_PSR_IS) != 0;
852 if (upeek(tcp, PT_R1, &scno) < 0)
855 if (upeek(tcp, PT_R15, &scno) < 0)
859 /* Read complete register set in one go. */
860 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (void *)®s) == -1)
864 * We only need to grab the syscall number on syscall entry.
866 if (regs.ARM_ip == 0) {
868 * Note: we only deal with only 32-bit CPUs here.
870 if (regs.ARM_cpsr & 0x20) {
872 * Get the Thumb-mode system call number
877 * Get the ARM-mode system call number
880 scno = ptrace(PTRACE_PEEKTEXT, tcp->pid, (void *)(regs.ARM_pc - 4), NULL);
884 /* Handle the EABI syscall convention. We do not
885 bother converting structures between the two
886 ABIs, but basic functionality should work even
887 if strace and the traced program have different
889 if (scno == 0xef000000) {
892 if ((scno & 0x0ff00000) != 0x0f900000) {
893 fprintf(stderr, "syscall: unknown syscall trap 0x%08lx\n",
899 * Fixup the syscall number
904 if (scno & 0x0f0000) {
906 * Handle ARM specific syscall
908 update_personality(tcp, 1);
911 update_personality(tcp, 0);
914 fprintf(stderr, "pid %d stray syscall entry\n", tcp->pid);
915 tcp->flags |= TCB_INSYSCALL;
918 if (upeek(tcp, 4*PT_ORIG_D0, &scno) < 0)
920 #elif defined(LINUX_MIPSN32)
921 unsigned long long regs[38];
923 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) ®s) < 0)
929 if (!SCNO_IN_RANGE(scno)) {
930 if (a3 == 0 || a3 == -1) {
932 fprintf(stderr, "stray syscall exit: v0 = %ld\n", scno);
937 if (upeek(tcp, REG_A3, &a3) < 0)
939 if (upeek(tcp, REG_V0, &scno) < 0)
942 if (!SCNO_IN_RANGE(scno)) {
943 if (a3 == 0 || a3 == -1) {
945 fprintf(stderr, "stray syscall exit: v0 = %ld\n", scno);
950 if (upeek(tcp, REG_A3, &a3) < 0)
952 if (upeek(tcp, REG_R0, &scno) < 0)
956 * Do some sanity checks to figure out if it's
957 * really a syscall entry
959 if (!SCNO_IN_RANGE(scno)) {
960 if (a3 == 0 || a3 == -1) {
962 fprintf(stderr, "stray syscall exit: r0 = %ld\n", scno);
966 #elif defined(SPARC) || defined(SPARC64)
967 /* Everything we need is in the current register set. */
968 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0)
971 /* Disassemble the syscall trap. */
972 /* Retrieve the syscall trap instruction. */
974 # if defined(SPARC64)
975 trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)regs.tpc, 0);
978 trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)regs.pc, 0);
983 /* Disassemble the trap to see what personality to use. */
986 /* Linux/SPARC syscall trap. */
987 update_personality(tcp, 0);
990 /* Linux/SPARC64 syscall trap. */
991 update_personality(tcp, 2);
994 /* SunOS syscall trap. (pers 1) */
995 fprintf(stderr, "syscall: SunOS no support\n");
998 /* Solaris 2.x syscall trap. (per 2) */
999 update_personality(tcp, 1);
1002 /* NetBSD/FreeBSD syscall trap. */
1003 fprintf(stderr, "syscall: NetBSD/FreeBSD not supported\n");
1006 /* Solaris 2.x gettimeofday */
1007 update_personality(tcp, 1);
1010 # if defined(SPARC64)
1011 fprintf(stderr, "syscall: unknown syscall trap %08lx %016lx\n", trap, regs.tpc);
1013 fprintf(stderr, "syscall: unknown syscall trap %08lx %08lx\n", trap, regs.pc);
1018 /* Extract the system call number from the registers. */
1019 if (trap == 0x91d02027)
1022 scno = regs.u_regs[U_REG_G1];
1024 scno = regs.u_regs[U_REG_O0];
1025 memmove(®s.u_regs[U_REG_O0], ®s.u_regs[U_REG_O1], 7*sizeof(regs.u_regs[0]));
1028 if (upeek(tcp, PT_GR20, &scno) < 0)
1032 * In the new syscall ABI, the system call number is in R3.
1034 if (upeek(tcp, 4*(REG_REG0+3), &scno) < 0)
1038 /* Odd as it may seem, a glibc bug has been known to cause
1039 glibc to issue bogus negative syscall numbers. So for
1040 our purposes, make strace print what it *should* have been */
1041 long correct_scno = (scno & 0xff);
1044 "Detected glibc bug: bogus system call"
1045 " number = %ld, correcting to %ld\n",
1048 scno = correct_scno;
1051 if (upeek(tcp, REG_SYSCALL, &scno) < 0)
1054 #elif defined(CRISV10) || defined(CRISV32)
1055 if (upeek(tcp, 4*PT_R9, &scno) < 0)
1058 if (upeek(tcp, PTREGS_OFFSET_REG(10), &scno) < 0)
1060 #elif defined(MICROBLAZE)
1061 if (upeek(tcp, 0, &scno) < 0)
1066 /* new syscall ABI returns result in R0 */
1067 if (upeek(tcp, 4*REG_REG0, (long *)&r0) < 0)
1070 /* ABI defines result returned in r9 */
1071 if (upeek(tcp, REG_GENERAL(9), (long *)&r9) < 0)
1079 /* Called at each syscall entry.
1081 * 0: "ignore this ptrace stop", bail out of trace_syscall_entering() silently.
1082 * 1: ok, continue in trace_syscall_entering().
1083 * other: error, trace_syscall_entering() should print error indicator
1084 * ("????" etc) and bail out.
1087 syscall_fixup_on_sysenter(struct tcb *tcp)
1089 /* A common case of "not a syscall entry" is post-execve SIGTRAP */
1091 if (i386_regs.eax != -ENOSYS) {
1093 fprintf(stderr, "not a syscall entry (eax = %ld)\n", i386_regs.eax);
1096 #elif defined(X86_64)
1098 long rax = x86_64_regs.rax;
1099 if (current_personality == 1)
1100 rax = (int)rax; /* sign extend from 32 bits */
1101 if (rax != -ENOSYS) {
1103 fprintf(stderr, "not a syscall entry (rax = %ld)\n", rax);
1107 #elif defined(S390) || defined(S390X)
1108 /* TODO: we already fetched PT_GPR2 in get_scno
1109 * and stored it in syscall_mode, reuse it here
1110 * instead of re-fetching?
1112 if (upeek(tcp, PT_GPR2, &gpr2) < 0)
1114 if (syscall_mode != -ENOSYS)
1115 syscall_mode = tcp->scno;
1116 if (gpr2 != syscall_mode) {
1118 fprintf(stderr, "not a syscall entry (gpr2 = %ld)\n", gpr2);
1122 /* TODO? Eliminate upeek's in arches below like we did in x86 */
1123 if (upeek(tcp, 4*PT_D0, &d0) < 0)
1125 if (d0 != -ENOSYS) {
1127 fprintf(stderr, "not a syscall entry (d0 = %ld)\n", d0);
1131 if (upeek(tcp, PT_R10, &r10) < 0)
1133 if (upeek(tcp, PT_R8, &r8) < 0)
1135 if (ia32 && r8 != -ENOSYS) {
1137 fprintf(stderr, "not a syscall entry (r8 = %ld)\n", r8);
1140 #elif defined(CRISV10) || defined(CRISV32)
1141 if (upeek(tcp, 4*PT_R10, &r10) < 0)
1143 if (r10 != -ENOSYS) {
1145 fprintf(stderr, "not a syscall entry (r10 = %ld)\n", r10);
1148 #elif defined(MICROBLAZE)
1149 if (upeek(tcp, 3 * 4, &r3) < 0)
1151 if (r3 != -ENOSYS) {
1153 fprintf(stderr, "not a syscall entry (r3 = %ld)\n", r3);
1161 internal_fork(struct tcb *tcp)
1163 #if defined S390 || defined S390X || defined CRISV10 || defined CRISV32
1164 # define ARG_FLAGS 1
1166 # define ARG_FLAGS 0
1168 #ifndef CLONE_UNTRACED
1169 # define CLONE_UNTRACED 0x00800000
1171 if ((ptrace_setoptions
1172 & (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
1173 == (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
1179 if (entering(tcp)) {
1181 * We won't see the new child if clone is called with
1182 * CLONE_UNTRACED, so we keep the same logic with that option
1183 * and don't trace it.
1185 if ((sysent[tcp->scno].sys_func == sys_clone) &&
1186 (tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED))
1190 if (tcp->flags & TCB_BPTSET)
1195 #if defined(TCB_WAITEXECVE)
1197 internal_exec(struct tcb *tcp)
1199 /* Maybe we have post-execve SIGTRAP suppressed? */
1200 if (ptrace_setoptions & PTRACE_O_TRACEEXEC)
1201 return; /* yes, no need to do anything */
1203 if (exiting(tcp) && syserror(tcp))
1204 /* Error in execve, no post-execve SIGTRAP expected */
1205 tcp->flags &= ~TCB_WAITEXECVE;
1207 tcp->flags |= TCB_WAITEXECVE;
1212 internal_syscall(struct tcb *tcp)
1215 * We must always trace a few critical system calls in order to
1216 * correctly support following forks in the presence of tracing
1221 if (!SCNO_IN_RANGE(tcp->scno))
1224 func = sysent[tcp->scno].sys_func;
1226 if ( sys_fork == func
1227 || sys_vfork == func
1228 || sys_clone == func
1234 #if defined(TCB_WAITEXECVE)
1235 if ( sys_execve == func
1236 # if defined(SPARC) || defined(SPARC64)
1237 || sys_execv == func
1246 /* Return -1 on error or 1 on success (never 0!) */
1248 get_syscall_args(struct tcb *tcp)
1252 if (SCNO_IN_RANGE(tcp->scno))
1253 nargs = tcp->u_nargs = sysent[tcp->scno].nargs;
1255 nargs = tcp->u_nargs = MAX_ARGS;
1257 #if defined(S390) || defined(S390X)
1258 for (i = 0; i < nargs; ++i)
1259 if (upeek(tcp, i==0 ? PT_ORIGGPR2 : PT_GPR2 + i*sizeof(long), &tcp->u_arg[i]) < 0)
1261 #elif defined(ALPHA)
1262 for (i = 0; i < nargs; ++i)
1263 if (upeek(tcp, REG_A0+i, &tcp->u_arg[i]) < 0)
1267 unsigned long *out0, cfm, sof, sol;
1269 /* be backwards compatible with kernel < 2.4.4... */
1271 # define PT_RBS_END PT_AR_BSP
1274 if (upeek(tcp, PT_RBS_END, &rbs_end) < 0)
1276 if (upeek(tcp, PT_CFM, (long *) &cfm) < 0)
1279 sof = (cfm >> 0) & 0x7f;
1280 sol = (cfm >> 7) & 0x7f;
1281 out0 = ia64_rse_skip_regs((unsigned long *) rbs_end, -sof + sol);
1283 for (i = 0; i < nargs; ++i) {
1284 if (umoven(tcp, (unsigned long) ia64_rse_skip_regs(out0, i),
1285 sizeof(long), (char *) &tcp->u_arg[i]) < 0)
1289 static const int argreg[MAX_ARGS] = { PT_R11 /* EBX = out0 */,
1290 PT_R9 /* ECX = out1 */,
1291 PT_R10 /* EDX = out2 */,
1292 PT_R14 /* ESI = out3 */,
1293 PT_R15 /* EDI = out4 */,
1294 PT_R13 /* EBP = out5 */};
1296 for (i = 0; i < nargs; ++i) {
1297 if (upeek(tcp, argreg[i], &tcp->u_arg[i]) < 0)
1299 /* truncate away IVE sign-extension */
1300 tcp->u_arg[i] &= 0xffffffff;
1303 #elif defined(LINUX_MIPSN32) || defined(LINUX_MIPSN64)
1304 /* N32 and N64 both use up to six registers. */
1305 unsigned long long regs[38];
1307 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) ®s) < 0)
1310 for (i = 0; i < nargs; ++i) {
1311 tcp->u_arg[i] = regs[REG_A0 + i];
1312 # if defined(LINUX_MIPSN32)
1313 tcp->ext_arg[i] = regs[REG_A0 + i];
1320 if (upeek(tcp, REG_SP, &sp) < 0)
1322 for (i = 0; i < 4; ++i)
1323 if (upeek(tcp, REG_A0 + i, &tcp->u_arg[i]) < 0)
1325 umoven(tcp, sp + 16, (nargs - 4) * sizeof(tcp->u_arg[0]),
1326 (char *)(tcp->u_arg + 4));
1328 for (i = 0; i < nargs; ++i)
1329 if (upeek(tcp, REG_A0 + i, &tcp->u_arg[i]) < 0)
1332 #elif defined(POWERPC)
1334 # define PT_ORIG_R3 34
1336 for (i = 0; i < nargs; ++i) {
1337 if (upeek(tcp, (i==0) ?
1338 (sizeof(unsigned long) * PT_ORIG_R3) :
1339 ((i+PT_R3) * sizeof(unsigned long)),
1340 &tcp->u_arg[i]) < 0)
1343 #elif defined(SPARC) || defined(SPARC64)
1344 for (i = 0; i < nargs; ++i)
1345 tcp->u_arg[i] = regs.u_regs[U_REG_O0 + i];
1347 for (i = 0; i < nargs; ++i)
1348 if (upeek(tcp, PT_GR26-4*i, &tcp->u_arg[i]) < 0)
1351 for (i = 0; i < nargs; ++i)
1352 tcp->u_arg[i] = regs.uregs[i];
1353 #elif defined(AVR32)
1356 tcp->u_arg[0] = regs.r12;
1357 tcp->u_arg[1] = regs.r11;
1358 tcp->u_arg[2] = regs.r10;
1359 tcp->u_arg[3] = regs.r9;
1360 tcp->u_arg[4] = regs.r5;
1361 tcp->u_arg[5] = regs.r3;
1363 static const int argreg[MAX_ARGS] = { PT_R0, PT_R1, PT_R2, PT_R3, PT_R4, PT_R5 };
1365 for (i = 0; i < nargs; ++i)
1366 if (upeek(tcp, argreg[i], &tcp->u_arg[i]) < 0)
1369 static const int syscall_regs[MAX_ARGS] = {
1370 4 * (REG_REG0+4), 4 * (REG_REG0+5), 4 * (REG_REG0+6),
1371 4 * (REG_REG0+7), 4 * (REG_REG0 ), 4 * (REG_REG0+1)
1374 for (i = 0; i < nargs; ++i)
1375 if (upeek(tcp, syscall_regs[i], &tcp->u_arg[i]) < 0)
1379 /* Registers used by SH5 Linux system calls for parameters */
1380 static const int syscall_regs[MAX_ARGS] = { 2, 3, 4, 5, 6, 7 };
1382 for (i = 0; i < nargs; ++i)
1383 if (upeek(tcp, REG_GENERAL(syscall_regs[i]), &tcp->u_arg[i]) < 0)
1385 #elif defined(X86_64)
1388 if (current_personality == 0) { /* x86-64 ABI */
1389 tcp->u_arg[0] = x86_64_regs.rdi;
1390 tcp->u_arg[1] = x86_64_regs.rsi;
1391 tcp->u_arg[2] = x86_64_regs.rdx;
1392 tcp->u_arg[3] = x86_64_regs.r10;
1393 tcp->u_arg[4] = x86_64_regs.r8;
1394 tcp->u_arg[5] = x86_64_regs.r9;
1395 } else { /* i386 ABI */
1396 /* Sign-extend lower 32 bits */
1397 tcp->u_arg[0] = (long)(int)x86_64_regs.rbx;
1398 tcp->u_arg[1] = (long)(int)x86_64_regs.rcx;
1399 tcp->u_arg[2] = (long)(int)x86_64_regs.rdx;
1400 tcp->u_arg[3] = (long)(int)x86_64_regs.rsi;
1401 tcp->u_arg[4] = (long)(int)x86_64_regs.rdi;
1402 tcp->u_arg[5] = (long)(int)x86_64_regs.rbp;
1404 #elif defined(MICROBLAZE)
1405 for (i = 0; i < nargs; ++i)
1406 if (upeek(tcp, (5 + i) * 4, &tcp->u_arg[i]) < 0)
1408 #elif defined(CRISV10) || defined(CRISV32)
1409 static const int crisregs[MAX_ARGS] = {
1410 4*PT_ORIG_R10, 4*PT_R11, 4*PT_R12,
1411 4*PT_R13 , 4*PT_MOF, 4*PT_SRP
1414 for (i = 0; i < nargs; ++i)
1415 if (upeek(tcp, crisregs[i], &tcp->u_arg[i]) < 0)
1418 for (i = 0; i < nargs; ++i)
1419 if (upeek(tcp, PTREGS_OFFSET_REG(i), &tcp->u_arg[i]) < 0)
1422 for (i = 0; i < nargs; ++i)
1423 if (upeek(tcp, (i < 5 ? i : i + 2)*4, &tcp->u_arg[i]) < 0)
1428 tcp->u_arg[0] = i386_regs.ebx;
1429 tcp->u_arg[1] = i386_regs.ecx;
1430 tcp->u_arg[2] = i386_regs.edx;
1431 tcp->u_arg[3] = i386_regs.esi;
1432 tcp->u_arg[4] = i386_regs.edi;
1433 tcp->u_arg[5] = i386_regs.ebp;
1434 #else /* Other architecture (32bits specific) */
1435 for (i = 0; i < nargs; ++i)
1436 if (upeek(tcp, i*4, &tcp->u_arg[i]) < 0)
1443 trace_syscall_entering(struct tcb *tcp)
1447 #if defined TCB_WAITEXECVE
1448 if (tcp->flags & TCB_WAITEXECVE) {
1449 /* This is the post-execve SIGTRAP. */
1450 tcp->flags &= ~TCB_WAITEXECVE;
1455 scno_good = res = get_scno(tcp);
1459 res = syscall_fixup_on_sysenter(tcp);
1463 res = get_syscall_args(tcp);
1469 tprints("????" /* anti-trigraph gap */ "(");
1470 else if (!SCNO_IN_RANGE(tcp->scno))
1471 tprintf("syscall_%lu(", tcp->scno);
1473 tprintf("%s(", sysent[tcp->scno].sys_name);
1475 * " <unavailable>" will be added later by the code which
1476 * detects ptrace errors.
1481 #if defined(SYS_socket_subcall) || defined(SYS_ipc_subcall)
1482 while (SCNO_IN_RANGE(tcp->scno)) {
1483 # ifdef SYS_socket_subcall
1484 if (sysent[tcp->scno].sys_func == sys_socketcall) {
1485 decode_socket_subcall(tcp);
1489 # ifdef SYS_ipc_subcall
1490 if (sysent[tcp->scno].sys_func == sys_ipc) {
1491 decode_ipc_subcall(tcp);
1497 #endif /* SYS_socket_subcall || SYS_ipc_subcall */
1499 internal_syscall(tcp);
1501 if ((SCNO_IN_RANGE(tcp->scno) &&
1502 !(qual_flags[tcp->scno] & QUAL_TRACE)) ||
1503 (tracing_paths && !pathtrace_match(tcp))) {
1504 tcp->flags |= TCB_INSYSCALL | TCB_FILTERED;
1508 tcp->flags &= ~TCB_FILTERED;
1510 if (cflag == CFLAG_ONLY_STATS) {
1516 if (!SCNO_IN_RANGE(tcp->scno))
1517 tprintf("syscall_%lu(", tcp->scno);
1519 tprintf("%s(", sysent[tcp->scno].sys_name);
1520 if (!SCNO_IN_RANGE(tcp->scno) ||
1521 ((qual_flags[tcp->scno] & QUAL_RAW) &&
1522 sysent[tcp->scno].sys_func != sys_exit))
1523 res = printargs(tcp);
1525 res = (*sysent[tcp->scno].sys_func)(tcp);
1527 if (fflush(tcp->outf) == EOF)
1530 tcp->flags |= TCB_INSYSCALL;
1531 /* Measure the entrance time as late as possible to avoid errors. */
1533 gettimeofday(&tcp->etime, NULL);
1538 * 1: ok, continue in trace_syscall_exiting().
1539 * -1: error, trace_syscall_exiting() should print error indicator
1540 * ("????" etc) and bail out.
1543 get_syscall_result(struct tcb *tcp)
1545 #if defined(S390) || defined(S390X)
1546 if (upeek(tcp, PT_GPR2, &gpr2) < 0)
1548 #elif defined(POWERPC)
1549 # define SO_MASK 0x10000000
1552 if (upeek(tcp, sizeof(unsigned long)*PT_CCR, &flags) < 0)
1554 if (upeek(tcp, sizeof(unsigned long)*PT_R3, &ppc_result) < 0)
1556 if (flags & SO_MASK)
1557 ppc_result = -ppc_result;
1559 #elif defined(AVR32)
1560 /* Read complete register set in one go. */
1561 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, ®s) < 0)
1564 if (upeek(tcp, PT_R0, &r0) < 0)
1567 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &i386_regs) < 0)
1569 #elif defined(X86_64)
1570 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) &x86_64_regs) < 0)
1573 # define IA64_PSR_IS ((long)1 << 34)
1574 if (upeek(tcp, PT_CR_IPSR, &psr) >= 0)
1575 ia32 = (psr & IA64_PSR_IS) != 0;
1576 if (upeek(tcp, PT_R8, &r8) < 0)
1578 if (upeek(tcp, PT_R10, &r10) < 0)
1581 /* Read complete register set in one go. */
1582 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (void *)®s) == -1)
1585 if (upeek(tcp, 4*PT_D0, &d0) < 0)
1587 #elif defined(LINUX_MIPSN32)
1588 unsigned long long regs[38];
1590 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long) ®s) < 0)
1595 if (upeek(tcp, REG_A3, &a3) < 0)
1597 if (upeek(tcp, REG_V0, &r2) < 0)
1599 #elif defined(ALPHA)
1600 if (upeek(tcp, REG_A3, &a3) < 0)
1602 if (upeek(tcp, REG_R0, &r0) < 0)
1604 #elif defined(SPARC) || defined(SPARC64)
1605 /* Everything we need is in the current register set. */
1606 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0)
1609 if (upeek(tcp, PT_GR28, &r28) < 0)
1613 #elif defined(CRISV10) || defined(CRISV32)
1614 if (upeek(tcp, 4*PT_R10, &r10) < 0)
1617 #elif defined(MICROBLAZE)
1618 if (upeek(tcp, 3 * 4, &r3) < 0)
1623 /* new syscall ABI returns result in R0 */
1624 if (upeek(tcp, 4*REG_REG0, (long *)&r0) < 0)
1627 /* ABI defines result returned in r9 */
1628 if (upeek(tcp, REG_GENERAL(9), (long *)&r9) < 0)
1635 /* Called at each syscall exit */
1637 syscall_fixup_on_sysexit(struct tcb *tcp)
1639 #if defined(S390) || defined(S390X)
1640 if (syscall_mode != -ENOSYS)
1641 syscall_mode = tcp->scno;
1642 if ((tcp->flags & TCB_WAITEXECVE)
1643 && (gpr2 == -ENOSYS || gpr2 == tcp->scno)) {
1645 * Return from execve.
1646 * Fake a return value of zero. We leave the TCB_WAITEXECVE
1647 * flag set for the post-execve SIGTRAP to see and reset.
1655 * Check the syscall return value register value for whether it is
1656 * a negated errno code indicating an error, or a success return value.
1659 is_negated_errno(unsigned long int val)
1661 unsigned long int max = -(long int) nerrnos;
1662 #if SUPPORTED_PERSONALITIES > 1
1663 if (current_wordsize < sizeof(val)) {
1664 val = (unsigned int) val;
1665 max = (unsigned int) max;
1672 * 1: ok, continue in trace_syscall_exiting().
1673 * -1: error, trace_syscall_exiting() should print error indicator
1674 * ("????" etc) and bail out.
1677 get_error(struct tcb *tcp)
1680 int check_errno = 1;
1681 if (SCNO_IN_RANGE(tcp->scno) &&
1682 sysent[tcp->scno].sys_flags & SYSCALL_NEVER_FAILS) {
1685 #if defined(S390) || defined(S390X)
1686 if (check_errno && is_negated_errno(gpr2)) {
1694 if (check_errno && is_negated_errno(i386_regs.eax)) {
1696 u_error = -i386_regs.eax;
1699 tcp->u_rval = i386_regs.eax;
1701 #elif defined(X86_64)
1702 if (check_errno && is_negated_errno(x86_64_regs.rax)) {
1704 u_error = -x86_64_regs.rax;
1707 tcp->u_rval = x86_64_regs.rax;
1714 if (check_errno && is_negated_errno(err)) {
1722 if (check_errno && r10) {
1730 if (check_errno && a3) {
1736 #elif defined(POWERPC)
1737 if (check_errno && is_negated_errno(ppc_result)) {
1739 u_error = -ppc_result;
1742 tcp->u_rval = ppc_result;
1745 if (check_errno && is_negated_errno(d0)) {
1753 if (check_errno && is_negated_errno(regs.ARM_r0)) {
1755 u_error = -regs.ARM_r0;
1758 tcp->u_rval = regs.ARM_r0;
1760 #elif defined(AVR32)
1761 if (check_errno && regs.r12 && (unsigned) -regs.r12 < nerrnos) {
1763 u_error = -regs.r12;
1766 tcp->u_rval = regs.r12;
1769 if (check_errno && is_negated_errno(r0)) {
1775 #elif defined(ALPHA)
1776 if (check_errno && a3) {
1783 #elif defined(SPARC)
1784 if (check_errno && regs.psr & PSR_C) {
1786 u_error = regs.u_regs[U_REG_O0];
1789 tcp->u_rval = regs.u_regs[U_REG_O0];
1791 #elif defined(SPARC64)
1792 if (check_errno && regs.tstate & 0x1100000000UL) {
1794 u_error = regs.u_regs[U_REG_O0];
1797 tcp->u_rval = regs.u_regs[U_REG_O0];
1800 if (check_errno && is_negated_errno(r28)) {
1808 if (check_errno && is_negated_errno(r0)) {
1816 if (check_errno && is_negated_errno(r9)) {
1823 #elif defined(CRISV10) || defined(CRISV32)
1824 if (check_errno && r10 && (unsigned) -r10 < nerrnos) {
1833 if (upeek(tcp, PTREGS_OFFSET_REG(0), &rval) < 0)
1835 if (check_errno && rval < 0 && rval > -nerrnos) {
1842 #elif defined(MICROBLAZE)
1843 if (check_errno && is_negated_errno(r3)) {
1851 tcp->u_error = u_error;
1856 dumpio(struct tcb *tcp)
1860 if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= MAX_QUALS)
1862 if (!SCNO_IN_RANGE(tcp->scno))
1864 if (sysent[tcp->scno].sys_func == printargs)
1866 if (qual_flags[tcp->u_arg[0]] & QUAL_READ) {
1867 if (sysent[tcp->scno].sys_func == sys_read ||
1868 sysent[tcp->scno].sys_func == sys_pread ||
1869 sysent[tcp->scno].sys_func == sys_recv ||
1870 sysent[tcp->scno].sys_func == sys_recvfrom)
1871 dumpstr(tcp, tcp->u_arg[1], tcp->u_rval);
1872 else if (sysent[tcp->scno].sys_func == sys_readv)
1873 dumpiov(tcp, tcp->u_arg[2], tcp->u_arg[1]);
1876 if (qual_flags[tcp->u_arg[0]] & QUAL_WRITE) {
1877 if (sysent[tcp->scno].sys_func == sys_write ||
1878 sysent[tcp->scno].sys_func == sys_pwrite ||
1879 sysent[tcp->scno].sys_func == sys_send ||
1880 sysent[tcp->scno].sys_func == sys_sendto)
1881 dumpstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1882 else if (sysent[tcp->scno].sys_func == sys_writev)
1883 dumpiov(tcp, tcp->u_arg[2], tcp->u_arg[1]);
1889 trace_syscall_exiting(struct tcb *tcp)
1896 /* Measure the exit time as early as possible to avoid errors. */
1898 gettimeofday(&tv, NULL);
1900 #if SUPPORTED_PERSONALITIES > 1
1901 update_personality(tcp, tcp->currpers);
1903 res = get_syscall_result(tcp);
1905 syscall_fixup_on_sysexit(tcp); /* never fails */
1906 res = get_error(tcp); /* returns 1 or -1 */
1908 internal_syscall(tcp);
1909 if (filtered(tcp)) {
1916 struct timeval t = tv;
1917 count_syscall(tcp, &t);
1918 if (cflag == CFLAG_ONLY_STATS) {
1923 /* If not in -ff mode, and printing_tcp != tcp,
1924 * then the log currently does not end with output
1925 * of _our syscall entry_, but with something else.
1926 * We need to say which syscall's return is this.
1928 * Forced reprinting via TCB_REPRINT is used only by
1929 * "strace -ff -oLOG test/threaded_execve" corner case.
1930 * It's the only case when -ff mode needs reprinting.
1932 if ((followfork < 2 && printing_tcp != tcp) || (tcp->flags & TCB_REPRINT)) {
1933 tcp->flags &= ~TCB_REPRINT;
1935 if (!SCNO_IN_RANGE(tcp->scno))
1936 tprintf("<... syscall_%lu resumed> ", tcp->scno);
1938 tprintf("<... %s resumed> ", sysent[tcp->scno].sys_name);
1943 /* There was error in one of prior ptrace ops */
1946 tprints("= ? <unavailable>\n");
1948 tcp->flags &= ~TCB_INSYSCALL;
1953 if (!SCNO_IN_RANGE(tcp->scno)
1954 || (qual_flags[tcp->scno] & QUAL_RAW)) {
1955 /* sys_res = printargs(tcp); - but it's nop on sysexit */
1957 /* FIXME: not_failing_only (IOW, option -z) is broken:
1958 * failure of syscall is known only after syscall return.
1959 * Thus we end up with something like this on, say, ENOENT:
1960 * open("doesnt_exist", O_RDONLY <unfinished ...>
1961 * {next syscall decode}
1962 * whereas the intended result is that open(...) line
1963 * is not shown at all.
1965 if (not_failing_only && tcp->u_error)
1966 goto ret; /* ignore failed syscalls */
1967 sys_res = (*sysent[tcp->scno].sys_func)(tcp);
1972 u_error = tcp->u_error;
1973 if (!SCNO_IN_RANGE(tcp->scno) ||
1974 qual_flags[tcp->scno] & QUAL_RAW) {
1976 tprintf("= -1 (errno %ld)", u_error);
1978 tprintf("= %#lx", tcp->u_rval);
1980 else if (!(sys_res & RVAL_NONE) && u_error) {
1982 /* Blocked signals do not interrupt any syscalls.
1983 * In this case syscalls don't return ERESTARTfoo codes.
1985 * Deadly signals set to SIG_DFL interrupt syscalls
1986 * and kill the process regardless of which of the codes below
1987 * is returned by the interrupted syscall.
1988 * In some cases, kernel forces a kernel-generated deadly
1989 * signal to be unblocked and set to SIG_DFL (and thus cause
1990 * death) if it is blocked or SIG_IGNed: for example, SIGSEGV
1991 * or SIGILL. (The alternative is to leave process spinning
1992 * forever on the faulty instruction - not useful).
1994 * SIG_IGNed signals and non-deadly signals set to SIG_DFL
1995 * (for example, SIGCHLD, SIGWINCH) interrupt syscalls,
1996 * but kernel will always restart them.
1999 /* Most common type of signal-interrupted syscall exit code.
2000 * The system call will be restarted with the same arguments
2001 * if SA_RESTART is set; otherwise, it will fail with EINTR.
2003 tprints("= ? ERESTARTSYS (To be restarted if SA_RESTART is set)");
2005 case ERESTARTNOINTR:
2006 /* Rare. For example, fork() returns this if interrupted.
2007 * SA_RESTART is ignored (assumed set): the restart is unconditional.
2009 tprints("= ? ERESTARTNOINTR (To be restarted)");
2011 case ERESTARTNOHAND:
2012 /* pause(), rt_sigsuspend() etc use this code.
2013 * SA_RESTART is ignored (assumed not set):
2014 * syscall won't restart (will return EINTR instead)
2015 * even after signal with SA_RESTART set.
2016 * However, after SIG_IGN or SIG_DFL signal it will.
2018 tprints("= ? ERESTARTNOHAND (Interrupted by signal)");
2020 case ERESTART_RESTARTBLOCK:
2021 /* Syscalls like nanosleep(), poll() which can't be
2022 * restarted with their original arguments use this
2023 * code. Kernel will execute restart_syscall() instead,
2024 * which changes arguments before restarting syscall.
2025 * SA_RESTART is ignored (assumed not set) similarly
2026 * to ERESTARTNOHAND. (Kernel can't honor SA_RESTART
2027 * since restart data is saved in "restart block"
2028 * in task struct, and if signal handler uses a syscall
2029 * which in turn saves another such restart block,
2030 * old data is lost and restart becomes impossible)
2032 tprints("= ? ERESTART_RESTARTBLOCK (Interrupted by signal)");
2036 tprintf("= -1 E??? (errno %ld)", u_error);
2037 else if (u_error < nerrnos)
2038 tprintf("= -1 %s (%s)", errnoent[u_error],
2041 tprintf("= -1 ERRNO_%ld (%s)", u_error,
2045 if ((sys_res & RVAL_STR) && tcp->auxstr)
2046 tprintf(" (%s)", tcp->auxstr);
2049 if (sys_res & RVAL_NONE)
2052 switch (sys_res & RVAL_MASK) {
2054 tprintf("= %#lx", tcp->u_rval);
2057 tprintf("= %#lo", tcp->u_rval);
2060 tprintf("= %lu", tcp->u_rval);
2063 tprintf("= %ld", tcp->u_rval);
2067 "invalid rval format\n");
2071 if ((sys_res & RVAL_STR) && tcp->auxstr)
2072 tprintf(" (%s)", tcp->auxstr);
2075 tv_sub(&tv, &tv, &tcp->etime);
2076 tprintf(" <%ld.%06ld>",
2077 (long) tv.tv_sec, (long) tv.tv_usec);
2084 tcp->flags &= ~TCB_INSYSCALL;
2089 trace_syscall(struct tcb *tcp)
2091 return exiting(tcp) ?
2092 trace_syscall_exiting(tcp) : trace_syscall_entering(tcp);