summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornetchild <netchild@FreeBSD.org>2006-05-10 18:17:29 +0000
committernetchild <netchild@FreeBSD.org>2006-05-10 18:17:29 +0000
commit24c492f42c1f3598483abed69e3e2636b88bc2d2 (patch)
treefa471bf4cced56b25d7e9dca0c38878b1532c4bf
parent3747ef53419cdf3a75d078d7e2509fa3c44c049e (diff)
downloadFreeBSD-src-24c492f42c1f3598483abed69e3e2636b88bc2d2.zip
FreeBSD-src-24c492f42c1f3598483abed69e3e2636b88bc2d2.tar.gz
Implement rt_sigpending in the linuxolator.
PR: 92671 Submitted by: Markus Niemist"o <markus.niemisto@gmx.net>
-rw-r--r--sys/amd64/linux32/linux32_dummy.c1
-rw-r--r--sys/amd64/linux32/syscalls.master3
-rw-r--r--sys/compat/linux/linux_signal.c28
-rw-r--r--sys/i386/linux/linux_dummy.c1
-rw-r--r--sys/i386/linux/syscalls.master3
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( \
OpenPOWER on IntegriCloud