Browse Source

add process_vm_{read,write}v syscall wrapper from glibc

Waldemar Brodkorb 3 months ago
parent
commit
3d975fa52b

+ 19 - 0
include/sys/uio.h

@@ -74,6 +74,25 @@ extern ssize_t pwritev (int __fd, const struct iovec *__iovec, int __count,
 			__off64_t __offset) __wur;
 #endif	/* Use misc.  */
 
+#ifdef __USE_GNU
+/* Read from another process' address space.  */
+extern ssize_t process_vm_readv (pid_t __pid, const struct iovec *__lvec,
+				 unsigned long int __liovcnt,
+				 const struct iovec *__rvec,
+				 unsigned long int __riovcnt,
+				 unsigned long int __flags)
+  __THROW;
+
+/* Write to another process' address space.  */
+extern ssize_t process_vm_writev (pid_t __pid, const struct iovec *__lvec,
+				  unsigned long int __liovcnt,
+				  const struct iovec *__rvec,
+				  unsigned long int __riovcnt,
+				  unsigned long int __flags)
+  __THROW;
+
+#endif
+
 __END_DECLS
 
 #endif /* sys/uio.h */

+ 2 - 0
libc/sysdeps/linux/common/Makefile.in

@@ -40,6 +40,8 @@ CSRC-$(UCLIBC_LINUX_SPECIFIC) += \
 	ppoll.c \
 	prctl.c \
 	prlimit.c \
+	process_vm_readv.c \
+	process_vm_writev.c \
 	readahead.c \
 	reboot.c \
 	remap_file_pages.c \

+ 32 - 0
libc/sysdeps/linux/common/process_vm_readv.c

@@ -0,0 +1,32 @@
+/* process_vm_readv - Linux specific syscall.
+   Copyright (C) 2020-2024 Free Software Foundation, Inc.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sys/uio.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+#ifdef __NR_process_vm_readv
+ssize_t
+process_vm_readv (pid_t pid, const struct iovec *local_iov,
+		  unsigned long int liovcnt,
+		  const struct iovec *remote_iov,
+		  unsigned long int riovcnt, unsigned long int flags)
+{
+  return INLINE_SYSCALL (process_vm_readv, 6, pid, local_iov,
+			      liovcnt, remote_iov, riovcnt, flags);
+}
+#endif

+ 32 - 0
libc/sysdeps/linux/common/process_vm_writev.c

@@ -0,0 +1,32 @@
+/* process_vm_writev - Linux specific syscall.
+   Copyright (C) 2020-2024 Free Software Foundation, Inc.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sys/uio.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+#ifdef __NR_process_vm_writev
+ssize_t
+process_vm_writev (pid_t pid, const struct iovec *local_iov,
+		   unsigned long int liovcnt,
+		   const struct iovec *remote_iov,
+		   unsigned long int riovcnt, unsigned long int flags)
+{
+  return INLINE_SYSCALL (process_vm_writev, 6, pid, local_iov,
+			      liovcnt, remote_iov, riovcnt, flags);
+}
+#endif