This is the mail archive of the
libc-ports@sources.redhat.com
mailing list for the libc-ports project.
Fix ARM signal unwinding for newer kernels
- From: "Joseph S. Myers" <joseph at codesourcery dot com>
- To: libc-ports at sourceware dot org
- Date: Tue, 1 May 2007 21:12:06 +0000 (UTC)
- Subject: 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