Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Feb 2013 19:35:04 +0000 (UTC)
From:      Dmitry Chagin <dchagin@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r247493 - in user/dchagin/lemul/sys: amd64/linux32 compat/linux i386/linux
Message-ID:  <201302281935.r1SJZ4nS020571@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dchagin
Date: Thu Feb 28 19:35:04 2013
New Revision: 247493
URL: http://svnweb.freebsd.org/changeset/base/247493

Log:
  Implement pselect6() system call.

Modified:
  user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c
  user/dchagin/lemul/sys/amd64/linux32/syscalls.master
  user/dchagin/lemul/sys/compat/linux/linux_misc.c
  user/dchagin/lemul/sys/i386/linux/linux_dummy.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	Thu Feb 28 19:01:04 2013	(r247492)
+++ user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c	Thu Feb 28 19:35:04 2013	(r247493)
@@ -101,7 +101,6 @@ DUMMY(inotify_add_watch);
 DUMMY(inotify_rm_watch);
 /* linux 2.6.16: */
 DUMMY(migrate_pages);
-DUMMY(pselect6);
 DUMMY(ppoll);
 DUMMY(unshare);
 /* linux 2.6.17: */

Modified: user/dchagin/lemul/sys/amd64/linux32/syscalls.master
==============================================================================
--- user/dchagin/lemul/sys/amd64/linux32/syscalls.master	Thu Feb 28 19:01:04 2013	(r247492)
+++ user/dchagin/lemul/sys/amd64/linux32/syscalls.master	Thu Feb 28 19:35:04 2013	(r247493)
@@ -505,7 +505,10 @@
 306	AUE_FCHMODAT	STD	{ int linux_fchmodat(l_int dfd, const char *filename, \
 					l_mode_t mode); }
 307	AUE_FACCESSAT	STD	{ int linux_faccessat(l_int dfd, const char *filename, l_int amode, int flag); }
-308	AUE_NULL	STD	{ int linux_pselect6(void); }
+308	AUE_SELECT	STD	{ int linux_pselect6(l_int nfds,		\
+				    l_fd_set *readfds, l_fd_set *writefds,	\
+				    l_fd_set *exceptfds,			\
+				    struct l_timespec *tsp, l_uintptr_t *sig); }
 309	AUE_NULL	STD	{ int linux_ppoll(void); }
 310	AUE_NULL	STD	{ int linux_unshare(void); }
 ; linux 2.6.17:

Modified: user/dchagin/lemul/sys/compat/linux/linux_misc.c
==============================================================================
--- user/dchagin/lemul/sys/compat/linux/linux_misc.c	Thu Feb 28 19:01:04 2013	(r247492)
+++ user/dchagin/lemul/sys/compat/linux/linux_misc.c	Thu Feb 28 19:35:04 2013	(r247493)
@@ -116,6 +116,12 @@ struct l_sysinfo {
 	l_uint		mem_unit;
 	char		_f[20-2*sizeof(l_long)-sizeof(l_int)];	/* padding */
 };
+
+struct l_pselect6arg {
+	l_sigset_t	*ss;
+	l_size_t	ss_len;
+};
+
 int
 linux_sysinfo(struct thread *td, struct linux_sysinfo_args *args)
 {
@@ -2070,3 +2076,78 @@ out:
 	PRELE(p);
 	return (error);
 }
+
+int
+linux_pselect6(struct thread *td, struct linux_pselect6_args *args)
+{
+	struct timeval utv, tv0, tv1, *tvp;
+	struct l_pselect6arg lpse6;
+	struct l_timespec lts;
+	struct timespec uts;
+	l_sigset_t l_ss;
+	sigset_t *ssp;
+	sigset_t ss;
+	int error;
+
+	if (args->sig) {
+		error = copyin(args->sig, &lpse6, sizeof(lpse6));
+		if (error)
+			return (error);
+		if (lpse6.ss_len != sizeof(l_ss))
+			return (EINVAL);
+		error = copyin(lpse6.ss, &l_ss, sizeof(l_ss));
+		if (error)
+			return (error);
+		linux_to_bsd_sigset(&l_ss, &ss);
+		ssp = &ss;
+	} else
+		ssp = NULL;
+
+	/*
+	 * Currently glibc changes nanosecond number to microsecond.
+	 * This mean losing precision but for now it is hardly seen.
+	 */
+	if (args->tsp) {
+		error = copyin(args->tsp, &lts, sizeof(lts));
+		if (error)
+			return (error);
+		uts.tv_sec = lts.tv_sec;
+		uts.tv_nsec = lts.tv_nsec;
+
+		TIMESPEC_TO_TIMEVAL(&utv, &uts);
+		if (itimerfix(&utv))
+			return (EINVAL);
+
+		microtime(&tv0);
+		tvp = &utv;
+	} else
+		tvp = NULL;
+
+	error = kern_pselect(td, args->nfds, args->readfds, args->writefds,
+	    args->exceptfds, tvp, ssp, sizeof(l_int) * 8);
+
+	if (error == 0 && args->tsp) {
+		if (td->td_retval[0]) {
+			/*
+			 * Compute how much time was left of the timeout,
+			 * by subtracting the current time and the time
+			 * before we started the call, and subtracting
+			 * that result from the user-supplied value.
+			 */
+
+			microtime(&tv1);
+			timevalsub(&tv1, &tv0);
+			timevalsub(&utv, &tv1);
+			if (utv.tv_sec < 0)
+				timevalclear(&utv);
+		} else
+			timevalclear(&utv);
+
+		TIMEVAL_TO_TIMESPEC(&utv, &uts);
+		lts.tv_sec = uts.tv_sec;
+		lts.tv_nsec = uts.tv_nsec;
+		error = copyout(&lts, args->tsp, sizeof(lts));
+	}
+
+	return (error);
+}

Modified: user/dchagin/lemul/sys/i386/linux/linux_dummy.c
==============================================================================
--- user/dchagin/lemul/sys/i386/linux/linux_dummy.c	Thu Feb 28 19:01:04 2013	(r247492)
+++ user/dchagin/lemul/sys/i386/linux/linux_dummy.c	Thu Feb 28 19:35:04 2013	(r247493)
@@ -92,7 +92,6 @@ DUMMY(inotify_add_watch);
 DUMMY(inotify_rm_watch);
 /* linux 2.6.16: */
 DUMMY(migrate_pages);
-DUMMY(pselect6);
 DUMMY(ppoll);
 DUMMY(unshare);
 /* linux 2.6.17: */

Modified: user/dchagin/lemul/sys/i386/linux/syscalls.master
==============================================================================
--- user/dchagin/lemul/sys/i386/linux/syscalls.master	Thu Feb 28 19:01:04 2013	(r247492)
+++ user/dchagin/lemul/sys/i386/linux/syscalls.master	Thu Feb 28 19:35:04 2013	(r247493)
@@ -515,7 +515,10 @@
 306	AUE_FCHMODAT	STD	{ int linux_fchmodat(l_int dfd, const char *filename, \
 					l_mode_t mode); }
 307	AUE_FACCESSAT	STD	{ int linux_faccessat(l_int dfd, const char *filename, l_int amode, l_int flag); }
-308	AUE_NULL	STD	{ int linux_pselect6(void); }
+308	AUE_SELECT	STD	{ int linux_pselect6(l_int nfds,			\
+		    			    l_fd_set *readfds, l_fd_set *writefds,	\
+					    l_fd_set *exceptfds,			\
+					    struct l_timespec *tsp, l_uintptr_t *sig); }
 309	AUE_NULL	STD	{ int linux_ppoll(void); }
 310	AUE_NULL	STD	{ int linux_unshare(void); }
 ; linux 2.6.17:



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