diff options
Diffstat (limited to 'arch/alpha/kernel/signal.c')
| -rw-r--r-- | arch/alpha/kernel/signal.c | 41 |
1 files changed, 3 insertions, 38 deletions
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 0932dbb1ef8e..0f6b51ae865a 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c | |||
| @@ -144,8 +144,7 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act, | |||
| 144 | /* | 144 | /* |
| 145 | * Atomically swap in the new signal mask, and wait for a signal. | 145 | * Atomically swap in the new signal mask, and wait for a signal. |
| 146 | */ | 146 | */ |
| 147 | asmlinkage int | 147 | SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask) |
| 148 | do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw) | ||
| 149 | { | 148 | { |
| 150 | mask &= _BLOCKABLE; | 149 | mask &= _BLOCKABLE; |
| 151 | spin_lock_irq(¤t->sighand->siglock); | 150 | spin_lock_irq(¤t->sighand->siglock); |
| @@ -154,41 +153,6 @@ do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw) | |||
| 154 | recalc_sigpending(); | 153 | recalc_sigpending(); |
| 155 | spin_unlock_irq(¤t->sighand->siglock); | 154 | spin_unlock_irq(¤t->sighand->siglock); |
| 156 | 155 | ||
| 157 | /* Indicate EINTR on return from any possible signal handler, | ||
| 158 | which will not come back through here, but via sigreturn. */ | ||
| 159 | regs->r0 = EINTR; | ||
| 160 | regs->r19 = 1; | ||
| 161 | |||
| 162 | current->state = TASK_INTERRUPTIBLE; | ||
| 163 | schedule(); | ||
| 164 | set_thread_flag(TIF_RESTORE_SIGMASK); | ||
| 165 | return -ERESTARTNOHAND; | ||
| 166 | } | ||
| 167 | |||
| 168 | asmlinkage int | ||
| 169 | do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize, | ||
| 170 | struct pt_regs *regs, struct switch_stack *sw) | ||
| 171 | { | ||
| 172 | sigset_t set; | ||
| 173 | |||
| 174 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 175 | if (sigsetsize != sizeof(sigset_t)) | ||
| 176 | return -EINVAL; | ||
| 177 | if (copy_from_user(&set, uset, sizeof(set))) | ||
| 178 | return -EFAULT; | ||
| 179 | |||
| 180 | sigdelsetmask(&set, ~_BLOCKABLE); | ||
| 181 | spin_lock_irq(¤t->sighand->siglock); | ||
| 182 | current->saved_sigmask = current->blocked; | ||
| 183 | current->blocked = set; | ||
| 184 | recalc_sigpending(); | ||
| 185 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 186 | |||
| 187 | /* Indicate EINTR on return from any possible signal handler, | ||
| 188 | which will not come back through here, but via sigreturn. */ | ||
| 189 | regs->r0 = EINTR; | ||
| 190 | regs->r19 = 1; | ||
| 191 | |||
| 192 | current->state = TASK_INTERRUPTIBLE; | 156 | current->state = TASK_INTERRUPTIBLE; |
| 193 | schedule(); | 157 | schedule(); |
| 194 | set_thread_flag(TIF_RESTORE_SIGMASK); | 158 | set_thread_flag(TIF_RESTORE_SIGMASK); |
| @@ -239,6 +203,8 @@ restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | |||
| 239 | unsigned long usp; | 203 | unsigned long usp; |
| 240 | long i, err = __get_user(regs->pc, &sc->sc_pc); | 204 | long i, err = __get_user(regs->pc, &sc->sc_pc); |
| 241 | 205 | ||
| 206 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
| 207 | |||
| 242 | sw->r26 = (unsigned long) ret_from_sys_call; | 208 | sw->r26 = (unsigned long) ret_from_sys_call; |
| 243 | 209 | ||
| 244 | err |= __get_user(regs->r0, sc->sc_regs+0); | 210 | err |= __get_user(regs->r0, sc->sc_regs+0); |
| @@ -591,7 +557,6 @@ syscall_restart(unsigned long r0, unsigned long r19, | |||
| 591 | regs->pc -= 4; | 557 | regs->pc -= 4; |
| 592 | break; | 558 | break; |
| 593 | case ERESTART_RESTARTBLOCK: | 559 | case ERESTART_RESTARTBLOCK: |
| 594 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
| 595 | regs->r0 = EINTR; | 560 | regs->r0 = EINTR; |
| 596 | break; | 561 | break; |
| 597 | } | 562 | } |
