summaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
author"Steven J. Hill" <sjhill@realitydiluted.com>2007-05-24 02:56:59 +0000
committer"Steven J. Hill" <sjhill@realitydiluted.com>2007-05-24 02:56:59 +0000
commit9ce2de577fd3d1089104e69eccea1c4a4a2824cf (patch)
treea7306cd404b946ce6d62c09de2862b6801cb468f /libc
parentb947380b03eb3c25c1510dab0ec9f93f875835e4 (diff)
Fix ARM EABI signal unwinding to accomodate signal frame layout between Linux kernel versions as reported by Joseph S. Myers on the mailing list. More information available at <http://www.uclibc.org/lists/uclibc/2007-May/017971.html> .
Diffstat (limited to 'libc')
-rw-r--r--libc/sysdeps/linux/arm/sigrestorer.S15
1 files changed, 13 insertions, 2 deletions
diff --git a/libc/sysdeps/linux/arm/sigrestorer.S b/libc/sysdeps/linux/arm/sigrestorer.S
index 5b996ea83..daa614f46 100644
--- a/libc/sysdeps/linux/arm/sigrestorer.S
+++ b/libc/sysdeps/linux/arm/sigrestorer.S
@@ -17,7 +17,8 @@
02111-1307 USA. */
#include <sys/syscall.h>
-
+#include <linux/version.h>
+
/* If no SA_RESTORER function was specified by the application we use
one of these. This avoids the need for the kernel to synthesise a return
instruction on the stack, which would involve expensive cache flushes.
@@ -29,7 +30,9 @@
Start the unwind tables at least one instruction before the signal
trampoline, because the unwinder will assume we are returning after
- a call site. */
+ a call site.
+
+ The signal frame layout changed in 2.6.18. */
.global __default_sa_restorer
.type __default_sa_restorer,%function
@@ -37,7 +40,11 @@
#ifdef __ARM_EABI__
.fnstart
.save {r0-r15}
+#if LINUX_VERSION_CODE >= 0x020612
+ .pad #32
+#else
.pad #12
+#endif
nop
__default_sa_restorer:
mov r7, $SYS_ify(sigreturn)
@@ -57,7 +64,11 @@ __default_sa_restorer:
#ifdef __ARM_EABI__
.fnstart
.save {r0-r15}
+#if LINUX_VERSION_CODE >= 0x020612
+ .pad #160
+#else
.pad #168
+#endif
nop
__default_rt_sa_restorer:
mov r7, $SYS_ify(rt_sigreturn)