]> git.hungrycats.org Git - linux/commitdiff
Re-instate the SA_RESTORER functionality, since it seems that some
authorLinus Torvalds <torvalds@home.transmeta.com>
Sun, 12 Jan 2003 00:50:14 +0000 (16:50 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Sun, 12 Jan 2003 00:50:14 +0000 (16:50 -0800)
programs still depend on it and in fact do install a different signal
restorer than the standard kernel version.

arch/i386/kernel/signal.c

index 56a0af099074d51ac3a556f6dd05e523b85652af..42160fc0322d98dd06e5e14d3b90cc953eeaf925 100644 (file)
@@ -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