svn commit: r247219 - in user/dchagin/lemul/sys: amd64/linux32 compat/linux i386/linux
Dmitry Chagin
dchagin at FreeBSD.org
Sun Feb 24 11:31:03 UTC 2013
Author: dchagin
Date: Sun Feb 24 11:31:00 2013
New Revision: 247219
URL: http://svnweb.freebsd.org/changeset/base/247219
Log:
Implement waitid() system call.
Modified:
user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c
user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c
user/dchagin/lemul/sys/amd64/linux32/syscalls.master
user/dchagin/lemul/sys/compat/linux/linux_misc.h
user/dchagin/lemul/sys/i386/linux/linux_dummy.c
user/dchagin/lemul/sys/i386/linux/linux_machdep.c
user/dchagin/lemul/sys/i386/linux/syscalls.master
Modified: user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c
==============================================================================
--- user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c Sun Feb 24 11:28:51 2013 (r247218)
+++ user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c Sun Feb 24 11:31:00 2013 (r247219)
@@ -90,7 +90,6 @@ DUMMY(mq_timedreceive);
DUMMY(mq_notify);
DUMMY(mq_getsetattr);
DUMMY(kexec_load);
-DUMMY(waitid);
/* linux 2.6.11: */
DUMMY(add_key);
DUMMY(request_key);
Modified: user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c
==============================================================================
--- user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c Sun Feb 24 11:28:51 2013 (r247218)
+++ user/dchagin/lemul/sys/amd64/linux32/linux32_machdep.c Sun Feb 24 11:31:00 2013 (r247219)
@@ -1046,3 +1046,64 @@ linux_wait4(struct thread *td, struct li
return (error);
}
+
+int
+linux_waitid(struct thread *td, struct linux_waitid_args *args)
+{
+ int status, options, sig;
+ struct __wrusage wru;
+ struct l_rusage lru;
+ siginfo_t siginfo;
+ l_siginfo_t lsi;
+ idtype_t idtype;
+ int error;
+
+ options = 0;
+ linux_to_bsd_waitopts(args->options, &options);
+
+ if (options & ~(WNOHANG | WNOWAIT | WEXITED | WUNTRACED | WCONTINUED))
+ return (EINVAL);
+ if (!(options & (WEXITED | WUNTRACED | WCONTINUED)))
+ return (EINVAL);
+
+ switch (args->idtype) {
+ case LINUX_P_ALL:
+ idtype = P_ALL;
+ break;
+ case LINUX_P_PID:
+ if (args->id <= 0)
+ return (EINVAL);
+ idtype = P_PID;
+ break;
+ case LINUX_P_PGID:
+ if (args->id <= 0)
+ return (EINVAL);
+ idtype = P_PGID;
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ error = kern_wait6(td, idtype, args->id, &status, options,
+ &wru, &siginfo);
+ if (error)
+ return (error);
+ td->td_retval[0] = 0;
+
+ if (args->rusage != NULL) {
+ bsd_to_linux_rusage(&wru.wru_children, &lru);
+ error = copyout(&lru, args->rusage, sizeof(lru));
+ if (error)
+ return (error);
+ }
+
+ if (args->info != NULL) {
+ sig = siginfo.si_signo;
+ if (siginfo.si_signo <= td->td_proc->p_sysent->sv_sigsize)
+ sig = td->td_proc->p_sysent->sv_sigtbl[_SIG_IDX(sig)];
+ siginfo_to_lsiginfo(&siginfo, &lsi, sig);
+ error = copyout(&lsi, args->info, sizeof(lsi));
+ }
+
+ return (error);
+}
Modified: user/dchagin/lemul/sys/amd64/linux32/syscalls.master
==============================================================================
--- user/dchagin/lemul/sys/amd64/linux32/syscalls.master Sun Feb 24 11:28:51 2013 (r247218)
+++ user/dchagin/lemul/sys/amd64/linux32/syscalls.master Sun Feb 24 11:31:00 2013 (r247219)
@@ -464,7 +464,8 @@
281 AUE_NULL STD { int linux_mq_notify(void); }
282 AUE_NULL STD { int linux_mq_getsetattr(void); }
283 AUE_NULL STD { int linux_kexec_load(void); }
-284 AUE_NULL STD { int linux_waitid(void); }
+284 AUE_WAIT6 STD { int linux_waitid(int idtype, l_pid_t id, l_siginfo_t *info, \
+ int options, struct l_rusage *rusage); }
285 AUE_NULL UNIMPL
; linux 2.6.11:
286 AUE_NULL STD { int linux_add_key(void); }
Modified: user/dchagin/lemul/sys/compat/linux/linux_misc.h
==============================================================================
--- user/dchagin/lemul/sys/compat/linux/linux_misc.h Sun Feb 24 11:28:51 2013 (r247218)
+++ user/dchagin/lemul/sys/compat/linux/linux_misc.h Sun Feb 24 11:31:00 2013 (r247219)
@@ -122,6 +122,12 @@ extern int stclohz;
#define __WALL 0x40000000
#define __WCLONE 0x80000000
+/* Linux waitid idtype */
+#define LINUX_P_ALL 0
+#define LINUX_P_PID 1
+#define LINUX_P_PGID 2
+
+
int linux_common_wait(struct thread *td, int pid, int *status,
int options, struct rusage *ru);
void linux_to_bsd_waitopts(int options, int *bsdopts);
Modified: user/dchagin/lemul/sys/i386/linux/linux_dummy.c
==============================================================================
--- user/dchagin/lemul/sys/i386/linux/linux_dummy.c Sun Feb 24 11:28:51 2013 (r247218)
+++ user/dchagin/lemul/sys/i386/linux/linux_dummy.c Sun Feb 24 11:31:00 2013 (r247219)
@@ -81,7 +81,6 @@ DUMMY(mbind);
DUMMY(get_mempolicy);
DUMMY(set_mempolicy);
DUMMY(kexec_load);
-DUMMY(waitid);
/* linux 2.6.11: */
DUMMY(add_key);
DUMMY(request_key);
Modified: user/dchagin/lemul/sys/i386/linux/linux_machdep.c
==============================================================================
--- user/dchagin/lemul/sys/i386/linux/linux_machdep.c Sun Feb 24 11:28:51 2013 (r247218)
+++ user/dchagin/lemul/sys/i386/linux/linux_machdep.c Sun Feb 24 11:31:00 2013 (r247219)
@@ -1097,3 +1097,63 @@ linux_wait4(struct thread *td, struct li
return (error);
}
+
+int
+linux_waitid(struct thread *td, struct linux_waitid_args *args)
+{
+ int status, options, sig;
+ struct __wrusage wru;
+ siginfo_t siginfo;
+ l_siginfo_t lsi;
+ idtype_t idtype;
+ int error;
+
+ options = 0;
+ linux_to_bsd_waitopts(args->options, &options);
+
+ if (options & ~(WNOHANG | WNOWAIT | WEXITED | WUNTRACED | WCONTINUED))
+ return (EINVAL);
+ if (!(options & (WEXITED | WUNTRACED | WCONTINUED)))
+ return (EINVAL);
+
+ switch (args->idtype) {
+ case LINUX_P_ALL:
+ idtype = P_ALL;
+ break;
+ case LINUX_P_PID:
+ if (args->id <= 0)
+ return (EINVAL);
+ idtype = P_PID;
+ break;
+ case LINUX_P_PGID:
+ if (args->id <= 0)
+ return (EINVAL);
+ idtype = P_PGID;
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ error = kern_wait6(td, idtype, args->id, &status, options,
+ &wru, &siginfo);
+ if (error)
+ return (error);
+ td->td_retval[0] = 0;
+
+ if (args->rusage != NULL) {
+ error = copyout(&wru.wru_children, args->rusage,
+ sizeof(wru.wru_children));
+ if (error)
+ return (error);
+ }
+
+ if (args->info != NULL) {
+ sig = siginfo.si_signo;
+ if (siginfo.si_signo <= td->td_proc->p_sysent->sv_sigsize)
+ sig = td->td_proc->p_sysent->sv_sigtbl[_SIG_IDX(sig)];
+ siginfo_to_lsiginfo(&siginfo, &lsi, sig);
+ error = copyout(&lsi, args->info, sizeof(lsi));
+ }
+
+ return (error);
+}
Modified: user/dchagin/lemul/sys/i386/linux/syscalls.master
==============================================================================
--- user/dchagin/lemul/sys/i386/linux/syscalls.master Sun Feb 24 11:28:51 2013 (r247218)
+++ user/dchagin/lemul/sys/i386/linux/syscalls.master Sun Feb 24 11:31:00 2013 (r247219)
@@ -474,7 +474,8 @@
282 AUE_NULL STD { int linux_mq_getsetattr(l_mqd_t mqd, const struct mq_attr *attr, \
struct mq_attr *oattr); }
283 AUE_NULL STD { int linux_kexec_load(void); }
-284 AUE_NULL STD { int linux_waitid(void); }
+284 AUE_WAIT6 STD { int linux_waitid(int idtype, l_pid_t id, l_siginfo_t *info, \
+ int options, struct l_rusage *rusage); }
285 AUE_NULL UNIMPL
; linux 2.6.11:
286 AUE_NULL STD { int linux_add_key(void); }
More information about the svn-src-user
mailing list