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>
39 # include <sys/xattr.h>
44 # include <asm/ptrace_offsets.h>
52 #ifdef HAVE_LINUX_PTRACE_H
53 # undef PTRACE_SYSCALL
54 # ifdef HAVE_STRUCT_IA64_FPREG
55 # define ia64_fpreg XXX_ia64_fpreg
57 # ifdef HAVE_STRUCT_PT_ALL_USER_REGS
58 # define pt_all_user_regs XXX_pt_all_user_regs
60 # ifdef HAVE_STRUCT_PTRACE_PEEKSIGINFO_ARGS
61 # define ptrace_peeksiginfo_args XXX_ptrace_peeksiginfo_args
63 # include <linux/ptrace.h>
64 # undef ptrace_peeksiginfo_args
66 # undef pt_all_user_regs
70 string_to_uint(const char *str)
78 value = strtol(str, &error, 10);
79 if (errno || *error || value < 0 || (long)(int)value != value)
85 tv_nz(const struct timeval *a)
87 return a->tv_sec || a->tv_usec;
91 tv_cmp(const struct timeval *a, const struct timeval *b)
93 if (a->tv_sec < b->tv_sec
94 || (a->tv_sec == b->tv_sec && a->tv_usec < b->tv_usec))
96 if (a->tv_sec > b->tv_sec
97 || (a->tv_sec == b->tv_sec && a->tv_usec > b->tv_usec))
103 tv_float(const struct timeval *tv)
105 return tv->tv_sec + tv->tv_usec/1000000.0;
109 tv_add(struct timeval *tv, const struct timeval *a, const struct timeval *b)
111 tv->tv_sec = a->tv_sec + b->tv_sec;
112 tv->tv_usec = a->tv_usec + b->tv_usec;
113 if (tv->tv_usec >= 1000000) {
115 tv->tv_usec -= 1000000;
120 tv_sub(struct timeval *tv, const struct timeval *a, const struct timeval *b)
122 tv->tv_sec = a->tv_sec - b->tv_sec;
123 tv->tv_usec = a->tv_usec - b->tv_usec;
124 if (((long) tv->tv_usec) < 0) {
126 tv->tv_usec += 1000000;
131 tv_div(struct timeval *tv, const struct timeval *a, int n)
133 tv->tv_usec = (a->tv_sec % n * 1000000 + a->tv_usec + n / 2) / n;
134 tv->tv_sec = a->tv_sec / n + tv->tv_usec / 1000000;
135 tv->tv_usec %= 1000000;
139 tv_mul(struct timeval *tv, const struct timeval *a, int n)
141 tv->tv_usec = a->tv_usec * n;
142 tv->tv_sec = a->tv_sec * n + tv->tv_usec / 1000000;
143 tv->tv_usec %= 1000000;
147 xlookup(const struct xlat *xlat, const unsigned int val)
149 for (; xlat->str != NULL; xlat++)
150 if (xlat->val == val)
156 xlat_bsearch_compare(const void *a, const void *b)
158 const unsigned int val1 = (const unsigned long) a;
159 const unsigned int val2 = ((const struct xlat *) b)->val;
160 return (val1 > val2) ? 1 : (val1 < val2) ? -1 : 0;
164 xlat_search(const struct xlat *xlat, const size_t nmemb, const unsigned int val)
166 const struct xlat *e =
167 bsearch((const void*) (const unsigned long) val,
168 xlat, nmemb, sizeof(*xlat), xlat_bsearch_compare);
170 return e ? e->str : NULL;
173 #if !defined HAVE_STPCPY
175 stpcpy(char *dst, const char *src)
177 while ((*dst = *src++) != '\0')
183 /* Find a next bit which is set.
184 * Starts testing at cur_bit.
185 * Returns -1 if no more bits are set.
187 * We never touch bytes we don't need to.
188 * On big-endian, array is assumed to consist of
189 * current_wordsize wide words: for example, is current_wordsize is 4,
190 * the bytes are walked in 3,2,1,0, 7,6,5,4, 11,10,9,8 ... sequence.
191 * On little-endian machines, word size is immaterial.
194 next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits)
196 const unsigned endian = 1;
197 int little_endian = *(char*)&endian;
199 const uint8_t *array = bit_array;
200 unsigned pos = cur_bit / 8;
201 unsigned pos_xor_mask = little_endian ? 0 : current_wordsize-1;
207 if (cur_bit >= size_bits)
209 cur_byte = array[pos ^ pos_xor_mask];
211 cur_bit = (cur_bit + 8) & (-8);
215 bitmask = 1 << (cur_bit & 7);
217 if (cur_byte & bitmask)
220 if (cur_bit >= size_bits)
223 /* This check *can't be* optimized out: */
231 * Print entry in struct xlat table, if there.
234 printxval(const struct xlat *xlat, const unsigned int val, const char *dflt)
236 const char *str = xlookup(xlat, val);
241 tprintf("%#x /* %s */", val, dflt);
245 * Print 64bit argument at position arg_no and return the index of the next
249 printllval(struct tcb *tcp, const char *format, int arg_no)
251 #if SIZEOF_LONG > 4 && SIZEOF_LONG == SIZEOF_LONG_LONG
252 # if SUPPORTED_PERSONALITIES > 1
253 if (current_wordsize > 4) {
255 tprintf(format, tcp->u_arg[arg_no]);
257 # if SUPPORTED_PERSONALITIES > 1
259 # if defined(AARCH64) || defined(POWERPC64)
260 /* Align arg_no to the next even number. */
261 arg_no = (arg_no + 1) & 0xe;
263 tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]));
266 # endif /* SUPPORTED_PERSONALITIES */
267 #elif SIZEOF_LONG > 4
268 # error Unsupported configuration: SIZEOF_LONG > 4 && SIZEOF_LONG_LONG > SIZEOF_LONG
269 #elif defined LINUX_MIPSN32
270 tprintf(format, tcp->ext_arg[arg_no]);
273 if (current_personality == 0) {
274 tprintf(format, tcp->ext_arg[arg_no]);
277 tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]));
281 # if defined __ARM_EABI__ || \
282 defined LINUX_MIPSO32 || \
285 /* Align arg_no to the next even number. */
286 arg_no = (arg_no + 1) & 0xe;
288 tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]));
296 * Interpret `xlat' as an array of flags
297 * print the entries whose bits are on in `flags'
298 * return # of flags printed.
301 addflags(const struct xlat *xlat, int flags)
303 for (; xlat->str; xlat++) {
304 if (xlat->val && (flags & xlat->val) == xlat->val) {
305 tprintf("|%s", xlat->str);
310 tprintf("|%#x", flags);
315 * Interpret `xlat' as an array of flags.
316 * Print to static string the entries whose bits are on in `flags'
317 * Return static string.
320 sprintflags(const char *prefix, const struct xlat *xlat, int flags)
322 static char outstr[1024];
326 outptr = stpcpy(outstr, prefix);
328 for (; xlat->str; xlat++) {
329 if ((flags & xlat->val) == xlat->val) {
332 outptr = stpcpy(outptr, xlat->str);
342 outptr += sprintf(outptr, "%#x", flags);
349 printflags(const struct xlat *xlat, int flags, const char *dflt)
354 if (flags == 0 && xlat->val == 0) {
360 for (n = 0; xlat->str; xlat++) {
361 if (xlat->val && (flags & xlat->val) == xlat->val) {
362 tprintf("%s%s", sep, xlat->str);
371 tprintf("%s%#x", sep, flags);
376 tprintf("%#x", flags);
378 tprintf(" /* %s */", dflt);
389 printnum(struct tcb *tcp, long addr, const char *fmt)
397 if (umove(tcp, addr, &num) < 0) {
398 tprintf("%#lx", addr);
407 printnum_int(struct tcb *tcp, long addr, const char *fmt)
415 if (umove(tcp, addr, &num) < 0) {
416 tprintf("%#lx", addr);
428 static char buf[sizeof("yyyy/mm/dd-hh:mm:ss")];
436 snprintf(buf, sizeof buf, "%02d/%02d/%02d-%02d:%02d:%02d",
437 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
438 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
440 snprintf(buf, sizeof buf, "%lu", (unsigned long) t);
446 getfdproto(struct tcb *tcp, int fd, char *buf, unsigned bufsize)
450 char path[sizeof("/proc/%u/fd/%u") + 2 * sizeof(int)*3];
455 sprintf(path, "/proc/%u/fd/%u", tcp->pid, fd);
456 r = getxattr(path, "system.sockprotoname", buf, bufsize - 1);
461 * This is a protection for the case when the kernel
462 * side does not append a null byte to the buffer.
473 printfd(struct tcb *tcp, int fd)
475 char path[PATH_MAX + 1];
476 if (show_fd_path && getfdpath(tcp, fd, path, sizeof(path)) >= 0) {
477 static const char socket_prefix[] = "socket:[";
478 const size_t socket_prefix_len = sizeof(socket_prefix) - 1;
481 if (show_fd_path > 1 &&
482 strncmp(path, socket_prefix, socket_prefix_len) == 0 &&
483 path[(path_len = strlen(path)) - 1] == ']') {
484 unsigned long inodenr;
485 inodenr = strtoul(path + socket_prefix_len, NULL, 10);
487 if (!print_sockaddr_by_inode(inodenr)) {
488 #define PROTO_NAME_LEN 32
489 char proto_buf[PROTO_NAME_LEN];
491 getfdproto(tcp, fd, proto_buf, PROTO_NAME_LEN);
494 tprintf("%s:[%lu]", proto, inodenr);
500 tprintf("%d<%s>", fd, path);
507 printuid(const char *text, unsigned long uid)
509 tprintf(((long) uid == -1) ? "%s%ld" : "%s%lu", text, uid);
513 * Quote string `instr' of length `size'
514 * Write up to (3 + `size' * 4) bytes to `outstr' buffer.
515 * If `len' is -1, treat `instr' as a NUL-terminated string
516 * and quote at most (`size' - 1) bytes.
518 * Returns 0 if len == -1 and NUL was seen, 1 otherwise.
519 * Note that if len >= 0, always returns 1.
522 string_quote(const char *instr, char *outstr, long len, int size)
524 const unsigned char *ustr = (const unsigned char *) instr;
526 int usehex, c, i, eol;
528 eol = 0x100; /* this can never match a char */
538 /* Check for presence of symbol which require
539 to hex-quote the whole string. */
540 for (i = 0; i < size; ++i) {
542 /* Check for NUL-terminated string. */
546 /* Force hex unless c is printable or whitespace */
551 /* In ASCII isspace is only these chars: "\t\n\v\f\r".
552 * They happen to have ASCII codes 9,10,11,12,13.
554 if (c < ' ' && (unsigned)(c - 9) >= 5) {
564 /* Hex-quote the whole string. */
565 for (i = 0; i < size; ++i) {
567 /* Check for NUL-terminated string. */
572 *s++ = "0123456789abcdef"[c >> 4];
573 *s++ = "0123456789abcdef"[c & 0xf];
576 for (i = 0; i < size; ++i) {
578 /* Check for NUL-terminated string. */
582 case '\"': case '\\':
607 if (c >= ' ' && c <= 0x7e)
613 && ustr[i + 1] >= '0'
614 && ustr[i + 1] <= '9'
617 *s++ = '0' + (c >> 6);
618 *s++ = '0' + ((c >> 3) & 0x7);
623 *s++ = '0' + (c >> 6);
624 *s++ = '0' + ((c >> 3) & 0x7);
627 *s++ = '0' + (c & 0x7);
637 /* Return zero if we printed entire ASCIZ string (didn't truncate it) */
638 if (len == -1 && ustr[i] == '\0') {
639 /* We didn't see NUL yet (otherwise we'd jump to 'asciz_ended')
640 * but next char is NUL.
650 /* Return zero: we printed entire ASCIZ string (didn't truncate it) */
655 * Print path string specified by address `addr' and length `n'.
656 * If path length exceeds `n', append `...' to the output.
659 printpathn(struct tcb *tcp, long addr, unsigned int n)
661 char path[PATH_MAX + 1];
669 /* Cap path length to the path buffer size */
670 if (n > sizeof path - 1)
673 /* Fetch one byte more to find out whether path length > n. */
674 nul_seen = umovestr(tcp, addr, n + 1, path);
676 tprintf("%#lx", addr);
682 outstr = alloca(4 * n); /* 4*(n-1) + 3 for quotes and NUL */
683 string_quote(path, outstr, -1, n);
691 printpath(struct tcb *tcp, long addr)
693 /* Size must correspond to char path[] size in printpathn */
694 printpathn(tcp, addr, PATH_MAX);
698 * Print string specified by address `addr' and length `len'.
699 * If `len' < 0, treat the string as a NUL-terminated string.
700 * If string length exceeds `max_strlen', append `...' to the output.
703 printstr(struct tcb *tcp, long addr, long len)
705 static char *str = NULL;
714 /* Allocate static buffers if they are not allocated yet. */
716 unsigned int outstr_size = 4 * max_strlen + /*for quotes and NUL:*/ 3;
718 if (outstr_size / 4 != max_strlen)
720 str = malloc(max_strlen + 1);
723 outstr = malloc(outstr_size);
730 * Treat as a NUL-terminated string: fetch one byte more
731 * because string_quote() quotes one byte less.
733 size = max_strlen + 1;
734 if (umovestr(tcp, addr, size, str) < 0) {
735 tprintf("%#lx", addr);
741 if (size > (unsigned long)len)
742 size = (unsigned long)len;
743 if (umoven(tcp, addr, size, str) < 0) {
744 tprintf("%#lx", addr);
749 /* If string_quote didn't see NUL and (it was supposed to be ASCIZ str
750 * or we were requested to print more than -s NUM chars)...
752 ellipsis = (string_quote(str, outstr, len, size) &&
753 (len < 0 || (unsigned long) len > max_strlen));
761 dumpiov(struct tcb *tcp, int len, long addr)
763 #if SUPPORTED_PERSONALITIES > 1
765 struct { u_int32_t base; u_int32_t len; } *iov32;
766 struct { u_int64_t base; u_int64_t len; } *iov64;
768 #define iov iovu.iov64
770 (current_wordsize == 4 ? sizeof(*iovu.iov32) : sizeof(*iovu.iov64))
771 #define iov_iov_base(i) \
772 (current_wordsize == 4 ? (uint64_t) iovu.iov32[i].base : iovu.iov64[i].base)
773 #define iov_iov_len(i) \
774 (current_wordsize == 4 ? (uint64_t) iovu.iov32[i].len : iovu.iov64[i].len)
777 #define sizeof_iov sizeof(*iov)
778 #define iov_iov_base(i) iov[i].iov_base
779 #define iov_iov_len(i) iov[i].iov_len
784 size = sizeof_iov * len;
785 /* Assuming no sane program has millions of iovs */
786 if ((unsigned)len > 1024*1024 /* insane or negative size? */
787 || (iov = malloc(size)) == NULL) {
788 fprintf(stderr, "Out of memory\n");
791 if (umoven(tcp, addr, size, (char *) iov) >= 0) {
792 for (i = 0; i < len; i++) {
793 /* include the buffer number to make it easy to
794 * match up the trace with the source */
795 tprintf(" * %lu bytes in buffer %d\n",
796 (unsigned long)iov_iov_len(i), i);
797 dumpstr(tcp, (long) iov_iov_base(i),
809 dumpstr(struct tcb *tcp, long addr, int len)
811 static int strsize = -1;
812 static unsigned char *str;
817 "xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx "
818 "1234567890123456") + /*in case I'm off by few:*/ 4)
819 /*align to 8 to make memset easier:*/ + 7) & -8
821 const unsigned char *src;
824 memset(outbuf, ' ', sizeof(outbuf));
826 if (strsize < len + 16) {
828 str = malloc(len + 16);
831 fprintf(stderr, "Out of memory\n");
837 if (umoven(tcp, addr, len, (char *) str) < 0)
840 /* Space-pad to 16 bytes */
852 *dst++ = "0123456789abcdef"[*src >> 4];
853 *dst++ = "0123456789abcdef"[*src & 0xf];
859 dst++; /* space is there by memset */
862 dst++; /* space is there by memset */
869 if (*src >= ' ' && *src < 0x7f)
876 tprintf(" | %05x %s |\n", i - 16, outbuf);
880 #ifdef HAVE_PROCESS_VM_READV
881 /* C library supports this, but the kernel might not. */
882 static bool process_vm_readv_not_supported = 0;
885 /* Need to do this since process_vm_readv() is not yet available in libc.
886 * When libc is be updated, only "static bool process_vm_readv_not_supported"
887 * line should remain.
889 #if !defined(__NR_process_vm_readv)
891 # define __NR_process_vm_readv 347
892 # elif defined(X86_64)
893 # define __NR_process_vm_readv 310
894 # elif defined(POWERPC)
895 # define __NR_process_vm_readv 351
899 #if defined(__NR_process_vm_readv)
900 static bool process_vm_readv_not_supported = 0;
901 /* Have to avoid duplicating with the C library headers. */
902 static ssize_t strace_process_vm_readv(pid_t pid,
903 const struct iovec *lvec,
904 unsigned long liovcnt,
905 const struct iovec *rvec,
906 unsigned long riovcnt,
909 return syscall(__NR_process_vm_readv, (long)pid, lvec, liovcnt, rvec, riovcnt, flags);
911 #define process_vm_readv strace_process_vm_readv
913 static bool process_vm_readv_not_supported = 1;
914 # define process_vm_readv(...) (errno = ENOSYS, -1)
917 #endif /* end of hack */
919 #define PAGMASK (~(PAGSIZ - 1))
921 * move `len' bytes of data from process `pid'
922 * at address `addr' to our space at `laddr'
925 umoven(struct tcb *tcp, long addr, int len, char *laddr)
931 char x[sizeof(long)];
934 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
935 if (current_wordsize < sizeof(addr))
936 addr &= (1ul << 8 * current_wordsize) - 1;
939 if (!process_vm_readv_not_supported) {
940 struct iovec local[1], remote[1];
943 local[0].iov_base = laddr;
944 remote[0].iov_base = (void*)addr;
945 local[0].iov_len = remote[0].iov_len = len;
946 r = process_vm_readv(pid, local, 1, remote, 1, 0);
950 error_msg("umoven: short read (%d < %d) @0x%lx",
956 process_vm_readv_not_supported = 1;
959 /* the process is gone */
961 case EFAULT: case EIO: case EPERM:
962 /* address space is inaccessible */
965 /* all the rest is strange and should be reported */
966 perror_msg("process_vm_readv");
972 if (addr & (sizeof(long) - 1)) {
973 /* addr not a multiple of sizeof(long) */
974 n = addr - (addr & -sizeof(long)); /* residue */
975 addr &= -sizeof(long); /* residue */
977 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);
981 case ESRCH: case EINVAL:
982 /* these could be seen if the process is gone */
984 case EFAULT: case EIO: case EPERM:
985 /* address space is inaccessible */
988 /* all the rest is strange and should be reported */
989 perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%lx",
993 m = MIN(sizeof(long) - n, len);
994 memcpy(laddr, &u.x[n], m);
995 addr += sizeof(long);
1002 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);
1006 case ESRCH: case EINVAL:
1007 /* these could be seen if the process is gone */
1009 case EFAULT: case EIO: case EPERM:
1010 /* address space is inaccessible */
1012 perror_msg("umoven: short read (%d < %d) @0x%lx",
1013 nread, nread + len, addr - nread);
1017 /* all the rest is strange and should be reported */
1018 perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%lx",
1022 m = MIN(sizeof(long), len);
1023 memcpy(laddr, u.x, m);
1024 addr += sizeof(long);
1034 * Like `umove' but make the additional effort of looking
1035 * for a terminating zero byte.
1037 * Returns < 0 on error, > 0 if NUL was seen,
1038 * (TODO if useful: return count of bytes including NUL),
1039 * else 0 if len bytes were read but no NUL byte seen.
1041 * Note: there is no guarantee we won't overwrite some bytes
1042 * in laddr[] _after_ terminating NUL (but, of course,
1043 * we never write past laddr[len-1]).
1046 umovestr(struct tcb *tcp, long addr, int len, char *laddr)
1048 #if SIZEOF_LONG == 4
1049 const unsigned long x01010101 = 0x01010101ul;
1050 const unsigned long x80808080 = 0x80808080ul;
1051 #elif SIZEOF_LONG == 8
1052 const unsigned long x01010101 = 0x0101010101010101ul;
1053 const unsigned long x80808080 = 0x8080808080808080ul;
1055 # error SIZEOF_LONG > 8
1062 char x[sizeof(long)];
1065 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
1066 if (current_wordsize < sizeof(addr))
1067 addr &= (1ul << 8 * current_wordsize) - 1;
1071 if (!process_vm_readv_not_supported) {
1072 struct iovec local[1], remote[1];
1074 local[0].iov_base = laddr;
1075 remote[0].iov_base = (void*)addr;
1082 /* Don't read kilobytes: most strings are short */
1084 if (chunk_len > 256)
1086 /* Don't cross pages. I guess otherwise we can get EFAULT
1087 * and fail to notice that terminating NUL lies
1088 * in the existing (first) page.
1089 * (I hope there aren't arches with pages < 4K)
1091 end_in_page = ((addr + chunk_len) & 4095);
1092 r = chunk_len - end_in_page;
1093 if (r > 0) /* if chunk_len > end_in_page */
1094 chunk_len = r; /* chunk_len -= end_in_page */
1096 local[0].iov_len = remote[0].iov_len = chunk_len;
1097 r = process_vm_readv(pid, local, 1, remote, 1, 0);
1099 if (memchr(local[0].iov_base, '\0', r))
1101 local[0].iov_base += r;
1102 remote[0].iov_base += r;
1109 process_vm_readv_not_supported = 1;
1110 goto vm_readv_didnt_work;
1112 /* the process is gone */
1114 case EFAULT: case EIO: case EPERM:
1115 /* address space is inaccessible */
1117 perror_msg("umovestr: short read (%d < %d) @0x%lx",
1118 nread, nread + len, addr);
1122 /* all the rest is strange and should be reported */
1123 perror_msg("process_vm_readv");
1129 vm_readv_didnt_work:
1131 if (addr & (sizeof(long) - 1)) {
1132 /* addr not a multiple of sizeof(long) */
1133 n = addr - (addr & -sizeof(long)); /* residue */
1134 addr &= -sizeof(long); /* residue */
1136 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);
1140 case ESRCH: case EINVAL:
1141 /* these could be seen if the process is gone */
1143 case EFAULT: case EIO: case EPERM:
1144 /* address space is inaccessible */
1147 /* all the rest is strange and should be reported */
1148 perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%lx",
1152 m = MIN(sizeof(long) - n, len);
1153 memcpy(laddr, &u.x[n], m);
1154 while (n & (sizeof(long) - 1))
1155 if (u.x[n++] == '\0')
1157 addr += sizeof(long);
1165 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);
1169 case ESRCH: case EINVAL:
1170 /* these could be seen if the process is gone */
1172 case EFAULT: case EIO: case EPERM:
1173 /* address space is inaccessible */
1175 perror_msg("umovestr: short read (%d < %d) @0x%lx",
1176 nread, nread + len, addr - nread);
1180 /* all the rest is strange and should be reported */
1181 perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%lx",
1185 m = MIN(sizeof(long), len);
1186 memcpy(laddr, u.x, m);
1187 /* "If a NUL char exists in this word" */
1188 if ((u.val - x01010101) & ~u.val & x80808080)
1190 addr += sizeof(long);
1199 upeek(int pid, long off, long *res)
1204 val = ptrace(PTRACE_PEEKUSER, (pid_t)pid, (char *) off, 0);
1205 if (val == -1 && errno) {
1206 if (errno != ESRCH) {
1207 perror_msg("upeek: PTRACE_PEEKUSER pid:%d @0x%lx)", pid, off);
1215 /* Note! On new kernels (about 2.5.46+), we use PTRACE_O_TRACECLONE
1216 * and PTRACE_O_TRACE[V]FORK for tracing children.
1217 * If you are adding a new arch which is only supported by newer kernels,
1218 * you most likely don't need to add any code below
1219 * beside a dummy "return 0" block in change_syscall().
1223 * These #if's are huge, please indent them correctly.
1224 * It's easy to get confused otherwise.
1227 #include "syscall.h"
1229 #ifndef CLONE_PTRACE
1230 # define CLONE_PTRACE 0x00002000
1233 # define CLONE_VFORK 0x00004000
1236 # define CLONE_VM 0x00000100
1241 typedef unsigned long *arg_setup_state;
1244 arg_setup(struct tcb *tcp, arg_setup_state *state)
1246 unsigned long cfm, sof, sol;
1249 if (ia64_ia32mode) {
1250 /* Satisfy a false GCC warning. */
1255 if (upeek(tcp->pid, PT_AR_BSP, &bsp) < 0)
1257 if (upeek(tcp->pid, PT_CFM, (long *) &cfm) < 0)
1260 sof = (cfm >> 0) & 0x7f;
1261 sol = (cfm >> 7) & 0x7f;
1262 bsp = (long) ia64_rse_skip_regs((unsigned long *) bsp, -sof + sol);
1264 *state = (unsigned long *) bsp;
1268 # define arg_finish_change(tcp, state) 0
1271 get_arg0(struct tcb *tcp, arg_setup_state *state, long *valp)
1276 ret = upeek(tcp->pid, PT_R11, valp);
1279 (unsigned long) ia64_rse_skip_regs(*state, 0),
1280 sizeof(long), (void *) valp);
1285 get_arg1(struct tcb *tcp, arg_setup_state *state, long *valp)
1290 ret = upeek(tcp->pid, PT_R9, valp);
1293 (unsigned long) ia64_rse_skip_regs(*state, 1),
1294 sizeof(long), (void *) valp);
1299 set_arg0(struct tcb *tcp, arg_setup_state *state, long val)
1301 int req = PTRACE_POKEDATA;
1304 if (ia64_ia32mode) {
1305 ap = (void *) (intptr_t) PT_R11; /* r11 == EBX */
1306 req = PTRACE_POKEUSER;
1308 ap = ia64_rse_skip_regs(*state, 0);
1310 ptrace(req, tcp->pid, ap, val);
1311 return errno ? -1 : 0;
1315 set_arg1(struct tcb *tcp, arg_setup_state *state, long val)
1317 int req = PTRACE_POKEDATA;
1320 if (ia64_ia32mode) {
1321 ap = (void *) (intptr_t) PT_R9; /* r9 == ECX */
1322 req = PTRACE_POKEUSER;
1324 ap = ia64_rse_skip_regs(*state, 1);
1326 ptrace(req, tcp->pid, ap, val);
1327 return errno ? -1 : 0;
1330 /* ia64 does not return the input arguments from functions (and syscalls)
1331 according to ia64 RSE (Register Stack Engine) behavior. */
1333 # define restore_arg0(tcp, state, val) ((void) (state), 0)
1334 # define restore_arg1(tcp, state, val) ((void) (state), 0)
1336 #elif defined(SPARC) || defined(SPARC64)
1338 # if defined(SPARC64)
1339 # undef PTRACE_GETREGS
1340 # define PTRACE_GETREGS PTRACE_GETREGS64
1341 # undef PTRACE_SETREGS
1342 # define PTRACE_SETREGS PTRACE_SETREGS64
1345 typedef struct pt_regs arg_setup_state;
1347 # define arg_setup(tcp, state) \
1348 (ptrace(PTRACE_GETREGS, (tcp)->pid, (char *) (state), 0))
1349 # define arg_finish_change(tcp, state) \
1350 (ptrace(PTRACE_SETREGS, (tcp)->pid, (char *) (state), 0))
1352 # define get_arg0(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O0], 0)
1353 # define get_arg1(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O1], 0)
1354 # define set_arg0(tcp, state, val) ((state)->u_regs[U_REG_O0] = (val), 0)
1355 # define set_arg1(tcp, state, val) ((state)->u_regs[U_REG_O1] = (val), 0)
1356 # define restore_arg0(tcp, state, val) 0
1358 #else /* other architectures */
1360 # if defined S390 || defined S390X
1361 /* Note: this is only true for the `clone' system call, which handles
1362 arguments specially. We could as well say that its first two arguments
1363 are swapped relative to other architectures, but that would just be
1364 another #ifdef in the calls. */
1365 # define arg0_offset PT_GPR3
1366 # define arg1_offset PT_ORIGGPR2
1367 # define restore_arg0(tcp, state, val) ((void) (state), 0)
1368 # define restore_arg1(tcp, state, val) ((void) (state), 0)
1369 # define arg0_index 1
1370 # define arg1_index 0
1371 # elif defined(ALPHA) || defined(MIPS)
1372 # define arg0_offset REG_A0
1373 # define arg1_offset (REG_A0+1)
1374 # elif defined(POWERPC)
1375 # define arg0_offset (sizeof(unsigned long)*PT_R3)
1376 # define arg1_offset (sizeof(unsigned long)*PT_R4)
1377 # define restore_arg0(tcp, state, val) ((void) (state), 0)
1378 # elif defined(HPPA)
1379 # define arg0_offset PT_GR26
1380 # define arg1_offset (PT_GR26-4)
1381 # elif defined(X86_64) || defined(X32)
1382 # define arg0_offset ((long)(8*(current_personality ? RBX : RDI)))
1383 # define arg1_offset ((long)(8*(current_personality ? RCX : RSI)))
1385 # define arg0_offset (4*(REG_REG0+4))
1386 # define arg1_offset (4*(REG_REG0+5))
1387 # elif defined(SH64)
1388 /* ABI defines arg0 & 1 in r2 & r3 */
1389 # define arg0_offset (REG_OFFSET+16)
1390 # define arg1_offset (REG_OFFSET+24)
1391 # define restore_arg0(tcp, state, val) 0
1392 # elif defined CRISV10 || defined CRISV32
1393 # define arg0_offset (4*PT_R11)
1394 # define arg1_offset (4*PT_ORIG_R10)
1395 # define restore_arg0(tcp, state, val) 0
1396 # define restore_arg1(tcp, state, val) 0
1397 # define arg0_index 1
1398 # define arg1_index 0
1400 # define arg0_offset 0
1401 # define arg1_offset 4
1403 # define restore_arg0(tcp, state, val) 0
1407 typedef int arg_setup_state;
1409 # define arg_setup(tcp, state) (0)
1410 # define arg_finish_change(tcp, state) 0
1411 # define get_arg0(tcp, cookie, valp) (upeek((tcp)->pid, arg0_offset, (valp)))
1412 # define get_arg1(tcp, cookie, valp) (upeek((tcp)->pid, arg1_offset, (valp)))
1415 set_arg0(struct tcb *tcp, void *cookie, long val)
1417 return ptrace(PTRACE_POKEUSER, tcp->pid, (char*)arg0_offset, val);
1421 set_arg1(struct tcb *tcp, void *cookie, long val)
1423 return ptrace(PTRACE_POKEUSER, tcp->pid, (char*)arg1_offset, val);
1426 #endif /* architectures */
1428 #ifndef restore_arg0
1429 # define restore_arg0(tcp, state, val) set_arg0((tcp), (state), (val))
1431 #ifndef restore_arg1
1432 # define restore_arg1(tcp, state, val) set_arg1((tcp), (state), (val))
1436 # define arg0_index 0
1437 # define arg1_index 1
1441 change_syscall(struct tcb *tcp, arg_setup_state *state, int new)
1444 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
1447 #elif defined(X86_64)
1448 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
1452 /* setbpt/clearbpt never used: */
1453 /* X32 is only supported since about linux-3.0.30 */
1454 #elif defined(POWERPC)
1455 if (ptrace(PTRACE_POKEUSER, tcp->pid,
1456 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
1459 #elif defined(S390) || defined(S390X)
1460 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
1461 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new) < 0)
1465 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new) < 0)
1468 #elif defined(SPARC) || defined(SPARC64)
1469 state->u_regs[U_REG_G1] = new;
1472 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new) < 0)
1475 #elif defined(ALPHA)
1476 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new) < 0)
1479 #elif defined(AVR32)
1480 /* setbpt/clearbpt never used: */
1481 /* AVR32 is only supported since about linux-2.6.19 */
1483 /* setbpt/clearbpt never used: */
1484 /* Blackfin is only supported since about linux-2.6.23 */
1486 if (ia64_ia32mode) {
1489 break; /* x86 SYS_fork */
1494 fprintf(stderr, "%s: unexpected syscall %d\n",
1498 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new) < 0)
1500 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new) < 0)
1504 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new) < 0)
1508 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new) < 0)
1512 /* Top half of reg encodes the no. of args n as 0x1n.
1513 Assume 0 args as kernel never actually checks... */
1514 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
1515 0x100000 | new) < 0)
1518 #elif defined(CRISV10) || defined(CRISV32)
1519 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
1523 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
1524 # ifndef PTRACE_SET_SYSCALL
1525 # define PTRACE_SET_SYSCALL 23
1527 if (ptrace(PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0)
1530 #elif defined(AARCH64)
1531 /* setbpt/clearbpt never used: */
1532 /* AARCH64 is only supported since about linux-3.0.31 */
1534 /* setbpt/clearbpt never used: */
1535 /* Tilera CPUs are only supported since about linux-2.6.34 */
1536 #elif defined(MICROBLAZE)
1537 /* setbpt/clearbpt never used: */
1538 /* microblaze is only supported since about linux-2.6.30 */
1540 /* never reached; OR1K is only supported by kernels since 3.1.0. */
1541 #elif defined(METAG)
1542 /* setbpt/clearbpt never used: */
1543 /* Meta is only supported since linux-3.7 */
1544 #elif defined(XTENSA)
1545 /* setbpt/clearbpt never used: */
1546 /* Xtensa is only supported since linux 2.6.13 */
1548 /* setbpt/clearbpt never used: */
1549 /* ARC only supported since 3.9 */
1551 #warning Do not know how to handle change_syscall for this architecture
1552 #endif /* architecture */
1557 setbpt(struct tcb *tcp)
1559 static int clone_scno[SUPPORTED_PERSONALITIES] = { SYS_clone };
1560 arg_setup_state state;
1562 if (tcp->flags & TCB_BPTSET) {
1563 fprintf(stderr, "PANIC: TCB already set in pid %u\n", tcp->pid);
1568 * It's a silly kludge to initialize this with a search at runtime.
1569 * But it's better than maintaining another magic thing in the
1570 * godforsaken tables.
1572 if (clone_scno[current_personality] == 0) {
1574 for (i = 0; i < nsyscalls; ++i)
1575 if (sysent[i].sys_func == sys_clone) {
1576 clone_scno[current_personality] = i;
1581 if (tcp->s_ent->sys_func == sys_fork) {
1582 if (arg_setup(tcp, &state) < 0
1583 || get_arg0(tcp, &state, &tcp->inst[0]) < 0
1584 || get_arg1(tcp, &state, &tcp->inst[1]) < 0
1585 || change_syscall(tcp, &state,
1586 clone_scno[current_personality]) < 0
1587 || set_arg0(tcp, &state, CLONE_PTRACE|SIGCHLD) < 0
1588 || set_arg1(tcp, &state, 0) < 0
1589 || arg_finish_change(tcp, &state) < 0)
1591 tcp->u_arg[arg0_index] = CLONE_PTRACE|SIGCHLD;
1592 tcp->u_arg[arg1_index] = 0;
1593 tcp->flags |= TCB_BPTSET;
1597 if (tcp->s_ent->sys_func == sys_clone) {
1598 /* ia64 calls directly `clone (CLONE_VFORK | CLONE_VM)'
1599 contrary to x86 vfork above. Even on x86 we turn the
1600 vfork semantics into plain fork - each application must not
1601 depend on the vfork specifics according to POSIX. We would
1602 hang waiting for the parent resume otherwise. We need to
1603 clear also CLONE_VM but only in the CLONE_VFORK case as
1604 otherwise we would break pthread_create. */
1606 long new_arg0 = (tcp->u_arg[arg0_index] | CLONE_PTRACE);
1607 if (new_arg0 & CLONE_VFORK)
1608 new_arg0 &= ~(unsigned long)(CLONE_VFORK | CLONE_VM);
1609 if (arg_setup(tcp, &state) < 0
1610 || set_arg0(tcp, &state, new_arg0) < 0
1611 || arg_finish_change(tcp, &state) < 0)
1613 tcp->inst[0] = tcp->u_arg[arg0_index];
1614 tcp->inst[1] = tcp->u_arg[arg1_index];
1615 tcp->flags |= TCB_BPTSET;
1619 fprintf(stderr, "PANIC: setbpt for syscall %ld on %u???\n",
1620 tcp->scno, tcp->pid);
1625 clearbpt(struct tcb *tcp)
1627 arg_setup_state state;
1628 if (arg_setup(tcp, &state) < 0
1629 || change_syscall(tcp, &state, tcp->scno) < 0
1630 || restore_arg0(tcp, &state, tcp->inst[0]) < 0
1631 || restore_arg1(tcp, &state, tcp->inst[1]) < 0
1632 || arg_finish_change(tcp, &state))
1635 tcp->flags &= ~TCB_BPTSET;