Fix ARM EABI signal unwinding

Joseph S. Myers joseph at codesourcery.com
Wed May 23 22:40:16 UTC 2007


The ARM signal frame layout changed in kernel version 2.6.18, and for EABI 
unwinding from signal handlers depends on unwind information in libc 
matching the kernel's signal frame layout.

This patch makes uClibc use appropriate unwind information depending on 
the kernel headers used (as opposed to the runtime selection in my 
corresponding glibc patch 
<http://sourceware.org/ml/libc-ports/2007-05/msg00002.html>).  EABI 
support was introduced in 2.6.16; if you use 2.6.16 or 2.6.17 headers 
you'll get correct unwind information for those kernels, if you use later 
headers you'll get correct unwind information for later kernels.

The testcases this fixes are GCC's gcc.dg/cleanup-{8,9,10,11}.c.

Index: libc/sysdeps/linux/arm/sigrestorer.S
===================================================================
--- libc/sysdeps/linux/arm/sigrestorer.S	(revision 18675)
+++ libc/sysdeps/linux/arm/sigrestorer.S	(working copy)
@@ -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,15 +30,21 @@
 
    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
 .align 2
 #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 @@
 #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)

-- 
Joseph S. Myers
joseph at codesourcery.com



More information about the uClibc mailing list