diff options
| author | Linus Torvalds <torvalds@home.transmeta.com> | 2003-01-11 16:50:14 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2003-01-11 16:50:14 -0800 |
| commit | 2bcdebe4e596eb1642e945ef8fbc705b919ad60c (patch) | |
| tree | 536508fd9a7b968097cbcd0a4af4be5eb88d9515 | |
| parent | d5a9a399cb155b910469abfc2e3dd9d49699054c (diff) | |
Re-instate the SA_RESTORER functionality, since it seems that some
programs still depend on it and in fact do install a different signal
restorer than the standard kernel version.
| -rw-r--r-- | arch/i386/kernel/signal.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c index 56a0af099074..42160fc0322d 100644 --- a/arch/i386/kernel/signal.c +++ b/arch/i386/kernel/signal.c @@ -350,6 +350,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size) static void setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, struct pt_regs * regs) { + void *restorer; struct sigframe *frame; int err = 0; @@ -378,8 +379,12 @@ static void setup_frame(int sig, struct k_sigaction *ka, if (err) goto give_sigsegv; + restorer = (void *) (fix_to_virt(FIX_VSYSCALL) + 32); + if (ka->sa.sa_flags & SA_RESTORER) + restorer = ka->sa.sa_restorer; + /* Set up to return from userspace. */ - err |= __put_user(fix_to_virt(FIX_VSYSCALL) + 32, &frame->pretcode); + err |= __put_user(restorer, &frame->pretcode); /* * This is popl %eax ; movl $,%eax ; int $0x80 @@ -422,6 +427,7 @@ give_sigsegv: static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct pt_regs * regs) { + void *restorer; struct rt_sigframe *frame; int err = 0; @@ -456,7 +462,10 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, goto give_sigsegv; /* Set up to return from userspace. */ - err |= __put_user(fix_to_virt(FIX_VSYSCALL) + 64, &frame->pretcode); + restorer = (void *) (fix_to_virt(FIX_VSYSCALL) + 64); + if (ka->sa.sa_flags & SA_RESTORER) + restorer = ka->sa.sa_restorer; + err |= __put_user(restorer, &frame->pretcode); /* * This is movl $,%eax ; int $0x80 |
