aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/m32r/kernel/signal.c17
-rw-r--r--include/asm-m32r/thread_info.h11
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(&current->sighand->siglock); 49 spin_lock_irq(&current->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(&current->sighand->siglock); 53 spin_unlock_irq(&current->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
64asmlinkage int 61asmlinkage 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 */