Implement 32-bit compatibility for waitid(2).
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
a19050f301
commit
54f2da755b
|
@ -221,6 +221,28 @@ sys32_waitpid(compat_pid_t pid, unsigned int *stat_addr, int options)
|
||||||
return compat_sys_wait4(pid, stat_addr, options, NULL);
|
return compat_sys_wait4(pid, stat_addr, options, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asmlinkage long
|
||||||
|
sysn32_waitid(int which, compat_pid_t pid,
|
||||||
|
siginfo_t __user *uinfo, int options,
|
||||||
|
struct compat_rusage __user *uru)
|
||||||
|
{
|
||||||
|
struct rusage ru;
|
||||||
|
long ret;
|
||||||
|
mm_segment_t old_fs = get_fs();
|
||||||
|
|
||||||
|
set_fs (KERNEL_DS);
|
||||||
|
ret = sys_waitid(which, pid, uinfo, options,
|
||||||
|
uru ? (struct rusage __user *) &ru : NULL);
|
||||||
|
set_fs (old_fs);
|
||||||
|
|
||||||
|
if (ret < 0 || uinfo->si_signo == 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (uru)
|
||||||
|
ret = put_compat_rusage(&ru, uru);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
struct sysinfo32 {
|
struct sysinfo32 {
|
||||||
s32 uptime;
|
s32 uptime;
|
||||||
u32 loads[3];
|
u32 loads[3];
|
||||||
|
|
|
@ -358,7 +358,7 @@ EXPORT(sysn32_call_table)
|
||||||
PTR compat_sys_mq_notify
|
PTR compat_sys_mq_notify
|
||||||
PTR compat_sys_mq_getsetattr
|
PTR compat_sys_mq_getsetattr
|
||||||
PTR sys_ni_syscall /* 6240, sys_vserver */
|
PTR sys_ni_syscall /* 6240, sys_vserver */
|
||||||
PTR sys_waitid
|
PTR sysn32_waitid
|
||||||
PTR sys_ni_syscall /* available, was setaltroot */
|
PTR sys_ni_syscall /* available, was setaltroot */
|
||||||
PTR sys_add_key
|
PTR sys_add_key
|
||||||
PTR sys_request_key
|
PTR sys_request_key
|
||||||
|
|
|
@ -480,7 +480,7 @@ sys_call_table:
|
||||||
PTR compat_sys_mq_notify /* 4275 */
|
PTR compat_sys_mq_notify /* 4275 */
|
||||||
PTR compat_sys_mq_getsetattr
|
PTR compat_sys_mq_getsetattr
|
||||||
PTR sys_ni_syscall /* sys_vserver */
|
PTR sys_ni_syscall /* sys_vserver */
|
||||||
PTR sys_waitid
|
PTR sys32_waitid
|
||||||
PTR sys_ni_syscall /* available, was setaltroot */
|
PTR sys_ni_syscall /* available, was setaltroot */
|
||||||
PTR sys_add_key /* 4280 */
|
PTR sys_add_key /* 4280 */
|
||||||
PTR sys_request_key
|
PTR sys_request_key
|
||||||
|
|
|
@ -902,3 +902,30 @@ asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo)
|
||||||
set_fs (old_fs);
|
set_fs (old_fs);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asmlinkage long
|
||||||
|
sys32_waitid(int which, compat_pid_t pid,
|
||||||
|
compat_siginfo_t __user *uinfo, int options,
|
||||||
|
struct compat_rusage __user *uru)
|
||||||
|
{
|
||||||
|
siginfo_t info;
|
||||||
|
struct rusage ru;
|
||||||
|
long ret;
|
||||||
|
mm_segment_t old_fs = get_fs();
|
||||||
|
|
||||||
|
info.si_signo = 0;
|
||||||
|
set_fs (KERNEL_DS);
|
||||||
|
ret = sys_waitid(which, pid, (siginfo_t __user *) &info, options,
|
||||||
|
uru ? (struct rusage __user *) &ru : NULL);
|
||||||
|
set_fs (old_fs);
|
||||||
|
|
||||||
|
if (ret < 0 || info.si_signo == 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (uru && (ret = put_compat_rusage(&ru, uru)))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
BUG_ON(info.si_code & __SI_MASK);
|
||||||
|
info.si_code |= __SI_CHLD;
|
||||||
|
return copy_siginfo_to_user32(uinfo, &info);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue