diff options
Diffstat (limited to 'libc/sysdeps')
| -rw-r--r-- | libc/sysdeps/linux/arm/sigaction.c | 12 | ||||
| -rw-r--r-- | libc/sysdeps/linux/arm/sigrestorer.S | 33 | 
2 files changed, 34 insertions, 11 deletions
diff --git a/libc/sysdeps/linux/arm/sigaction.c b/libc/sysdeps/linux/arm/sigaction.c index 1066d33dd..8ab2be797 100644 --- a/libc/sysdeps/linux/arm/sigaction.c +++ b/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); diff --git a/libc/sysdeps/linux/arm/sigrestorer.S b/libc/sysdeps/linux/arm/sigrestorer.S index bc175de6a..5b996ea83 100644 --- a/libc/sysdeps/linux/arm/sigrestorer.S +++ b/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  | 
