summaryrefslogtreecommitdiff
path: root/patches
diff options
context:
space:
mode:
authorYann E. MORIN" <yann.morin.1998@anciens.enib.fr>2009-08-03 06:50:56 (GMT)
committerYann E. MORIN" <yann.morin.1998@anciens.enib.fr>2009-08-03 06:50:56 (GMT)
commit946a86fb675935229f264dfcad53fef66ee98442 (patch)
treeb2afdd8b2d0e6b571a1eb64a3f0944d61f24039e /patches
parent70f87b89699f1ed99d14a174d0a32f3aa1ecb653 (diff)
parent33ed1557b64e4449fbb368993f048a8f32678f0f (diff)
[config] Merge CONFIG_SHELL selection.
Diffstat (limited to 'patches')
-rw-r--r--patches/duma/2_5_15/100-cross-compile.patch32
-rw-r--r--patches/duma/2_5_15/110-separate_cpp.patch19
-rw-r--r--patches/eglibc/2_10/100-powerpc-8xx-CPU15-errata.patch49
-rw-r--r--patches/gmp/4.3.1/100-multiplicity-that-does-not-fit-an-int.patch33
-rw-r--r--patches/gmp/4.3.1/110-unbounded-alloc.patch31
-rw-r--r--patches/libelf/0.8.11/100-fix-64-bit-detection.patch24
-rw-r--r--patches/ltrace/0.5.2/100-allow-cross-compile.patch77
-rw-r--r--patches/ltrace/0.5.2/110-alpha-support.patch11
-rw-r--r--patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch240
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;
+ }
+