diff options
Diffstat (limited to 'arch/xtensa/kernel/signal.c')
-rw-r--r-- | arch/xtensa/kernel/signal.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c index d7590dddd084..718eca1850bd 100644 --- a/arch/xtensa/kernel/signal.c +++ b/arch/xtensa/kernel/signal.c | |||
@@ -337,7 +337,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
337 | struct rt_sigframe *frame; | 337 | struct rt_sigframe *frame; |
338 | int err = 0; | 338 | int err = 0; |
339 | int signal; | 339 | int signal; |
340 | unsigned long sp, ra; | 340 | unsigned long sp, ra, tp; |
341 | 341 | ||
342 | sp = regs->areg[1]; | 342 | sp = regs->areg[1]; |
343 | 343 | ||
@@ -391,7 +391,8 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
391 | * Return context not modified until this point. | 391 | * Return context not modified until this point. |
392 | */ | 392 | */ |
393 | 393 | ||
394 | /* Set up registers for signal handler */ | 394 | /* Set up registers for signal handler; preserve the threadptr */ |
395 | tp = regs->threadptr; | ||
395 | start_thread(regs, (unsigned long) ka->sa.sa_handler, | 396 | start_thread(regs, (unsigned long) ka->sa.sa_handler, |
396 | (unsigned long) frame); | 397 | (unsigned long) frame); |
397 | 398 | ||
@@ -402,6 +403,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
402 | regs->areg[6] = (unsigned long) signal; | 403 | regs->areg[6] = (unsigned long) signal; |
403 | regs->areg[7] = (unsigned long) &frame->info; | 404 | regs->areg[7] = (unsigned long) &frame->info; |
404 | regs->areg[8] = (unsigned long) &frame->uc; | 405 | regs->areg[8] = (unsigned long) &frame->uc; |
406 | regs->threadptr = tp; | ||
405 | 407 | ||
406 | /* Set access mode to USER_DS. Nomenclature is outdated, but | 408 | /* Set access mode to USER_DS. Nomenclature is outdated, but |
407 | * functionality is used in uaccess.h | 409 | * functionality is used in uaccess.h |