Skip to content

Commit

Permalink
[XTENSA] Add support for the sa_restorer function
Browse files Browse the repository at this point in the history
Supporting the sa_restorer function allows for better security
since the sigreturn system call doesn't need to be placed on
the stack, so the stack doesn't need to be executable. This
requires support from the c-library as it has to provide the
restorer function.

Signed-off-by: Chris Zankel <chris@zankel.net>
  • Loading branch information
Chris Zankel committed Feb 14, 2008
1 parent c658eac commit 44c64e6
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions arch/xtensa/kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -381,14 +381,19 @@ static void setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
err |= setup_sigcontext(frame, regs);
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));

/* Create sys_rt_sigreturn syscall in stack frame */
if (ka->sa.sa_flags & SA_RESTORER) {
ra = (unsigned long)ka->sa.sa_restorer;
} else {

err |= gen_return_code(frame->retcode);
/* Create sys_rt_sigreturn syscall in stack frame */

if (err) {
goto give_sigsegv;
err |= gen_return_code(frame->retcode);

if (err) {
goto give_sigsegv;
}
ra = (unsigned long) frame->retcode;
}


/*
* Create signal handler execution context.
Expand All @@ -402,7 +407,6 @@ static void setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/* Set up a stack frame for a call4
* Note: PS.CALLINC is set to one by start_thread
*/
ra = (unsigned long) frame->retcode;
regs->areg[4] = (((unsigned long) ra) & 0x3fffffff) | 0x40000000;
regs->areg[6] = (unsigned long) signal;
regs->areg[7] = (unsigned long) &frame->info;
Expand Down

0 comments on commit 44c64e6

Please sign in to comment.