2
* Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6
* Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7
* Linux for s390 port by D.J. Barrow
8
* <barrow_dj@mail.yahoo.com,djbarrow@de.ibm.com>
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in the
18
* documentation and/or other materials provided with the distribution.
19
* 3. The name of the author may not be used to endorse or promote products
20
* derived from this software without specific prior written permission.
22
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39
#include <sys/syscall.h>
41
#include <sys/param.h>
47
#include <machine/reg.h>
52
#if defined(linux) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 1))
53
#include <linux/ptrace.h>
56
#if defined(LINUX) && defined(IA64)
57
# include <asm/ptrace_offsets.h>
63
# define PTRACE_PEEKUSR PTRACE_PEEKUSER
64
#elif defined(HAVE_LINUX_PTRACE_H)
66
# ifdef HAVE_STRUCT_IA64_FPREG
67
# define ia64_fpreg XXX_ia64_fpreg
69
# ifdef HAVE_STRUCT_PT_ALL_USER_REGS
70
# define pt_all_user_regs XXX_pt_all_user_regs
72
#include <linux/ptrace.h>
74
# undef pt_all_user_regs
77
#ifdef SUNOS4_KERNEL_ARCH_KLUDGE
78
#include <sys/utsname.h>
79
#endif /* SUNOS4_KERNEL_ARCH_KLUDGE */
81
#if defined(LINUXSPARC) && defined (SPARC64)
82
# undef PTRACE_GETREGS
83
# define PTRACE_GETREGS PTRACE_GETREGS64
84
# undef PTRACE_SETREGS
85
# define PTRACE_SETREGS PTRACE_SETREGS64
90
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
93
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
100
return a->tv_sec || a->tv_usec;
105
struct timeval *a, *b;
107
if (a->tv_sec < b->tv_sec
108
|| (a->tv_sec == b->tv_sec && a->tv_usec < b->tv_usec))
110
if (a->tv_sec > b->tv_sec
111
|| (a->tv_sec == b->tv_sec && a->tv_usec > b->tv_usec))
120
return tv->tv_sec + tv->tv_usec/1000000.0;
125
struct timeval *tv, *a, *b;
127
tv->tv_sec = a->tv_sec + b->tv_sec;
128
tv->tv_usec = a->tv_usec + b->tv_usec;
129
if (tv->tv_usec >= 1000000) {
131
tv->tv_usec -= 1000000;
137
struct timeval *tv, *a, *b;
139
tv->tv_sec = a->tv_sec - b->tv_sec;
140
tv->tv_usec = a->tv_usec - b->tv_usec;
141
if (((long) tv->tv_usec) < 0) {
143
tv->tv_usec += 1000000;
149
struct timeval *tv, *a;
152
tv->tv_usec = (a->tv_sec % n * 1000000 + a->tv_usec + n / 2) / n;
153
tv->tv_sec = a->tv_sec / n + tv->tv_usec / 1000000;
154
tv->tv_usec %= 1000000;
159
struct timeval *tv, *a;
162
tv->tv_usec = a->tv_usec * n;
163
tv->tv_sec = a->tv_sec * n + tv->tv_usec / 1000000;
164
tv->tv_usec %= 1000000;
168
xlookup(const struct xlat *xlat, int val)
170
for (; xlat->str != NULL; xlat++)
171
if (xlat->val == val)
177
* Generic ptrace wrapper which tracks ESRCH errors
178
* by setting tcp->ptrace_errno to ESRCH.
180
* We assume that ESRCH indicates likely process death (SIGKILL?),
181
* modulo bugs where process somehow ended up not stopped.
182
* Unfortunately kernel uses ESRCH for that case too. Oh well.
184
* Currently used by upeek() only.
185
* TODO: use this in all other ptrace() calls while decoding.
188
do_ptrace(int request, struct tcb *tcp, void *addr, void *data)
193
l = ptrace(request, tcp->pid, addr, (long) data);
194
/* Non-ESRCH errors might be our invalid reg/mem accesses,
195
* we do not record them. */
197
tcp->ptrace_errno = ESRCH;
202
* Used when we want to unblock stopped traced process.
203
* Should be only used with PTRACE_CONT, PTRACE_DETACH and PTRACE_SYSCALL.
204
* Returns 0 on success or if error was ESRCH
205
* (presumably process was killed while we talk to it).
206
* Otherwise prints error message and returns -1.
209
ptrace_restart(int op, struct tcb *tcp, int sig)
215
ptrace(op, tcp->pid, (void *) 1, (long) sig);
217
if (!err || err == ESRCH)
220
tcp->ptrace_errno = err;
222
if (op == PTRACE_CONT)
224
if (op == PTRACE_DETACH)
226
fprintf(stderr, "strace: ptrace(PTRACE_%s,1,%d): %s\n",
227
msg, sig, strerror(err));
232
* Print entry in struct xlat table, if there.
235
printxval(const struct xlat *xlat, int val, const char *dflt)
237
const char *str = xlookup(xlat, val);
242
tprintf("%#x /* %s */", val, dflt);
247
* Print 64bit argument at position llarg and return the index of the next
251
printllval(struct tcb *tcp, const char *format, int llarg)
253
# if defined(FREEBSD) \
254
|| (defined(LINUX) && defined(POWERPC) && !defined(POWERPC64)) \
255
|| defined (LINUX_MIPSO32)
256
/* Align 64bit argument to 64bit boundary. */
257
if (llarg % 2) llarg++;
259
# if defined LINUX && (defined X86_64 || defined POWERPC64)
260
if (current_personality == 0) {
261
tprintf(format, tcp->u_arg[llarg]);
265
/* Align 64bit argument to 64bit boundary. */
266
if (llarg % 2) llarg++;
268
tprintf(format, LONG_LONG(tcp->u_arg[llarg], tcp->u_arg[llarg + 1]));
271
# elif defined IA64 || defined ALPHA
272
tprintf(format, tcp->u_arg[llarg]);
274
# elif defined LINUX_MIPSN32
275
tprintf(format, tcp->ext_arg[llarg]);
278
tprintf(format, LONG_LONG(tcp->u_arg[llarg], tcp->u_arg[llarg + 1]));
286
* Interpret `xlat' as an array of flags
287
* print the entries whose bits are on in `flags'
288
* return # of flags printed.
291
addflags(xlat, flags)
292
const struct xlat *xlat;
297
for (n = 0; xlat->str; xlat++) {
298
if (xlat->val && (flags & xlat->val) == xlat->val) {
299
tprintf("|%s", xlat->str);
305
tprintf("|%#x", flags);
312
* Interpret `xlat' as an array of flags/
313
* Print to static string the entries whose bits are on in `flags'
314
* Return static string.
317
sprintflags(const char *prefix, const struct xlat *xlat, int flags)
319
static char outstr[1024];
322
strcpy(outstr, prefix);
324
for (; xlat->str; xlat++) {
325
if ((flags & xlat->val) == xlat->val) {
328
strcat(outstr, xlat->str);
336
sprintf(outstr + strlen(outstr), "%#x", flags);
343
printflags(const struct xlat *xlat, int flags, const char *dflt)
348
if (flags == 0 && xlat->val == 0) {
349
tprintf("%s", xlat->str);
354
for (n = 0; xlat->str; xlat++) {
355
if (xlat->val && (flags & xlat->val) == xlat->val) {
356
tprintf("%s%s", sep, xlat->str);
365
tprintf("%s%#x", sep, flags);
370
tprintf("%#x", flags);
372
tprintf(" /* %s */", dflt);
383
printnum(struct tcb *tcp, long addr, const char *fmt)
391
if (umove(tcp, addr, &num) < 0) {
392
tprintf("%#lx", addr);
401
printnum_int(struct tcb *tcp, long addr, const char *fmt)
409
if (umove(tcp, addr, &num) < 0) {
410
tprintf("%#lx", addr);
419
printfd(struct tcb *tcp, int fd)
430
tprintf((uid == -1) ? "%ld" : "%lu", uid);
433
static char path[MAXPATHLEN + 1];
436
* Quote string `instr' of length `size'
437
* Write up to (3 + `size' * 4) bytes to `outstr' buffer.
438
* If `len' < 0, treat `instr' as a NUL-terminated string
439
* and quote at most (`size' - 1) bytes.
442
string_quote(const char *instr, char *outstr, int len, int size)
444
const unsigned char *ustr = (const unsigned char *) instr;
446
int usehex = 0, c, i;
451
/* Check for presence of symbol which require
452
to hex-quote the whole string. */
453
for (i = 0; i < size; ++i) {
455
/* Check for NUL-terminated string. */
459
/* Quote at most size - 1 bytes. */
463
if (!isprint(c) && !isspace(c)) {
473
/* Hex-quote the whole string. */
474
for (i = 0; i < size; ++i) {
476
/* Check for NUL-terminated string. */
480
/* Quote at most size - 1 bytes. */
484
sprintf(s, "\\x%02x", c);
488
for (i = 0; i < size; ++i) {
490
/* Check for NUL-terminated string. */
494
/* Quote at most size - 1 bytes. */
499
case '\"': case '\\':
526
else if (i + 1 < size
527
&& isdigit(ustr[i + 1])) {
528
sprintf(s, "\\%03o", c);
531
sprintf(s, "\\%o", c);
542
/* Return nonzero if the string was unterminated. */
547
* Print path string specified by address `addr' and length `n'.
548
* If path length exceeds `n', append `...' to the output.
551
printpathn(struct tcb *tcp, long addr, int n)
558
/* Cap path length to the path buffer size,
559
and NUL-terminate the buffer. */
560
if (n > sizeof path - 1)
564
/* Fetch one byte more to find out whether path length > n. */
565
if (umovestr(tcp, addr, n + 1, path) < 0)
566
tprintf("%#lx", addr);
568
static char outstr[4*(sizeof path - 1) + sizeof "\"...\""];
569
int trunc = (path[n] != '\0');
573
(void) string_quote(path, outstr, -1, n + 1);
575
strcat(outstr, "...");
576
tprintf("%s", outstr);
581
printpath(struct tcb *tcp, long addr)
583
printpathn(tcp, addr, sizeof path - 1);
587
* Print string specified by address `addr' and length `len'.
588
* If `len' < 0, treat the string as a NUL-terminated string.
589
* If string length exceeds `max_strlen', append `...' to the output.
592
printstr(struct tcb *tcp, long addr, int len)
594
static char *str = NULL;
602
/* Allocate static buffers if they are not allocated yet. */
604
str = malloc(max_strlen + 1);
606
outstr = malloc(4 * max_strlen + sizeof "\"...\"");
607
if (!str || !outstr) {
608
fprintf(stderr, "out of memory\n");
609
tprintf("%#lx", addr);
615
* Treat as a NUL-terminated string: fetch one byte more
616
* because string_quote() quotes one byte less.
618
size = max_strlen + 1;
619
str[max_strlen] = '\0';
620
if (umovestr(tcp, addr, size, str) < 0) {
621
tprintf("%#lx", addr);
626
size = MIN(len, max_strlen);
627
if (umoven(tcp, addr, size, str) < 0) {
628
tprintf("%#lx", addr);
633
if (string_quote(str, outstr, len, size) &&
634
(len < 0 || len > max_strlen))
635
strcat(outstr, "...");
637
tprintf("%s", outstr);
642
dumpiov(tcp, len, addr)
647
#if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
649
struct { u_int32_t base; u_int32_t len; } *iov32;
650
struct { u_int64_t base; u_int64_t len; } *iov64;
652
#define iov iovu.iov64
654
(personality_wordsize[current_personality] == 4 \
655
? sizeof(*iovu.iov32) : sizeof(*iovu.iov64))
656
#define iov_iov_base(i) \
657
(personality_wordsize[current_personality] == 4 \
658
? (u_int64_t) iovu.iov32[i].base : iovu.iov64[i].base)
659
#define iov_iov_len(i) \
660
(personality_wordsize[current_personality] == 4 \
661
? (u_int64_t) iovu.iov32[i].len : iovu.iov64[i].len)
664
#define sizeof_iov sizeof(*iov)
665
#define iov_iov_base(i) iov[i].iov_base
666
#define iov_iov_len(i) iov[i].iov_len
671
size = sizeof_iov * (unsigned long) len;
672
if (size / sizeof_iov != len
673
|| (iov = malloc(size)) == NULL) {
674
fprintf(stderr, "out of memory\n");
677
if (umoven(tcp, addr, size, (char *) iov) >= 0) {
678
for (i = 0; i < len; i++) {
679
/* include the buffer number to make it easy to
680
* match up the trace with the source */
681
tprintf(" * %lu bytes in buffer %d\n",
682
(unsigned long)iov_iov_len(i), i);
683
dumpstr(tcp, (long) iov_iov_base(i),
696
dumpstr(tcp, addr, len)
701
static int strsize = -1;
702
static unsigned char *str;
703
static char outstr[80];
710
if ((str = malloc(len)) == NULL) {
711
fprintf(stderr, "out of memory\n");
717
if (umoven(tcp, addr, len, (char *) str) < 0)
720
for (i = 0; i < len; i += 16) {
722
sprintf(s, " | %05x ", i);
724
for (j = 0; j < 16; j++) {
728
sprintf(s, " %02x", str[i + j]);
732
*s++ = ' '; *s++ = ' '; *s++ = ' ';
735
*s++ = ' '; *s++ = ' ';
736
for (j = 0; j < 16; j++) {
740
if (isprint(str[i + j]))
748
tprintf("%s |\n", outstr);
752
#define PAGMASK (~(PAGSIZ - 1))
754
* move `len' bytes of data from process `pid'
755
* at address `addr' to our space at `laddr'
758
umoven(struct tcb *tcp, long addr, int len, char *laddr)
766
char x[sizeof(long)];
769
if (addr & (sizeof(long) - 1)) {
770
/* addr not a multiple of sizeof(long) */
771
n = addr - (addr & -sizeof(long)); /* residue */
772
addr &= -sizeof(long); /* residue */
774
u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);
776
if (started && (errno==EPERM || errno==EIO)) {
777
/* Ran into 'end of memory' - stupid "printpath" */
780
/* But if not started, we had a bogus address. */
781
if (addr != 0 && errno != EIO && errno != ESRCH)
782
perror("ptrace: umoven");
786
memcpy(laddr, &u.x[n], m = MIN(sizeof(long) - n, len));
787
addr += sizeof(long), laddr += m, len -= m;
791
u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);
793
if (started && (errno==EPERM || errno==EIO)) {
794
/* Ran into 'end of memory' - stupid "printpath" */
797
if (addr != 0 && errno != EIO && errno != ESRCH)
798
perror("ptrace: umoven");
802
memcpy(laddr, u.x, m = MIN(sizeof(long), len));
803
addr += sizeof(long), laddr += m, len -= m;
812
n = MIN(len, PAGSIZ);
813
n = MIN(n, ((addr + PAGSIZ) & PAGMASK) - addr);
814
if (ptrace(PTRACE_READDATA, pid,
815
(char *) addr, len, laddr) < 0) {
816
if (errno != ESRCH) {
817
perror("umoven: ptrace(PTRACE_READDATA, ...)");
829
#ifdef HAVE_MP_PROCFS
830
int fd = tcp->pfd_as;
834
lseek(fd, addr, SEEK_SET);
835
if (read(fd, laddr, len) == -1)
837
#endif /* USE_PROCFS */
843
* like `umove' but make the additional effort of looking
844
* for a terminating zero byte.
847
umovestr(struct tcb *tcp, long addr, int len, char *laddr)
850
#ifdef HAVE_MP_PROCFS
851
int fd = tcp->pfd_as;
855
/* Some systems (e.g. FreeBSD) can be upset if we read off the
856
end of valid memory, avoid this by trying to read up
857
to page boundaries. But we don't know what a page is (and
858
getpagesize(2) (if it exists) doesn't necessarily return
859
hardware page size). Assume all pages >= 1024 (a-historical
862
int page = 1024; /* How to find this? */
863
int move = page - (addr & (page - 1));
866
lseek(fd, addr, SEEK_SET);
869
if (move > left) move = left;
870
if ((move = read(fd, laddr, move)) <= 0)
871
return left != len ? 0 : -1;
872
if (memchr (laddr, 0, move)) break;
878
#else /* !USE_PROCFS */
884
char x[sizeof(long)];
887
if (addr & (sizeof(long) - 1)) {
888
/* addr not a multiple of sizeof(long) */
889
n = addr - (addr & -sizeof(long)); /* residue */
890
addr &= -sizeof(long); /* residue */
892
u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);
894
if (started && (errno==EPERM || errno==EIO)) {
895
/* Ran into 'end of memory' - stupid "printpath" */
898
if (addr != 0 && errno != EIO && errno != ESRCH)
903
memcpy(laddr, &u.x[n], m = MIN(sizeof(long)-n,len));
904
while (n & (sizeof(long) - 1))
905
if (u.x[n++] == '\0')
907
addr += sizeof(long), laddr += m, len -= m;
911
u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);
913
if (started && (errno==EPERM || errno==EIO)) {
914
/* Ran into 'end of memory' - stupid "printpath" */
917
if (addr != 0 && errno != EIO && errno != ESRCH)
922
memcpy(laddr, u.x, m = MIN(sizeof(long), len));
923
for (i = 0; i < sizeof(long); i++)
927
addr += sizeof(long), laddr += m, len -= m;
929
#endif /* !USE_PROCFS */
934
# if !defined (SPARC) && !defined(SPARC64)
935
# define PTRACE_WRITETEXT 101
936
# define PTRACE_WRITEDATA 102
937
# endif /* !SPARC && !SPARC64 */
943
uload(cmd, pid, addr, len, laddr)
954
char x[sizeof(long)];
957
if (cmd == PTRACE_WRITETEXT) {
958
peek = PTRACE_PEEKTEXT;
959
poke = PTRACE_POKETEXT;
962
peek = PTRACE_PEEKDATA;
963
poke = PTRACE_POKEDATA;
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);
970
u.val = ptrace(peek, pid, (char *) addr, 0);
972
perror("uload: POKE");
975
memcpy(&u.x[n], laddr, m = MIN(sizeof(long) - n, len));
976
if (ptrace(poke, pid, (char *)addr, u.val) < 0) {
977
perror("uload: POKE");
980
addr += sizeof(long), laddr += m, len -= m;
983
if (len < sizeof(long))
984
u.val = ptrace(peek, pid, (char *) addr, 0);
985
memcpy(u.x, laddr, m = MIN(sizeof(long), len));
986
if (ptrace(poke, pid, (char *) addr, u.val) < 0) {
987
perror("uload: POKE");
990
addr += sizeof(long), laddr += m, len -= m;
996
tload(pid, addr, len, laddr)
1001
return uload(PTRACE_WRITETEXT, pid, addr, len, laddr);
1005
dload(pid, addr, len, laddr)
1011
return uload(PTRACE_WRITEDATA, pid, addr, len, laddr);
1019
upeek(tcp, off, res)
1026
# ifdef SUNOS4_KERNEL_ARCH_KLUDGE
1028
static int is_sun4m = -1;
1029
struct utsname name;
1031
/* Round up the usual suspects. */
1032
if (is_sun4m == -1) {
1033
if (uname(&name) < 0) {
1034
perror("upeek: uname?");
1037
is_sun4m = strcmp(name.machine, "sun4m") == 0;
1039
const struct xlat *x;
1041
for (x = struct_user_offsets; x->str; x++)
1048
# endif /* SUNOS4_KERNEL_ARCH_KLUDGE */
1050
val = do_ptrace(PTRACE_PEEKUSER, tcp, (char *) off, 0);
1051
if (val == -1 && errno) {
1052
if (errno != ESRCH) {
1054
sprintf(buf,"upeek: ptrace(PTRACE_PEEKUSER,%d,%lu,0)", tcp->pid, off);
1063
#endif /* !USE_PROCFS */
1066
printcall(struct tcb *tcp)
1068
#define PRINTBADPC tprintf(sizeof(long) == 4 ? "[????????] " : \
1069
sizeof(long) == 8 ? "[????????????????] " : \
1076
if (upeek(tcp, 4*EIP, &eip) < 0) {
1080
tprintf("[%08lx] ", eip);
1082
# elif defined(S390) || defined(S390X)
1084
if(upeek(tcp,PT_PSWADDR,&psw) < 0) {
1089
tprintf("[%08lx] ", psw);
1091
tprintf("[%16lx] ", psw);
1094
# elif defined(X86_64)
1097
if (upeek(tcp, 8*RIP, &rip) < 0) {
1101
tprintf("[%16lx] ", rip);
1102
# elif defined(IA64)
1105
if (upeek(tcp, PT_B0, &ip) < 0) {
1109
tprintf("[%08lx] ", ip);
1110
# elif defined(POWERPC)
1113
if (upeek(tcp, sizeof(unsigned long)*PT_NIP, &pc) < 0) {
1118
tprintf("[%016lx] ", pc);
1120
tprintf("[%08lx] ", pc);
1122
# elif defined(M68K)
1125
if (upeek(tcp, 4*PT_PC, &pc) < 0) {
1126
tprintf ("[????????] ");
1129
tprintf("[%08lx] ", pc);
1130
# elif defined(ALPHA)
1133
if (upeek(tcp, REG_PC, &pc) < 0) {
1134
tprintf ("[????????????????] ");
1137
tprintf("[%08lx] ", pc);
1138
# elif defined(SPARC) || defined(SPARC64)
1139
struct pt_regs regs;
1140
if (ptrace(PTRACE_GETREGS,tcp->pid,(char *)®s,0) < 0) {
1144
# if defined(SPARC64)
1145
tprintf("[%08lx] ", regs.tpc);
1147
tprintf("[%08lx] ", regs.pc);
1149
# elif defined(HPPA)
1152
if(upeek(tcp,PT_IAOQ0,&pc) < 0) {
1153
tprintf ("[????????] ");
1156
tprintf("[%08lx] ", pc);
1157
# elif defined(MIPS)
1160
if (upeek(tcp, REG_EPC, &pc) < 0) {
1161
tprintf ("[????????] ");
1164
tprintf("[%08lx] ", pc);
1168
if (upeek(tcp, 4*REG_PC, &pc) < 0) {
1169
tprintf ("[????????] ");
1172
tprintf("[%08lx] ", pc);
1173
# elif defined(SH64)
1176
if (upeek(tcp, REG_PC, &pc) < 0) {
1177
tprintf ("[????????????????] ");
1180
tprintf("[%08lx] ", pc);
1184
if (upeek(tcp, 4*15, &pc) < 0) {
1188
tprintf("[%08lx] ", pc);
1189
# elif defined(AVR32)
1192
if (upeek(tcp, REG_PC, &pc) < 0) {
1193
tprintf("[????????] ");
1196
tprintf("[%08lx] ", pc);
1197
# elif defined(BFIN)
1200
if (upeek(tcp, PT_PC, &pc) < 0) {
1204
tprintf("[%08lx] ", pc);
1205
#elif defined(CRISV10)
1208
if (upeek(tcp, 4*PT_IRP, &pc) < 0) {
1212
tprintf("[%08lx] ", pc);
1213
#elif defined(CRISV32)
1216
if (upeek(tcp, 4*PT_ERP, &pc) < 0) {
1220
tprintf("[%08lx] ", pc);
1221
# endif /* architecture */
1227
if (ptrace(PTRACE_GETREGS, tcp->pid, (char *) ®s, 0) < 0) {
1228
perror("printcall: ptrace(PTRACE_GETREGS, ...)");
1232
tprintf("[%08x] ", regs.r_o7);
1242
pread(tcp->pfd_reg, ®s, sizeof(regs), 0);
1243
tprintf("[%08x] ", regs.r_eip);
1244
#endif /* FREEBSD */
1249
* These #if's are huge, please indent them correctly.
1250
* It's easy to get confused otherwise.
1256
# include "syscall.h"
1258
# include <sys/syscall.h>
1259
# ifndef CLONE_PTRACE
1260
# define CLONE_PTRACE 0x00002000
1262
# ifndef CLONE_VFORK
1263
# define CLONE_VFORK 0x00004000
1266
# define CLONE_VM 0x00000100
1268
# ifndef CLONE_STOPPED
1269
# define CLONE_STOPPED 0x02000000
1274
/* We don't have fork()/vfork() syscalls on ia64 itself, but the ia32
1275
subsystem has them for x86... */
1277
# define SYS_vfork 190
1279
typedef unsigned long *arg_setup_state;
1282
arg_setup(struct tcb *tcp, arg_setup_state *state)
1284
unsigned long cfm, sof, sol;
1288
/* Satisfy a false GCC warning. */
1293
if (upeek(tcp, PT_AR_BSP, &bsp) < 0)
1295
if (upeek(tcp, PT_CFM, (long *) &cfm) < 0)
1298
sof = (cfm >> 0) & 0x7f;
1299
sol = (cfm >> 7) & 0x7f;
1300
bsp = (long) ia64_rse_skip_regs((unsigned long *) bsp, -sof + sol);
1302
*state = (unsigned long *) bsp;
1306
# define arg_finish_change(tcp, state) 0
1310
get_arg0 (struct tcb *tcp, arg_setup_state *state, long *valp)
1315
ret = upeek (tcp, PT_R11, valp);
1318
(unsigned long) ia64_rse_skip_regs(*state, 0),
1319
sizeof(long), (void *) valp);
1324
get_arg1 (struct tcb *tcp, arg_setup_state *state, long *valp)
1329
ret = upeek (tcp, PT_R9, valp);
1332
(unsigned long) ia64_rse_skip_regs(*state, 1),
1333
sizeof(long), (void *) valp);
1339
set_arg0 (struct tcb *tcp, arg_setup_state *state, long val)
1341
int req = PTRACE_POKEDATA;
1345
ap = (void *) (intptr_t) PT_R11; /* r11 == EBX */
1346
req = PTRACE_POKEUSER;
1348
ap = ia64_rse_skip_regs(*state, 0);
1350
ptrace(req, tcp->pid, ap, val);
1351
return errno ? -1 : 0;
1355
set_arg1 (struct tcb *tcp, arg_setup_state *state, long val)
1357
int req = PTRACE_POKEDATA;
1361
ap = (void *) (intptr_t) PT_R9; /* r9 == ECX */
1362
req = PTRACE_POKEUSER;
1364
ap = ia64_rse_skip_regs(*state, 1);
1366
ptrace(req, tcp->pid, ap, val);
1367
return errno ? -1 : 0;
1370
/* ia64 does not return the input arguments from functions (and syscalls)
1371
according to ia64 RSE (Register Stack Engine) behavior. */
1373
# define restore_arg0(tcp, state, val) ((void) (state), 0)
1374
# define restore_arg1(tcp, state, val) ((void) (state), 0)
1376
# elif defined (SPARC) || defined (SPARC64)
1378
typedef struct pt_regs arg_setup_state;
1380
# define arg_setup(tcp, state) \
1381
(ptrace (PTRACE_GETREGS, tcp->pid, (char *) (state), 0))
1382
# define arg_finish_change(tcp, state) \
1383
(ptrace (PTRACE_SETREGS, tcp->pid, (char *) (state), 0))
1385
# define get_arg0(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O0], 0)
1386
# define get_arg1(tcp, state, valp) (*(valp) = (state)->u_regs[U_REG_O1], 0)
1387
# define set_arg0(tcp, state, val) ((state)->u_regs[U_REG_O0] = (val), 0)
1388
# define set_arg1(tcp, state, val) ((state)->u_regs[U_REG_O1] = (val), 0)
1389
# define restore_arg0(tcp, state, val) 0
1391
# else /* other architectures */
1393
# if defined S390 || defined S390X
1394
/* Note: this is only true for the `clone' system call, which handles
1395
arguments specially. We could as well say that its first two arguments
1396
are swapped relative to other architectures, but that would just be
1397
another #ifdef in the calls. */
1398
# define arg0_offset PT_GPR3
1399
# define arg1_offset PT_ORIGGPR2
1400
# define restore_arg0(tcp, state, val) ((void) (state), 0)
1401
# define restore_arg1(tcp, state, val) ((void) (state), 0)
1402
# define arg0_index 1
1403
# define arg1_index 0
1404
# elif defined (ALPHA) || defined (MIPS)
1405
# define arg0_offset REG_A0
1406
# define arg1_offset (REG_A0+1)
1407
# elif defined (AVR32)
1408
# define arg0_offset (REG_R12)
1409
# define arg1_offset (REG_R11)
1410
# elif defined (POWERPC)
1411
# define arg0_offset (sizeof(unsigned long)*PT_R3)
1412
# define arg1_offset (sizeof(unsigned long)*PT_R4)
1413
# define restore_arg0(tcp, state, val) ((void) (state), 0)
1414
# elif defined (HPPA)
1415
# define arg0_offset PT_GR26
1416
# define arg1_offset (PT_GR26-4)
1417
# elif defined (X86_64)
1418
# define arg0_offset ((long)(8*(current_personality ? RBX : RDI)))
1419
# define arg1_offset ((long)(8*(current_personality ? RCX : RSI)))
1421
# define arg0_offset (4*(REG_REG0+4))
1422
# define arg1_offset (4*(REG_REG0+5))
1423
# elif defined (SH64)
1424
/* ABI defines arg0 & 1 in r2 & r3 */
1425
# define arg0_offset (REG_OFFSET+16)
1426
# define arg1_offset (REG_OFFSET+24)
1427
# define restore_arg0(tcp, state, val) 0
1428
# elif defined CRISV10 || defined CRISV32
1429
# define arg0_offset (4*PT_R11)
1430
# define arg1_offset (4*PT_ORIG_R10)
1431
# define restore_arg0(tcp, state, val) 0
1432
# define restore_arg1(tcp, state, val) 0
1433
# define arg0_index 1
1434
# define arg1_index 0
1436
# define arg0_offset 0
1437
# define arg1_offset 4
1439
# define restore_arg0(tcp, state, val) 0
1443
typedef int arg_setup_state;
1445
# define arg_setup(tcp, state) (0)
1446
# define arg_finish_change(tcp, state) 0
1447
# define get_arg0(tcp, cookie, valp) \
1448
(upeek ((tcp), arg0_offset, (valp)))
1449
# define get_arg1(tcp, cookie, valp) \
1450
(upeek ((tcp), arg1_offset, (valp)))
1453
set_arg0 (struct tcb *tcp, void *cookie, long val)
1455
return ptrace (PTRACE_POKEUSER, tcp->pid, (char*)arg0_offset, val);
1459
set_arg1 (struct tcb *tcp, void *cookie, long val)
1461
return ptrace (PTRACE_POKEUSER, tcp->pid, (char*)arg1_offset, val);
1464
# endif /* architectures */
1466
# ifndef restore_arg0
1467
# define restore_arg0(tcp, state, val) set_arg0((tcp), (state), (val))
1469
# ifndef restore_arg1
1470
# define restore_arg1(tcp, state, val) set_arg1((tcp), (state), (val))
1474
# define arg0_index 0
1475
# define arg1_index 1
1479
setbpt(struct tcb *tcp)
1481
static int clone_scno[SUPPORTED_PERSONALITIES] = { SYS_clone };
1482
arg_setup_state state;
1484
if (tcp->flags & TCB_BPTSET) {
1485
fprintf(stderr, "PANIC: TCB already set in pid %u\n", tcp->pid);
1490
* It's a silly kludge to initialize this with a search at runtime.
1491
* But it's better than maintaining another magic thing in the
1492
* godforsaken tables.
1494
if (clone_scno[current_personality] == 0) {
1496
for (i = 0; i < nsyscalls; ++i)
1497
if (sysent[i].sys_func == sys_clone) {
1498
clone_scno[current_personality] = i;
1503
switch (known_scno(tcp)) {
1510
# if defined SYS_fork || defined SYS_vfork
1511
if (arg_setup (tcp, &state) < 0
1512
|| get_arg0 (tcp, &state, &tcp->inst[0]) < 0
1513
|| get_arg1 (tcp, &state, &tcp->inst[1]) < 0
1514
|| change_syscall(tcp, clone_scno[current_personality]) < 0
1515
|| set_arg0 (tcp, &state, CLONE_PTRACE|SIGCHLD) < 0
1516
|| set_arg1 (tcp, &state, 0) < 0
1517
|| arg_finish_change (tcp, &state) < 0)
1519
tcp->u_arg[arg0_index] = CLONE_PTRACE|SIGCHLD;
1520
tcp->u_arg[arg1_index] = 0;
1521
tcp->flags |= TCB_BPTSET;
1529
/* ia64 calls directly `clone (CLONE_VFORK | CLONE_VM)'
1530
contrary to x86 SYS_vfork above. Even on x86 we turn the
1531
vfork semantics into plain fork - each application must not
1532
depend on the vfork specifics according to POSIX. We would
1533
hang waiting for the parent resume otherwise. We need to
1534
clear also CLONE_VM but only in the CLONE_VFORK case as
1535
otherwise we would break pthread_create. */
1537
if ((arg_setup (tcp, &state) < 0
1538
|| set_arg0 (tcp, &state,
1539
(tcp->u_arg[arg0_index] | CLONE_PTRACE)
1540
& ~(tcp->u_arg[arg0_index] & CLONE_VFORK
1541
? CLONE_VFORK | CLONE_VM : 0)) < 0
1542
|| arg_finish_change (tcp, &state) < 0))
1544
tcp->flags |= TCB_BPTSET;
1545
tcp->inst[0] = tcp->u_arg[arg0_index];
1546
tcp->inst[1] = tcp->u_arg[arg1_index];
1550
fprintf(stderr, "PANIC: setbpt for syscall %ld on %u???\n",
1551
tcp->scno, tcp->pid);
1562
arg_setup_state state;
1563
if (arg_setup (tcp, &state) < 0
1564
|| restore_arg0 (tcp, &state, tcp->inst[0]) < 0
1565
|| restore_arg1 (tcp, &state, tcp->inst[1]) < 0
1566
|| arg_finish_change (tcp, &state))
1567
if (errno != ESRCH) return -1;
1568
tcp->flags &= ~TCB_BPTSET;
1572
# else /* !defined LINUX */
1579
# ifdef SPARC /* This code is slightly sparc specific */
1582
# define BPT 0x91d02001 /* ta 1 */
1583
# define LOOP 0x10800000 /* ba 0 */
1584
# define LOOPA 0x30800000 /* ba,a 0 */
1585
# define NOP 0x01000000
1587
static int loopdeloop[1] = {LOOPA};
1589
static int loopdeloop[2] = {LOOP, NOP};
1592
if (tcp->flags & TCB_BPTSET) {
1593
fprintf(stderr, "PANIC: TCB already set in pid %u\n", tcp->pid);
1596
if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) {
1597
perror("setbpt: ptrace(PTRACE_GETREGS, ...)");
1600
tcp->baddr = regs.r_o7 + 8;
1601
if (ptrace(PTRACE_READTEXT, tcp->pid, (char *)tcp->baddr,
1602
sizeof tcp->inst, (char *)tcp->inst) < 0) {
1603
perror("setbpt: ptrace(PTRACE_READTEXT, ...)");
1608
* XXX - BRUTAL MODE ON
1609
* We cannot set a real BPT in the child, since it will not be
1610
* traced at the moment it will reach the trap and would probably
1611
* die with a core dump.
1612
* Thus, we are force our way in by taking out two instructions
1613
* and insert an eternal loop in stead, in expectance of the SIGSTOP
1614
* generated by out PTRACE_ATTACH.
1615
* Of cause, if we evaporate ourselves in the middle of all this...
1617
if (ptrace(PTRACE_WRITETEXT, tcp->pid, (char *) tcp->baddr,
1618
sizeof loopdeloop, (char *) loopdeloop) < 0) {
1619
perror("setbpt: ptrace(PTRACE_WRITETEXT, ...)");
1622
tcp->flags |= TCB_BPTSET;
1625
# endif /* SUNOS4 */
1641
if (!(tcp->flags & TCB_BPTSET)) {
1642
fprintf(stderr, "PANIC: TCB not set in pid %u\n", tcp->pid);
1645
if (ptrace(PTRACE_WRITETEXT, tcp->pid, (char *) tcp->baddr,
1646
sizeof tcp->inst, (char *) tcp->inst) < 0) {
1647
perror("clearbtp: ptrace(PTRACE_WRITETEXT, ...)");
1650
tcp->flags &= ~TCB_BPTSET;
1654
* Since we don't have a single instruction breakpoint, we may have
1655
* to adjust the program counter after removing our `breakpoint'.
1657
if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) {
1658
perror("clearbpt: ptrace(PTRACE_GETREGS, ...)");
1661
if ((regs.r_pc < tcp->baddr) ||
1662
(regs.r_pc > tcp->baddr + 4)) {
1663
/* The breakpoint has not been reached yet */
1666
"NOTE: PC not at bpt (pc %#x baddr %#x)\n",
1667
regs.r_pc, tcp->baddr);
1670
if (regs.r_pc != tcp->baddr)
1672
fprintf(stderr, "NOTE: PC adjusted (%#x -> %#x\n",
1673
regs.r_pc, tcp->baddr);
1675
regs.r_pc = tcp->baddr;
1676
if (ptrace(PTRACE_SETREGS, tcp->pid, (char *)®s, 0) < 0) {
1677
perror("clearbpt: ptrace(PTRACE_SETREGS, ...)");
1682
# endif /* SUNOS4 */
1687
# endif /* !defined LINUX */
1689
#endif /* !USE_PROCFS */
1701
for (n = 0; n < sizeof *hdr; n += 4) {
1703
if (upeek(tcp, uoff(u_exdata) + n, &res) < 0)
1705
memcpy(((char *) hdr) + n, &res, 4);
1708
fprintf(stderr, "[struct exec: magic: %o version %u Mach %o\n",
1709
hdr->a_magic, hdr->a_toolversion, hdr->a_machtype);
1710
fprintf(stderr, "Text %lu Data %lu Bss %lu Syms %lu Entry %#lx]\n",
1711
hdr->a_text, hdr->a_data, hdr->a_bss, hdr->a_syms, hdr->a_entry);
1722
* Change `vfork' in a freshly exec'ed dynamically linked
1723
* executable's (internal) symbol table to plain old `fork'
1727
struct link_dynamic dyn;
1728
struct link_dynamic_2 ld;
1731
if (getex(tcp, &hdr) < 0)
1736
if (umove(tcp, (int) N_DATADDR(hdr), &dyn) < 0) {
1737
fprintf(stderr, "Cannot read DYNAMIC\n");
1740
if (umove(tcp, (int) dyn.ld_un.ld_2, &ld) < 0) {
1741
fprintf(stderr, "Cannot read link_dynamic_2\n");
1744
if ((strtab = malloc((unsigned)ld.ld_symb_size)) == NULL) {
1745
fprintf(stderr, "out of memory\n");
1748
if (umoven(tcp, (int)ld.ld_symbols+(int)N_TXTADDR(hdr),
1749
(int)ld.ld_symb_size, strtab) < 0)
1752
for (cp = strtab; cp < strtab + ld.ld_symb_size; ) {
1753
if (strcmp(cp, "_vfork") == 0) {
1755
fprintf(stderr, "fixvfork: FOUND _vfork\n");
1756
strcpy(cp, "_fork");
1761
if (cp < strtab + ld.ld_symb_size)
1763
* Write entire symbol table back to avoid
1764
* memory alignment bugs in ptrace
1766
if (tload(pid, (int)ld.ld_symbols+(int)N_TXTADDR(hdr),
1767
(int)ld.ld_symb_size, strtab) < 0)