svn commit: r314909 - in stable/11/sys: amd64/linux amd64/linux32 compat/linux i386/linux

Mahdi Mokhtari mmokhi at FreeBSD.org
Wed Mar 8 13:09:14 UTC 2017


Author: mmokhi (ports committer)
Date: Wed Mar  8 13:09:12 2017
New Revision: 314909
URL: https://svnweb.freebsd.org/changeset/base/314909

Log:
  MFC r314219
  Add linux_preadv() and linux_pwritev() syscalls to Linuxulator.
  
  Approved by:	dchagin

Modified:
  stable/11/sys/amd64/linux/linux_dummy.c
  stable/11/sys/amd64/linux32/linux.h
  stable/11/sys/amd64/linux32/linux32_dummy.c
  stable/11/sys/amd64/linux32/linux32_machdep.c
  stable/11/sys/compat/linux/linux_file.c
  stable/11/sys/i386/linux/linux_dummy.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/amd64/linux/linux_dummy.c
==============================================================================
--- stable/11/sys/amd64/linux/linux_dummy.c	Wed Mar  8 12:18:58 2017	(r314908)
+++ stable/11/sys/amd64/linux/linux_dummy.c	Wed Mar  8 13:09:12 2017	(r314909)
@@ -111,9 +111,6 @@ DUMMY(timerfd_gettime);
 /* linux 2.6.27: */
 DUMMY(signalfd4);
 DUMMY(inotify_init1);
-/* linux 2.6.30: */
-DUMMY(preadv);
-DUMMY(pwritev);
 /* linux 2.6.31: */
 DUMMY(rt_tgsigqueueinfo);
 DUMMY(perf_event_open);

Modified: stable/11/sys/amd64/linux32/linux.h
==============================================================================
--- stable/11/sys/amd64/linux32/linux.h	Wed Mar  8 12:18:58 2017	(r314908)
+++ stable/11/sys/amd64/linux32/linux.h	Wed Mar  8 13:09:12 2017	(r314909)
@@ -663,6 +663,7 @@ struct l_user_desc {
 	(((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1)
 
 struct iovec;
+struct uio;
 
 struct l_iovec32 {
 	uint32_t	iov_base;
@@ -671,6 +672,8 @@ struct l_iovec32 {
 
 int linux32_copyiniov(struct l_iovec32 *iovp32, l_ulong iovcnt,
 			    struct iovec **iovp, int error);
+int linux32_copyinuio(struct l_iovec32 *iovp, l_ulong iovcnt,
+			    struct uio **uiop);
 int linux_copyout_rusage(struct rusage *ru, void *uaddr);
 
 /* robust futexes */

Modified: stable/11/sys/amd64/linux32/linux32_dummy.c
==============================================================================
--- stable/11/sys/amd64/linux32/linux32_dummy.c	Wed Mar  8 12:18:58 2017	(r314908)
+++ stable/11/sys/amd64/linux32/linux32_dummy.c	Wed Mar  8 13:09:12 2017	(r314909)
@@ -110,9 +110,6 @@ DUMMY(timerfd_gettime);
 /* linux 2.6.27: */
 DUMMY(signalfd4);
 DUMMY(inotify_init1);
-/* linux 2.6.30: */
-DUMMY(preadv);
-DUMMY(pwritev);
 /* linux 2.6.31: */
 DUMMY(rt_tgsigqueueinfo);
 DUMMY(perf_event_open);

Modified: stable/11/sys/amd64/linux32/linux32_machdep.c
==============================================================================
--- stable/11/sys/amd64/linux32/linux32_machdep.c	Wed Mar  8 12:18:58 2017	(r314908)
+++ stable/11/sys/amd64/linux32/linux32_machdep.c	Wed Mar  8 13:09:12 2017	(r314909)
@@ -144,7 +144,7 @@ linux_execve(struct thread *td, struct l
 
 CTASSERT(sizeof(struct l_iovec32) == 8);
 
-static int
+int
 linux32_copyinuio(struct l_iovec32 *iovp, l_ulong iovcnt, struct uio **uiop)
 {
 	struct l_iovec32 iov32;

Modified: stable/11/sys/compat/linux/linux_file.c
==============================================================================
--- stable/11/sys/compat/linux/linux_file.c	Wed Mar  8 12:18:58 2017	(r314908)
+++ stable/11/sys/compat/linux/linux_file.c	Wed Mar  8 13:09:12 2017	(r314909)
@@ -1062,6 +1062,62 @@ linux_pwrite(td, uap)
 }
 
 int
+linux_preadv(struct thread *td, struct linux_preadv_args *uap)
+{
+	struct uio *auio;
+	int error;
+	off_t offset;
+
+	/*
+	 * According http://man7.org/linux/man-pages/man2/preadv.2.html#NOTES
+	 * pos_l and pos_h, respectively, contain the
+	 * low order and high order 32 bits of offset.
+	 */
+	offset = (((off_t)uap->pos_h << (sizeof(offset) * 4)) <<
+	    (sizeof(offset) * 4)) | uap->pos_l;
+	if (offset < 0)
+		return (EINVAL);
+#ifdef COMPAT_LINUX32
+	error = linux32_copyinuio(PTRIN(uap->vec), uap->vlen, &auio);
+#else
+	error = copyinuio(uap->vec, uap->vlen, &auio);
+#endif
+	if (error != 0)
+		return (error);
+	error = kern_preadv(td, uap->fd, auio, offset);
+	free(auio, M_IOV);
+	return (error);
+}
+
+int
+linux_pwritev(struct thread *td, struct linux_pwritev_args *uap)
+{
+	struct uio *auio;
+	int error;
+	off_t offset;
+
+	/*
+	 * According http://man7.org/linux/man-pages/man2/pwritev.2.html#NOTES
+	 * pos_l and pos_h, respectively, contain the
+	 * low order and high order 32 bits of offset.
+	 */
+	offset = (((off_t)uap->pos_h << (sizeof(offset) * 4)) <<
+	    (sizeof(offset) * 4)) | uap->pos_l;
+	if (offset < 0)
+		return (EINVAL);
+#ifdef COMPAT_LINUX32
+	error = linux32_copyinuio(PTRIN(uap->vec), uap->vlen, &auio);
+#else
+	error = copyinuio(uap->vec, uap->vlen, &auio);
+#endif
+	if (error != 0)
+		return (error);
+	error = kern_pwritev(td, uap->fd, auio, offset);
+	free(auio, M_IOV);
+	return (error);
+}
+
+int
 linux_mount(struct thread *td, struct linux_mount_args *args)
 {
 	char fstypename[MFSNAMELEN];

Modified: stable/11/sys/i386/linux/linux_dummy.c
==============================================================================
--- stable/11/sys/i386/linux/linux_dummy.c	Wed Mar  8 12:18:58 2017	(r314908)
+++ stable/11/sys/i386/linux/linux_dummy.c	Wed Mar  8 13:09:12 2017	(r314909)
@@ -106,9 +106,6 @@ DUMMY(timerfd_gettime);
 /* linux 2.6.27: */
 DUMMY(signalfd4);
 DUMMY(inotify_init1);
-/* linux 2.6.30: */
-DUMMY(preadv);
-DUMMY(pwritev);
 /* linux 2.6.31: */
 DUMMY(rt_tgsigqueueinfo);
 DUMMY(perf_event_open);


More information about the svn-src-all mailing list