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.
39 #include <sys/syscall.h>
41 #include <sys/param.h>
47 #include <machine/reg.h>
52 #if defined(linux) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 1))
53 #include <linux/ptrace.h>
56 #if defined(LINUX) && defined(IA64)
57 # include <asm/ptrace_offsets.h>
63 # define PTRACE_PEEKUSR PTRACE_PEEKUSER
64 #elif defined(HAVE_LINUX_PTRACE_H)
66 # ifdef HAVE_STRUCT_IA64_FPREG
67 # define ia64_fpreg XXX_ia64_fpreg
69 # ifdef HAVE_STRUCT_PT_ALL_USER_REGS
70 # define pt_all_user_regs XXX_pt_all_user_regs
72 #include <linux/ptrace.h>
74 # undef pt_all_user_regs
77 #ifdef SUNOS4_KERNEL_ARCH_KLUDGE
78 #include <sys/utsname.h>
79 #endif /* SUNOS4_KERNEL_ARCH_KLUDGE */
81 #if defined(LINUXSPARC) && defined (SPARC64)
82 # undef PTRACE_GETREGS
83 # define PTRACE_GETREGS PTRACE_GETREGS64
84 # undef PTRACE_SETREGS
85 # define PTRACE_SETREGS PTRACE_SETREGS64
90 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
93 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
100 return a->tv_sec || a->tv_usec;
105 struct timeval *a, *b;
107 if (a->tv_sec < b->tv_sec
108 || (a->tv_sec == b->tv_sec && a->tv_usec < b->tv_usec))
110 if (a->tv_sec > b->tv_sec
111 || (a->tv_sec == b->tv_sec && a->tv_usec > b->tv_usec))
120 return tv->tv_sec + tv->tv_usec/1000000.0;
125 struct timeval *tv, *a, *b;
127 tv->tv_sec = a->tv_sec + b->tv_sec;
128 tv->tv_usec = a->tv_usec + b->tv_usec;
129 if (tv->tv_usec >= 1000000) {
131 tv->tv_usec -= 1000000;
137 struct timeval *tv, *a, *b;
139 tv->tv_sec = a->tv_sec - b->tv_sec;
140 tv->tv_usec = a->tv_usec - b->tv_usec;
141 if (((long) tv->tv_usec) < 0) {
143 tv->tv_usec += 1000000;
149 struct timeval *tv, *a;
152 tv->tv_usec = (a->tv_sec % n * 1000000 + a->tv_usec + n / 2) / n;
153 tv->tv_sec = a->tv_sec / n + tv->tv_usec / 1000000;
154 tv->tv_usec %= 1000000;
159 struct timeval *tv, *a;
162 tv->tv_usec = a->tv_usec * n;
163 tv->tv_sec = a->tv_sec * n + tv->tv_usec / 1000000;
164 tv->tv_usec %= 1000000;
168 xlookup(const struct xlat *xlat, int val)
170 for (; xlat->str != NULL; xlat++)
171 if (xlat->val == val)
177 * Generic ptrace wrapper which tracks ESRCH errors
178 * by setting tcp->ptrace_errno to ESRCH.
180 * We assume that ESRCH indicates likely process death (SIGKILL?),
181 * modulo bugs where process somehow ended up not stopped.
182 * Unfortunately kernel uses ESRCH for that case too. Oh well.
184 * Currently used by upeek() only.
185 * TODO: use this in all other ptrace() calls while decoding.
188 do_ptrace(int request, struct tcb *tcp, void *addr, void *data)
193 l = ptrace(request, tcp->pid, addr, (long) data);
194 /* Non-ESRCH errors might be our invalid reg/mem accesses,
195 * we do not record them. */
197 tcp->ptrace_errno = ESRCH;
202 * Used when we want to unblock stopped traced process.
203 * Should be only used with PTRACE_CONT, PTRACE_DETACH and PTRACE_SYSCALL.
204 * Returns 0 on success or if error was ESRCH
205 * (presumably process was killed while we talk to it).
206 * Otherwise prints error message and returns -1.
209 ptrace_restart(int op, struct tcb *tcp, int sig)
215 ptrace(op, tcp->pid, (void *) 1, (long) sig);
217 if (!err || err == ESRCH)
220 tcp->ptrace_errno = err;
222 if (op == PTRACE_CONT)
224 if (op == PTRACE_DETACH)
226 fprintf(stderr, "strace: ptrace(PTRACE_%s,1,%d): %s\n",
227 msg, sig, strerror(err));
232 * Print entry in struct xlat table, if there.
235 printxval(const struct xlat *xlat, int val, const char *dflt)
237 const char *str = xlookup(xlat, val);
242 tprintf("%#x /* %s */", val, dflt);
247 * Print 64bit argument at position llarg and return the index of the next
251 printllval(struct tcb *tcp, const char *format, int llarg)
253 # if defined(FREEBSD) \
254 || (defined(LINUX) && defined(POWERPC) && !defined(POWERPC64)) \
255 || defined (LINUX_MIPSO32)
256 /* Align 64bit argument to 64bit boundary. */
257 if (llarg % 2) llarg++;
259 # if defined LINUX && (defined X86_64 || defined POWERPC64)
260 if (current_personality == 0) {
261 tprintf(format, tcp->u_arg[llarg]);
265 /* Align 64bit argument to 64bit boundary. */
266 if (llarg % 2) llarg++;
268 tprintf(format, LONG_LONG(tcp->u_arg[llarg], tcp->u_arg[llarg + 1]));
271 # elif defined IA64 || defined ALPHA
272 tprintf(format, tcp->u_arg[llarg]);
274 # elif defined LINUX_MIPSN32
275 tprintf(format, tcp->ext_arg[llarg]);
278 tprintf(format, LONG_LONG(tcp->u_arg[llarg], tcp->u_arg[llarg + 1]));
286 * Interpret `xlat' as an array of flags
287 * print the entries whose bits are on in `flags'
288 * return # of flags printed.
291 addflags(xlat, flags)
292 const struct xlat *xlat;
297 for (n = 0; xlat->str; xlat++) {
298 if (xlat->val && (flags & xlat->val) == xlat->val) {
299 tprintf("|%s", xlat->str);
305 tprintf("|%#x", flags);
312 * Interpret `xlat' as an array of flags/
313 * Print to static string the entries whose bits are on in `flags'
314 * Return static string.
317 sprintflags(const char *prefix, const struct xlat *xlat, int flags)
319 static char outstr[1024];
322 strcpy(outstr, prefix);
324 for (; xlat->str; xlat++) {
325 if ((flags & xlat->val) == xlat->val) {
328 strcat(outstr, xlat->str);
336 sprintf(outstr + strlen(outstr), "%#x", flags);
343 printflags(const struct xlat *xlat, int flags, const char *dflt)
348 if (flags == 0 && xlat->val == 0) {
349 tprintf("%s", xlat->str);
354 for (n = 0; xlat->str; xlat++) {
355 if (xlat->val && (flags & xlat->val) == xlat->val) {
356 tprintf("%s%s", sep, xlat->str);
365 tprintf("%s%#x", sep, flags);
370 tprintf("%#x", flags);
372 tprintf(" /* %s */", dflt);
383 printnum(struct tcb *tcp, long addr, const char *fmt)
391 if (umove(tcp, addr, &num) < 0) {
392 tprintf("%#lx", addr);
401 printnum_int(struct tcb *tcp, long addr, const char *fmt)
409 if (umove(tcp, addr, &num) < 0) {
410 tprintf("%#lx", addr);
419 printfd(struct tcb *tcp, int fd)
423 if (show_fd_path && (p = getfdpath(tcp, fd)))
424 tprintf("%d<%s>", fd, p);
435 tprintf((uid == -1) ? "%ld" : "%lu", uid);
438 static char path[MAXPATHLEN + 1];
441 * Quote string `instr' of length `size'
442 * Write up to (3 + `size' * 4) bytes to `outstr' buffer.
443 * If `len' < 0, treat `instr' as a NUL-terminated string
444 * and quote at most (`size' - 1) bytes.
447 string_quote(const char *instr, char *outstr, int len, int size)
449 const unsigned char *ustr = (const unsigned char *) instr;
451 int usehex = 0, c, i;
456 /* Check for presence of symbol which require
457 to hex-quote the whole string. */
458 for (i = 0; i < size; ++i) {
460 /* Check for NUL-terminated string. */
464 /* Quote at most size - 1 bytes. */
468 if (!isprint(c) && !isspace(c)) {
478 /* Hex-quote the whole string. */
479 for (i = 0; i < size; ++i) {
481 /* Check for NUL-terminated string. */
485 /* Quote at most size - 1 bytes. */
489 sprintf(s, "\\x%02x", c);
493 for (i = 0; i < size; ++i) {
495 /* Check for NUL-terminated string. */
499 /* Quote at most size - 1 bytes. */
504 case '\"': case '\\':
531 else if (i + 1 < size
532 && isdigit(ustr[i + 1])) {
533 sprintf(s, "\\%03o", c);
536 sprintf(s, "\\%o", c);
547 /* Return nonzero if the string was unterminated. */
552 * Print path string specified by address `addr' and length `n'.
553 * If path length exceeds `n', append `...' to the output.
556 printpathn(struct tcb *tcp, long addr, int n)
563 /* Cap path length to the path buffer size,
564 and NUL-terminate the buffer. */
565 if (n > sizeof path - 1)
569 /* Fetch one byte more to find out whether path length > n. */
570 if (umovestr(tcp, addr, n + 1, path) < 0)
571 tprintf("%#lx", addr);
573 static char outstr[4*(sizeof path - 1) + sizeof "\"...\""];
574 int trunc = (path[n] != '\0');
578 (void) string_quote(path, outstr, -1, n + 1);
580 strcat(outstr, "...");
581 tprintf("%s", outstr);
586 printpath(struct tcb *tcp, long addr)
588 printpathn(tcp, addr, sizeof path - 1);
592 * Print string specified by address `addr' and length `len'.
593 * If `len' < 0, treat the string as a NUL-terminated string.
594 * If string length exceeds `max_strlen', append `...' to the output.
597 printstr(struct tcb *tcp, long addr, int len)
599 static char *str = NULL;
607 /* Allocate static buffers if they are not allocated yet. */
609 str = malloc(max_strlen + 1);
611 outstr = malloc(4 * max_strlen + sizeof "\"...\"");
612 if (!str || !outstr) {
613 fprintf(stderr, "out of memory\n");
614 tprintf("%#lx", addr);
620 * Treat as a NUL-terminated string: fetch one byte more
621 * because string_quote() quotes one byte less.
623 size = max_strlen + 1;
624 str[max_strlen] = '\0';
625 if (umovestr(tcp, addr, size, str) < 0) {
626 tprintf("%#lx", addr);
631 size = MIN(len, max_strlen);
632 if (umoven(tcp, addr, size, str) < 0) {
633 tprintf("%#lx", addr);
638 if (string_quote(str, outstr, len, size) &&
639 (len < 0 || len > max_strlen))
640 strcat(outstr, "...");
642 tprintf("%s", outstr);
647 dumpiov(tcp, len, addr)
652 #if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
654 struct { u_int32_t base; u_int32_t len; } *iov32;
655 struct { u_int64_t base; u_int64_t len; } *iov64;
657 #define iov iovu.iov64
659 (personality_wordsize[current_personality] == 4 \
660 ? sizeof(*iovu.iov32) : sizeof(*iovu.iov64))
661 #define iov_iov_base(i) \
662 (personality_wordsize[current_personality] == 4 \
663 ? (u_int64_t) iovu.iov32[i].base : iovu.iov64[i].base)
664 #define iov_iov_len(i) \
665 (personality_wordsize[current_personality] == 4 \
666 ? (u_int64_t) iovu.iov32[i].len : iovu.iov64[i].len)
669 #define sizeof_iov sizeof(*iov)
670 #define iov_iov_base(i) iov[i].iov_base
671 #define iov_iov_len(i) iov[i].iov_len
676 size = sizeof_iov * (unsigned long) len;
677 if (size / sizeof_iov != len
678 || (iov = malloc(size)) == NULL) {
679 fprintf(stderr, "out of memory\n");
682 if (umoven(tcp, addr, size, (char *) iov) >= 0) {
683 for (i = 0; i < len; i++) {
684 /* include the buffer number to make it easy to
685 * match up the trace with the source */
686 tprintf(" * %lu bytes in buffer %d\n",
687 (unsigned long)iov_iov_len(i), i);
688 dumpstr(tcp, (long) iov_iov_base(i),
701 dumpstr(tcp, addr, len)
706 static int strsize = -1;
707 static unsigned char *str;
708 static char outstr[80];
715 if ((str = malloc(len)) == NULL) {
716 fprintf(stderr, "out of memory\n");
722 if (umoven(tcp, addr, len, (char *) str) < 0)
725 for (i = 0; i < len; i += 16) {
727 sprintf(s, " | %05x ", i);
729 for (j = 0; j < 16; j++) {
733 sprintf(s, " %02x", str[i + j]);
737 *s++ = ' '; *s++ = ' '; *s++ = ' ';
740 *s++ = ' '; *s++ = ' ';
741 for (j = 0; j < 16; j++) {
745 if (isprint(str[i + j]))
753 tprintf("%s |\n", outstr);
757 #define PAGMASK (~(PAGSIZ - 1))
759 * move `len' bytes of data from process `pid'
760 * at address `addr' to our space at `laddr'
763 umoven(struct tcb *tcp, long addr, int len, char *laddr)
771 char x[sizeof(long)];
774 if (addr & (sizeof(long) - 1)) {
775 /* addr not a multiple of sizeof(long) */
776 n = addr - (addr & -sizeof(long)); /* residue */
777 addr &= -sizeof(long); /* residue */
779 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);
781 if (started && (errno==EPERM || errno==EIO)) {
782 /* Ran into 'end of memory' - stupid "printpath" */
785 /* But if not started, we had a bogus address. */
786 if (addr != 0 && errno != EIO && errno != ESRCH)
787 perror("ptrace: umoven");
791 memcpy(laddr, &u.x[n], m = MIN(sizeof(long) - n, len));
792 addr += sizeof(long), laddr += m, len -= m;
796 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);
798 if (started && (errno==EPERM || errno==EIO)) {
799 /* Ran into 'end of memory' - stupid "printpath" */
802 if (addr != 0 && errno != EIO && errno != ESRCH)
803 perror("ptrace: umoven");
807 memcpy(laddr, u.x, m = MIN(sizeof(long), len));
808 addr += sizeof(long), laddr += m, len -= m;
817 n = MIN(len, PAGSIZ);
818 n = MIN(n, ((addr + PAGSIZ) & PAGMASK) - addr);
819 if (ptrace(PTRACE_READDATA, pid,
820 (char *) addr, len, laddr) < 0) {
821 if (errno != ESRCH) {
822 perror("umoven: ptrace(PTRACE_READDATA, ...)");
834 #ifdef HAVE_MP_PROCFS
835 int fd = tcp->pfd_as;
839 lseek(fd, addr, SEEK_SET);
840 if (read(fd, laddr, len) == -1)
842 #endif /* USE_PROCFS */
848 * like `umove' but make the additional effort of looking
849 * for a terminating zero byte.
852 umovestr(struct tcb *tcp, long addr, int len, char *laddr)
855 #ifdef HAVE_MP_PROCFS
856 int fd = tcp->pfd_as;
860 /* Some systems (e.g. FreeBSD) can be upset if we read off the
861 end of valid memory, avoid this by trying to read up
862 to page boundaries. But we don't know what a page is (and
863 getpagesize(2) (if it exists) doesn't necessarily return
864 hardware page size). Assume all pages >= 1024 (a-historical
867 int page = 1024; /* How to find this? */
868 int move = page - (addr & (page - 1));
871 lseek(fd, addr, SEEK_SET);
874 if (move > left) move = left;
875 if ((move = read(fd, laddr, move)) <= 0)
876 return left != len ? 0 : -1;
877 if (memchr (laddr, 0, move)) break;
883 #else /* !USE_PROCFS */
889 char x[sizeof(long)];
892 if (addr & (sizeof(long) - 1)) {
893 /* addr not a multiple of sizeof(long) */
894 n = addr - (addr & -sizeof(long)); /* residue */
895 addr &= -sizeof(long); /* residue */
897 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);
899 if (started && (errno==EPERM || errno==EIO)) {
900 /* Ran into 'end of memory' - stupid "printpath" */
903 if (addr != 0 && errno != EIO && errno != ESRCH)
908 memcpy(laddr, &u.x[n], m = MIN(sizeof(long)-n,len));
909 while (n & (sizeof(long) - 1))
910 if (u.x[n++] == '\0')
912 addr += sizeof(long), laddr += m, len -= m;
916 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);
918 if (started && (errno==EPERM || errno==EIO)) {
919 /* Ran into 'end of memory' - stupid "printpath" */
922 if (addr != 0 && errno != EIO && errno != ESRCH)
927 memcpy(laddr, u.x, m = MIN(sizeof(long), len));
928 for (i = 0; i < sizeof(long); i++)
932 addr += sizeof(long), laddr += m, len -= m;
934 #endif /* !USE_PROCFS */
939 # if !defined (SPARC) && !defined(SPARC64)
940 # define PTRACE_WRITETEXT 101
941 # define PTRACE_WRITEDATA 102
942 # endif /* !SPARC && !SPARC64 */
948 uload(cmd, pid, addr, len, laddr)
959 char x[sizeof(long)];
962 if (cmd == PTRACE_WRITETEXT) {
963 peek = PTRACE_PEEKTEXT;
964 poke = PTRACE_POKETEXT;
967 peek = PTRACE_PEEKDATA;
968 poke = PTRACE_POKEDATA;
970 if (addr & (sizeof(long) - 1)) {
971 /* addr not a multiple of sizeof(long) */
972 n = addr - (addr & -sizeof(long)); /* residue */
973 addr &= -sizeof(long);
975 u.val = ptrace(peek, pid, (char *) addr, 0);
977 perror("uload: POKE");
980 memcpy(&u.x[n], laddr, m = MIN(sizeof(long) - n, len));
981 if (ptrace(poke, pid, (char *)addr, u.val) < 0) {
982 perror("uload: POKE");
985 addr += sizeof(long), laddr += m, len -= m;
988 if (len < sizeof(long))
989 u.val = ptrace(peek, pid, (char *) addr, 0);
990 memcpy(u.x, laddr, m = MIN(sizeof(long), len));
991 if (ptrace(poke, pid, (char *) addr, u.val) < 0) {
992 perror("uload: POKE");
995 addr += sizeof(long), laddr += m, len -= m;
1001 tload(pid, addr, len, laddr)
1006 return uload(PTRACE_WRITETEXT, pid, addr, len, laddr);
1010 dload(pid, addr, len, laddr)
1016 return uload(PTRACE_WRITEDATA, pid, addr, len, laddr);
1024 upeek(tcp, off, res)
1031 # ifdef SUNOS4_KERNEL_ARCH_KLUDGE
1033 static int is_sun4m = -1;
1034 struct utsname name;
1036 /* Round up the usual suspects. */
1037 if (is_sun4m == -1) {
1038 if (uname(&name) < 0) {
1039 perror("upeek: uname?");
1042 is_sun4m = strcmp(name.machine, "sun4m") == 0;
1044 const struct xlat *x;
1046 for (x = struct_user_offsets; x->str; x++)
1053 # endif /* SUNOS4_KERNEL_ARCH_KLUDGE */
1055 val = do_ptrace(PTRACE_PEEKUSER, tcp, (char *) off, 0);
1056 if (val == -1 && errno) {
1057 if (errno != ESRCH) {
1059 sprintf(buf,"upeek: ptrace(PTRACE_PEEKUSER,%d,%lu,0)", tcp->pid, off);
1068 #endif /* !USE_PROCFS */
1071 printcall(struct tcb *tcp)
1073 #define PRINTBADPC tprintf(sizeof(long) == 4 ? "[????????] " : \
1074 sizeof(long) == 8 ? "[????????????????] " : \
1081 if (upeek(tcp, 4*EIP, &eip) < 0) {
1085 tprintf("[%08lx] ", eip);
1087 # elif defined(S390) || defined(S390X)
1089 if(upeek(tcp,PT_PSWADDR,&psw) < 0) {
1094 tprintf("[%08lx] ", psw);
1096 tprintf("[%16lx] ", psw);
1099 # elif defined(X86_64)
1102 if (upeek(tcp, 8*RIP, &rip) < 0) {
1106 tprintf("[%16lx] ", rip);
1107 # elif defined(IA64)
1110 if (upeek(tcp, PT_B0, &ip) < 0) {
1114 tprintf("[%08lx] ", ip);
1115 # elif defined(POWERPC)
1118 if (upeek(tcp, sizeof(unsigned long)*PT_NIP, &pc) < 0) {
1123 tprintf("[%016lx] ", pc);
1125 tprintf("[%08lx] ", pc);
1127 # elif defined(M68K)
1130 if (upeek(tcp, 4*PT_PC, &pc) < 0) {
1131 tprintf ("[????????] ");
1134 tprintf("[%08lx] ", pc);
1135 # elif defined(ALPHA)
1138 if (upeek(tcp, REG_PC, &pc) < 0) {
1139 tprintf ("[????????????????] ");
1142 tprintf("[%08lx] ", pc);
1143 # elif defined(SPARC) || defined(SPARC64)
1144 struct pt_regs regs;
1145 if (ptrace(PTRACE_GETREGS,tcp->pid,(char *)®s,0) < 0) {
1149 # if defined(SPARC64)
1150 tprintf("[%08lx] ", regs.tpc);
1152 tprintf("[%08lx] ", regs.pc);
1154 # elif defined(HPPA)
1157 if(upeek(tcp,PT_IAOQ0,&pc) < 0) {
1158 tprintf ("[????????] ");
1161 tprintf("[%08lx] ", pc);
1162 # elif defined(MIPS)
1165 if (upeek(tcp, REG_EPC, &pc) < 0) {
1166 tprintf ("[????????] ");
1169 tprintf("[%08lx] ", pc);
1173 if (upeek(tcp, 4*REG_PC, &pc) < 0) {
1174 tprintf ("[????????] ");
1177 tprintf("[%08lx] ", pc);
1178 # elif defined(SH64)
1181 if (upeek(tcp, REG_PC, &pc) < 0) {
1182 tprintf ("[????????????????] ");
1185 tprintf("[%08lx] ", pc);
1189 if (upeek(tcp, 4*15, &pc) < 0) {
1193 tprintf("[%08lx] ", pc);
1194 # elif defined(AVR32)
1197 if (upeek(tcp, REG_PC, &pc) < 0) {
1198 tprintf("[????????] ");
1201 tprintf("[%08lx] ", pc);
1202 # elif defined(BFIN)
1205 if (upeek(tcp, PT_PC, &pc) < 0) {
1209 tprintf("[%08lx] ", pc);
1210 #elif defined(CRISV10)
1213 if (upeek(tcp, 4*PT_IRP, &pc) < 0) {
1217 tprintf("[%08lx] ", pc);
1218 #elif defined(CRISV32)
1221 if (upeek(tcp, 4*PT_ERP, &pc) < 0) {
1225 tprintf("[%08lx] ", pc);
1226 # endif /* architecture */
1232 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *) ®s, 0) < 0) {
1233 perror("printcall: ptrace(PTRACE_GETREGS, ...)");
1237 tprintf("[%08x] ", regs.r_o7);
1247 pread(tcp->pfd_reg, ®s, sizeof(regs), 0);
1248 tprintf("[%08x] ", regs.r_eip);
1249 #endif /* FREEBSD */
1254 * These #if's are huge, please indent them correctly.
1255 * It's easy to get confused otherwise.
1261 # include "syscall.h"
1263 # include <sys/syscall.h>
1264 # ifndef CLONE_PTRACE
1265 # define CLONE_PTRACE 0x00002000
1267 # ifndef CLONE_VFORK
1268 # define CLONE_VFORK 0x00004000
1271 # define CLONE_VM 0x00000100
1273 # ifndef CLONE_STOPPED
1274 # define CLONE_STOPPED 0x02000000
1279 /* We don't have fork()/vfork() syscalls on ia64 itself, but the ia32
1280 subsystem has them for x86... */
1282 # define SYS_vfork 190
1284 typedef unsigned long *arg_setup_state;
1287 arg_setup(struct tcb *tcp, arg_setup_state *state)
1289 unsigned long cfm, sof, sol;
1293 /* Satisfy a false GCC warning. */
1298 if (upeek(tcp, PT_AR_BSP, &bsp) < 0)
1300 if (upeek(tcp, PT_CFM, (long *) &cfm) < 0)
1303 sof = (cfm >> 0) & 0x7f;
1304 sol = (cfm >> 7) & 0x7f;
1305 bsp = (long) ia64_rse_skip_regs((unsigned long *) bsp, -sof + sol);
1307 *state = (unsigned long *) bsp;
1311 # define arg_finish_change(tcp, state) 0
1315 get_arg0 (struct tcb *tcp, arg_setup_state *state, long *valp)
1320 ret = upeek (tcp, PT_R11, valp);
1323 (unsigned long) ia64_rse_skip_regs(*state, 0),
1324 sizeof(long), (void *) valp);
1329 get_arg1 (struct tcb *tcp, arg_setup_state *state, long *valp)
1334 ret = upeek (tcp, PT_R9, valp);
1337 (unsigned long) ia64_rse_skip_regs(*state, 1),
1338 sizeof(long), (void *) valp);
1344 set_arg0 (struct tcb *tcp, arg_setup_state *state, long val)
1346 int req = PTRACE_POKEDATA;
1350 ap = (void *) (intptr_t) PT_R11; /* r11 == EBX */
1351 req = PTRACE_POKEUSER;
1353 ap = ia64_rse_skip_regs(*state, 0);
1355 ptrace(req, tcp->pid, ap, val);
1356 return errno ? -1 : 0;
1360 set_arg1 (struct tcb *tcp, arg_setup_state *state, long val)
1362 int req = PTRACE_POKEDATA;
1366 ap = (void *) (intptr_t) PT_R9; /* r9 == ECX */
1367 req = PTRACE_POKEUSER;
1369 ap = ia64_rse_skip_regs(*state, 1);
1371 ptrace(req, tcp->pid, ap, val);
1372 return errno ? -1 : 0;
1375 /* ia64 does not return the input arguments from functions (and syscalls)
1376 according to ia64 RSE (Register Stack Engine) behavior. */
1378 # define restore_arg0(tcp, state, val) ((void) (state), 0)
1379 # define restore_arg1(tcp, state, val) ((void) (state), 0)
1381 # elif defined (SPARC) || defined (SPARC64)
1383 typedef struct pt_regs arg_setup_state;
1385 # define arg_setup(tcp, state) \
1386 (ptrace (PTRACE_GETREGS, tcp->pid, (char *) (state), 0))
1387 # define arg_finish_change(tcp, state) \
1388 (ptrace (PTRACE_SETREGS, tcp->pid, (char *) (state), 0))
1390 # define get_arg0(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O0], 0)
1391 # define get_arg1(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O1], 0)
1392 # define set_arg0(tcp, state, val) ((state)->u_regs[U_REG_O0] = (val), 0)
1393 # define set_arg1(tcp, state, val) ((state)->u_regs[U_REG_O1] = (val), 0)
1394 # define restore_arg0(tcp, state, val) 0
1396 # else /* other architectures */
1398 # if defined S390 || defined S390X
1399 /* Note: this is only true for the `clone' system call, which handles
1400 arguments specially. We could as well say that its first two arguments
1401 are swapped relative to other architectures, but that would just be
1402 another #ifdef in the calls. */
1403 # define arg0_offset PT_GPR3
1404 # define arg1_offset PT_ORIGGPR2
1405 # define restore_arg0(tcp, state, val) ((void) (state), 0)
1406 # define restore_arg1(tcp, state, val) ((void) (state), 0)
1407 # define arg0_index 1
1408 # define arg1_index 0
1409 # elif defined (ALPHA) || defined (MIPS)
1410 # define arg0_offset REG_A0
1411 # define arg1_offset (REG_A0+1)
1412 # elif defined (AVR32)
1413 # define arg0_offset (REG_R12)
1414 # define arg1_offset (REG_R11)
1415 # elif defined (POWERPC)
1416 # define arg0_offset (sizeof(unsigned long)*PT_R3)
1417 # define arg1_offset (sizeof(unsigned long)*PT_R4)
1418 # define restore_arg0(tcp, state, val) ((void) (state), 0)
1419 # elif defined (HPPA)
1420 # define arg0_offset PT_GR26
1421 # define arg1_offset (PT_GR26-4)
1422 # elif defined (X86_64)
1423 # define arg0_offset ((long)(8*(current_personality ? RBX : RDI)))
1424 # define arg1_offset ((long)(8*(current_personality ? RCX : RSI)))
1426 # define arg0_offset (4*(REG_REG0+4))
1427 # define arg1_offset (4*(REG_REG0+5))
1428 # elif defined (SH64)
1429 /* ABI defines arg0 & 1 in r2 & r3 */
1430 # define arg0_offset (REG_OFFSET+16)
1431 # define arg1_offset (REG_OFFSET+24)
1432 # define restore_arg0(tcp, state, val) 0
1433 # elif defined CRISV10 || defined CRISV32
1434 # define arg0_offset (4*PT_R11)
1435 # define arg1_offset (4*PT_ORIG_R10)
1436 # define restore_arg0(tcp, state, val) 0
1437 # define restore_arg1(tcp, state, val) 0
1438 # define arg0_index 1
1439 # define arg1_index 0
1441 # define arg0_offset 0
1442 # define arg1_offset 4
1444 # define restore_arg0(tcp, state, val) 0
1448 typedef int arg_setup_state;
1450 # define arg_setup(tcp, state) (0)
1451 # define arg_finish_change(tcp, state) 0
1452 # define get_arg0(tcp, cookie, valp) \
1453 (upeek ((tcp), arg0_offset, (valp)))
1454 # define get_arg1(tcp, cookie, valp) \
1455 (upeek ((tcp), arg1_offset, (valp)))
1458 set_arg0 (struct tcb *tcp, void *cookie, long val)
1460 return ptrace (PTRACE_POKEUSER, tcp->pid, (char*)arg0_offset, val);
1464 set_arg1 (struct tcb *tcp, void *cookie, long val)
1466 return ptrace (PTRACE_POKEUSER, tcp->pid, (char*)arg1_offset, val);
1469 # endif /* architectures */
1471 # ifndef restore_arg0
1472 # define restore_arg0(tcp, state, val) set_arg0((tcp), (state), (val))
1474 # ifndef restore_arg1
1475 # define restore_arg1(tcp, state, val) set_arg1((tcp), (state), (val))
1479 # define arg0_index 0
1480 # define arg1_index 1
1484 setbpt(struct tcb *tcp)
1486 static int clone_scno[SUPPORTED_PERSONALITIES] = { SYS_clone };
1487 arg_setup_state state;
1489 if (tcp->flags & TCB_BPTSET) {
1490 fprintf(stderr, "PANIC: TCB already set in pid %u\n", tcp->pid);
1495 * It's a silly kludge to initialize this with a search at runtime.
1496 * But it's better than maintaining another magic thing in the
1497 * godforsaken tables.
1499 if (clone_scno[current_personality] == 0) {
1501 for (i = 0; i < nsyscalls; ++i)
1502 if (sysent[i].sys_func == sys_clone) {
1503 clone_scno[current_personality] = i;
1508 switch (known_scno(tcp)) {
1515 # if defined SYS_fork || defined SYS_vfork
1516 if (arg_setup (tcp, &state) < 0
1517 || get_arg0 (tcp, &state, &tcp->inst[0]) < 0
1518 || get_arg1 (tcp, &state, &tcp->inst[1]) < 0
1519 || change_syscall(tcp, clone_scno[current_personality]) < 0
1520 || set_arg0 (tcp, &state, CLONE_PTRACE|SIGCHLD) < 0
1521 || set_arg1 (tcp, &state, 0) < 0
1522 || arg_finish_change (tcp, &state) < 0)
1524 tcp->u_arg[arg0_index] = CLONE_PTRACE|SIGCHLD;
1525 tcp->u_arg[arg1_index] = 0;
1526 tcp->flags |= TCB_BPTSET;
1534 /* ia64 calls directly `clone (CLONE_VFORK | CLONE_VM)'
1535 contrary to x86 SYS_vfork above. Even on x86 we turn the
1536 vfork semantics into plain fork - each application must not
1537 depend on the vfork specifics according to POSIX. We would
1538 hang waiting for the parent resume otherwise. We need to
1539 clear also CLONE_VM but only in the CLONE_VFORK case as
1540 otherwise we would break pthread_create. */
1542 if ((arg_setup (tcp, &state) < 0
1543 || set_arg0 (tcp, &state,
1544 (tcp->u_arg[arg0_index] | CLONE_PTRACE)
1545 & ~(tcp->u_arg[arg0_index] & CLONE_VFORK
1546 ? CLONE_VFORK | CLONE_VM : 0)) < 0
1547 || arg_finish_change (tcp, &state) < 0))
1549 tcp->flags |= TCB_BPTSET;
1550 tcp->inst[0] = tcp->u_arg[arg0_index];
1551 tcp->inst[1] = tcp->u_arg[arg1_index];
1555 fprintf(stderr, "PANIC: setbpt for syscall %ld on %u???\n",
1556 tcp->scno, tcp->pid);
1567 arg_setup_state state;
1568 if (arg_setup (tcp, &state) < 0
1569 || restore_arg0 (tcp, &state, tcp->inst[0]) < 0
1570 || restore_arg1 (tcp, &state, tcp->inst[1]) < 0
1571 || arg_finish_change (tcp, &state))
1572 if (errno != ESRCH) return -1;
1573 tcp->flags &= ~TCB_BPTSET;
1577 # else /* !defined LINUX */
1584 # ifdef SPARC /* This code is slightly sparc specific */
1587 # define BPT 0x91d02001 /* ta 1 */
1588 # define LOOP 0x10800000 /* ba 0 */
1589 # define LOOPA 0x30800000 /* ba,a 0 */
1590 # define NOP 0x01000000
1592 static int loopdeloop[1] = {LOOPA};
1594 static int loopdeloop[2] = {LOOP, NOP};
1597 if (tcp->flags & TCB_BPTSET) {
1598 fprintf(stderr, "PANIC: TCB already set in pid %u\n", tcp->pid);
1601 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) {
1602 perror("setbpt: ptrace(PTRACE_GETREGS, ...)");
1605 tcp->baddr = regs.r_o7 + 8;
1606 if (ptrace(PTRACE_READTEXT, tcp->pid, (char *)tcp->baddr,
1607 sizeof tcp->inst, (char *)tcp->inst) < 0) {
1608 perror("setbpt: ptrace(PTRACE_READTEXT, ...)");
1613 * XXX - BRUTAL MODE ON
1614 * We cannot set a real BPT in the child, since it will not be
1615 * traced at the moment it will reach the trap and would probably
1616 * die with a core dump.
1617 * Thus, we are force our way in by taking out two instructions
1618 * and insert an eternal loop in stead, in expectance of the SIGSTOP
1619 * generated by out PTRACE_ATTACH.
1620 * Of cause, if we evaporate ourselves in the middle of all this...
1622 if (ptrace(PTRACE_WRITETEXT, tcp->pid, (char *) tcp->baddr,
1623 sizeof loopdeloop, (char *) loopdeloop) < 0) {
1624 perror("setbpt: ptrace(PTRACE_WRITETEXT, ...)");
1627 tcp->flags |= TCB_BPTSET;
1630 # endif /* SUNOS4 */
1646 if (!(tcp->flags & TCB_BPTSET)) {
1647 fprintf(stderr, "PANIC: TCB not set in pid %u\n", tcp->pid);
1650 if (ptrace(PTRACE_WRITETEXT, tcp->pid, (char *) tcp->baddr,
1651 sizeof tcp->inst, (char *) tcp->inst) < 0) {
1652 perror("clearbtp: ptrace(PTRACE_WRITETEXT, ...)");
1655 tcp->flags &= ~TCB_BPTSET;
1659 * Since we don't have a single instruction breakpoint, we may have
1660 * to adjust the program counter after removing our `breakpoint'.
1662 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) {
1663 perror("clearbpt: ptrace(PTRACE_GETREGS, ...)");
1666 if ((regs.r_pc < tcp->baddr) ||
1667 (regs.r_pc > tcp->baddr + 4)) {
1668 /* The breakpoint has not been reached yet */
1671 "NOTE: PC not at bpt (pc %#x baddr %#x)\n",
1672 regs.r_pc, tcp->baddr);
1675 if (regs.r_pc != tcp->baddr)
1677 fprintf(stderr, "NOTE: PC adjusted (%#x -> %#x\n",
1678 regs.r_pc, tcp->baddr);
1680 regs.r_pc = tcp->baddr;
1681 if (ptrace(PTRACE_SETREGS, tcp->pid, (char *)®s, 0) < 0) {
1682 perror("clearbpt: ptrace(PTRACE_SETREGS, ...)");
1687 # endif /* SUNOS4 */
1692 # endif /* !defined LINUX */
1694 #endif /* !USE_PROCFS */
1706 for (n = 0; n < sizeof *hdr; n += 4) {
1708 if (upeek(tcp, uoff(u_exdata) + n, &res) < 0)
1710 memcpy(((char *) hdr) + n, &res, 4);
1713 fprintf(stderr, "[struct exec: magic: %o version %u Mach %o\n",
1714 hdr->a_magic, hdr->a_toolversion, hdr->a_machtype);
1715 fprintf(stderr, "Text %lu Data %lu Bss %lu Syms %lu Entry %#lx]\n",
1716 hdr->a_text, hdr->a_data, hdr->a_bss, hdr->a_syms, hdr->a_entry);
1727 * Change `vfork' in a freshly exec'ed dynamically linked
1728 * executable's (internal) symbol table to plain old `fork'
1732 struct link_dynamic dyn;
1733 struct link_dynamic_2 ld;
1736 if (getex(tcp, &hdr) < 0)
1741 if (umove(tcp, (int) N_DATADDR(hdr), &dyn) < 0) {
1742 fprintf(stderr, "Cannot read DYNAMIC\n");
1745 if (umove(tcp, (int) dyn.ld_un.ld_2, &ld) < 0) {
1746 fprintf(stderr, "Cannot read link_dynamic_2\n");
1749 if ((strtab = malloc((unsigned)ld.ld_symb_size)) == NULL) {
1750 fprintf(stderr, "out of memory\n");
1753 if (umoven(tcp, (int)ld.ld_symbols+(int)N_TXTADDR(hdr),
1754 (int)ld.ld_symb_size, strtab) < 0)
1757 for (cp = strtab; cp < strtab + ld.ld_symb_size; ) {
1758 if (strcmp(cp, "_vfork") == 0) {
1760 fprintf(stderr, "fixvfork: FOUND _vfork\n");
1761 strcpy(cp, "_fork");
1766 if (cp < strtab + ld.ld_symb_size)
1768 * Write entire symbol table back to avoid
1769 * memory alignment bugs in ptrace
1771 if (tload(pid, (int)ld.ld_symbols+(int)N_TXTADDR(hdr),
1772 (int)ld.ld_symb_size, strtab) < 0)