diff options
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 |
commit | 9ce2de577fd3d1089104e69eccea1c4a4a2824cf (patch) | |
tree | a7306cd404b946ce6d62c09de2862b6801cb468f | |
parent | b947380b03eb3c25c1510dab0ec9f93f875835e4 (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> .
-rw-r--r-- | libc/sysdeps/linux/arm/sigrestorer.S | 15 |
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) |