This is the mail archive of the libc-ports@sources.redhat.com mailing list for the libc-ports project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix ARM signal unwinding for newer kernels


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 libc support both old and new layouts depending on the 
kernel version at runtime, with --enable-kernel=2.6.18 reducing things 
back to a single function for each of realtime and non-realtime signal 
frames.

(For kernel versions such as 2.6.16.49 it will presently wrongly use the 
newer layout because 
<http://sourceware.org/ml/libc-alpha/2003-11/msg00010.html> was rejected 
for libc.  But I think breaking this for older kernels is better than 
things being broken for newer kernels.)

2007-05-01  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/unix/sysv/linux/arm/kernel-features.h
	(__ASSUME_SIGFRAME_V2): Define for 2.6.18 and later.
	* sysdeps/unix/sysv/linux/arm/eabi/sigrestorer.S
	(__default_sa_restorer): Rename to __default_sa_restorer_v1.
	Don't define if __ASSUME_SIGFRAME_V2.
	(__default_rt_sa_restorer): Rename to
	__default_rt_sa_restorer_v1.  Don't define if
	__ASSUME_SIGFRAME_V2.
	(__default_sa_restorer_v2, __default_rt_sa_restorer_v2): New.
	* sysdeps/unix/sysv/linux/arm/nptl/Versions
	(__default_sa_restorer_v1, __default_rt_sa_restorer_v1,
	__default_sa_restorer_v2, __default_rt_sa_restorer_v2): Add to
	GLIBC_PRIVATE.
	* sysdeps/unix/sysv/linux/arm/sigaction.c [__ARM_EABI__]
	(__default_sa_restorer_v1, __default_sa_restorer_v2,
	__default_rt_sa_restorer_v1, __default_rt_sa_restorer_v2):
	Declare.
	(__default_sa_restorer, __default_rt_sa_restorer): Define as
	macros depending on kernel version.

Index: sysdeps/unix/sysv/linux/arm/kernel-features.h
===================================================================
RCS file: /cvs/glibc/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h,v
retrieving revision 1.3
diff -u -r1.3 kernel-features.h
--- sysdeps/unix/sysv/linux/arm/kernel-features.h	31 Oct 2006 17:09:24 -0000	1.3
+++ sysdeps/unix/sysv/linux/arm/kernel-features.h	1 May 2007 21:08:00 -0000
@@ -46,4 +46,9 @@
 # define __ASSUME_VFORK_SYSCALL		1
 #endif
 
+/* The signal frame layout changed in 2.6.18.  */
+#if __LINUX_KERNEL_VERSION >= 132626
+# define __ASSUME_SIGFRAME_V2	1
+#endif
+
 #include_next <kernel-features.h>
Index: sysdeps/unix/sysv/linux/arm/sigaction.c
===================================================================
RCS file: /cvs/glibc/ports/sysdeps/unix/sysv/linux/arm/sigaction.c,v
retrieving revision 1.14
diff -u -r1.14 sigaction.c
--- sysdeps/unix/sysv/linux/arm/sigaction.c	24 Jul 2006 15:43:02 -0000	1.14
+++ sysdeps/unix/sysv/linux/arm/sigaction.c	1 May 2007 21:08:00 -0000
@@ -36,8 +36,27 @@
 
 #define SA_RESTORER	0x04000000
 
+#ifdef __ARM_EABI__
+extern void __default_sa_restorer_v1(void);
+extern void __default_sa_restorer_v2(void);
+extern void __default_rt_sa_restorer_v1(void);
+extern void __default_rt_sa_restorer_v2(void);
+# ifdef __ASSUME_SIGFRAME_V2
+#  define __default_sa_restorer __default_sa_restorer_v2
+#  define __default_rt_sa_restorer __default_rt_sa_restorer_v2
+# else
+#  include <ldsodefs.h>
+#  define __default_sa_restorer (GLRO(dl_osversion) >= 0x020612	\
+				 ? __default_sa_restorer_v2	\
+				 : __default_sa_restorer_v1)
+#  define __default_rt_sa_restorer (GLRO(dl_osversion) >= 0x020612	\
+				    ? __default_rt_sa_restorer_v2	\
+				    : __default_rt_sa_restorer_v1)
+# endif
+#else
 extern void __default_sa_restorer(void);
 extern void __default_rt_sa_restorer(void);
+#endif
 
 /* When RT signals are in use we need to use a different return stub.  */
 #ifdef __NR_rt_sigreturn
Index: sysdeps/unix/sysv/linux/arm/eabi/sigrestorer.S
===================================================================
RCS file: /cvs/glibc/ports/sysdeps/unix/sysv/linux/arm/eabi/sigrestorer.S,v
retrieving revision 1.2
diff -u -r1.2 sigrestorer.S
--- sysdeps/unix/sysv/linux/arm/eabi/sigrestorer.S	16 Nov 2005 19:03:42 -0000	1.2
+++ sysdeps/unix/sysv/linux/arm/eabi/sigrestorer.S	1 May 2007 21:08:00 -0000
@@ -29,24 +29,49 @@
 
    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.
 
+   Because the signal frame layout changed in 2.6.18, we provide two
+   copies of these functions with different unwind information.  */
+
+#ifndef __ASSUME_SIGFRAME_V2
 	.fnstart
 	.save {r0-r15}
 	.pad #12
 	nop
-ENTRY(__default_sa_restorer)
+ENTRY(__default_sa_restorer_v1)
+	mov	r7, $SYS_ify(sigreturn)
+	swi	0x0
+	.fnend
+#endif
+
+	.fnstart
+	.save {r0-r15}
+	.pad #32
+	nop
+ENTRY(__default_sa_restorer_v2)
 	mov	r7, $SYS_ify(sigreturn)
 	swi	0x0
 	.fnend
 
 #ifdef __NR_rt_sigreturn
 
+#ifndef __ASSUME_SIGFRAME_V2
 	.fnstart
 	.save {r0-r15}
 	.pad #168
 	nop
-ENTRY(__default_rt_sa_restorer)
+ENTRY(__default_rt_sa_restorer_v1)
+	mov	r7, $SYS_ify(rt_sigreturn)
+	swi	0x0
+	.fnend
+#endif
+
+	.fnstart
+	.save {r0-r15}
+	.pad #160
+	nop
+ENTRY(__default_rt_sa_restorer_v2)
 	mov	r7, $SYS_ify(rt_sigreturn)
 	swi	0x0
 	.fnend
Index: sysdeps/unix/sysv/linux/arm/nptl/Versions
===================================================================
RCS file: /cvs/glibc/ports/sysdeps/unix/sysv/linux/arm/nptl/Versions,v
retrieving revision 1.1
diff -u -r1.1 Versions
--- sysdeps/unix/sysv/linux/arm/nptl/Versions	16 Nov 2005 19:03:42 -0000	1.1
+++ sysdeps/unix/sysv/linux/arm/nptl/Versions	1 May 2007 21:08:00 -0000
@@ -2,5 +2,7 @@
   GLIBC_PRIVATE {
     # A copy of sigaction lives in NPTL, and needs these.
     __default_sa_restorer; __default_rt_sa_restorer;
+    __default_sa_restorer_v1; __default_rt_sa_restorer_v1;
+    __default_sa_restorer_v2; __default_rt_sa_restorer_v2;
   }
 }

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]