From c68a2d697f609a53e026b6f2c9dbdc3d1854a878 Mon Sep 17 00:00:00 2001 From: Chris Zankel Date: Fri, 11 Jan 2008 11:44:17 -0800 Subject: [PATCH] --- yaml --- r: 85943 b: refs/heads/master c: 44c64e6b15ceab6a4927f54e1081a74ba096b95a h: refs/heads/master i: 85941: 805b4a367eb873982913e1b3cbae83c61675c6e2 85939: 001f1ffc2b58ec0d1a7ad34bc9600865ef3e312c 85935: 7b1c0cd52b1e34a9f79f658b803f2465cce07b2a v: v3 --- [refs] | 2 +- trunk/arch/xtensa/kernel/signal.c | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index 84ae76927ffc..6da16bfc6a4a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c658eac628aa8df040dfe614556d95e6da3a9ffb +refs/heads/master: 44c64e6b15ceab6a4927f54e1081a74ba096b95a diff --git a/trunk/arch/xtensa/kernel/signal.c b/trunk/arch/xtensa/kernel/signal.c index 299be42d116b..f2220b5bdce6 100644 --- a/trunk/arch/xtensa/kernel/signal.c +++ b/trunk/arch/xtensa/kernel/signal.c @@ -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. @@ -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;