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(int) * 3 * 6];
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 #define PROTO_NAME_LEN 32
486 char proto_buf[PROTO_NAME_LEN];
488 getfdproto(tcp, fd, proto_buf, PROTO_NAME_LEN);
489 inodenr = strtoul(path + socket_prefix_len, NULL, 10);
491 if (!print_sockaddr_by_inode(inodenr, proto)) {
493 tprintf("%s:[%lu]", proto, inodenr);
499 tprintf("%d<%s>", fd, path);
506 * Quote string `instr' of length `size'
507 * Write up to (3 + `size' * 4) bytes to `outstr' buffer.
508 * If `len' is -1, treat `instr' as a NUL-terminated string
509 * and quote at most (`size' - 1) bytes.
511 * Returns 0 if len == -1 and NUL was seen, 1 otherwise.
512 * Note that if len >= 0, always returns 1.
515 string_quote(const char *instr, char *outstr, long len, int size)
517 const unsigned char *ustr = (const unsigned char *) instr;
519 int usehex, c, i, eol;
521 eol = 0x100; /* this can never match a char */
531 /* Check for presence of symbol which require
532 to hex-quote the whole string. */
533 for (i = 0; i < size; ++i) {
535 /* Check for NUL-terminated string. */
539 /* Force hex unless c is printable or whitespace */
544 /* In ASCII isspace is only these chars: "\t\n\v\f\r".
545 * They happen to have ASCII codes 9,10,11,12,13.
547 if (c < ' ' && (unsigned)(c - 9) >= 5) {
557 /* Hex-quote the whole string. */
558 for (i = 0; i < size; ++i) {
560 /* Check for NUL-terminated string. */
565 *s++ = "0123456789abcdef"[c >> 4];
566 *s++ = "0123456789abcdef"[c & 0xf];
569 for (i = 0; i < size; ++i) {
571 /* Check for NUL-terminated string. */
575 case '\"': case '\\':
600 if (c >= ' ' && c <= 0x7e)
606 && ustr[i + 1] >= '0'
607 && ustr[i + 1] <= '9'
610 *s++ = '0' + (c >> 6);
611 *s++ = '0' + ((c >> 3) & 0x7);
616 *s++ = '0' + (c >> 6);
617 *s++ = '0' + ((c >> 3) & 0x7);
620 *s++ = '0' + (c & 0x7);
630 /* Return zero if we printed entire ASCIZ string (didn't truncate it) */
631 if (len == -1 && ustr[i] == '\0') {
632 /* We didn't see NUL yet (otherwise we'd jump to 'asciz_ended')
633 * but next char is NUL.
643 /* Return zero: we printed entire ASCIZ string (didn't truncate it) */
648 * Print path string specified by address `addr' and length `n'.
649 * If path length exceeds `n', append `...' to the output.
652 printpathn(struct tcb *tcp, long addr, unsigned int n)
654 char path[PATH_MAX + 1];
662 /* Cap path length to the path buffer size */
663 if (n > sizeof path - 1)
666 /* Fetch one byte more to find out whether path length > n. */
667 nul_seen = umovestr(tcp, addr, n + 1, path);
669 tprintf("%#lx", addr);
675 outstr = alloca(4 * n); /* 4*(n-1) + 3 for quotes and NUL */
676 string_quote(path, outstr, -1, n);
684 printpath(struct tcb *tcp, long addr)
686 /* Size must correspond to char path[] size in printpathn */
687 printpathn(tcp, addr, PATH_MAX);
691 * Print string specified by address `addr' and length `len'.
692 * If `len' < 0, treat the string as a NUL-terminated string.
693 * If string length exceeds `max_strlen', append `...' to the output.
696 printstr(struct tcb *tcp, long addr, long len)
698 static char *str = NULL;
707 /* Allocate static buffers if they are not allocated yet. */
709 unsigned int outstr_size = 4 * max_strlen + /*for quotes and NUL:*/ 3;
711 if (outstr_size / 4 != max_strlen)
713 str = malloc(max_strlen + 1);
716 outstr = malloc(outstr_size);
723 * Treat as a NUL-terminated string: fetch one byte more
724 * because string_quote() quotes one byte less.
726 size = max_strlen + 1;
727 if (umovestr(tcp, addr, size, str) < 0) {
728 tprintf("%#lx", addr);
734 if (size > (unsigned long)len)
735 size = (unsigned long)len;
736 if (umoven(tcp, addr, size, str) < 0) {
737 tprintf("%#lx", addr);
742 /* If string_quote didn't see NUL and (it was supposed to be ASCIZ str
743 * or we were requested to print more than -s NUM chars)...
745 ellipsis = (string_quote(str, outstr, len, size) &&
746 (len < 0 || (unsigned long) len > max_strlen));
754 dumpiov(struct tcb *tcp, int len, long addr)
756 #if SUPPORTED_PERSONALITIES > 1
758 struct { u_int32_t base; u_int32_t len; } *iov32;
759 struct { u_int64_t base; u_int64_t len; } *iov64;
761 #define iov iovu.iov64
763 (current_wordsize == 4 ? sizeof(*iovu.iov32) : sizeof(*iovu.iov64))
764 #define iov_iov_base(i) \
765 (current_wordsize == 4 ? (uint64_t) iovu.iov32[i].base : iovu.iov64[i].base)
766 #define iov_iov_len(i) \
767 (current_wordsize == 4 ? (uint64_t) iovu.iov32[i].len : iovu.iov64[i].len)
770 #define sizeof_iov sizeof(*iov)
771 #define iov_iov_base(i) iov[i].iov_base
772 #define iov_iov_len(i) iov[i].iov_len
777 size = sizeof_iov * len;
778 /* Assuming no sane program has millions of iovs */
779 if ((unsigned)len > 1024*1024 /* insane or negative size? */
780 || (iov = malloc(size)) == NULL) {
781 fprintf(stderr, "Out of memory\n");
784 if (umoven(tcp, addr, size, (char *) iov) >= 0) {
785 for (i = 0; i < len; i++) {
786 /* include the buffer number to make it easy to
787 * match up the trace with the source */
788 tprintf(" * %lu bytes in buffer %d\n",
789 (unsigned long)iov_iov_len(i), i);
790 dumpstr(tcp, (long) iov_iov_base(i),
802 dumpstr(struct tcb *tcp, long addr, int len)
804 static int strsize = -1;
805 static unsigned char *str;
810 "xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx "
811 "1234567890123456") + /*in case I'm off by few:*/ 4)
812 /*align to 8 to make memset easier:*/ + 7) & -8
814 const unsigned char *src;
817 memset(outbuf, ' ', sizeof(outbuf));
819 if (strsize < len + 16) {
821 str = malloc(len + 16);
824 fprintf(stderr, "Out of memory\n");
830 if (umoven(tcp, addr, len, (char *) str) < 0)
833 /* Space-pad to 16 bytes */
845 *dst++ = "0123456789abcdef"[*src >> 4];
846 *dst++ = "0123456789abcdef"[*src & 0xf];
852 dst++; /* space is there by memset */
855 dst++; /* space is there by memset */
862 if (*src >= ' ' && *src < 0x7f)
869 tprintf(" | %05x %s |\n", i - 16, outbuf);
873 #ifdef HAVE_PROCESS_VM_READV
874 /* C library supports this, but the kernel might not. */
875 static bool process_vm_readv_not_supported = 0;
878 /* Need to do this since process_vm_readv() is not yet available in libc.
879 * When libc is be updated, only "static bool process_vm_readv_not_supported"
880 * line should remain.
882 #if !defined(__NR_process_vm_readv)
884 # define __NR_process_vm_readv 347
885 # elif defined(X86_64)
886 # define __NR_process_vm_readv 310
887 # elif defined(POWERPC)
888 # define __NR_process_vm_readv 351
892 #if defined(__NR_process_vm_readv)
893 static bool process_vm_readv_not_supported = 0;
894 /* Have to avoid duplicating with the C library headers. */
895 static ssize_t strace_process_vm_readv(pid_t pid,
896 const struct iovec *lvec,
897 unsigned long liovcnt,
898 const struct iovec *rvec,
899 unsigned long riovcnt,
902 return syscall(__NR_process_vm_readv, (long)pid, lvec, liovcnt, rvec, riovcnt, flags);
904 #define process_vm_readv strace_process_vm_readv
906 static bool process_vm_readv_not_supported = 1;
907 # define process_vm_readv(...) (errno = ENOSYS, -1)
910 #endif /* end of hack */
912 #define PAGMASK (~(PAGSIZ - 1))
914 * move `len' bytes of data from process `pid'
915 * at address `addr' to our space at `laddr'
918 umoven(struct tcb *tcp, long addr, int len, char *laddr)
924 char x[sizeof(long)];
927 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
928 if (current_wordsize < sizeof(addr))
929 addr &= (1ul << 8 * current_wordsize) - 1;
932 if (!process_vm_readv_not_supported) {
933 struct iovec local[1], remote[1];
936 local[0].iov_base = laddr;
937 remote[0].iov_base = (void*)addr;
938 local[0].iov_len = remote[0].iov_len = len;
939 r = process_vm_readv(pid, local, 1, remote, 1, 0);
943 error_msg("umoven: short read (%d < %d) @0x%lx",
949 process_vm_readv_not_supported = 1;
952 /* the process is gone */
954 case EFAULT: case EIO: case EPERM:
955 /* address space is inaccessible */
958 /* all the rest is strange and should be reported */
959 perror_msg("process_vm_readv");
965 if (addr & (sizeof(long) - 1)) {
966 /* addr not a multiple of sizeof(long) */
967 n = addr - (addr & -sizeof(long)); /* residue */
968 addr &= -sizeof(long); /* residue */
970 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);
974 case ESRCH: case EINVAL:
975 /* these could be seen if the process is gone */
977 case EFAULT: case EIO: case EPERM:
978 /* address space is inaccessible */
981 /* all the rest is strange and should be reported */
982 perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%lx",
986 m = MIN(sizeof(long) - n, len);
987 memcpy(laddr, &u.x[n], m);
988 addr += sizeof(long);
995 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);
999 case ESRCH: case EINVAL:
1000 /* these could be seen if the process is gone */
1002 case EFAULT: case EIO: case EPERM:
1003 /* address space is inaccessible */
1005 perror_msg("umoven: short read (%d < %d) @0x%lx",
1006 nread, nread + len, addr - nread);
1010 /* all the rest is strange and should be reported */
1011 perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%lx",
1015 m = MIN(sizeof(long), len);
1016 memcpy(laddr, u.x, m);
1017 addr += sizeof(long);
1027 * Like `umove' but make the additional effort of looking
1028 * for a terminating zero byte.
1030 * Returns < 0 on error, > 0 if NUL was seen,
1031 * (TODO if useful: return count of bytes including NUL),
1032 * else 0 if len bytes were read but no NUL byte seen.
1034 * Note: there is no guarantee we won't overwrite some bytes
1035 * in laddr[] _after_ terminating NUL (but, of course,
1036 * we never write past laddr[len-1]).
1039 umovestr(struct tcb *tcp, long addr, int len, char *laddr)
1041 #if SIZEOF_LONG == 4
1042 const unsigned long x01010101 = 0x01010101ul;
1043 const unsigned long x80808080 = 0x80808080ul;
1044 #elif SIZEOF_LONG == 8
1045 const unsigned long x01010101 = 0x0101010101010101ul;
1046 const unsigned long x80808080 = 0x8080808080808080ul;
1048 # error SIZEOF_LONG > 8
1055 char x[sizeof(long)];
1058 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
1059 if (current_wordsize < sizeof(addr))
1060 addr &= (1ul << 8 * current_wordsize) - 1;
1064 if (!process_vm_readv_not_supported) {
1065 struct iovec local[1], remote[1];
1067 local[0].iov_base = laddr;
1068 remote[0].iov_base = (void*)addr;
1075 /* Don't read kilobytes: most strings are short */
1077 if (chunk_len > 256)
1079 /* Don't cross pages. I guess otherwise we can get EFAULT
1080 * and fail to notice that terminating NUL lies
1081 * in the existing (first) page.
1082 * (I hope there aren't arches with pages < 4K)
1084 end_in_page = ((addr + chunk_len) & 4095);
1085 r = chunk_len - end_in_page;
1086 if (r > 0) /* if chunk_len > end_in_page */
1087 chunk_len = r; /* chunk_len -= end_in_page */
1089 local[0].iov_len = remote[0].iov_len = chunk_len;
1090 r = process_vm_readv(pid, local, 1, remote, 1, 0);
1092 if (memchr(local[0].iov_base, '\0', r))
1094 local[0].iov_base += r;
1095 remote[0].iov_base += r;
1102 process_vm_readv_not_supported = 1;
1103 goto vm_readv_didnt_work;
1105 /* the process is gone */
1107 case EFAULT: case EIO: case EPERM:
1108 /* address space is inaccessible */
1110 perror_msg("umovestr: short read (%d < %d) @0x%lx",
1111 nread, nread + len, addr);
1115 /* all the rest is strange and should be reported */
1116 perror_msg("process_vm_readv");
1122 vm_readv_didnt_work:
1124 if (addr & (sizeof(long) - 1)) {
1125 /* addr not a multiple of sizeof(long) */
1126 n = addr - (addr & -sizeof(long)); /* residue */
1127 addr &= -sizeof(long); /* residue */
1129 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);
1133 case ESRCH: case EINVAL:
1134 /* these could be seen if the process is gone */
1136 case EFAULT: case EIO: case EPERM:
1137 /* address space is inaccessible */
1140 /* all the rest is strange and should be reported */
1141 perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%lx",
1145 m = MIN(sizeof(long) - n, len);
1146 memcpy(laddr, &u.x[n], m);
1147 while (n & (sizeof(long) - 1))
1148 if (u.x[n++] == '\0')
1150 addr += sizeof(long);
1158 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);
1162 case ESRCH: case EINVAL:
1163 /* these could be seen if the process is gone */
1165 case EFAULT: case EIO: case EPERM:
1166 /* address space is inaccessible */
1168 perror_msg("umovestr: short read (%d < %d) @0x%lx",
1169 nread, nread + len, addr - nread);
1173 /* all the rest is strange and should be reported */
1174 perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%lx",
1178 m = MIN(sizeof(long), len);
1179 memcpy(laddr, u.x, m);
1180 /* "If a NUL char exists in this word" */
1181 if ((u.val - x01010101) & ~u.val & x80808080)
1183 addr += sizeof(long);
1192 upeek(int pid, long off, long *res)
1197 val = ptrace(PTRACE_PEEKUSER, (pid_t)pid, (char *) off, 0);
1198 if (val == -1 && errno) {
1199 if (errno != ESRCH) {
1200 perror_msg("upeek: PTRACE_PEEKUSER pid:%d @0x%lx)", pid, off);
1208 /* Note! On new kernels (about 2.5.46+), we use PTRACE_O_TRACECLONE
1209 * and PTRACE_O_TRACE[V]FORK for tracing children.
1210 * If you are adding a new arch which is only supported by newer kernels,
1211 * you most likely don't need to add any code below
1212 * beside a dummy "return 0" block in change_syscall().
1216 * These #if's are huge, please indent them correctly.
1217 * It's easy to get confused otherwise.
1220 #include "syscall.h"
1222 #ifndef CLONE_PTRACE
1223 # define CLONE_PTRACE 0x00002000
1226 # define CLONE_VFORK 0x00004000
1229 # define CLONE_VM 0x00000100
1234 typedef unsigned long *arg_setup_state;
1237 arg_setup(struct tcb *tcp, arg_setup_state *state)
1239 unsigned long cfm, sof, sol;
1242 if (ia64_ia32mode) {
1243 /* Satisfy a false GCC warning. */
1248 if (upeek(tcp->pid, PT_AR_BSP, &bsp) < 0)
1250 if (upeek(tcp->pid, PT_CFM, (long *) &cfm) < 0)
1253 sof = (cfm >> 0) & 0x7f;
1254 sol = (cfm >> 7) & 0x7f;
1255 bsp = (long) ia64_rse_skip_regs((unsigned long *) bsp, -sof + sol);
1257 *state = (unsigned long *) bsp;
1261 # define arg_finish_change(tcp, state) 0
1264 get_arg0(struct tcb *tcp, arg_setup_state *state, long *valp)
1269 ret = upeek(tcp->pid, PT_R11, valp);
1272 (unsigned long) ia64_rse_skip_regs(*state, 0),
1273 sizeof(long), (void *) valp);
1278 get_arg1(struct tcb *tcp, arg_setup_state *state, long *valp)
1283 ret = upeek(tcp->pid, PT_R9, valp);
1286 (unsigned long) ia64_rse_skip_regs(*state, 1),
1287 sizeof(long), (void *) valp);
1292 set_arg0(struct tcb *tcp, arg_setup_state *state, long val)
1294 int req = PTRACE_POKEDATA;
1297 if (ia64_ia32mode) {
1298 ap = (void *) (intptr_t) PT_R11; /* r11 == EBX */
1299 req = PTRACE_POKEUSER;
1301 ap = ia64_rse_skip_regs(*state, 0);
1303 ptrace(req, tcp->pid, ap, val);
1304 return errno ? -1 : 0;
1308 set_arg1(struct tcb *tcp, arg_setup_state *state, long val)
1310 int req = PTRACE_POKEDATA;
1313 if (ia64_ia32mode) {
1314 ap = (void *) (intptr_t) PT_R9; /* r9 == ECX */
1315 req = PTRACE_POKEUSER;
1317 ap = ia64_rse_skip_regs(*state, 1);
1319 ptrace(req, tcp->pid, ap, val);
1320 return errno ? -1 : 0;
1323 /* ia64 does not return the input arguments from functions (and syscalls)
1324 according to ia64 RSE (Register Stack Engine) behavior. */
1326 # define restore_arg0(tcp, state, val) ((void) (state), 0)
1327 # define restore_arg1(tcp, state, val) ((void) (state), 0)
1329 #elif defined(SPARC) || defined(SPARC64)
1331 # if defined(SPARC64)
1332 # undef PTRACE_GETREGS
1333 # define PTRACE_GETREGS PTRACE_GETREGS64
1334 # undef PTRACE_SETREGS
1335 # define PTRACE_SETREGS PTRACE_SETREGS64
1338 typedef struct pt_regs arg_setup_state;
1340 # define arg_setup(tcp, state) \
1341 (ptrace(PTRACE_GETREGS, (tcp)->pid, (char *) (state), 0))
1342 # define arg_finish_change(tcp, state) \
1343 (ptrace(PTRACE_SETREGS, (tcp)->pid, (char *) (state), 0))
1345 # define get_arg0(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O0], 0)
1346 # define get_arg1(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O1], 0)
1347 # define set_arg0(tcp, state, val) ((state)->u_regs[U_REG_O0] = (val), 0)
1348 # define set_arg1(tcp, state, val) ((state)->u_regs[U_REG_O1] = (val), 0)
1349 # define restore_arg0(tcp, state, val) 0
1351 #else /* other architectures */
1353 # if defined S390 || defined S390X
1354 /* Note: this is only true for the `clone' system call, which handles
1355 arguments specially. We could as well say that its first two arguments
1356 are swapped relative to other architectures, but that would just be
1357 another #ifdef in the calls. */
1358 # define arg0_offset PT_GPR3
1359 # define arg1_offset PT_ORIGGPR2
1360 # define restore_arg0(tcp, state, val) ((void) (state), 0)
1361 # define restore_arg1(tcp, state, val) ((void) (state), 0)
1362 # define arg0_index 1
1363 # define arg1_index 0
1364 # elif defined(ALPHA) || defined(MIPS)
1365 # define arg0_offset REG_A0
1366 # define arg1_offset (REG_A0+1)
1367 # elif defined(POWERPC)
1368 # define arg0_offset (sizeof(unsigned long)*PT_R3)
1369 # define arg1_offset (sizeof(unsigned long)*PT_R4)
1370 # define restore_arg0(tcp, state, val) ((void) (state), 0)
1371 # elif defined(HPPA)
1372 # define arg0_offset PT_GR26
1373 # define arg1_offset (PT_GR26-4)
1374 # elif defined(X86_64) || defined(X32)
1375 # define arg0_offset ((long)(8*(current_personality ? RBX : RDI)))
1376 # define arg1_offset ((long)(8*(current_personality ? RCX : RSI)))
1378 # define arg0_offset (4*(REG_REG0+4))
1379 # define arg1_offset (4*(REG_REG0+5))
1380 # elif defined(SH64)
1381 /* ABI defines arg0 & 1 in r2 & r3 */
1382 # define arg0_offset (REG_OFFSET+16)
1383 # define arg1_offset (REG_OFFSET+24)
1384 # define restore_arg0(tcp, state, val) 0
1385 # elif defined CRISV10 || defined CRISV32
1386 # define arg0_offset (4*PT_R11)
1387 # define arg1_offset (4*PT_ORIG_R10)
1388 # define restore_arg0(tcp, state, val) 0
1389 # define restore_arg1(tcp, state, val) 0
1390 # define arg0_index 1
1391 # define arg1_index 0
1393 # define arg0_offset 0
1394 # define arg1_offset 4
1396 # define restore_arg0(tcp, state, val) 0
1400 typedef int arg_setup_state;
1402 # define arg_setup(tcp, state) (0)
1403 # define arg_finish_change(tcp, state) 0
1404 # define get_arg0(tcp, cookie, valp) (upeek((tcp)->pid, arg0_offset, (valp)))
1405 # define get_arg1(tcp, cookie, valp) (upeek((tcp)->pid, arg1_offset, (valp)))
1408 set_arg0(struct tcb *tcp, void *cookie, long val)
1410 return ptrace(PTRACE_POKEUSER, tcp->pid, (char*)arg0_offset, val);
1414 set_arg1(struct tcb *tcp, void *cookie, long val)
1416 return ptrace(PTRACE_POKEUSER, tcp->pid, (char*)arg1_offset, val);
1419 #endif /* architectures */
1421 #ifndef restore_arg0
1422 # define restore_arg0(tcp, state, val) set_arg0((tcp), (state), (val))
1424 #ifndef restore_arg1
1425 # define restore_arg1(tcp, state, val) set_arg1((tcp), (state), (val))
1429 # define arg0_index 0
1430 # define arg1_index 1
1434 change_syscall(struct tcb *tcp, arg_setup_state *state, int new)
1437 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
1440 #elif defined(X86_64)
1441 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
1445 /* setbpt/clearbpt never used: */
1446 /* X32 is only supported since about linux-3.0.30 */
1447 #elif defined(POWERPC)
1448 if (ptrace(PTRACE_POKEUSER, tcp->pid,
1449 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
1452 #elif defined(S390) || defined(S390X)
1453 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
1454 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new) < 0)
1458 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new) < 0)
1461 #elif defined(SPARC) || defined(SPARC64)
1462 state->u_regs[U_REG_G1] = new;
1465 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new) < 0)
1468 #elif defined(ALPHA)
1469 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new) < 0)
1472 #elif defined(AVR32)
1473 /* setbpt/clearbpt never used: */
1474 /* AVR32 is only supported since about linux-2.6.19 */
1476 /* setbpt/clearbpt never used: */
1477 /* Blackfin is only supported since about linux-2.6.23 */
1479 if (ia64_ia32mode) {
1482 break; /* x86 SYS_fork */
1487 fprintf(stderr, "%s: unexpected syscall %d\n",
1491 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new) < 0)
1493 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new) < 0)
1497 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new) < 0)
1501 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new) < 0)
1505 /* Top half of reg encodes the no. of args n as 0x1n.
1506 Assume 0 args as kernel never actually checks... */
1507 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
1508 0x100000 | new) < 0)
1511 #elif defined(CRISV10) || defined(CRISV32)
1512 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
1516 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
1517 # ifndef PTRACE_SET_SYSCALL
1518 # define PTRACE_SET_SYSCALL 23
1520 if (ptrace(PTRACE_SET_SYSCALL, tcp->pid, 0, new & 0xffff) != 0)
1523 #elif defined(AARCH64)
1524 /* setbpt/clearbpt never used: */
1525 /* AARCH64 is only supported since about linux-3.0.31 */
1527 /* setbpt/clearbpt never used: */
1528 /* Tilera CPUs are only supported since about linux-2.6.34 */
1529 #elif defined(MICROBLAZE)
1530 /* setbpt/clearbpt never used: */
1531 /* microblaze is only supported since about linux-2.6.30 */
1533 /* never reached; OR1K is only supported by kernels since 3.1.0. */
1534 #elif defined(METAG)
1535 /* setbpt/clearbpt never used: */
1536 /* Meta is only supported since linux-3.7 */
1537 #elif defined(XTENSA)
1538 /* setbpt/clearbpt never used: */
1539 /* Xtensa is only supported since linux 2.6.13 */
1541 /* setbpt/clearbpt never used: */
1542 /* ARC only supported since 3.9 */
1544 #warning Do not know how to handle change_syscall for this architecture
1545 #endif /* architecture */
1550 setbpt(struct tcb *tcp)
1552 static int clone_scno[SUPPORTED_PERSONALITIES] = { SYS_clone };
1553 arg_setup_state state;
1555 if (tcp->flags & TCB_BPTSET) {
1556 fprintf(stderr, "PANIC: TCB already set in pid %u\n", tcp->pid);
1561 * It's a silly kludge to initialize this with a search at runtime.
1562 * But it's better than maintaining another magic thing in the
1563 * godforsaken tables.
1565 if (clone_scno[current_personality] == 0) {
1567 for (i = 0; i < nsyscalls; ++i)
1568 if (sysent[i].sys_func == sys_clone) {
1569 clone_scno[current_personality] = i;
1574 if (tcp->s_ent->sys_func == sys_fork) {
1575 if (arg_setup(tcp, &state) < 0
1576 || get_arg0(tcp, &state, &tcp->inst[0]) < 0
1577 || get_arg1(tcp, &state, &tcp->inst[1]) < 0
1578 || change_syscall(tcp, &state,
1579 clone_scno[current_personality]) < 0
1580 || set_arg0(tcp, &state, CLONE_PTRACE|SIGCHLD) < 0
1581 || set_arg1(tcp, &state, 0) < 0
1582 || arg_finish_change(tcp, &state) < 0)
1584 tcp->u_arg[arg0_index] = CLONE_PTRACE|SIGCHLD;
1585 tcp->u_arg[arg1_index] = 0;
1586 tcp->flags |= TCB_BPTSET;
1590 if (tcp->s_ent->sys_func == sys_clone) {
1591 /* ia64 calls directly `clone (CLONE_VFORK | CLONE_VM)'
1592 contrary to x86 vfork above. Even on x86 we turn the
1593 vfork semantics into plain fork - each application must not
1594 depend on the vfork specifics according to POSIX. We would
1595 hang waiting for the parent resume otherwise. We need to
1596 clear also CLONE_VM but only in the CLONE_VFORK case as
1597 otherwise we would break pthread_create. */
1599 long new_arg0 = (tcp->u_arg[arg0_index] | CLONE_PTRACE);
1600 if (new_arg0 & CLONE_VFORK)
1601 new_arg0 &= ~(unsigned long)(CLONE_VFORK | CLONE_VM);
1602 if (arg_setup(tcp, &state) < 0
1603 || set_arg0(tcp, &state, new_arg0) < 0
1604 || arg_finish_change(tcp, &state) < 0)
1606 tcp->inst[0] = tcp->u_arg[arg0_index];
1607 tcp->inst[1] = tcp->u_arg[arg1_index];
1608 tcp->flags |= TCB_BPTSET;
1612 fprintf(stderr, "PANIC: setbpt for syscall %ld on %u???\n",
1613 tcp->scno, tcp->pid);
1618 clearbpt(struct tcb *tcp)
1620 arg_setup_state state;
1621 if (arg_setup(tcp, &state) < 0
1622 || change_syscall(tcp, &state, tcp->scno) < 0
1623 || restore_arg0(tcp, &state, tcp->inst[0]) < 0
1624 || restore_arg1(tcp, &state, tcp->inst[1]) < 0
1625 || arg_finish_change(tcp, &state))
1628 tcp->flags &= ~TCB_BPTSET;