diff options
Diffstat (limited to 'sysdeps/unix/sysv')
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/sigaction.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/sysdeps/unix/sysv/linux/i386/sigaction.c b/sysdeps/unix/sysv/linux/i386/sigaction.c index c2f0a0f5d1..55252632dc 100644 --- a/sysdeps/unix/sysv/linux/i386/sigaction.c +++ b/sysdeps/unix/sysv/linux/i386/sigaction.c @@ -88,10 +88,15 @@ __libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact) { kact.k_sa_handler = act->sa_handler; memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t)); + +# if __ASSUME_VSYSCALL == 0 kact.sa_flags = act->sa_flags | SA_RESTORER; kact.sa_restorer = ((act->sa_flags & SA_SIGINFO) ? &restore_rt : &restore); +# else + kact.sa_flags = act->sa_flags; +# endif } /* XXX The size argument hopefully will have to be changed to the @@ -157,6 +162,7 @@ libc_hidden_weak (__sigaction) weak_alias (__libc_sigaction, sigaction) #endif +#if __ASSUME_VSYSCALL == 0 /* NOTE: Please think twice before making any changes to the bits of code below. GDB needs some intimate knowledge about it to recognize them as signal trampolines, and make backtraces through @@ -165,8 +171,8 @@ weak_alias (__libc_sigaction, sigaction) If you ever feel the need to make any changes, please notify the appropriate GDB maintainer. */ -#define RESTORE(name, syscall) RESTORE2 (name, syscall) -#define RESTORE2(name, syscall) \ +# define RESTORE(name, syscall) RESTORE2 (name, syscall) +# define RESTORE2(name, syscall) \ asm \ ( \ ".text\n" \ @@ -176,10 +182,10 @@ asm \ " int $0x80" \ ); -#ifdef __NR_rt_sigaction +# ifdef __NR_rt_sigaction /* The return code for realtime-signals. */ RESTORE (restore_rt, __NR_rt_sigreturn) -#endif +# endif /* For the boring old signals. */ # undef RESTORE2 @@ -195,3 +201,4 @@ asm \ ); RESTORE (restore, __NR_sigreturn) +#endif |