summaryrefslogtreecommitdiff
path: root/toolchain/uClibc
diff options
context:
space:
mode:
authorflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>2009-09-26 18:08:02 +0000
committerflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>2009-09-26 18:08:02 +0000
commit2d0f2c9a88dfc9c35c73b5f20f3f4b34eed91a02 (patch)
tree87e06183fb9ec2e21151df47640437cb53d090a4 /toolchain/uClibc
parent607f1b1b96dbb415d3087f622855a06ba5728222 (diff)
[toolchain] Do not save variables in hi or lo across system calls, fixes issues with gcc-4.4 (#5351)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@17742 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'toolchain/uClibc')
-rw-r--r--toolchain/uClibc/patches-0.9.30.1/901-hi_lo_system_calls.patch30
1 files changed, 30 insertions, 0 deletions
diff --git a/toolchain/uClibc/patches-0.9.30.1/901-hi_lo_system_calls.patch b/toolchain/uClibc/patches-0.9.30.1/901-hi_lo_system_calls.patch
new file mode 100644
index 0000000000..6c78130e3f
--- /dev/null
+++ b/toolchain/uClibc/patches-0.9.30.1/901-hi_lo_system_calls.patch
@@ -0,0 +1,30 @@
+The kernel does not save these registers across system calls. GCC 4.4
+has gotten more agressive about using them for temporary variables, so
+this shows up as intermittent crashes if you use a recent compiler.
+
+Signed-off-by: Daniel Jacobowitz <dan@codesourcery.com>
+
+diff --git a/libc/sysdeps/linux/mips/bits/syscalls.h b/libc/sysdeps/linux/mips/bits/syscalls.h
+index 3639913..28b0f91 100644
+--- a/libc/sysdeps/linux/mips/bits/syscalls.h
++++ b/libc/sysdeps/linux/mips/bits/syscalls.h
+@@ -261,7 +261,7 @@
+ })
+
+ #define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", \
+- "$14", "$15", "$24", "$25", "memory"
++ "$14", "$15", "$24", "$25", "hi", "lo", "memory"
+
+ #else /* N32 || N64 */
+
+@@ -318,7 +318,7 @@
+ })
+
+ #define __SYSCALL_CLOBBERS "$1", "$3", "$10", "$11", "$12", "$13", \
+- "$14", "$15", "$24", "$25", "memory"
++ "$14", "$15", "$24", "$25", "hi", "lo", "memory"
+
+ #endif
+
+
+--