diff options
| -rw-r--r-- | arch/m32r/kernel/signal.c | 17 | ||||
| -rw-r--r-- | include/asm-m32r/thread_info.h | 11 |
2 files changed, 15 insertions, 13 deletions
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c index a753d79c4e89..18124542a6eb 100644 --- a/arch/m32r/kernel/signal.c +++ b/arch/m32r/kernel/signal.c | |||
| @@ -36,7 +36,7 @@ sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, | |||
| 36 | unsigned long r2, unsigned long r3, unsigned long r4, | 36 | unsigned long r2, unsigned long r3, unsigned long r4, |
| 37 | unsigned long r5, unsigned long r6, struct pt_regs *regs) | 37 | unsigned long r5, unsigned long r6, struct pt_regs *regs) |
| 38 | { | 38 | { |
| 39 | sigset_t saveset, newset; | 39 | sigset_t newset; |
| 40 | 40 | ||
| 41 | /* XXX: Don't preclude handling different sized sigset_t's. */ | 41 | /* XXX: Don't preclude handling different sized sigset_t's. */ |
| 42 | if (sigsetsize != sizeof(sigset_t)) | 42 | if (sigsetsize != sizeof(sigset_t)) |
| @@ -44,21 +44,18 @@ sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, | |||
| 44 | 44 | ||
| 45 | if (copy_from_user(&newset, unewset, sizeof(newset))) | 45 | if (copy_from_user(&newset, unewset, sizeof(newset))) |
| 46 | return -EFAULT; | 46 | return -EFAULT; |
| 47 | sigdelsetmask(&newset, ~_BLOCKABLE); | 47 | sigdelsetmask(&newset, sigmask(SIGKILL)|sigmask(SIGSTOP)); |
| 48 | 48 | ||
| 49 | spin_lock_irq(¤t->sighand->siglock); | 49 | spin_lock_irq(¤t->sighand->siglock); |
| 50 | saveset = current->blocked; | 50 | current->saved_sigmask = current->blocked; |
| 51 | current->blocked = newset; | 51 | current->blocked = newset; |
| 52 | recalc_sigpending(); | 52 | recalc_sigpending(); |
| 53 | spin_unlock_irq(¤t->sighand->siglock); | 53 | spin_unlock_irq(¤t->sighand->siglock); |
| 54 | 54 | ||
| 55 | regs->r0 = -EINTR; | 55 | current->state = TASK_INTERRUPTIBLE; |
| 56 | while (1) { | 56 | schedule(); |
| 57 | current->state = TASK_INTERRUPTIBLE; | 57 | set_thread_flag(TIF_RESTORE_SIGMASK); |
| 58 | schedule(); | 58 | return -ERESTARTNOHAND; |
| 59 | if (do_signal(regs, &saveset)) | ||
| 60 | return regs->r0; | ||
| 61 | } | ||
| 62 | } | 59 | } |
| 63 | 60 | ||
| 64 | asmlinkage int | 61 | asmlinkage int |
diff --git a/include/asm-m32r/thread_info.h b/include/asm-m32r/thread_info.h index c039820dba7c..1effcd0f5e63 100644 --- a/include/asm-m32r/thread_info.h +++ b/include/asm-m32r/thread_info.h | |||
| @@ -149,16 +149,21 @@ static inline unsigned int get_thread_fault_code(void) | |||
| 149 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ | 149 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ |
| 150 | #define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */ | 150 | #define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */ |
| 151 | #define TIF_IRET 4 /* return with iret */ | 151 | #define TIF_IRET 4 /* return with iret */ |
| 152 | #define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ | 152 | #define TIF_RESTORE_SIGMASK 8 /* restore signal mask in do_signal() */ |
| 153 | /* 31..28 fault code */ | 153 | #define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */ |
| 154 | #define TIF_MEMDIE 17 | 154 | #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ |
| 155 | #define TIF_MEMDIE 18 /* OOM killer killed process */ | ||
| 156 | #define TIF_FREEZE 19 /* is freezing for suspend */ | ||
| 155 | 157 | ||
| 156 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | 158 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
| 157 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) | 159 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) |
| 158 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) | 160 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) |
| 159 | #define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) | 161 | #define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) |
| 160 | #define _TIF_IRET (1<<TIF_IRET) | 162 | #define _TIF_IRET (1<<TIF_IRET) |
| 163 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) | ||
| 164 | #define _TIF_USEDFPU (1<<TIF_USEDFPU) | ||
| 161 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 165 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
| 166 | #define _TIF_FREEZE (1<<TIF_FREEZE) | ||
| 162 | 167 | ||
| 163 | #define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ | 168 | #define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ |
| 164 | #define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ | 169 | #define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ |
