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))
97 tv_nz(struct timeval *a)
99 return a->tv_sec || a->tv_usec;
103 tv_cmp(struct timeval *a, struct timeval *b)
105 if (a->tv_sec < b->tv_sec
106 || (a->tv_sec == b->tv_sec && a->tv_usec < b->tv_usec))
108 if (a->tv_sec > b->tv_sec
109 || (a->tv_sec == b->tv_sec && a->tv_usec > b->tv_usec))
115 tv_float(struct timeval *tv)
117 return tv->tv_sec + tv->tv_usec/1000000.0;
121 tv_add(struct timeval *tv, struct timeval *a, struct timeval *b)
123 tv->tv_sec = a->tv_sec + b->tv_sec;
124 tv->tv_usec = a->tv_usec + b->tv_usec;
125 if (tv->tv_usec >= 1000000) {
127 tv->tv_usec -= 1000000;
132 tv_sub(struct timeval *tv, struct timeval *a, struct timeval *b)
134 tv->tv_sec = a->tv_sec - b->tv_sec;
135 tv->tv_usec = a->tv_usec - b->tv_usec;
136 if (((long) tv->tv_usec) < 0) {
138 tv->tv_usec += 1000000;
143 tv_div(struct timeval *tv, struct timeval *a, int n)
145 tv->tv_usec = (a->tv_sec % n * 1000000 + a->tv_usec + n / 2) / n;
146 tv->tv_sec = a->tv_sec / n + tv->tv_usec / 1000000;
147 tv->tv_usec %= 1000000;
151 tv_mul(struct timeval *tv, struct timeval *a, int n)
153 tv->tv_usec = a->tv_usec * n;
154 tv->tv_sec = a->tv_sec * n + tv->tv_usec / 1000000;
155 tv->tv_usec %= 1000000;
159 xlookup(const struct xlat *xlat, int val)
161 for (; xlat->str != NULL; xlat++)
162 if (xlat->val == val)
167 #if !defined HAVE_STPCPY
169 stpcpy(char *dst, const char *src)
171 while ((*dst = *src++) != '\0')
178 * Generic ptrace wrapper which tracks ESRCH errors
179 * by setting tcp->ptrace_errno to ESRCH.
181 * We assume that ESRCH indicates likely process death (SIGKILL?),
182 * modulo bugs where process somehow ended up not stopped.
183 * Unfortunately kernel uses ESRCH for that case too. Oh well.
185 * Currently used by upeek() only.
186 * TODO: use this in all other ptrace() calls while decoding.
189 do_ptrace(int request, struct tcb *tcp, void *addr, void *data)
194 l = ptrace(request, tcp->pid, addr, (long) data);
195 /* Non-ESRCH errors might be our invalid reg/mem accesses,
196 * we do not record them. */
198 tcp->ptrace_errno = ESRCH;
203 * Used when we want to unblock stopped traced process.
204 * Should be only used with PTRACE_CONT, PTRACE_DETACH and PTRACE_SYSCALL.
205 * Returns 0 on success or if error was ESRCH
206 * (presumably process was killed while we talk to it).
207 * Otherwise prints error message and returns -1.
210 ptrace_restart(int op, struct tcb *tcp, int sig)
216 ptrace(op, tcp->pid, (void *) 1, (long) sig);
218 if (!err || err == ESRCH)
221 tcp->ptrace_errno = err;
223 if (op == PTRACE_CONT)
225 if (op == PTRACE_DETACH)
227 perror_msg("ptrace(PTRACE_%s,1,%d)", msg, sig);
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 || defined(__ARM_EABI__)
257 /* Align 64bit argument to 64bit boundary. */
258 llarg = (llarg + 1) & 0x1e;
260 # if defined LINUX && (defined X86_64 || defined POWERPC64)
261 if (current_personality == 0) {
262 tprintf(format, tcp->u_arg[llarg]);
266 /* Align 64bit argument to 64bit boundary. */
267 llarg = (llarg + 1) & 0x1e;
269 tprintf(format, LONG_LONG(tcp->u_arg[llarg], tcp->u_arg[llarg + 1]));
272 # elif defined IA64 || defined ALPHA
273 tprintf(format, tcp->u_arg[llarg]);
275 # elif defined LINUX_MIPSN32
276 tprintf(format, tcp->ext_arg[llarg]);
279 tprintf(format, LONG_LONG(tcp->u_arg[llarg], tcp->u_arg[llarg + 1]));
287 * Interpret `xlat' as an array of flags
288 * print the entries whose bits are on in `flags'
289 * return # of flags printed.
292 addflags(const struct xlat *xlat, int flags)
294 for (; xlat->str; xlat++) {
295 if (xlat->val && (flags & xlat->val) == xlat->val) {
296 tprintf("|%s", xlat->str);
301 tprintf("|%#x", flags);
306 * Interpret `xlat' as an array of flags.
307 * Print to static string the entries whose bits are on in `flags'
308 * Return static string.
311 sprintflags(const char *prefix, const struct xlat *xlat, int flags)
313 static char outstr[1024];
317 outptr = stpcpy(outstr, prefix);
319 for (; xlat->str; xlat++) {
320 if ((flags & xlat->val) == xlat->val) {
323 outptr = stpcpy(outptr, xlat->str);
331 outptr += sprintf(outptr, "%#x", flags);
338 printflags(const struct xlat *xlat, int flags, const char *dflt)
343 if (flags == 0 && xlat->val == 0) {
349 for (n = 0; xlat->str; xlat++) {
350 if (xlat->val && (flags & xlat->val) == xlat->val) {
351 tprintf("%s%s", sep, xlat->str);
360 tprintf("%s%#x", sep, flags);
365 tprintf("%#x", flags);
367 tprintf(" /* %s */", dflt);
378 printnum(struct tcb *tcp, long addr, const char *fmt)
386 if (umove(tcp, addr, &num) < 0) {
387 tprintf("%#lx", addr);
396 printnum_int(struct tcb *tcp, long addr, const char *fmt)
404 if (umove(tcp, addr, &num) < 0) {
405 tprintf("%#lx", addr);
414 printfd(struct tcb *tcp, int fd)
418 if (show_fd_path && (p = getfdpath(tcp, fd)))
419 tprintf("%d<%s>", fd, p);
425 printuid(const char *text, unsigned long uid)
427 tprintf((uid == -1) ? "%s%ld" : "%s%lu", text, uid);
431 * Quote string `instr' of length `size'
432 * Write up to (3 + `size' * 4) bytes to `outstr' buffer.
433 * If `len' < 0, treat `instr' as a NUL-terminated string
434 * and quote at most (`size' - 1) bytes.
437 string_quote(const char *instr, char *outstr, int len, int size)
439 const unsigned char *ustr = (const unsigned char *) instr;
441 int usehex, c, i, eol;
443 eol = 0x100; /* this can never match a char */
453 /* Check for presence of symbol which require
454 to hex-quote the whole string. */
455 for (i = 0; i < size; ++i) {
457 /* Check for NUL-terminated string. */
460 if (!isprint(c) && !isspace(c)) {
470 /* Hex-quote the whole string. */
471 for (i = 0; i < size; ++i) {
473 /* Check for NUL-terminated string. */
478 *s++ = "0123456789abcdef"[c >> 4];
479 *s++ = "0123456789abcdef"[c & 0xf];
482 for (i = 0; i < size; ++i) {
484 /* Check for NUL-terminated string. */
488 case '\"': case '\\':
519 && ustr[i + 1] >= '0'
520 && ustr[i + 1] <= '9'
523 *s++ = '0' + (c >> 6);
524 *s++ = '0' + ((c >> 3) & 0x7);
529 *s++ = '0' + (c >> 6);
530 *s++ = '0' + ((c >> 3) & 0x7);
533 *s++ = '0' + (c & 0x7);
543 /* Return zero if we printed entire ASCIZ string (didn't truncate it) */
544 if (len < 0 && ustr[i] == '\0') {
545 /* We didn't see NUL yet (otherwise we'd jump to 'asciz_ended')
546 * but next char is NUL.
556 /* Return zero: we printed entire ASCIZ string (didn't truncate it) */
561 * Print path string specified by address `addr' and length `n'.
562 * If path length exceeds `n', append `...' to the output.
565 printpathn(struct tcb *tcp, long addr, int n)
567 char path[MAXPATHLEN + 1];
574 /* Cap path length to the path buffer size,
575 and NUL-terminate the buffer. */
576 if (n > sizeof path - 1)
580 /* Fetch one byte more to find out whether path length > n. */
581 if (umovestr(tcp, addr, n + 1, path) < 0)
582 tprintf("%#lx", addr);
585 int trunc = (path[n] != '\0');
590 outstr = alloca(4 * n); /* 4*(n-1) + 2 for quotes */
591 string_quote(path, outstr, -1, n);
599 printpath(struct tcb *tcp, long addr)
601 /* Size must correspond to char path[] size in printpathn */
602 printpathn(tcp, addr, MAXPATHLEN);
606 * Print string specified by address `addr' and length `len'.
607 * If `len' < 0, treat the string as a NUL-terminated string.
608 * If string length exceeds `max_strlen', append `...' to the output.
611 printstr(struct tcb *tcp, long addr, int len)
613 static char *str = NULL;
622 /* Allocate static buffers if they are not allocated yet. */
624 str = malloc(max_strlen + 1);
627 outstr = malloc(4 * max_strlen + /*for quotes:*/ 2);
634 * Treat as a NUL-terminated string: fetch one byte more
635 * because string_quote() quotes one byte less.
637 size = max_strlen + 1;
638 str[max_strlen] = '\0';
639 /* FIXME! umovestr can overwrite the '\0' stored above??? */
640 if (umovestr(tcp, addr, size, str) < 0) {
641 tprintf("%#lx", addr);
646 size = MIN(len, max_strlen);
647 if (umoven(tcp, addr, size, str) < 0) {
648 tprintf("%#lx", addr);
653 ellipsis = (string_quote(str, outstr, len, size) &&
654 (len < 0 || len > max_strlen));
663 dumpiov(struct tcb *tcp, int len, long addr)
665 #if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
667 struct { u_int32_t base; u_int32_t len; } *iov32;
668 struct { u_int64_t base; u_int64_t len; } *iov64;
670 #define iov iovu.iov64
672 (personality_wordsize[current_personality] == 4 \
673 ? sizeof(*iovu.iov32) : sizeof(*iovu.iov64))
674 #define iov_iov_base(i) \
675 (personality_wordsize[current_personality] == 4 \
676 ? (u_int64_t) iovu.iov32[i].base : iovu.iov64[i].base)
677 #define iov_iov_len(i) \
678 (personality_wordsize[current_personality] == 4 \
679 ? (u_int64_t) iovu.iov32[i].len : iovu.iov64[i].len)
682 #define sizeof_iov sizeof(*iov)
683 #define iov_iov_base(i) iov[i].iov_base
684 #define iov_iov_len(i) iov[i].iov_len
689 size = sizeof_iov * len;
690 /* Assuming no sane program has millions of iovs */
691 if ((unsigned)len > 1024*1024 /* insane or negative size? */
692 || (iov = malloc(size)) == NULL) {
693 fprintf(stderr, "Out of memory\n");
696 if (umoven(tcp, addr, size, (char *) iov) >= 0) {
697 for (i = 0; i < len; i++) {
698 /* include the buffer number to make it easy to
699 * match up the trace with the source */
700 tprintf(" * %lu bytes in buffer %d\n",
701 (unsigned long)iov_iov_len(i), i);
702 dumpstr(tcp, (long) iov_iov_base(i),
715 dumpstr(struct tcb *tcp, long addr, int len)
717 static int strsize = -1;
718 static unsigned char *str;
727 fprintf(stderr, "Out of memory\n");
733 if (umoven(tcp, addr, len, (char *) str) < 0)
736 for (i = 0; i < len; i += 16) {
740 sprintf(s, " | %05x ", i);
742 for (j = 0; j < 16; j++) {
746 sprintf(s, " %02x", str[i + j]);
750 *s++ = ' '; *s++ = ' '; *s++ = ' ';
753 *s++ = ' '; *s++ = ' ';
754 for (j = 0; j < 16; j++) {
758 if (isprint(str[i + j]))
766 tprintf("%s |\n", outstr);
770 #define PAGMASK (~(PAGSIZ - 1))
772 * move `len' bytes of data from process `pid'
773 * at address `addr' to our space at `laddr'
776 umoven(struct tcb *tcp, long addr, int len, char *laddr)
784 char x[sizeof(long)];
787 #if SUPPORTED_PERSONALITIES > 1
788 if (personality_wordsize[current_personality] < sizeof(addr))
789 addr &= (1ul << 8 * personality_wordsize[current_personality]) - 1;
792 if (addr & (sizeof(long) - 1)) {
793 /* addr not a multiple of sizeof(long) */
794 n = addr - (addr & -sizeof(long)); /* residue */
795 addr &= -sizeof(long); /* residue */
797 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);
799 /* But if not started, we had a bogus address. */
800 if (addr != 0 && errno != EIO && errno != ESRCH)
801 perror("ptrace: umoven");
805 memcpy(laddr, &u.x[n], m = MIN(sizeof(long) - n, len));
806 addr += sizeof(long), laddr += m, len -= m;
810 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);
812 if (started && (errno==EPERM || errno==EIO)) {
813 /* Ran into 'end of memory' - stupid "printpath" */
816 if (addr != 0 && errno != EIO && errno != ESRCH)
817 perror("ptrace: umoven");
821 memcpy(laddr, u.x, m = MIN(sizeof(long), len));
822 addr += sizeof(long), laddr += m, len -= m;
831 n = MIN(len, PAGSIZ);
832 n = MIN(n, ((addr + PAGSIZ) & PAGMASK) - addr);
833 if (ptrace(PTRACE_READDATA, pid,
834 (char *) addr, len, laddr) < 0) {
835 if (errno != ESRCH) {
836 perror("umoven: ptrace(PTRACE_READDATA, ...)");
848 #ifdef HAVE_MP_PROCFS
849 int fd = tcp->pfd_as;
853 lseek(fd, addr, SEEK_SET);
854 if (read(fd, laddr, len) == -1)
856 #endif /* USE_PROCFS */
862 * like `umove' but make the additional effort of looking
863 * for a terminating zero byte.
866 umovestr(struct tcb *tcp, long addr, int len, char *laddr)
869 #ifdef HAVE_MP_PROCFS
870 int fd = tcp->pfd_as;
874 /* Some systems (e.g. FreeBSD) can be upset if we read off the
875 end of valid memory, avoid this by trying to read up
876 to page boundaries. But we don't know what a page is (and
877 getpagesize(2) (if it exists) doesn't necessarily return
878 hardware page size). Assume all pages >= 1024 (a-historical
881 int page = 1024; /* How to find this? */
882 int move = page - (addr & (page - 1));
885 lseek(fd, addr, SEEK_SET);
890 move = read(fd, laddr, move);
892 return left != len ? 0 : -1;
893 if (memchr(laddr, 0, move))
900 #else /* !USE_PROCFS */
906 char x[sizeof(long)];
909 #if SUPPORTED_PERSONALITIES > 1
910 if (personality_wordsize[current_personality] < sizeof(addr))
911 addr &= (1ul << 8 * personality_wordsize[current_personality]) - 1;
914 if (addr & (sizeof(long) - 1)) {
915 /* addr not a multiple of sizeof(long) */
916 n = addr - (addr & -sizeof(long)); /* residue */
917 addr &= -sizeof(long); /* residue */
919 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);
921 if (addr != 0 && errno != EIO && errno != ESRCH)
926 memcpy(laddr, &u.x[n], m = MIN(sizeof(long)-n, len));
927 while (n & (sizeof(long) - 1))
928 if (u.x[n++] == '\0')
930 addr += sizeof(long), laddr += m, len -= m;
934 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);
936 if (started && (errno==EPERM || errno==EIO)) {
937 /* Ran into 'end of memory' - stupid "printpath" */
940 if (addr != 0 && errno != EIO && errno != ESRCH)
945 memcpy(laddr, u.x, m = MIN(sizeof(long), len));
946 for (i = 0; i < sizeof(long); i++)
950 addr += sizeof(long), laddr += m, len -= m;
952 #endif /* !USE_PROCFS */
957 # if !defined (SPARC) && !defined(SPARC64)
958 # define PTRACE_WRITETEXT 101
959 # define PTRACE_WRITEDATA 102
960 # endif /* !SPARC && !SPARC64 */
966 uload(int cmd, int pid, long addr, int len, char *laddr)
972 char x[sizeof(long)];
975 if (cmd == PTRACE_WRITETEXT) {
976 peek = PTRACE_PEEKTEXT;
977 poke = PTRACE_POKETEXT;
980 peek = PTRACE_PEEKDATA;
981 poke = PTRACE_POKEDATA;
983 if (addr & (sizeof(long) - 1)) {
984 /* addr not a multiple of sizeof(long) */
985 n = addr - (addr & -sizeof(long)); /* residue */
986 addr &= -sizeof(long);
988 u.val = ptrace(peek, pid, (char *) addr, 0);
990 perror("uload: POKE");
993 memcpy(&u.x[n], laddr, m = MIN(sizeof(long) - n, len));
994 if (ptrace(poke, pid, (char *)addr, u.val) < 0) {
995 perror("uload: POKE");
998 addr += sizeof(long), laddr += m, len -= m;
1001 if (len < sizeof(long))
1002 u.val = ptrace(peek, pid, (char *) addr, 0);
1003 memcpy(u.x, laddr, m = MIN(sizeof(long), len));
1004 if (ptrace(poke, pid, (char *) addr, u.val) < 0) {
1005 perror("uload: POKE");
1008 addr += sizeof(long), laddr += m, len -= m;
1014 tload(int pid, int addr, int len, char *laddr)
1016 return uload(PTRACE_WRITETEXT, pid, addr, len, laddr);
1020 dload(int pid, int addr, int len, char *laddr)
1022 return uload(PTRACE_WRITEDATA, pid, addr, len, laddr);
1030 upeek(struct tcb *tcp, long off, long *res)
1034 # ifdef SUNOS4_KERNEL_ARCH_KLUDGE
1036 static int is_sun4m = -1;
1037 struct utsname name;
1039 /* Round up the usual suspects. */
1040 if (is_sun4m == -1) {
1041 if (uname(&name) < 0) {
1042 perror("upeek: uname?");
1045 is_sun4m = strcmp(name.machine, "sun4m") == 0;
1047 const struct xlat *x;
1049 for (x = struct_user_offsets; x->str; x++)
1056 # endif /* SUNOS4_KERNEL_ARCH_KLUDGE */
1058 val = do_ptrace(PTRACE_PEEKUSER, tcp, (char *) off, 0);
1059 if (val == -1 && errno) {
1060 if (errno != ESRCH) {
1062 sprintf(buf, "upeek: ptrace(PTRACE_PEEKUSER,%d,%lu,0)", tcp->pid, off);
1071 #endif /* !USE_PROCFS */
1074 printcall(struct tcb *tcp)
1076 #define PRINTBADPC tprintf(sizeof(long) == 4 ? "[????????] " : \
1077 sizeof(long) == 8 ? "[????????????????] " : \
1084 if (upeek(tcp, 4*EIP, &eip) < 0) {
1088 tprintf("[%08lx] ", eip);
1090 # elif defined(S390) || defined(S390X)
1092 if (upeek(tcp, PT_PSWADDR, &psw) < 0) {
1097 tprintf("[%08lx] ", psw);
1099 tprintf("[%16lx] ", psw);
1102 # elif defined(X86_64)
1105 if (upeek(tcp, 8*RIP, &rip) < 0) {
1109 tprintf("[%16lx] ", rip);
1110 # elif defined(IA64)
1113 if (upeek(tcp, PT_B0, &ip) < 0) {
1117 tprintf("[%08lx] ", ip);
1118 # elif defined(POWERPC)
1121 if (upeek(tcp, sizeof(unsigned long)*PT_NIP, &pc) < 0) {
1126 tprintf("[%016lx] ", pc);
1128 tprintf("[%08lx] ", pc);
1130 # elif defined(M68K)
1133 if (upeek(tcp, 4*PT_PC, &pc) < 0) {
1134 tprints("[????????] ");
1137 tprintf("[%08lx] ", pc);
1138 # elif defined(ALPHA)
1141 if (upeek(tcp, REG_PC, &pc) < 0) {
1142 tprints("[????????????????] ");
1145 tprintf("[%08lx] ", pc);
1146 # elif defined(SPARC) || defined(SPARC64)
1147 struct pt_regs regs;
1148 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) {
1152 # if defined(SPARC64)
1153 tprintf("[%08lx] ", regs.tpc);
1155 tprintf("[%08lx] ", regs.pc);
1157 # elif defined(HPPA)
1160 if (upeek(tcp, PT_IAOQ0, &pc) < 0) {
1161 tprints("[????????] ");
1164 tprintf("[%08lx] ", pc);
1165 # elif defined(MIPS)
1168 if (upeek(tcp, REG_EPC, &pc) < 0) {
1169 tprints("[????????] ");
1172 tprintf("[%08lx] ", pc);
1176 if (upeek(tcp, 4*REG_PC, &pc) < 0) {
1177 tprints("[????????] ");
1180 tprintf("[%08lx] ", pc);
1181 # elif defined(SH64)
1184 if (upeek(tcp, REG_PC, &pc) < 0) {
1185 tprints("[????????????????] ");
1188 tprintf("[%08lx] ", pc);
1192 if (upeek(tcp, 4*15, &pc) < 0) {
1196 tprintf("[%08lx] ", pc);
1197 # elif defined(AVR32)
1200 if (upeek(tcp, REG_PC, &pc) < 0) {
1201 tprints("[????????] ");
1204 tprintf("[%08lx] ", pc);
1205 # elif defined(BFIN)
1208 if (upeek(tcp, PT_PC, &pc) < 0) {
1212 tprintf("[%08lx] ", pc);
1213 #elif defined(CRISV10)
1216 if (upeek(tcp, 4*PT_IRP, &pc) < 0) {
1220 tprintf("[%08lx] ", pc);
1221 #elif defined(CRISV32)
1224 if (upeek(tcp, 4*PT_ERP, &pc) < 0) {
1228 tprintf("[%08lx] ", pc);
1229 # endif /* architecture */
1235 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *) ®s, 0) < 0) {
1236 perror("printcall: ptrace(PTRACE_GETREGS, ...)");
1240 tprintf("[%08x] ", regs.r_o7);
1250 pread(tcp->pfd_reg, ®s, sizeof(regs), 0);
1251 tprintf("[%08x] ", regs.r_eip);
1252 #endif /* FREEBSD */
1257 * These #if's are huge, please indent them correctly.
1258 * It's easy to get confused otherwise.
1264 # include "syscall.h"
1266 # include <sys/syscall.h>
1267 # ifndef CLONE_PTRACE
1268 # define CLONE_PTRACE 0x00002000
1270 # ifndef CLONE_VFORK
1271 # define CLONE_VFORK 0x00004000
1274 # define CLONE_VM 0x00000100
1276 # ifndef CLONE_STOPPED
1277 # define CLONE_STOPPED 0x02000000
1282 /* We don't have fork()/vfork() syscalls on ia64 itself, but the ia32
1283 subsystem has them for x86... */
1285 # define SYS_vfork 190
1287 typedef unsigned long *arg_setup_state;
1290 arg_setup(struct tcb *tcp, arg_setup_state *state)
1292 unsigned long cfm, sof, sol;
1296 /* Satisfy a false GCC warning. */
1301 if (upeek(tcp, PT_AR_BSP, &bsp) < 0)
1303 if (upeek(tcp, PT_CFM, (long *) &cfm) < 0)
1306 sof = (cfm >> 0) & 0x7f;
1307 sol = (cfm >> 7) & 0x7f;
1308 bsp = (long) ia64_rse_skip_regs((unsigned long *) bsp, -sof + sol);
1310 *state = (unsigned long *) bsp;
1314 # define arg_finish_change(tcp, state) 0
1318 get_arg0(struct tcb *tcp, arg_setup_state *state, long *valp)
1323 ret = upeek(tcp, PT_R11, valp);
1326 (unsigned long) ia64_rse_skip_regs(*state, 0),
1327 sizeof(long), (void *) valp);
1332 get_arg1(struct tcb *tcp, arg_setup_state *state, long *valp)
1337 ret = upeek(tcp, PT_R9, valp);
1340 (unsigned long) ia64_rse_skip_regs(*state, 1),
1341 sizeof(long), (void *) valp);
1347 set_arg0(struct tcb *tcp, arg_setup_state *state, long val)
1349 int req = PTRACE_POKEDATA;
1353 ap = (void *) (intptr_t) PT_R11; /* r11 == EBX */
1354 req = PTRACE_POKEUSER;
1356 ap = ia64_rse_skip_regs(*state, 0);
1358 ptrace(req, tcp->pid, ap, val);
1359 return errno ? -1 : 0;
1363 set_arg1(struct tcb *tcp, arg_setup_state *state, long val)
1365 int req = PTRACE_POKEDATA;
1369 ap = (void *) (intptr_t) PT_R9; /* r9 == ECX */
1370 req = PTRACE_POKEUSER;
1372 ap = ia64_rse_skip_regs(*state, 1);
1374 ptrace(req, tcp->pid, ap, val);
1375 return errno ? -1 : 0;
1378 /* ia64 does not return the input arguments from functions (and syscalls)
1379 according to ia64 RSE (Register Stack Engine) behavior. */
1381 # define restore_arg0(tcp, state, val) ((void) (state), 0)
1382 # define restore_arg1(tcp, state, val) ((void) (state), 0)
1384 # elif defined (SPARC) || defined (SPARC64)
1386 typedef struct pt_regs arg_setup_state;
1388 # define arg_setup(tcp, state) \
1389 (ptrace(PTRACE_GETREGS, tcp->pid, (char *) (state), 0))
1390 # define arg_finish_change(tcp, state) \
1391 (ptrace(PTRACE_SETREGS, tcp->pid, (char *) (state), 0))
1393 # define get_arg0(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O0], 0)
1394 # define get_arg1(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O1], 0)
1395 # define set_arg0(tcp, state, val) ((state)->u_regs[U_REG_O0] = (val), 0)
1396 # define set_arg1(tcp, state, val) ((state)->u_regs[U_REG_O1] = (val), 0)
1397 # define restore_arg0(tcp, state, val) 0
1399 # else /* other architectures */
1401 # if defined S390 || defined S390X
1402 /* Note: this is only true for the `clone' system call, which handles
1403 arguments specially. We could as well say that its first two arguments
1404 are swapped relative to other architectures, but that would just be
1405 another #ifdef in the calls. */
1406 # define arg0_offset PT_GPR3
1407 # define arg1_offset PT_ORIGGPR2
1408 # define restore_arg0(tcp, state, val) ((void) (state), 0)
1409 # define restore_arg1(tcp, state, val) ((void) (state), 0)
1410 # define arg0_index 1
1411 # define arg1_index 0
1412 # elif defined (ALPHA) || defined (MIPS)
1413 # define arg0_offset REG_A0
1414 # define arg1_offset (REG_A0+1)
1415 # elif defined (AVR32)
1416 # define arg0_offset (REG_R12)
1417 # define arg1_offset (REG_R11)
1418 # elif defined (POWERPC)
1419 # define arg0_offset (sizeof(unsigned long)*PT_R3)
1420 # define arg1_offset (sizeof(unsigned long)*PT_R4)
1421 # define restore_arg0(tcp, state, val) ((void) (state), 0)
1422 # elif defined (HPPA)
1423 # define arg0_offset PT_GR26
1424 # define arg1_offset (PT_GR26-4)
1425 # elif defined (X86_64)
1426 # define arg0_offset ((long)(8*(current_personality ? RBX : RDI)))
1427 # define arg1_offset ((long)(8*(current_personality ? RCX : RSI)))
1429 # define arg0_offset (4*(REG_REG0+4))
1430 # define arg1_offset (4*(REG_REG0+5))
1431 # elif defined (SH64)
1432 /* ABI defines arg0 & 1 in r2 & r3 */
1433 # define arg0_offset (REG_OFFSET+16)
1434 # define arg1_offset (REG_OFFSET+24)
1435 # define restore_arg0(tcp, state, val) 0
1436 # elif defined CRISV10 || defined CRISV32
1437 # define arg0_offset (4*PT_R11)
1438 # define arg1_offset (4*PT_ORIG_R10)
1439 # define restore_arg0(tcp, state, val) 0
1440 # define restore_arg1(tcp, state, val) 0
1441 # define arg0_index 1
1442 # define arg1_index 0
1444 # define arg0_offset 0
1445 # define arg1_offset 4
1447 # define restore_arg0(tcp, state, val) 0
1451 typedef int arg_setup_state;
1453 # define arg_setup(tcp, state) (0)
1454 # define arg_finish_change(tcp, state) 0
1455 # define get_arg0(tcp, cookie, valp) \
1456 (upeek((tcp), arg0_offset, (valp)))
1457 # define get_arg1(tcp, cookie, valp) \
1458 (upeek((tcp), arg1_offset, (valp)))
1461 set_arg0(struct tcb *tcp, void *cookie, long val)
1463 return ptrace(PTRACE_POKEUSER, tcp->pid, (char*)arg0_offset, val);
1467 set_arg1(struct tcb *tcp, void *cookie, long val)
1469 return ptrace(PTRACE_POKEUSER, tcp->pid, (char*)arg1_offset, val);
1472 # endif /* architectures */
1474 # ifndef restore_arg0
1475 # define restore_arg0(tcp, state, val) set_arg0((tcp), (state), (val))
1477 # ifndef restore_arg1
1478 # define restore_arg1(tcp, state, val) set_arg1((tcp), (state), (val))
1482 # define arg0_index 0
1483 # define arg1_index 1
1487 setbpt(struct tcb *tcp)
1489 static int clone_scno[SUPPORTED_PERSONALITIES] = { SYS_clone };
1490 arg_setup_state state;
1492 if (tcp->flags & TCB_BPTSET) {
1493 fprintf(stderr, "PANIC: TCB already set in pid %u\n", tcp->pid);
1498 * It's a silly kludge to initialize this with a search at runtime.
1499 * But it's better than maintaining another magic thing in the
1500 * godforsaken tables.
1502 if (clone_scno[current_personality] == 0) {
1504 for (i = 0; i < nsyscalls; ++i)
1505 if (sysent[i].sys_func == sys_clone) {
1506 clone_scno[current_personality] = i;
1511 switch (known_scno(tcp)) {
1518 # if defined SYS_fork || defined SYS_vfork
1519 if (arg_setup(tcp, &state) < 0
1520 || get_arg0(tcp, &state, &tcp->inst[0]) < 0
1521 || get_arg1(tcp, &state, &tcp->inst[1]) < 0
1522 || change_syscall(tcp, clone_scno[current_personality]) < 0
1523 || set_arg0(tcp, &state, CLONE_PTRACE|SIGCHLD) < 0
1524 || set_arg1(tcp, &state, 0) < 0
1525 || arg_finish_change(tcp, &state) < 0)
1527 tcp->u_arg[arg0_index] = CLONE_PTRACE|SIGCHLD;
1528 tcp->u_arg[arg1_index] = 0;
1529 tcp->flags |= TCB_BPTSET;
1537 /* ia64 calls directly `clone (CLONE_VFORK | CLONE_VM)'
1538 contrary to x86 SYS_vfork above. Even on x86 we turn the
1539 vfork semantics into plain fork - each application must not
1540 depend on the vfork specifics according to POSIX. We would
1541 hang waiting for the parent resume otherwise. We need to
1542 clear also CLONE_VM but only in the CLONE_VFORK case as
1543 otherwise we would break pthread_create. */
1545 long new_arg0 = (tcp->u_arg[arg0_index] | CLONE_PTRACE);
1546 if (new_arg0 & CLONE_VFORK)
1547 new_arg0 &= ~(unsigned long)(CLONE_VFORK | CLONE_VM);
1548 if (arg_setup(tcp, &state) < 0
1549 || set_arg0(tcp, &state, new_arg0) < 0
1550 || arg_finish_change(tcp, &state) < 0)
1552 tcp->flags |= TCB_BPTSET;
1553 tcp->inst[0] = tcp->u_arg[arg0_index];
1554 tcp->inst[1] = tcp->u_arg[arg1_index];
1558 fprintf(stderr, "PANIC: setbpt for syscall %ld on %u???\n",
1559 tcp->scno, tcp->pid);
1567 clearbpt(struct tcb *tcp)
1569 arg_setup_state state;
1570 if (arg_setup(tcp, &state) < 0
1571 || restore_arg0(tcp, &state, tcp->inst[0]) < 0
1572 || restore_arg1(tcp, &state, tcp->inst[1]) < 0
1573 || arg_finish_change(tcp, &state))
1576 tcp->flags &= ~TCB_BPTSET;
1580 # else /* !defined LINUX */
1583 setbpt(struct tcb *tcp)
1586 # ifdef SPARC /* This code is slightly sparc specific */
1589 # define BPT 0x91d02001 /* ta 1 */
1590 # define LOOP 0x10800000 /* ba 0 */
1591 # define LOOPA 0x30800000 /* ba,a 0 */
1592 # define NOP 0x01000000
1594 static int loopdeloop[1] = {LOOPA};
1596 static int loopdeloop[2] = {LOOP, NOP};
1599 if (tcp->flags & TCB_BPTSET) {
1600 fprintf(stderr, "PANIC: TCB already set in pid %u\n", tcp->pid);
1603 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) {
1604 perror("setbpt: ptrace(PTRACE_GETREGS, ...)");
1607 tcp->baddr = regs.r_o7 + 8;
1608 if (ptrace(PTRACE_READTEXT, tcp->pid, (char *)tcp->baddr,
1609 sizeof tcp->inst, (char *)tcp->inst) < 0) {
1610 perror("setbpt: ptrace(PTRACE_READTEXT, ...)");
1615 * XXX - BRUTAL MODE ON
1616 * We cannot set a real BPT in the child, since it will not be
1617 * traced at the moment it will reach the trap and would probably
1618 * die with a core dump.
1619 * Thus, we are force our way in by taking out two instructions
1620 * and insert an eternal loop in stead, in expectance of the SIGSTOP
1621 * generated by out PTRACE_ATTACH.
1622 * Of cause, if we evaporate ourselves in the middle of all this...
1624 if (ptrace(PTRACE_WRITETEXT, tcp->pid, (char *) tcp->baddr,
1625 sizeof loopdeloop, (char *) loopdeloop) < 0) {
1626 perror("setbpt: ptrace(PTRACE_WRITETEXT, ...)");
1629 tcp->flags |= TCB_BPTSET;
1632 # endif /* SUNOS4 */
1638 clearbpt(struct tcb *tcp)
1647 if (!(tcp->flags & TCB_BPTSET)) {
1648 fprintf(stderr, "PANIC: TCB not set in pid %u\n", tcp->pid);
1651 if (ptrace(PTRACE_WRITETEXT, tcp->pid, (char *) tcp->baddr,
1652 sizeof tcp->inst, (char *) tcp->inst) < 0) {
1653 perror("clearbtp: ptrace(PTRACE_WRITETEXT, ...)");
1656 tcp->flags &= ~TCB_BPTSET;
1660 * Since we don't have a single instruction breakpoint, we may have
1661 * to adjust the program counter after removing our `breakpoint'.
1663 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) {
1664 perror("clearbpt: ptrace(PTRACE_GETREGS, ...)");
1667 if ((regs.r_pc < tcp->baddr) ||
1668 (regs.r_pc > tcp->baddr + 4)) {
1669 /* The breakpoint has not been reached yet */
1672 "NOTE: PC not at bpt (pc %#x baddr %#x)\n",
1673 regs.r_pc, tcp->baddr);
1676 if (regs.r_pc != tcp->baddr)
1678 fprintf(stderr, "NOTE: PC adjusted (%#x -> %#x\n",
1679 regs.r_pc, tcp->baddr);
1681 regs.r_pc = tcp->baddr;
1682 if (ptrace(PTRACE_SETREGS, tcp->pid, (char *)®s, 0) < 0) {
1683 perror("clearbpt: ptrace(PTRACE_SETREGS, ...)");
1688 # endif /* SUNOS4 */
1693 # endif /* !defined LINUX */
1695 #endif /* !USE_PROCFS */
1701 getex(struct tcb *tcp, struct exec *hdr)
1705 for (n = 0; n < sizeof *hdr; n += 4) {
1707 if (upeek(tcp, uoff(u_exdata) + n, &res) < 0)
1709 memcpy(((char *) hdr) + n, &res, 4);
1712 fprintf(stderr, "[struct exec: magic: %o version %u Mach %o\n",
1713 hdr->a_magic, hdr->a_toolversion, hdr->a_machtype);
1714 fprintf(stderr, "Text %lu Data %lu Bss %lu Syms %lu Entry %#lx]\n",
1715 hdr->a_text, hdr->a_data, hdr->a_bss, hdr->a_syms, hdr->a_entry);
1721 fixvfork(struct tcb *tcp)
1725 * Change `vfork' in a freshly exec'ed dynamically linked
1726 * executable's (internal) symbol table to plain old `fork'
1730 struct link_dynamic dyn;
1731 struct link_dynamic_2 ld;
1734 if (getex(tcp, &hdr) < 0)
1739 if (umove(tcp, (int) N_DATADDR(hdr), &dyn) < 0) {
1740 fprintf(stderr, "Cannot read DYNAMIC\n");
1743 if (umove(tcp, (int) dyn.ld_un.ld_2, &ld) < 0) {
1744 fprintf(stderr, "Cannot read link_dynamic_2\n");
1747 strtab = malloc((unsigned)ld.ld_symb_size);
1749 die_out_of_memory();
1750 if (umoven(tcp, (int)ld.ld_symbols+(int)N_TXTADDR(hdr),
1751 (int)ld.ld_symb_size, strtab) < 0)
1754 for (cp = strtab; cp < strtab + ld.ld_symb_size; ) {
1755 if (strcmp(cp, "_vfork") == 0) {
1757 fprintf(stderr, "fixvfork: FOUND _vfork\n");
1758 strcpy(cp, "_fork");
1763 if (cp < strtab + ld.ld_symb_size)
1765 * Write entire symbol table back to avoid
1766 * memory alignment bugs in ptrace
1768 if (tload(pid, (int)ld.ld_symbols+(int)N_TXTADDR(hdr),
1769 (int)ld.ld_symb_size, strtab) < 0)