diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/amd64/linux32/linux32_dummy.c | 1 | ||||
-rw-r--r-- | sys/amd64/linux32/syscalls.master | 3 | ||||
-rw-r--r-- | sys/compat/linux/linux_signal.c | 28 | ||||
-rw-r--r-- | sys/i386/linux/linux_dummy.c | 1 | ||||
-rw-r--r-- | sys/i386/linux/syscalls.master | 3 |
5 files changed, 32 insertions, 4 deletions
diff --git a/sys/amd64/linux32/linux32_dummy.c b/sys/amd64/linux32/linux32_dummy.c index 5322c8e..e79f101 100644 --- a/sys/amd64/linux32/linux32_dummy.c +++ b/sys/amd64/linux32/linux32_dummy.c @@ -54,7 +54,6 @@ DUMMY(sysfs); DUMMY(query_module); DUMMY(nfsservctl); DUMMY(prctl); -DUMMY(rt_sigpending); DUMMY(rt_sigtimedwait); DUMMY(rt_sigqueueinfo); DUMMY(capget); diff --git a/sys/amd64/linux32/syscalls.master b/sys/amd64/linux32/syscalls.master index 4e2e36a..ad9c8e8 100644 --- a/sys/amd64/linux32/syscalls.master +++ b/sys/amd64/linux32/syscalls.master @@ -308,7 +308,8 @@ 175 AUE_NULL MSTD { int linux_rt_sigprocmask(l_int how, \ l_sigset_t *mask, l_sigset_t *omask, \ l_size_t sigsetsize); } -176 AUE_NULL MSTD { int linux_rt_sigpending(void); } +176 AUE_NULL MSTD { int linux_rt_sigpending(l_sigset_t *set, \ + l_size_t sigsetsize); } 177 AUE_NULL MSTD { int linux_rt_sigtimedwait(void); } 178 AUE_NULL MSTD { int linux_rt_sigqueueinfo(void); } 179 AUE_NULL MSTD { int linux_rt_sigsuspend( \ diff --git a/sys/compat/linux/linux_signal.c b/sys/compat/linux/linux_signal.c index 1fc5bb4..252e553 100644 --- a/sys/compat/linux/linux_signal.c +++ b/sys/compat/linux/linux_signal.c @@ -406,6 +406,34 @@ linux_sigpending(struct thread *td, struct linux_sigpending_args *args) mask = lset.__bits[0]; return (copyout(&mask, args->mask, sizeof(mask))); } + +/* + * MPSAFE + */ +int +linux_rt_sigpending(struct thread *td, struct linux_rt_sigpending_args *args) +{ + struct proc *p = td->td_proc; + sigset_t bset; + l_sigset_t lset; + + if (args->sigsetsize > sizeof(lset)) + return EINVAL; + /* NOT REACHED */ + +#ifdef DEBUG + if (ldebug(rt_sigpending)) + printf(ARGS(rt_sigpending, "*")); +#endif + + PROC_LOCK(p); + bset = p->p_siglist; + SIGSETOR(bset, td->td_siglist); + SIGSETAND(bset, td->td_sigmask); + PROC_UNLOCK(p); + bsd_to_linux_sigset(&bset, &lset); + return (copyout(&lset, args->set, args->sigsetsize)); +} #endif /*!__alpha__*/ int diff --git a/sys/i386/linux/linux_dummy.c b/sys/i386/linux/linux_dummy.c index e97c5fa..5b623f4 100644 --- a/sys/i386/linux/linux_dummy.c +++ b/sys/i386/linux/linux_dummy.c @@ -57,7 +57,6 @@ DUMMY(vm86); DUMMY(query_module); DUMMY(nfsservctl); DUMMY(prctl); -DUMMY(rt_sigpending); DUMMY(rt_sigtimedwait); DUMMY(rt_sigqueueinfo); DUMMY(capget); diff --git a/sys/i386/linux/syscalls.master b/sys/i386/linux/syscalls.master index aec641f..22f7e5f 100644 --- a/sys/i386/linux/syscalls.master +++ b/sys/i386/linux/syscalls.master @@ -312,7 +312,8 @@ 175 AUE_NULL MSTD { int linux_rt_sigprocmask(l_int how, \ l_sigset_t *mask, l_sigset_t *omask, \ l_size_t sigsetsize); } -176 AUE_NULL MSTD { int linux_rt_sigpending(void); } +176 AUE_NULL MSTD { int linux_rt_sigpending(l_sigset_t *set, \ + l_size_t sigsetsize); } 177 AUE_NULL MSTD { int linux_rt_sigtimedwait(void); } 178 AUE_NULL MSTD { int linux_rt_sigqueueinfo(void); } 179 AUE_NULL MSTD { int linux_rt_sigsuspend( \ |