From 99e5e16c5ca03499787fd0dedc5220ca15ba8401 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Wed, 23 May 2007 17:33:17 +0000 Subject: [PATCH] * 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. --- ChangeLog.arm | 22 ++++++++++++++++++ sysdeps/unix/sysv/linux/arm/eabi/sigrestorer.S | 31 +++++++++++++++++++++++--- sysdeps/unix/sysv/linux/arm/kernel-features.h | 5 +++++ sysdeps/unix/sysv/linux/arm/nptl/Versions | 2 ++ sysdeps/unix/sysv/linux/arm/sigaction.c | 19 ++++++++++++++++ 5 files changed, 76 insertions(+), 3 deletions(-) diff --git a/ChangeLog.arm b/ChangeLog.arm index ebad07a..e733cb6 100644 --- a/ChangeLog.arm +++ b/ChangeLog.arm @@ -1,3 +1,25 @@ +2007-05-23 Joseph Myers + + * 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. + 2007-01-23 Daniel Jacobowitz * sysdeps/unix/sysv/linux/arm/sysdep.h (PTR_MANGLE, PTR_DEMANGLE): diff --git a/sysdeps/unix/sysv/linux/arm/eabi/sigrestorer.S b/sysdeps/unix/sysv/linux/arm/eabi/sigrestorer.S index 543d48c..cc06a55 100644 --- a/sysdeps/unix/sysv/linux/arm/eabi/sigrestorer.S +++ b/sysdeps/unix/sysv/linux/arm/eabi/sigrestorer.S @@ -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 diff --git a/sysdeps/unix/sysv/linux/arm/kernel-features.h b/sysdeps/unix/sysv/linux/arm/kernel-features.h index 5bedfe1..0a6ab21 100644 --- a/sysdeps/unix/sysv/linux/arm/kernel-features.h +++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h @@ -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 diff --git a/sysdeps/unix/sysv/linux/arm/nptl/Versions b/sysdeps/unix/sysv/linux/arm/nptl/Versions index c74a06f..435c921 100644 --- a/sysdeps/unix/sysv/linux/arm/nptl/Versions +++ b/sysdeps/unix/sysv/linux/arm/nptl/Versions @@ -2,5 +2,7 @@ libc { 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; } } diff --git a/sysdeps/unix/sysv/linux/arm/sigaction.c b/sysdeps/unix/sysv/linux/arm/sigaction.c index 2d890d0..707c0fa 100644 --- a/sysdeps/unix/sysv/linux/arm/sigaction.c +++ b/sysdeps/unix/sysv/linux/arm/sigaction.c @@ -36,8 +36,27 @@ int __libc_missing_rt_sigs; #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 +# 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 -- 2.7.4