Module Name: src Committed By: thorpej Date: Mon Sep 20 02:20:03 UTC 2021
Modified Files: src/sys/compat/linux/arch/alpha: syscalls.master src/sys/compat/linux/arch/amd64: syscalls.master src/sys/compat/linux/arch/arm: syscalls.master src/sys/compat/linux/arch/i386: syscalls.master src/sys/compat/linux/arch/m68k: syscalls.master src/sys/compat/linux/arch/mips: syscalls.master src/sys/compat/linux/arch/powerpc: syscalls.master src/sys/compat/linux/common: linux_file.c src/sys/compat/linux32/arch/amd64: syscalls.master src/sys/compat/linux32/common: linux32_misc.c Log Message: Add preadv(2) and pwritev(2) system calls to COMPAT_LINUX and COMPAT_LINUX32. To generate a diff of this commit: cvs rdiff -u -r1.100 -r1.101 src/sys/compat/linux/arch/alpha/syscalls.master cvs rdiff -u -r1.65 -r1.66 src/sys/compat/linux/arch/amd64/syscalls.master cvs rdiff -u -r1.72 -r1.73 src/sys/compat/linux/arch/arm/syscalls.master cvs rdiff -u -r1.127 -r1.128 src/sys/compat/linux/arch/i386/syscalls.master cvs rdiff -u -r1.98 -r1.99 src/sys/compat/linux/arch/m68k/syscalls.master cvs rdiff -u -r1.71 -r1.72 src/sys/compat/linux/arch/mips/syscalls.master cvs rdiff -u -r1.77 -r1.78 src/sys/compat/linux/arch/powerpc/syscalls.master cvs rdiff -u -r1.119 -r1.120 src/sys/compat/linux/common/linux_file.c cvs rdiff -u -r1.74 -r1.75 src/sys/compat/linux32/arch/amd64/syscalls.master cvs rdiff -u -r1.32 -r1.33 src/sys/compat/linux32/common/linux32_misc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/linux/arch/alpha/syscalls.master diff -u src/sys/compat/linux/arch/alpha/syscalls.master:1.100 src/sys/compat/linux/arch/alpha/syscalls.master:1.101 --- src/sys/compat/linux/arch/alpha/syscalls.master:1.100 Mon Sep 20 00:09:01 2021 +++ src/sys/compat/linux/arch/alpha/syscalls.master Mon Sep 20 02:20:02 2021 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.100 2021/09/20 00:09:01 thorpej Exp $ + $NetBSD: syscalls.master,v 1.101 2021/09/20 02:20:02 thorpej Exp $ ; ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -784,8 +784,12 @@ 487 STD { int|linux_sys||dup3(int from, int to, int flags); } 488 STD { int|linux_sys||pipe2(int *pfds, int flags); } 489 UNIMPL inotify_init1 -490 UNIMPL preadv -491 UNIMPL pwritev +490 STD { int|linux_sys||preadv(int fd, \ + const struct iovec *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } +491 STD { int|linux_sys||pwritev(int fd, \ + const struct iovcnt *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } 492 UNIMPL rt_tgsigqueueinfo 493 UNIMPL perf_counter_open 494 UNIMPL fanotify_init Index: src/sys/compat/linux/arch/amd64/syscalls.master diff -u src/sys/compat/linux/arch/amd64/syscalls.master:1.65 src/sys/compat/linux/arch/amd64/syscalls.master:1.66 --- src/sys/compat/linux/arch/amd64/syscalls.master:1.65 Mon Sep 20 00:09:01 2021 +++ src/sys/compat/linux/arch/amd64/syscalls.master Mon Sep 20 02:20:02 2021 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.65 2021/09/20 00:09:01 thorpej Exp $ + $NetBSD: syscalls.master,v 1.66 2021/09/20 02:20:02 thorpej Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -539,8 +539,12 @@ 292 STD { int|linux_sys||dup3(int from, int to, int flags); } 293 STD { int|linux_sys||pipe2(int *pfds, int flags); } 294 UNIMPL inotify_init1 -295 UNIMPL preadv -296 UNIMPL pwritev +295 STD { int|linux_sys||preadv(int fd, \ + const struct iovec *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } +296 STD { int|linux_sys||pwritev(int fd, \ + const struct iovcnt *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } 297 UNIMPL rt_tgsigqueueinfo 298 UNIMPL perf_counter_open 299 STD { int|linux_sys||recvmmsg(int s, \ Index: src/sys/compat/linux/arch/arm/syscalls.master diff -u src/sys/compat/linux/arch/arm/syscalls.master:1.72 src/sys/compat/linux/arch/arm/syscalls.master:1.73 --- src/sys/compat/linux/arch/arm/syscalls.master:1.72 Mon Sep 20 00:09:01 2021 +++ src/sys/compat/linux/arch/arm/syscalls.master Mon Sep 20 02:20:02 2021 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.72 2021/09/20 00:09:01 thorpej Exp $ + $NetBSD: syscalls.master,v 1.73 2021/09/20 02:20:02 thorpej Exp $ ; Derived from sys/compat/linux/arch/*/syscalls.master ; and from Linux 2.4.12 arch/arm/kernel/calls.S @@ -579,8 +579,12 @@ 358 STD { int|linux_sys||dup3(int from, int to, int flags); } 359 STD { int|linux_sys||pipe2(int *pfds, int flags); } 360 UNIMPL inotify_init1 -361 UNIMPL preadv -362 UNIMPL pwritev +361 STD { int|linux_sys||preadv(int fd, \ + const struct iovec *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } +362 STD { int|linux_sys||pwritev(int fd, \ + const struct iovcnt *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } 363 UNIMPL rt_tgsigqueueinfo 364 UNIMPL perf_counter_open 365 STD { int|linux_sys||recvmmsg(int s, \ Index: src/sys/compat/linux/arch/i386/syscalls.master diff -u src/sys/compat/linux/arch/i386/syscalls.master:1.127 src/sys/compat/linux/arch/i386/syscalls.master:1.128 --- src/sys/compat/linux/arch/i386/syscalls.master:1.127 Mon Sep 20 00:09:01 2021 +++ src/sys/compat/linux/arch/i386/syscalls.master Mon Sep 20 02:20:02 2021 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.127 2021/09/20 00:09:01 thorpej Exp $ + $NetBSD: syscalls.master,v 1.128 2021/09/20 02:20:02 thorpej Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -546,8 +546,12 @@ 330 STD { int|linux_sys||dup3(int from, int to, int flags); } 331 STD { int|linux_sys||pipe2( int *pfds, int flags); } 332 UNIMPL inotify_init1 -333 UNIMPL preadv -334 UNIMPL pwritev +333 STD { int|linux_sys||preadv(int fd, \ + const struct iovec *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } +334 STD { int|linux_sys||pwritev(int fd, \ + const struct iovcnt *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } 335 UNIMPL rt_tgsigqueueinfo 336 UNIMPL perf_counter_open 337 UNIMPL recvmmsg Index: src/sys/compat/linux/arch/m68k/syscalls.master diff -u src/sys/compat/linux/arch/m68k/syscalls.master:1.98 src/sys/compat/linux/arch/m68k/syscalls.master:1.99 --- src/sys/compat/linux/arch/m68k/syscalls.master:1.98 Mon Sep 20 00:09:01 2021 +++ src/sys/compat/linux/arch/m68k/syscalls.master Mon Sep 20 02:20:02 2021 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.98 2021/09/20 00:09:01 thorpej Exp $ + $NetBSD: syscalls.master,v 1.99 2021/09/20 02:20:02 thorpej Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -564,8 +564,12 @@ 326 STD { int|linux_sys||dup3(int from, int to, int flags); } 327 STD { int|linux_sys||pipe2(int *pfds, int flags); } 328 UNIMPL inotify_init1 -329 UNIMPL preadv -330 UNIMPL pwritev +329 STD { int|linux_sys||preadv(int fd, \ + const struct iovec *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } +330 STD { int|linux_sys||pwritev(int fd, \ + const struct iovcnt *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } 331 UNIMPL rt_tgsigqueueinfo 332 UNIMPL perf_counter_open 333 UNIMPL set_thread_area Index: src/sys/compat/linux/arch/mips/syscalls.master diff -u src/sys/compat/linux/arch/mips/syscalls.master:1.71 src/sys/compat/linux/arch/mips/syscalls.master:1.72 --- src/sys/compat/linux/arch/mips/syscalls.master:1.71 Mon Sep 20 00:09:01 2021 +++ src/sys/compat/linux/arch/mips/syscalls.master Mon Sep 20 02:20:02 2021 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.71 2021/09/20 00:09:01 thorpej Exp $ + $NetBSD: syscalls.master,v 1.72 2021/09/20 02:20:02 thorpej Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -553,8 +553,12 @@ 327 STD { int|linux_sys||dup3(int from, int to, int flags); } 328 STD { int|linux_sys||pipe2(int *pfds, int flags); } 329 UNIMPL inotify_init1 -330 UNIMPL preadv -331 UNIMPL pwritev +330 STD { int|linux_sys||preadv(int fd, \ + const struct iovec *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } +331 STD { int|linux_sys||pwritev(int fd, \ + const struct iovcnt *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } 332 UNIMPL rt_tgsigqueueinfo 333 UNIMPL perf_event_open 334 STD { int|linux_sys||accept4(int s, \ Index: src/sys/compat/linux/arch/powerpc/syscalls.master diff -u src/sys/compat/linux/arch/powerpc/syscalls.master:1.77 src/sys/compat/linux/arch/powerpc/syscalls.master:1.78 --- src/sys/compat/linux/arch/powerpc/syscalls.master:1.77 Mon Sep 20 00:09:01 2021 +++ src/sys/compat/linux/arch/powerpc/syscalls.master Mon Sep 20 02:20:02 2021 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.77 2021/09/20 00:09:01 thorpej Exp $ + $NetBSD: syscalls.master,v 1.78 2021/09/20 02:20:02 thorpej Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -553,8 +553,12 @@ 317 STD { int|linux_sys||pipe2(int *pfds, int flags); } 318 UNIMPL inotify_init1 319 UNIMPL perf_event_open -320 UNIMPL preadv -321 UNIMPL pwritev +320 STD { int|linux_sys||preadv(int fd, \ + const struct iovec *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } +321 STD { int|linux_sys||pwritev(int fd, \ + const struct iovcnt *iovp, int iovcnt, \ + unsigned long off_lo, unsigned long off_hi); } 322 UNIMPL rt_tgsigqueueinfo 323 UNIMPL fanotify_init 324 UNIMPL fanotify_mark Index: src/sys/compat/linux/common/linux_file.c diff -u src/sys/compat/linux/common/linux_file.c:1.119 src/sys/compat/linux/common/linux_file.c:1.120 --- src/sys/compat/linux/common/linux_file.c:1.119 Tue Sep 7 11:43:04 2021 +++ src/sys/compat/linux/common/linux_file.c Mon Sep 20 02:20:03 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_file.c,v 1.119 2021/09/07 11:43:04 riastradh Exp $ */ +/* $NetBSD: linux_file.c,v 1.120 2021/09/20 02:20:03 thorpej Exp $ */ /*- * Copyright (c) 1995, 1998, 2008 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_file.c,v 1.119 2021/09/07 11:43:04 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_file.c,v 1.120 2021/09/20 02:20:03 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -136,6 +136,23 @@ bsd_to_linux_ioflags(int bflags) return res; } +static inline off_t +linux_hilo_to_off_t(unsigned long hi, unsigned long lo) +{ +#ifdef _LP64 + /* + * Linux discards the "hi" portion on LP64 platforms; even though + * glibc puts of the upper 32-bits of the offset into the "hi" + * argument regardless, the "lo" argument has all the bits in + * this case. + */ + (void) hi; + return (off_t)lo; +#else + return (((off_t)hi) << 32) | lo; +#endif /* _LP64 */ +} + /* * creat(2) is an obsolete function, but it's present as a Linux * system call, so let's deal with it. @@ -785,6 +802,56 @@ linux_sys_pwrite(struct lwp *l, const st return sys_pwrite(l, &pra, retval); } +/* + * preadv(2) + */ +int +linux_sys_preadv(struct lwp *l, const struct linux_sys_preadv_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const struct iovec *) iovp; + syscallarg(int) iovcnt; + syscallarg(unsigned long) off_lo; + syscallarg(unsigned long) off_hi; + } */ + struct sys_preadv_args ua; + + SCARG(&ua, fd) = SCARG(uap, fd); + SCARG(&ua, iovp) = SCARG(uap, iovp); + SCARG(&ua, iovcnt) = SCARG(uap, iovcnt); + SCARG(&ua, PAD) = 0; + SCARG(&ua, offset) = linux_hilo_to_off_t(SCARG(uap, off_hi), + SCARG(uap, off_lo)); + return sys_preadv(l, &ua, retval); +} + +/* + * pwritev(2) + */ +int +linux_sys_pwritev(struct lwp *l, const struct linux_sys_pwritev_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const struct iovec *) iovp; + syscallarg(int) iovcnt; + syscallarg(unsigned long) off_lo; + syscallarg(unsigned long) off_hi; + } */ + struct sys_pwritev_args ua; + + SCARG(&ua, fd) = SCARG(uap, fd); + SCARG(&ua, iovp) = (const void *)SCARG(uap, iovp); + SCARG(&ua, iovcnt) = SCARG(uap, iovcnt); + SCARG(&ua, PAD) = 0; + SCARG(&ua, offset) = linux_hilo_to_off_t(SCARG(uap, off_hi), + SCARG(uap, off_lo)); + return sys_pwritev(l, &ua, retval); +} + int linux_sys_dup3(struct lwp *l, const struct linux_sys_dup3_args *uap, register_t *retval) Index: src/sys/compat/linux32/arch/amd64/syscalls.master diff -u src/sys/compat/linux32/arch/amd64/syscalls.master:1.74 src/sys/compat/linux32/arch/amd64/syscalls.master:1.75 --- src/sys/compat/linux32/arch/amd64/syscalls.master:1.74 Mon Sep 20 00:09:02 2021 +++ src/sys/compat/linux32/arch/amd64/syscalls.master Mon Sep 20 02:20:03 2021 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.74 2021/09/20 00:09:02 thorpej Exp $ + $NetBSD: syscalls.master,v 1.75 2021/09/20 02:20:03 thorpej Exp $ ; NetBSD i386 COMPAT_LINUX32 system call name/number "master" file. ; (See syscalls.conf to see what it is processed into.) @@ -567,8 +567,12 @@ 330 STD { int|linux32_sys||dup3(int from, int to, int flags); } 331 STD { int|linux32_sys||pipe2(netbsd32_intp fd, int flags); } 332 UNIMPL inotify_init1 -333 UNIMPL preadv -334 UNIMPL pwritev +333 STD { int|linux32_sys||preadv(int fd, \ + const netbsd32_iovecp_t iovp, int iovcnt, \ + netbsd32_u_long off_lo, netbsd32_u_long off_hi); } +334 STD { int|linux32_sys||pwritev(int fd, \ + const netbsd32_iovecp_t iovp, int iovcnt, \ + netbsd32_u_long off_lo, netbsd32_u_long off_hi); } 335 UNIMPL rt_tgsigqueueinfo 336 UNIMPL perf_counter_open 337 UNIMPL recvmmsg Index: src/sys/compat/linux32/common/linux32_misc.c diff -u src/sys/compat/linux32/common/linux32_misc.c:1.32 src/sys/compat/linux32/common/linux32_misc.c:1.33 --- src/sys/compat/linux32/common/linux32_misc.c:1.32 Mon Sep 20 00:09:02 2021 +++ src/sys/compat/linux32/common/linux32_misc.c Mon Sep 20 02:20:03 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_misc.c,v 1.32 2021/09/20 00:09:02 thorpej Exp $ */ +/* $NetBSD: linux32_misc.c,v 1.33 2021/09/20 02:20:03 thorpej Exp $ */ /*- * Copyright (c) 1995, 1998, 1999 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.32 2021/09/20 00:09:02 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.33 2021/09/20 02:20:03 thorpej Exp $"); #include <sys/param.h> #include <sys/proc.h> @@ -380,3 +380,53 @@ linux32_sys_eventfd2(struct lwp *l, cons return linux_sys_eventfd2(l, &ua, retval); } + +static inline off_t +linux32_hilo_to_off_t(unsigned long hi, unsigned long lo) +{ + return (((off_t)hi) << 32) | lo; +} + +int +linux32_sys_preadv(struct lwp *l, const struct linux32_sys_preadv_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const netbsd32_iovecp_t) iovp; + syscallarg(int) iovcnt; + syscallarg(netbsd32_u_long) off_lo; + syscallarg(netbsd32_u_long) off_hi; + } */ + struct netbsd32_preadv_args ua; + + SCARG(&ua, fd) = SCARG(uap, fd); + SCARG(&ua, iovp) = SCARG(uap, iovp); + SCARG(&ua, iovcnt) = SCARG(uap, iovcnt); + SCARG(&ua, PAD) = 0; + SCARG(&ua, offset) = linux32_hilo_to_off_t(SCARG(uap, off_hi), + SCARG(uap, off_lo)); + return netbsd32_preadv(l, &ua, retval); +} + +int +linux32_sys_pwritev(struct lwp *l, const struct linux32_sys_pwritev_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(const netbsd32_iovecp_t) iovp; + syscallarg(int) iovcnt; + syscallarg(netbsd32_u_long) off_lo; + syscallarg(netbsd32_u_long) off_hi; + } */ + struct netbsd32_pwritev_args ua; + + SCARG(&ua, fd) = SCARG(uap, fd); + SCARG(&ua, iovp) = SCARG(uap, iovp); + SCARG(&ua, iovcnt) = SCARG(uap, iovcnt); + SCARG(&ua, PAD) = 0; + SCARG(&ua, offset) = linux32_hilo_to_off_t(SCARG(uap, off_hi), + SCARG(uap, off_lo)); + return netbsd32_pwritev(l, &ua, retval); +}