Upstream fix for syscall() not setting errno on errors on MIPS
[openwrt/svn-archive/archive.git] / toolchain / uClibc / patches / 160-mips_syscall.patch
diff --git a/toolchain/uClibc/patches/160-mips_syscall.patch b/toolchain/uClibc/patches/160-mips_syscall.patch
new file mode 100644 (file)
index 0000000..c5e5f6b
--- /dev/null
@@ -0,0 +1,31 @@
+--- uClibc-0.9.29.orig/libc/sysdeps/linux/mips/syscall.S       2009-02-27 19:26:57.420288905 +0100
++++ uClibc-0.9.29/libc/sysdeps/linux/mips/syscall.S    2009-02-27 19:43:18.000000000 +0100
+@@ -29,6 +29,9 @@
+ .type   syscall,@function
+ .ent    syscall
+ syscall:
++#ifdef __PIC__
++      SETUP_GP
++#endif
+       move    v0, a0          /* Load system call number from first arg.  */
+       move    a0, a1          /* Move the next three args up a register.  */
+       move    a1, a2
+@@ -60,6 +63,18 @@
+ #else
+       addiu   sp,sp,32
+ #endif
++      bnez    a3, 1f
+       j ra                    /* Return to caller.  */
++1:
++      move    a0,v0           /* Pass return val to C function. */
++
++#ifdef __PIC__
++      SETUP_GP64(v0, syscall)
++      PTR_LA  t9, __syscall_error
++      RESTORE_GP64
++      jr      t9
++#else
++      j       __syscall_error
++#endif
+ .end    syscall
+ .size   syscall,.-syscall