summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/arm/sigrestorer.S
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/sysdeps/linux/arm/sigrestorer.S
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/sysdeps/linux/arm/sigrestorer.S')
-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)