diff options
Diffstat (limited to 'arch/sh/kernel/signal.c')
-rw-r--r-- | arch/sh/kernel/signal.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/sh/kernel/signal.c b/arch/sh/kernel/signal.c index d7d98d691c64..b32c35a7c0a3 100644 --- a/arch/sh/kernel/signal.c +++ b/arch/sh/kernel/signal.c | |||
@@ -500,7 +500,9 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
500 | } | 500 | } |
501 | /* fallthrough */ | 501 | /* fallthrough */ |
502 | case -ERESTARTNOINTR: | 502 | case -ERESTARTNOINTR: |
503 | regs->pc -= instruction_size(regs->pc); | 503 | regs->pc -= instruction_size( |
504 | ctrl_inw(regs->pc - 4)); | ||
505 | break; | ||
504 | } | 506 | } |
505 | } else { | 507 | } else { |
506 | /* gUSA handling */ | 508 | /* gUSA handling */ |
@@ -516,7 +518,8 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
516 | regs->regs[15] = regs->regs[1]; | 518 | regs->regs[15] = regs->regs[1]; |
517 | if (regs->pc < regs->regs[0]) | 519 | if (regs->pc < regs->regs[0]) |
518 | /* Go to rewind point #1 */ | 520 | /* Go to rewind point #1 */ |
519 | regs->pc = regs->regs[0] + offset - 2; | 521 | regs->pc = regs->regs[0] + offset - |
522 | instruction_size(ctrl_inw(regs->pc-4)); | ||
520 | } | 523 | } |
521 | #ifdef CONFIG_PREEMPT | 524 | #ifdef CONFIG_PREEMPT |
522 | local_irq_restore(flags); | 525 | local_irq_restore(flags); |
@@ -600,9 +603,9 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0) | |||
600 | regs->regs[0] == -ERESTARTSYS || | 603 | regs->regs[0] == -ERESTARTSYS || |
601 | regs->regs[0] == -ERESTARTNOINTR) { | 604 | regs->regs[0] == -ERESTARTNOINTR) { |
602 | regs->regs[0] = save_r0; | 605 | regs->regs[0] = save_r0; |
603 | regs->pc -= instruction_size(regs->pc); | 606 | regs->pc -= instruction_size(ctrl_inw(regs->pc - 4)); |
604 | } else if (regs->regs[0] == -ERESTART_RESTARTBLOCK) { | 607 | } else if (regs->regs[0] == -ERESTART_RESTARTBLOCK) { |
605 | regs->pc -= instruction_size(regs->pc); | 608 | regs->pc -= instruction_size(ctrl_inw(regs->pc - 4)); |
606 | regs->regs[3] = __NR_restart_syscall; | 609 | regs->regs[3] = __NR_restart_syscall; |
607 | } | 610 | } |
608 | } | 611 | } |