diff options
Diffstat (limited to 'arch/sh/kernel/signal.c')
-rw-r--r-- | arch/sh/kernel/signal.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/sh/kernel/signal.c b/arch/sh/kernel/signal.c index eb0191c374b6..b32c35a7c0a3 100644 --- a/arch/sh/kernel/signal.c +++ b/arch/sh/kernel/signal.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <linux/personality.h> | 23 | #include <linux/personality.h> |
24 | #include <linux/binfmts.h> | 24 | #include <linux/binfmts.h> |
25 | #include <linux/freezer.h> | 25 | #include <linux/freezer.h> |
26 | 26 | #include <asm/system.h> | |
27 | #include <asm/ucontext.h> | 27 | #include <asm/ucontext.h> |
28 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
29 | #include <asm/pgtable.h> | 29 | #include <asm/pgtable.h> |
@@ -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 -= 2; | 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 -= 2; | 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 -= 2; | 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 | } |