blob: 6d623151969895986a0e8ef93fe2616ccc136bdf [file] [log] [blame]
--- ltrace-0.5.2.orig/TODO
+++ ltrace-0.5.2/TODO
@@ -37,3 +37,4 @@
* debug: change "-d" option to be something like "-d elf,events", or "-d breakpoints"
* Find out if a process is sharing memory with its parent?
* When using -p, find out if that process is sharing memory with other procs
+* After a clone(), syscalls may be seen as sysrets in s390 (see trace.c:syscall_p())
--- ltrace-0.5.2.orig/process_event.c
+++ ltrace-0.5.2/process_event.c
@@ -170,7 +170,7 @@
enable_breakpoint(proc->pid, proc->breakpoint_being_enabled);
proc->breakpoint_being_enabled = NULL;
}
- if (proc->parent->state == STATE_ATTACHED && options.follow) {
+ if (options.follow) {
proc->state = STATE_ATTACHED;
} else {
proc->state = STATE_IGNORED;
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/ppc/trace.c
+++ ltrace-0.5.2/sysdeps/linux-gnu/ppc/trace.c
@@ -50,9 +50,9 @@
*sysnum =
(int)ptrace(PTRACE_PEEKUSER, proc->pid,
sizeof(long) * PT_R0, 0);
- if (proc->callstack_depth > 0
- && proc->callstack[proc->callstack_depth -
- 1].is_syscall) {
+ if (proc->callstack_depth > 0 &&
+ proc->callstack[proc->callstack_depth - 1].is_syscall &&
+ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
return 2;
}
return 1;
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/i386/trace.c
+++ ltrace-0.5.2/sysdeps/linux-gnu/i386/trace.c
@@ -32,7 +32,8 @@
*sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 4 * ORIG_EAX, 0);
if (proc->callstack_depth > 0 &&
- proc->callstack[proc->callstack_depth - 1].is_syscall) {
+ proc->callstack[proc->callstack_depth - 1].is_syscall &&
+ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
return 2;
}
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/ia64/trace.c
+++ ltrace-0.5.2/sysdeps/linux-gnu/ia64/trace.c
@@ -106,8 +106,8 @@
if (insn == 0x1000000000 || insn == 0x1ffffffffff) {
*sysnum = r15;
if (proc->callstack_depth > 0 &&
- proc->callstack[proc->callstack_depth -
- 1].is_syscall) {
+ proc->callstack[proc->callstack_depth - 1].is_syscall &&
+ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
return 2;
}
return 1;
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/m68k/trace.c
+++ ltrace-0.5.2/sysdeps/linux-gnu/m68k/trace.c
@@ -36,9 +36,8 @@
if (*sysnum >= 0) {
depth = proc->callstack_depth;
if (depth > 0 &&
- proc->callstack[depth - 1].is_syscall &&
- proc->callstack[depth - 1].c_un.syscall ==
- *sysnum) {
+ proc->callstack[depth - 1].is_syscall &&
+ proc->callstack[depth - 1].c_un.syscall == *sysnum) {
return 2;
} else {
return 1;
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/alpha/trace.c
+++ ltrace-0.5.2/sysdeps/linux-gnu/alpha/trace.c
@@ -36,8 +36,9 @@
return 0;
*sysnum =
ptrace(PTRACE_PEEKUSER, proc->pid, 0 /* REG_R0 */ , 0);
- if (proc->callstack_depth > 0
- && proc->callstack[proc->callstack_depth - 1].is_syscall) {
+ if (proc->callstack_depth > 0 &&
+ proc->callstack[proc->callstack_depth - 1].is_syscall &&
+ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
return 2;
}
if (*sysnum >= 0 && *sysnum < 500) {
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/sparc/trace.c
+++ ltrace-0.5.2/sysdeps/linux-gnu/sparc/trace.c
@@ -33,9 +33,9 @@
insn = ptrace(PTRACE_PEEKTEXT, proc->pid, ip, 0);
if ((insn & 0xc1f8007f) == 0x81d00010) {
*sysnum = ((proc_archdep *) proc->arch_ptr)->regs.r_g1;
- if ((proc->callstack_depth > 0)
- && proc->callstack[proc->callstack_depth -
- 1].is_syscall) {
+ if (proc->callstack_depth > 0 &&
+ proc->callstack[proc->callstack_depth - 1].is_syscall &&
+ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
return 2;
} else if (*sysnum >= 0) {
return 1;
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/mipsel/trace.c
+++ ltrace-0.5.2/sysdeps/linux-gnu/mipsel/trace.c
@@ -60,33 +60,34 @@
int
syscall_p(Process *proc, int status, int *sysnum) {
if (WIFSTOPPED(status)
- && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
- /* get the user's pc (plus 8) */
- long pc = (long)get_instruction_pointer(proc);
- /* fetch the SWI instruction */
- int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 4, 0);
- int num = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 8, 0);
-
-/*
- On a mipsel, syscall looks like:
- 24040fa1 li v0, 0x0fa1 # 4001 --> _exit syscall
- 0000000c syscall
- */
- if(insn!=0x0000000c){
- return 0;
- }
-
- *sysnum = (num & 0xFFFF) - 4000;
- /* if it is a syscall, return 1 or 2 */
- if (proc->callstack_depth > 0 &&
- proc->callstack[proc->callstack_depth - 1].is_syscall) {
- return 2;
- }
-
- if (*sysnum >= 0) {
- return 1;
- }
- }
+ && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
+ /* get the user's pc (plus 8) */
+ long pc = (long)get_instruction_pointer(proc);
+ /* fetch the SWI instruction */
+ int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 4, 0);
+ int num = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 8, 0);
+
+ /*
+ On a mipsel, syscall looks like:
+ 24040fa1 li v0, 0x0fa1 # 4001 --> _exit syscall
+ 0000000c syscall
+ */
+ if(insn!=0x0000000c){
+ return 0;
+ }
+
+ *sysnum = (num & 0xFFFF) - 4000;
+ /* if it is a syscall, return 1 or 2 */
+ if (proc->callstack_depth > 0 &&
+ proc->callstack[proc->callstack_depth - 1].is_syscall &&
+ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
+ return 2;
+ }
+
+ if (*sysnum >= 0) {
+ return 1;
+ }
+ }
return 0;
}
/**
@@ -119,34 +120,34 @@
*/
long
gimme_arg(enum tof type, Process *proc, int arg_num, arg_type_info *info) {
- long ret;
- debug(2,"type %d arg %d",type,arg_num);
- if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL){
- if(arg_num <4){
- ret=ptrace(PTRACE_PEEKUSER,proc->pid,off_a0+arg_num,0);
- debug(2,"ret = %#lx",ret);
- return ret;
- } else {
- // If we need this, I think we can look at [sp+16] for arg_num==4.
- CP;
- return 0;
- }
- }
- if(arg_num>=0){
- fprintf(stderr,"args on return?");
- }
- if(type == LT_TOF_FUNCTIONR) {
- return ptrace(PTRACE_PEEKUSER,proc->pid,off_v0,0);
- }
- if (type == LT_TOF_SYSCALLR) {
- unsigned a3=ptrace(PTRACE_PEEKUSER, proc->pid,off_a3,0);
- unsigned v0=ptrace(PTRACE_PEEKUSER, proc->pid,off_v0,0);
- if(!a3){
- return v0;
- }
- return -1;
- }
- fprintf(stderr, "gimme_arg called with wrong arguments\n");
+ long ret;
+ debug(2,"type %d arg %d",type,arg_num);
+ if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL){
+ if(arg_num <4){
+ ret=ptrace(PTRACE_PEEKUSER,proc->pid,off_a0+arg_num,0);
+ debug(2,"ret = %#lx",ret);
+ return ret;
+ } else {
+ // If we need this, I think we can look at [sp+16] for arg_num==4.
+ CP;
+ return 0;
+ }
+ }
+ if(arg_num>=0){
+ fprintf(stderr,"args on return?");
+ }
+ if(type == LT_TOF_FUNCTIONR) {
+ return ptrace(PTRACE_PEEKUSER,proc->pid,off_v0,0);
+ }
+ if (type == LT_TOF_SYSCALLR) {
+ unsigned a3=ptrace(PTRACE_PEEKUSER, proc->pid,off_a3,0);
+ unsigned v0=ptrace(PTRACE_PEEKUSER, proc->pid,off_v0,0);
+ if(!a3){
+ return v0;
+ }
+ return -1;
+ }
+ fprintf(stderr, "gimme_arg called with wrong arguments\n");
return 0;
}
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/x86_64/trace.c
+++ ltrace-0.5.2/sysdeps/linux-gnu/x86_64/trace.c
@@ -41,7 +41,8 @@
*sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 8 * ORIG_RAX, 0);
if (proc->callstack_depth > 0 &&
- proc->callstack[proc->callstack_depth - 1].is_syscall) {
+ proc->callstack[proc->callstack_depth - 1].is_syscall &&
+ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
return 2;
}