diff options
Diffstat (limited to 'patches')
-rw-r--r-- | patches/duma/2_5_15/100-cross-compile.patch | 32 | ||||
-rw-r--r-- | patches/duma/2_5_15/110-separate_cpp.patch | 19 | ||||
-rw-r--r-- | patches/eglibc/2_10/100-powerpc-8xx-CPU15-errata.patch | 49 | ||||
-rw-r--r-- | patches/gmp/4.3.1/100-multiplicity-that-does-not-fit-an-int.patch | 33 | ||||
-rw-r--r-- | patches/gmp/4.3.1/110-unbounded-alloc.patch | 31 | ||||
-rw-r--r-- | patches/libelf/0.8.11/100-fix-64-bit-detection.patch | 24 | ||||
-rw-r--r-- | patches/ltrace/0.5.2/100-allow-cross-compile.patch | 77 | ||||
-rw-r--r-- | patches/ltrace/0.5.2/110-alpha-support.patch | 11 | ||||
-rw-r--r-- | patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch | 240 |
9 files changed, 516 insertions, 0 deletions
diff --git a/patches/duma/2_5_15/100-cross-compile.patch b/patches/duma/2_5_15/100-cross-compile.patch new file mode 100644 index 0000000..cc95160 --- /dev/null +++ b/patches/duma/2_5_15/100-cross-compile.patch @@ -0,0 +1,32 @@ +diff -durN duma_2_5_15.orig/GNUmakefile duma_2_5_15/GNUmakefile +--- duma_2_5_15.orig/GNUmakefile 2008-08-03 21:22:38.000000000 +0200 ++++ duma_2_5_15/GNUmakefile 2009-06-19 15:32:23.000000000 +0200 +@@ -93,10 +93,6 @@ + # also define 'WIN32' + + # some defaults: +-CC=gcc +-CXX=g++ +-AR=ar +-RANLIB=ranlib + INSTALL=install + RM=rm + RMFORCE=rm -f +@@ -471,7 +467,7 @@ + + createconf$(EXEPOSTFIX): createconf.o + - $(RMFORCE) createconf$(EXEPOSTFIX) +- $(CC) $(CFLAGS) $(DUMA_OPTIONS) createconf.o -o createconf$(EXEPOSTFIX) ++ $(HOSTCC) $(HOSTCFLAGS) $(DUMA_OPTIONS) createconf.o -o createconf$(EXEPOSTFIX) + + tstheap$(EXEPOSTFIX): libduma.a tstheap.o + - $(RMFORCE) tstheap$(EXEPOSTFIX) +@@ -532,7 +528,7 @@ + # define rules how to build objects for createconf + # + createconf.o: +- $(CC) $(CFLAGS) $(DUMA_OPTIONS) -c createconf.c -o $@ ++ $(HOSTCC) $(HOSTCFLAGS) $(DUMA_OPTIONS) -c createconf.c -o $@ + + + # diff --git a/patches/duma/2_5_15/110-separate_cpp.patch b/patches/duma/2_5_15/110-separate_cpp.patch new file mode 100644 index 0000000..4bbccc7 --- /dev/null +++ b/patches/duma/2_5_15/110-separate_cpp.patch @@ -0,0 +1,19 @@ +diff -durN duma_2_5_15.orig/GNUmakefile duma_2_5_15/GNUmakefile +--- duma_2_5_15.orig/GNUmakefile 2009-06-19 16:41:53.000000000 +0200 ++++ duma_2_5_15/GNUmakefile 2009-06-19 16:43:53.000000000 +0200 +@@ -289,9 +289,13 @@ + dumatest.c tstheap.c thread-test.c testmt.c dumatestpp.cpp testoperators.cpp \ + createconf.c + +-OBJECTS=dumapp.o duma.o sem_inc.o print.o ++OBJECTS = duma.o sem_inc.o print.o ++SO_OBJECTS = duma_so.o sem_inc_so.o print_so.o + +-SO_OBJECTS=dumapp_so.o duma_so.o sem_inc_so.o print_so.o ++ifeq ($(DUMA_CPP),1) ++OBJECTS += dumapp.o ++SO_OBJECTS += dumapp_so.o ++endif + + # Make all the top-level targets the makefile knows about. + all: libduma.a tstheap$(EXEPOSTFIX) dumatest$(EXEPOSTFIX) thread-test$(EXEPOSTFIX) testmt$(EXEPOSTFIX) dumatestpp$(EXEPOSTFIX) testoperators$(EXEPOSTFIX) $(DUMA_DYN_DEPS) diff --git a/patches/eglibc/2_10/100-powerpc-8xx-CPU15-errata.patch b/patches/eglibc/2_10/100-powerpc-8xx-CPU15-errata.patch new file mode 100644 index 0000000..4fe1bb2 --- /dev/null +++ b/patches/eglibc/2_10/100-powerpc-8xx-CPU15-errata.patch @@ -0,0 +1,49 @@ +diff -ru eglibc-2_9_orig/sysdeps/powerpc/powerpc32/memset.S eglibc-2_9/sysdeps/powerpc/powerpc32/memset.S +--- eglibc-2_9_orig/sysdeps/powerpc/powerpc32/memset.S 2007-04-13 08:35:45.000000000 -0700 ++++ eglibc-2_9/sysdeps/powerpc/powerpc32/memset.S 2009-05-06 16:52:04.000000000 -0700 +@@ -112,11 +112,13 @@ + clrrwi. rALIGN, rLEN, 5 + mtcrf 0x01, rLEN /* 40th instruction from .align */ + ++#ifndef BROKEN_PPC_8xx_CPU15 + /* Check if we can use the special case for clearing memory using dcbz. + This requires that we know the correct cache line size for this + processor. Getting the __cache_line_size may require establishing GOT + addressability, so branch out of line to set this up. */ + beq cr1, L(checklinesize) ++#endif + + /* Store blocks of 32-bytes (256-bits) starting on a 32-byte boundary. + Can't assume that rCHR is zero or that the cache line size is either +@@ -158,6 +160,7 @@ + add rMEMP, rMEMP, rALIGN + b L(medium_tail2) /* 72nd instruction from .align */ + ++#ifndef BROKEN_PPC_8xx_CPU15 + .align 5 + nop + /* Clear cache lines of memory in 128-byte chunks. +@@ -191,6 +194,7 @@ + bdnz L(zloop) + beqlr cr5 + b L(medium_tail2) ++#endif /* ! BROKEN_PPC_8xx_CPU15 */ + + .align 5 + L(small): +@@ -248,6 +252,7 @@ + stw rCHR, -8(rMEMP) + blr + ++#ifndef BROKEN_PPC_8xx_CPU15 + L(checklinesize): + #ifdef SHARED + mflr rTMP +@@ -329,6 +334,7 @@ + L(handletail32): + clrrwi. rALIGN, rLEN, 5 + b L(nondcbz) ++#endif /* ! BROKEN_PPC_8xx_CPU15 */ + + END (BP_SYM (memset)) + libc_hidden_builtin_def (memset) diff --git a/patches/gmp/4.3.1/100-multiplicity-that-does-not-fit-an-int.patch b/patches/gmp/4.3.1/100-multiplicity-that-does-not-fit-an-int.patch new file mode 100644 index 0000000..f60e88f --- /dev/null +++ b/patches/gmp/4.3.1/100-multiplicity-that-does-not-fit-an-int.patch @@ -0,0 +1,33 @@ +diff --git a/mpz/remove.c b/mpz/remove.c +--- a/mpz/remove.c ++++ b/mpz/remove.c +@@ -23,7 +23,7 @@ + unsigned long int + mpz_remove (mpz_ptr dest, mpz_srcptr src, mpz_srcptr f) + { +- mpz_t fpow[40]; /* inexhaustible...until year 2020 or so */ ++ mpz_t fpow[GMP_LIMB_BITS]; /* Really MP_SIZE_T_BITS */ + mpz_t x, rem; + unsigned long int pwr; + int p; +@@ -69,7 +69,7 @@ + mpz_set (dest, x); + } + +- pwr = (1 << p) - 1; ++ pwr = (1L << p) - 1; + + mpz_clear (fpow[p]); + +diff --git a/mpz/remove.c b/mpz/remove.c +--- a/mpz/remove.c ++++ b/mpz/remove.c +@@ -80,7 +80,7 @@ + mpz_tdiv_qr (x, rem, dest, fpow[p]); + if (SIZ (rem) == 0) + { +- pwr += 1 << p; ++ pwr += 1L << p; + mpz_set (dest, x); + } + mpz_clear (fpow[p]); diff --git a/patches/gmp/4.3.1/110-unbounded-alloc.patch b/patches/gmp/4.3.1/110-unbounded-alloc.patch new file mode 100644 index 0000000..78e0588 --- /dev/null +++ b/patches/gmp/4.3.1/110-unbounded-alloc.patch @@ -0,0 +1,31 @@ +diff --git a/mpn/generic/toom44_mul.c b/mpn/generic/toom44_mul.c +--- a/mpn/generic/toom44_mul.c ++++ b/mpn/generic/toom44_mul.c +@@ -116,17 +116,16 @@ + + TMP_MARK; + +- as1 = TMP_SALLOC_LIMBS (n + 1); +- asm1 = TMP_SALLOC_LIMBS (n + 1); +- as2 = TMP_SALLOC_LIMBS (n + 1); +- ash = TMP_SALLOC_LIMBS (n + 1); +- asmh = TMP_SALLOC_LIMBS (n + 1); +- +- bs1 = TMP_SALLOC_LIMBS (n + 1); +- bsm1 = TMP_SALLOC_LIMBS (n + 1); +- bs2 = TMP_SALLOC_LIMBS (n + 1); +- bsh = TMP_SALLOC_LIMBS (n + 1); +- bsmh = TMP_SALLOC_LIMBS (n + 1); ++ as1 = TMP_ALLOC_LIMBS (10 * n + 10); ++ asm1 = as1 + n + 1; ++ as2 = asm1 + n + 1; ++ ash = as2 + n + 1; ++ asmh = ash + n + 1; ++ bs1 = asmh + n + 1; ++ bsm1 = bs1 + n + 1; ++ bs2 = bsm1 + n + 1; ++ bsh = bs2 + n + 1; ++ bsmh = bsh + n + 1; + + gp = pp; + hp = pp + n + 1; diff --git a/patches/libelf/0.8.11/100-fix-64-bit-detection.patch b/patches/libelf/0.8.11/100-fix-64-bit-detection.patch new file mode 100644 index 0000000..7995443 --- /dev/null +++ b/patches/libelf/0.8.11/100-fix-64-bit-detection.patch @@ -0,0 +1,24 @@ +diff -dur libelf-0.8.10.orig/configure libelf-0.8.10/configure +--- libelf-0.8.10.orig/configure 2007-09-07 14:08:06.000000000 +0200 ++++ libelf-0.8.10/configure 2008-10-23 22:43:19.000000000 +0200 +@@ -1595,7 +1595,7 @@ + echo $ac_n "(cached) $ac_c" 1>&6 + else + if test "$cross_compiling" = yes; then +- ac_cv_sizeof_long_long=0 ++ ac_cv_sizeof_long_long=8 + else + cat > conftest.$ac_ext <<EOF + #line 1602 "configure" +diff -dur libelf-0.8.10.orig/configure.in libelf-0.8.10/configure.in +--- libelf-0.8.10.orig/configure.in 2007-09-07 14:07:59.000000000 +0200 ++++ libelf-0.8.10/configure.in 2008-10-23 22:43:10.000000000 +0200 +@@ -90,7 +90,7 @@ + AC_CHECK_SIZEOF(short,2) + AC_CHECK_SIZEOF(int,4) + AC_CHECK_SIZEOF(long,4) +-AC_CHECK_SIZEOF(long long,0) ++AC_CHECK_SIZEOF(long long,8) + # Windows port + AC_CHECK_SIZEOF(__int64, 0) + diff --git a/patches/ltrace/0.5.2/100-allow-cross-compile.patch b/patches/ltrace/0.5.2/100-allow-cross-compile.patch new file mode 100644 index 0000000..10440ad --- /dev/null +++ b/patches/ltrace/0.5.2/100-allow-cross-compile.patch @@ -0,0 +1,77 @@ +diff -durN ltrace-0.5.2.orig/Makefile.in ltrace-0.5.2/Makefile.in +--- ltrace-0.5.2.orig/Makefile.in 2009-05-21 19:14:54.000000000 +0200 ++++ ltrace-0.5.2/Makefile.in 2009-06-27 15:30:34.000000000 +0200 +@@ -2,8 +2,14 @@ + # ltrace's Makefile.in + # + +-#OS := $(shell uname -s) + OS := @HOST_OS@ ++ARCH := $(shell echo "@HOST_ARCH@" |sed -e s/i.86/i386/ \ ++ -e s/sun4u/sparc64/ \ ++ -e s/arm.*/arm/ \ ++ -e s/sa110/arm/ \ ++ -e s/ppc64/ppc/ \ ++ -e s/s390x/s390/) ++export ARCH + + TOPDIR = $(shell pwd) + +diff -durN ltrace-0.5.2.orig/configure ltrace-0.5.2/configure +--- ltrace-0.5.2.orig/configure 2009-05-21 19:14:57.000000000 +0200 ++++ ltrace-0.5.2/configure 2009-06-27 15:30:34.000000000 +0200 +@@ -660,6 +660,7 @@ + host_cpu + host_vendor + host_os ++HOST_ARCH + HOST_OS + CC + CFLAGS +@@ -1823,6 +1824,7 @@ + case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + ++HOST_ARCH="$host_cpu" + case "$host_os" in + linux-gnu*) host_os=linux-gnu + esac +@@ -5406,6 +5408,7 @@ + host_cpu!$host_cpu$ac_delim + host_vendor!$host_vendor$ac_delim + host_os!$host_os$ac_delim ++HOST_ARCH!$HOST_ARCH$ac_delim + HOST_OS!$HOST_OS$ac_delim + CC!$CC$ac_delim + CFLAGS!$CFLAGS$ac_delim +@@ -5426,7 +5429,7 @@ + LTLIBOBJS!$LTLIBOBJS$ac_delim + _ACEOF + +- if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 63; then ++ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 64; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +diff -durN ltrace-0.5.2.orig/configure.ac ltrace-0.5.2/configure.ac +--- ltrace-0.5.2.orig/configure.ac 2009-05-21 19:14:54.000000000 +0200 ++++ ltrace-0.5.2/configure.ac 2009-06-27 15:30:34.000000000 +0200 +@@ -11,6 +11,8 @@ + esac + HOST_OS="$host_os" + AC_SUBST(HOST_OS) ++HOST_ARCH="$host_cpu" ++AC_SUBST(HOST_ARCH) + + dnl Checks for programs. + AC_PROG_CC +diff -durN ltrace-0.5.2.orig/sysdeps/linux-gnu/Makefile ltrace-0.5.2/sysdeps/linux-gnu/Makefile +--- ltrace-0.5.2.orig/sysdeps/linux-gnu/Makefile 2009-05-21 19:14:54.000000000 +0200 ++++ ltrace-0.5.2/sysdeps/linux-gnu/Makefile 2009-06-27 15:30:34.000000000 +0200 +@@ -1,6 +1,3 @@ +-ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ +- -e s/arm.*/arm/ -e s/sa110/arm/ -e s/ppc64/ppc/ -e s/s390x/s390/) +- + CPPFLAGS += -I$(TOPDIR)/sysdeps/linux-gnu/$(ARCH) + + OBJ = events.o trace.o proc.o breakpoint.o diff --git a/patches/ltrace/0.5.2/110-alpha-support.patch b/patches/ltrace/0.5.2/110-alpha-support.patch new file mode 100644 index 0000000..f121ca1 --- /dev/null +++ b/patches/ltrace/0.5.2/110-alpha-support.patch @@ -0,0 +1,11 @@ +diff -durN ltrace-0.5.2.orig/Makefile.in ltrace-0.5.2/Makefile.in +--- ltrace-0.5.2.orig/Makefile.in 2009-06-27 15:34:04.000000000 +0200 ++++ ltrace-0.5.2/Makefile.in 2009-06-27 15:34:27.000000000 +0200 +@@ -5,6 +5,7 @@ + OS := @HOST_OS@ + ARCH := $(shell echo "@HOST_ARCH@" |sed -e s/i.86/i386/ \ + -e s/sun4u/sparc64/ \ ++ -e s/alpha.*/alpha/ \ + -e s/arm.*/arm/ \ + -e s/sa110/arm/ \ + -e s/ppc64/ppc/ \ diff --git a/patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch b/patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch new file mode 100644 index 0000000..6d62315 --- /dev/null +++ b/patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch @@ -0,0 +1,240 @@ +--- 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; + } + |