Browse Source

Remove SA_ONSTACK handling for ARM based up on glibc code as submitted by Paul Brook <paul@codesourcery.com>.

"Steven J. Hill" 19 years ago
parent
commit
7b3606fe47
2 changed files with 34 additions and 11 deletions
  1. 2 10
      libc/sysdeps/linux/arm/sigaction.c
  2. 32 1
      libc/sysdeps/linux/arm/sigrestorer.S

+ 2 - 10
libc/sysdeps/linux/arm/sigaction.c

@@ -57,14 +57,7 @@ int __libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oa
 	memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t));
 	kact.sa_flags = act->sa_flags;
 # ifdef HAVE_SA_RESTORER
-	/* If the user specified SA_ONSTACK this means she is trying to
-	   use the old-style stack switching.  Unfortunately this
-	   requires the sa_restorer field so we cannot install our own
-	   handler.  (In fact the user is likely to be out of luck anyway
-	   since the kernel currently only supports stack switching via
-	   the X/Open sigaltstack interface, but we allow for the
-	   possibility that this might change in the future.)  */
-	if (kact.sa_flags & (SA_RESTORER | SA_ONSTACK)) {
+	if (kact.sa_flags & SA_RESTORER) {
 	    kact.sa_restorer = act->sa_restorer;
 	} else {
 	    kact.sa_restorer = choose_restorer (kact.sa_flags);
@@ -103,8 +96,7 @@ int __libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oa
 	kact.sa_mask = act->sa_mask.__val[0];
 	kact.sa_flags = act->sa_flags;
 # ifdef HAVE_SA_RESTORER
-	/* See the comments above for why we test SA_ONSTACK.  */
-	if (kact.sa_flags & (SA_RESTORER | SA_ONSTACK)) {
+	if (kact.sa_flags & SA_RESTORER) {
 	    kact.sa_restorer = act->sa_restorer;
 	} else {
 	    kact.sa_restorer = choose_restorer (kact.sa_flags);

+ 32 - 1
libc/sysdeps/linux/arm/sigrestorer.S

@@ -20,13 +20,33 @@
 
 /* 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. */
+   instruction on the stack, which would involve expensive cache flushes.
+
+   Nowadays (2.6 series, and somewhat earlier) the kernel uses a high page
+   for signal trampolines, so the cache flushes are not an issue.  But since
+   we do not have a vDSO, continue to use these so that we can provide
+   unwind information.
+
+   Start the unwind tables at least one instruction before the signal
+   trampoline, because the unwinder will assume we are returning after
+   a call site.  */
 
 .global __default_sa_restorer
 .type __default_sa_restorer,%function
 .align 2
+#ifdef __ARM_EABI__
+	.fnstart
+	.save {r0-r15}
+	.pad #12
+	nop
+__default_sa_restorer:
+	mov	r7, $SYS_ify(sigreturn)
+	swi	0x0
+	.fnend
+#else
 __default_sa_restorer:
 	DO_CALL (sigreturn)
+#endif
 
 
 #ifdef __NR_rt_sigreturn
@@ -34,7 +54,18 @@ __default_sa_restorer:
 .global __default_rt_sa_restorer
 .type __default_rt_sa_restorer,%function
 .align 2
+#ifdef __ARM_EABI__
+	.fnstart
+	.save {r0-r15}
+	.pad #168
+	nop
+__default_rt_sa_restorer:
+	mov	r7, $SYS_ify(rt_sigreturn)
+	swi	0x0
+	.fnend
+#else
 __default_rt_sa_restorer:
 	DO_CALL (rt_sigreturn)
+#endif
 
 #endif