Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 24 Feb 2013 11:31:00 +0000 (UTC)
From:      Dmitry Chagin <dchagin@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r247219 - in user/dchagin/lemul/sys: amd64/linux32 compat/linux i386/linux
Message-ID:  <201302241131.r1OBV0c0012664@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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); }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201302241131.r1OBV0c0012664>