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;
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
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;
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