123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- From 3d975fa52b82e390ecbb0252739ee3fae64266c2 Mon Sep 17 00:00:00 2001
- From: Waldemar Brodkorb <wbx@openadk.org>
- Date: Wed, 14 Aug 2024 17:28:19 +0200
- Subject: [PATCH 1/2] add process_vm_{read,write}v syscall wrapper from glibc
- Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
- ---
- include/sys/uio.h | 19 +++++++++++
- libc/sysdeps/linux/common/Makefile.in | 2 ++
- libc/sysdeps/linux/common/process_vm_readv.c | 32 +++++++++++++++++++
- libc/sysdeps/linux/common/process_vm_writev.c | 32 +++++++++++++++++++
- 4 files changed, 85 insertions(+)
- create mode 100644 libc/sysdeps/linux/common/process_vm_readv.c
- create mode 100644 libc/sysdeps/linux/common/process_vm_writev.c
- diff --git a/include/sys/uio.h b/include/sys/uio.h
- index 330426fec..9e9708c0c 100644
- --- a/include/sys/uio.h
- +++ b/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 */
- diff --git a/libc/sysdeps/linux/common/Makefile.in b/libc/sysdeps/linux/common/Makefile.in
- index 83be2691e..e0b280c33 100644
- --- a/libc/sysdeps/linux/common/Makefile.in
- +++ b/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 \
- diff --git a/libc/sysdeps/linux/common/process_vm_readv.c b/libc/sysdeps/linux/common/process_vm_readv.c
- new file mode 100644
- index 000000000..b69c1c97a
- --- /dev/null
- +++ b/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
- diff --git a/libc/sysdeps/linux/common/process_vm_writev.c b/libc/sysdeps/linux/common/process_vm_writev.c
- new file mode 100644
- index 000000000..e22817a8d
- --- /dev/null
- +++ b/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
- --
- 2.30.2
|