diff options
Diffstat (limited to 'arch/sh/kernel/signal_32.c')
-rw-r--r-- | arch/sh/kernel/signal_32.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c index 3db37425210d..579cd2ca358d 100644 --- a/arch/sh/kernel/signal_32.c +++ b/arch/sh/kernel/signal_32.c | |||
@@ -67,7 +67,8 @@ sys_sigsuspend(old_sigset_t mask, | |||
67 | 67 | ||
68 | current->state = TASK_INTERRUPTIBLE; | 68 | current->state = TASK_INTERRUPTIBLE; |
69 | schedule(); | 69 | schedule(); |
70 | set_thread_flag(TIF_RESTORE_SIGMASK); | 70 | set_restore_sigmask(); |
71 | |||
71 | return -ERESTARTNOHAND; | 72 | return -ERESTARTNOHAND; |
72 | } | 73 | } |
73 | 74 | ||
@@ -149,7 +150,7 @@ static inline int restore_sigcontext_fpu(struct sigcontext __user *sc) | |||
149 | return 0; | 150 | return 0; |
150 | 151 | ||
151 | set_used_math(); | 152 | set_used_math(); |
152 | return __copy_from_user(&tsk->thread.fpu.hard, &sc->sc_fpregs[0], | 153 | return __copy_from_user(&tsk->thread.xstate->hardfpu, &sc->sc_fpregs[0], |
153 | sizeof(long)*(16*2+2)); | 154 | sizeof(long)*(16*2+2)); |
154 | } | 155 | } |
155 | 156 | ||
@@ -174,7 +175,7 @@ static inline int save_sigcontext_fpu(struct sigcontext __user *sc, | |||
174 | clear_used_math(); | 175 | clear_used_math(); |
175 | 176 | ||
176 | unlazy_fpu(tsk, regs); | 177 | unlazy_fpu(tsk, regs); |
177 | return __copy_to_user(&sc->sc_fpregs[0], &tsk->thread.fpu.hard, | 178 | return __copy_to_user(&sc->sc_fpregs[0], &tsk->thread.xstate->hardfpu, |
178 | sizeof(long)*(16*2+2)); | 179 | sizeof(long)*(16*2+2)); |
179 | } | 180 | } |
180 | #endif /* CONFIG_SH_FPU */ | 181 | #endif /* CONFIG_SH_FPU */ |
@@ -527,7 +528,7 @@ handle_syscall_restart(unsigned long save_r0, struct pt_regs *regs, | |||
527 | /* fallthrough */ | 528 | /* fallthrough */ |
528 | case -ERESTARTNOINTR: | 529 | case -ERESTARTNOINTR: |
529 | regs->regs[0] = save_r0; | 530 | regs->regs[0] = save_r0; |
530 | regs->pc -= instruction_size(ctrl_inw(regs->pc - 4)); | 531 | regs->pc -= instruction_size(__raw_readw(regs->pc - 4)); |
531 | break; | 532 | break; |
532 | } | 533 | } |
533 | } | 534 | } |
@@ -590,7 +591,7 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0) | |||
590 | if (try_to_freeze()) | 591 | if (try_to_freeze()) |
591 | goto no_signal; | 592 | goto no_signal; |
592 | 593 | ||
593 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 594 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) |
594 | oldset = ¤t->saved_sigmask; | 595 | oldset = ¤t->saved_sigmask; |
595 | else | 596 | else |
596 | oldset = ¤t->blocked; | 597 | oldset = ¤t->blocked; |
@@ -602,12 +603,13 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0) | |||
602 | /* Whee! Actually deliver the signal. */ | 603 | /* Whee! Actually deliver the signal. */ |
603 | if (handle_signal(signr, &ka, &info, oldset, | 604 | if (handle_signal(signr, &ka, &info, oldset, |
604 | regs, save_r0) == 0) { | 605 | regs, save_r0) == 0) { |
605 | /* a signal was successfully delivered; the saved | 606 | /* |
607 | * A signal was successfully delivered; the saved | ||
606 | * sigmask will have been stored in the signal frame, | 608 | * sigmask will have been stored in the signal frame, |
607 | * and will be restored by sigreturn, so we can simply | 609 | * and will be restored by sigreturn, so we can simply |
608 | * clear the TIF_RESTORE_SIGMASK flag */ | 610 | * clear the TS_RESTORE_SIGMASK flag |
609 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 611 | */ |
610 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 612 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
611 | 613 | ||
612 | tracehook_signal_handler(signr, &info, &ka, regs, | 614 | tracehook_signal_handler(signr, &info, &ka, regs, |
613 | test_thread_flag(TIF_SINGLESTEP)); | 615 | test_thread_flag(TIF_SINGLESTEP)); |
@@ -624,17 +626,19 @@ no_signal: | |||
624 | regs->regs[0] == -ERESTARTSYS || | 626 | regs->regs[0] == -ERESTARTSYS || |
625 | regs->regs[0] == -ERESTARTNOINTR) { | 627 | regs->regs[0] == -ERESTARTNOINTR) { |
626 | regs->regs[0] = save_r0; | 628 | regs->regs[0] = save_r0; |
627 | regs->pc -= instruction_size(ctrl_inw(regs->pc - 4)); | 629 | regs->pc -= instruction_size(__raw_readw(regs->pc - 4)); |
628 | } else if (regs->regs[0] == -ERESTART_RESTARTBLOCK) { | 630 | } else if (regs->regs[0] == -ERESTART_RESTARTBLOCK) { |
629 | regs->pc -= instruction_size(ctrl_inw(regs->pc - 4)); | 631 | regs->pc -= instruction_size(__raw_readw(regs->pc - 4)); |
630 | regs->regs[3] = __NR_restart_syscall; | 632 | regs->regs[3] = __NR_restart_syscall; |
631 | } | 633 | } |
632 | } | 634 | } |
633 | 635 | ||
634 | /* if there's no signal to deliver, we just put the saved sigmask | 636 | /* |
635 | * back */ | 637 | * If there's no signal to deliver, we just put the saved sigmask |
636 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | 638 | * back. |
637 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 639 | */ |
640 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { | ||
641 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | ||
638 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 642 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); |
639 | } | 643 | } |
640 | } | 644 | } |