kern/92671: [PATCH] Fix for Maple 10: implement rt_sigpending linux
syscall
Markus Niemistö
markus.niemisto at gmx.net
Wed Feb 1 00:00:16 PST 2006
>Number: 92671
>Category: kern
>Synopsis: [PATCH] Fix for Maple 10: implement rt_sigpending linux syscall
>Confidential: no
>Severity: non-critical
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed Feb 01 08:00:15 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator: Markus Niemistö
>Release: FreeBSD 6-STABLE
>Organization:
>Environment:
FreeBSD kon.dielocalwarez.com 6.0-STABLE FreeBSD 6.0-STABLE #91: Fri Jan 27 20:30:38 EET 2006 root at kon.dielocalwarez.com:/usr/src/sys/amd64/compile/KON amd64
>Description:
FreeBSD has no rt_sigpending implementation in its Linux emulation layer. This syscall is needed atleast by Maple 10.
>How-To-Repeat:
Try to use Maple 10
>Fix:
Apply the following patch, that implements the syscall on i386 and amd64:
--- compat/linux/linux_signal.c Sun Feb 13 21:50:57 2005
+++ compat/linux/linux_signal.c Tue Jan 3 10:43:51 2006
@@ -406,6 +406,34 @@
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
--- amd64/linux32/linux32_dummy.c Mon Aug 16 10:55:06 2004
+++ amd64/linux32/linux32_dummy.c Tue Jan 3 10:44:33 2006
@@ -54,7 +54,6 @@
DUMMY(query_module);
DUMMY(nfsservctl);
DUMMY(prctl);
-DUMMY(rt_sigpending);
DUMMY(rt_sigtimedwait);
DUMMY(rt_sigqueueinfo);
DUMMY(capget);
--- amd64/linux32/syscalls.master Wed Jul 20 20:42:14 2005
+++ amd64/linux32/syscalls.master Tue Jan 3 10:44:21 2006
@@ -310,7 +310,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( \
--- amd64/linux32/linux32_proto.h Wed Feb 1 09:36:43 2006
+++ amd64/linux32/linux32_proto.h Wed Feb 1 09:37:09 2006
@@ -2,7 +2,7 @@
* System call prototypes.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_proto.h,v 1.5.2.1 2005/07/20 17:43:52 jhb Exp $
+ * $FreeBSD$
* created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.4.2.1 2005/07/20 17:42:14 jhb Exp
*/
@@ -518,7 +518,8 @@
char sigsetsize_l_[PADL_(l_size_t)]; l_size_t sigsetsize; char sigsetsize_r_[PADR_(l_size_t)];
};
struct linux_rt_sigpending_args {
- register_t dummy;
+ char set_l_[PADL_(l_sigset_t *)]; l_sigset_t * set; char set_r_[PADR_(l_sigset_t *)];
+ char sigsetsize_l_[PADL_(l_size_t)]; l_size_t sigsetsize; char sigsetsize_r_[PADR_(l_size_t)];
};
struct linux_rt_sigtimedwait_args {
register_t dummy;
--- amd64/linux32/linux32_syscall.h Wed Feb 1 09:36:43 2006
+++ amd64/linux32/linux32_syscall.h Wed Feb 1 09:37:09 2006
@@ -2,7 +2,7 @@
* System call numbers.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_syscall.h,v 1.5.2.1 2005/07/20 17:43:52 jhb Exp $
+ * $FreeBSD$
* created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.4.2.1 2005/07/20 17:42:14 jhb Exp
*/
--- amd64/linux32/linux32_sysent.c Wed Feb 1 09:36:43 2006
+++ amd64/linux32/linux32_sysent.c Wed Feb 1 09:37:09 2006
@@ -2,7 +2,7 @@
* System call switch table.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_sysent.c,v 1.5.2.1 2005/07/20 17:43:52 jhb Exp $
+ * $FreeBSD$
* created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.4.2.1 2005/07/20 17:42:14 jhb Exp
*/
@@ -196,7 +196,7 @@
{ SYF_MPSAFE | AS(linux_rt_sigreturn_args), (sy_call_t *)linux_rt_sigreturn, AUE_NULL }, /* 173 = linux_rt_sigreturn */
{ SYF_MPSAFE | AS(linux_rt_sigaction_args), (sy_call_t *)linux_rt_sigaction, AUE_NULL }, /* 174 = linux_rt_sigaction */
{ SYF_MPSAFE | AS(linux_rt_sigprocmask_args), (sy_call_t *)linux_rt_sigprocmask, AUE_NULL }, /* 175 = linux_rt_sigprocmask */
- { SYF_MPSAFE | 0, (sy_call_t *)linux_rt_sigpending, AUE_NULL }, /* 176 = linux_rt_sigpending */
+ { SYF_MPSAFE | AS(linux_rt_sigpending_args), (sy_call_t *)linux_rt_sigpending, AUE_NULL }, /* 176 = linux_rt_sigpending */
{ SYF_MPSAFE | 0, (sy_call_t *)linux_rt_sigtimedwait, AUE_NULL }, /* 177 = linux_rt_sigtimedwait */
{ SYF_MPSAFE | 0, (sy_call_t *)linux_rt_sigqueueinfo, AUE_NULL }, /* 178 = linux_rt_sigqueueinfo */
{ SYF_MPSAFE | AS(linux_rt_sigsuspend_args), (sy_call_t *)linux_rt_sigsuspend, AUE_NULL }, /* 179 = linux_rt_sigsuspend */
--- i386/linux/linux_dummy.c Wed Feb 1 09:41:23 2006
+++ i386/linux/linux_dummy.c Wed Feb 1 09:42:33 2006
@@ -58,7 +58,6 @@
DUMMY(query_module);
DUMMY(nfsservctl);
DUMMY(prctl);
-DUMMY(rt_sigpending);
DUMMY(rt_sigtimedwait);
DUMMY(rt_sigqueueinfo);
DUMMY(capget);
--- i386/linux/linux_proto.h Wed Feb 1 09:41:23 2006
+++ i386/linux/linux_proto.h Wed Feb 1 09:42:37 2006
@@ -2,7 +2,7 @@
* System call prototypes.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/i386/linux/linux_proto.h,v 1.64.2.1 2005/07/20 17:43:53 jhb Exp $
+ * $FreeBSD$
* created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.61.2.1 2005/07/20 17:42:15 jhb Exp
*/
@@ -513,7 +513,8 @@
char sigsetsize_l_[PADL_(l_size_t)]; l_size_t sigsetsize; char sigsetsize_r_[PADR_(l_size_t)];
};
struct linux_rt_sigpending_args {
- register_t dummy;
+ char set_l_[PADL_(l_sigset_t *)]; l_sigset_t * set; char set_r_[PADR_(l_sigset_t *)];
+ char sigsetsize_l_[PADL_(l_size_t)]; l_size_t sigsetsize; char sigsetsize_r_[PADR_(l_size_t)];
};
struct linux_rt_sigtimedwait_args {
register_t dummy;
--- i386/linux/linux_syscall.h Wed Feb 1 09:41:23 2006
+++ i386/linux/linux_syscall.h Wed Feb 1 09:42:37 2006
@@ -2,7 +2,7 @@
* System call numbers.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/i386/linux/linux_syscall.h,v 1.58.2.1 2005/07/20 17:43:53 jhb Exp $
+ * $FreeBSD$
* created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.61.2.1 2005/07/20 17:42:15 jhb Exp
*/
--- i386/linux/linux_sysent.c Wed Feb 1 09:41:23 2006
+++ i386/linux/linux_sysent.c Wed Feb 1 09:42:37 2006
@@ -2,7 +2,7 @@
* System call switch table.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/i386/linux/linux_sysent.c,v 1.65.2.1 2005/07/20 17:43:53 jhb Exp $
+ * $FreeBSD$
* created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.61.2.1 2005/07/20 17:42:15 jhb Exp
*/
@@ -196,7 +196,7 @@
{ SYF_MPSAFE | AS(linux_rt_sigreturn_args), (sy_call_t *)linux_rt_sigreturn, AUE_NULL }, /* 173 = linux_rt_sigreturn */
{ SYF_MPSAFE | AS(linux_rt_sigaction_args), (sy_call_t *)linux_rt_sigaction, AUE_NULL }, /* 174 = linux_rt_sigaction */
{ SYF_MPSAFE | AS(linux_rt_sigprocmask_args), (sy_call_t *)linux_rt_sigprocmask, AUE_NULL }, /* 175 = linux_rt_sigprocmask */
- { SYF_MPSAFE | 0, (sy_call_t *)linux_rt_sigpending, AUE_NULL }, /* 176 = linux_rt_sigpending */
+ { SYF_MPSAFE | AS(linux_rt_sigpending_args), (sy_call_t *)linux_rt_sigpending, AUE_NULL }, /* 176 = linux_rt_sigpending */
{ SYF_MPSAFE | 0, (sy_call_t *)linux_rt_sigtimedwait, AUE_NULL }, /* 177 = linux_rt_sigtimedwait */
{ SYF_MPSAFE | 0, (sy_call_t *)linux_rt_sigqueueinfo, AUE_NULL }, /* 178 = linux_rt_sigqueueinfo */
{ SYF_MPSAFE | AS(linux_rt_sigsuspend_args), (sy_call_t *)linux_rt_sigsuspend, AUE_NULL }, /* 179 = linux_rt_sigsuspend */
--- i386/linux/syscalls.master Wed Feb 1 09:41:23 2006
+++ i386/linux/syscalls.master Wed Feb 1 09:42:16 2006
@@ -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( \
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list