diff options
| -rw-r--r-- | arch/mips/kernel/linux32.c | 19 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-n32.S | 4 | ||||
| -rw-r--r-- | arch/mips/kernel/signal_n32.c | 33 |
3 files changed, 35 insertions, 21 deletions
diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 60353f5acc48..9996b6e84585 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c | |||
| @@ -1450,25 +1450,6 @@ sys32_timer_create(u32 clock, struct sigevent32 __user *se32, timer_t __user *ti | |||
| 1450 | return sys_timer_create(clock, p, timer_id); | 1450 | return sys_timer_create(clock, p, timer_id); |
| 1451 | } | 1451 | } |
| 1452 | 1452 | ||
| 1453 | asmlinkage long | ||
| 1454 | sysn32_rt_sigtimedwait(const sigset_t __user *uthese, | ||
| 1455 | siginfo_t __user *uinfo, | ||
| 1456 | const struct compat_timespec __user *uts32, | ||
| 1457 | size_t sigsetsize) | ||
| 1458 | { | ||
| 1459 | struct timespec __user *uts = NULL; | ||
| 1460 | |||
| 1461 | if (uts32) { | ||
| 1462 | struct timespec ts; | ||
| 1463 | uts = compat_alloc_user_space(sizeof(struct timespec)); | ||
| 1464 | if (get_user(ts.tv_sec, &uts32->tv_sec) || | ||
| 1465 | get_user(ts.tv_nsec, &uts32->tv_nsec) || | ||
| 1466 | copy_to_user (uts, &ts, sizeof (ts))) | ||
| 1467 | return -EFAULT; | ||
| 1468 | } | ||
| 1469 | return sys_rt_sigtimedwait(uthese, uinfo, uts, sigsetsize); | ||
| 1470 | } | ||
| 1471 | |||
| 1472 | save_static_function(sys32_clone); | 1453 | save_static_function(sys32_clone); |
| 1473 | __attribute_used__ noinline static int | 1454 | __attribute_used__ noinline static int |
| 1474 | _sys32_clone(nabi_no_regargs struct pt_regs regs) | 1455 | _sys32_clone(nabi_no_regargs struct pt_regs regs) |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index bc4980cefc8b..d87b5446fa13 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
| @@ -245,9 +245,9 @@ EXPORT(sysn32_call_table) | |||
| 245 | PTR sys_capget | 245 | PTR sys_capget |
| 246 | PTR sys_capset | 246 | PTR sys_capset |
| 247 | PTR sys32_rt_sigpending /* 6125 */ | 247 | PTR sys32_rt_sigpending /* 6125 */ |
| 248 | PTR sysn32_rt_sigtimedwait | 248 | PTR compat_sys_rt_sigtimedwait |
| 249 | PTR sys_rt_sigqueueinfo | 249 | PTR sys_rt_sigqueueinfo |
| 250 | PTR sys32_rt_sigsuspend | 250 | PTR sysn32_rt_sigsuspend |
| 251 | PTR sys32_sigaltstack | 251 | PTR sys32_sigaltstack |
| 252 | PTR compat_sys_utime /* 6130 */ | 252 | PTR compat_sys_utime /* 6130 */ |
| 253 | PTR sys_mknod | 253 | PTR sys_mknod |
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c index 5a3776096f07..3e168c08a3a8 100644 --- a/arch/mips/kernel/signal_n32.c +++ b/arch/mips/kernel/signal_n32.c | |||
| @@ -81,6 +81,39 @@ struct rt_sigframe_n32 { | |||
| 81 | #endif | 81 | #endif |
| 82 | }; | 82 | }; |
| 83 | 83 | ||
| 84 | extern void sigset_from_compat (sigset_t *set, compat_sigset_t *compat); | ||
| 85 | |||
| 86 | save_static_function(sysn32_rt_sigsuspend); | ||
| 87 | __attribute_used__ noinline static int | ||
| 88 | _sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | ||
| 89 | { | ||
| 90 | compat_sigset_t __user *unewset, uset; | ||
| 91 | size_t sigsetsize; | ||
| 92 | sigset_t newset; | ||
| 93 | |||
| 94 | /* XXX Don't preclude handling different sized sigset_t's. */ | ||
| 95 | sigsetsize = regs.regs[5]; | ||
| 96 | if (sigsetsize != sizeof(sigset_t)) | ||
| 97 | return -EINVAL; | ||
| 98 | |||
| 99 | unewset = (compat_sigset_t __user *) regs.regs[4]; | ||
| 100 | if (copy_from_user(&uset, unewset, sizeof(uset))) | ||
| 101 | return -EFAULT; | ||
| 102 | sigset_from_compat (&newset, &uset); | ||
| 103 | sigdelsetmask(&newset, ~_BLOCKABLE); | ||
| 104 | |||
| 105 | spin_lock_irq(¤t->sighand->siglock); | ||
| 106 | current->saved_sigmask = current->blocked; | ||
| 107 | current->blocked = newset; | ||
| 108 | recalc_sigpending(); | ||
| 109 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 110 | |||
| 111 | current->state = TASK_INTERRUPTIBLE; | ||
| 112 | schedule(); | ||
| 113 | set_thread_flag(TIF_RESTORE_SIGMASK); | ||
| 114 | return -ERESTARTNOHAND; | ||
| 115 | } | ||
| 116 | |||
| 84 | save_static_function(sysn32_rt_sigreturn); | 117 | save_static_function(sysn32_rt_sigreturn); |
| 85 | __attribute_used__ noinline static void | 118 | __attribute_used__ noinline static void |
| 86 | _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | 119 | _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) |
