From: Martin Cermak Date: Wed, 3 Sep 2025 14:02:26 +0000 (+0200) Subject: Wrap the remap_file_pages syscall X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=818e7661ecac5e0fb60f19f28ad64cd3bff6cdd9;p=thirdparty%2Fvalgrind.git Wrap the remap_file_pages syscall The remap_file_pages() system call is used to create a nonlinear mapping, that is, a mapping in which the pages of the file are mapped into a nonsequential order in memory. It is deprecated but in some cases it may still be used. LTP remap_file_pages01 and remap_file_pages02 test-cover it. Declare a remap_file_pages wrapper in priv_syswrap-linux.h and hook it for {amd64,arm,arm64,mips64,ppc32,ppc64,riscv64,s390x\ ,x86}- linux using LINX_ with PRE handler in syswrap-linux.c https://bugs.kde.org/show_bug.cgi?id=309554 --- diff --git a/NEWS b/NEWS index 0158a23af..8c4479100 100644 --- a/NEWS +++ b/NEWS @@ -33,6 +33,7 @@ bugzilla (https://bugs.kde.org/enter_bug.cgi?product=valgrind) rather than mailing the developers (or mailing lists) directly -- bugs that are not entered into bugzilla tend to get forgotten about or ignored. +309554 Wrap syscall remap_file_pages (216) 338803 Handling of dwz debug alt files or cross-CU is broken 418756 MAP_FIXED_NOREPLACE mmap flag unsupported 493430 Review all syscalls that use or return (new) file descriptors diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index 1d5135fc5..2fe8fd59d 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -110,6 +110,7 @@ DECL_TEMPLATE(linux, sys_epoll_ctl); DECL_TEMPLATE(linux, sys_epoll_wait); DECL_TEMPLATE(linux, sys_epoll_pwait); DECL_TEMPLATE(linux, sys_epoll_pwait2); +DECL_TEMPLATE(linux, sys_remap_file_pages); DECL_TEMPLATE(linux, sys_eventfd); DECL_TEMPLATE(linux, sys_eventfd2); diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index f15c3dac7..bb970b47d 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -729,7 +729,7 @@ static SyscallTableEntry syscall_table[] = { // (__NR_epoll_ctl_old, sys_ni_syscall), // 214 // (__NR_epoll_wait_old, sys_ni_syscall), // 215 - // (__NR_remap_file_pages, sys_remap_file_pages)// 216 + LINX_(__NR_remap_file_pages, sys_remap_file_pages), // 216 GENXY(__NR_getdents64, sys_getdents64), // 217 LINX_(__NR_set_tid_address, sys_set_tid_address),// 218 // (__NR_restart_syscall, sys_restart_syscall),// 219 diff --git a/coregrind/m_syswrap/syswrap-arm-linux.c b/coregrind/m_syswrap/syswrap-arm-linux.c index 1aae03c02..043a4095c 100644 --- a/coregrind/m_syswrap/syswrap-arm-linux.c +++ b/coregrind/m_syswrap/syswrap-arm-linux.c @@ -860,7 +860,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 255 LINXY(__NR_epoll_wait, sys_epoll_wait), // 256 -//zz // (__NR_remap_file_pages, sys_remap_file_pages), // 257 */Linux + LINX_(__NR_remap_file_pages, sys_remap_file_pages), // 257 */Linux LINX_(__NR_set_tid_address, sys_set_tid_address), // 258 LINXY(__NR_timer_create, sys_timer_create), // 259 diff --git a/coregrind/m_syswrap/syswrap-arm64-linux.c b/coregrind/m_syswrap/syswrap-arm64-linux.c index f6f63a52e..71d1123d0 100644 --- a/coregrind/m_syswrap/syswrap-arm64-linux.c +++ b/coregrind/m_syswrap/syswrap-arm64-linux.c @@ -782,7 +782,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_(__NR_munlockall, sys_munlockall), // 231 GENXY(__NR_mincore, sys_mincore), // 232 GENX_(__NR_madvise, sys_madvise), // 233 - // (__NR_remap_file_pages, sys_ni_syscall) // 234 + LINX_(__NR_remap_file_pages, sys_remap_file_pages), // 234 LINX_(__NR_mbind, sys_mbind), // 235 LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 236 LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 237 diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index fef23763f..e1450d886 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -2241,6 +2241,19 @@ POST(sys_epoll_pwait2) epoll_post_helper (tid, arrghs, status); } +PRE(sys_remap_file_pages) +{ + /* int remap_file_pages(void addr[.size], size_t size, + int prot, size_t pgoff, int flags); */ + Int arg_3 = (Int) ARG3; + Int arg_5 = (Int) ARG5; + PRINT("sys_remap_file_pages ( %#" FMT_REGWORD "x, %lu, %d, %lu, %d", + ARG1, ARG2, arg_3, ARG4, arg_5); + PRE_REG_READ5(int, "remap_file_pages", void *, addr, vki_size_t, + size_t, int, prot, vki_size_t, pgoff, int, flags); + PRE_MEM_READ("sys_remap_file_pages(addr)", ARG1, ARG2); +} + PRE(sys_eventfd) { PRINT("sys_eventfd ( %" FMT_REGWORD "u )", ARG1); diff --git a/coregrind/m_syswrap/syswrap-mips64-linux.c b/coregrind/m_syswrap/syswrap-mips64-linux.c index 5234ccc37..26ece232b 100644 --- a/coregrind/m_syswrap/syswrap-mips64-linux.c +++ b/coregrind/m_syswrap/syswrap-mips64-linux.c @@ -701,6 +701,7 @@ static SyscallTableEntry syscall_main_table[] = { LINXY (__NR_epoll_create1, sys_epoll_create1), LINX_ (__NR_epoll_ctl, sys_epoll_ctl), LINXY (__NR_epoll_wait, sys_epoll_wait), + LINX_ (__NR_remap_file_pages, sys_remap_file_pages), PLAX_(__NR_rt_sigreturn,sys_rt_sigreturn), #if defined(VGABI_N32) LINXY(__NR_fcntl64, sys_fcntl64), diff --git a/coregrind/m_syswrap/syswrap-ppc32-linux.c b/coregrind/m_syswrap/syswrap-ppc32-linux.c index cb4410795..d8dbe7de6 100644 --- a/coregrind/m_syswrap/syswrap-ppc32-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc32-linux.c @@ -902,7 +902,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 237 LINXY(__NR_epoll_wait, sys_epoll_wait), // 238 -//.. // (__NR_remap_file_pages, sys_remap_file_pages), // 239 */Linux + LINX_(__NR_remap_file_pages, sys_remap_file_pages), // 239 */Linux LINXY(__NR_timer_create, sys_timer_create), // 240 LINXY(__NR_timer_settime, sys_timer_settime), // 241 LINXY(__NR_timer_gettime, sys_timer_gettime), // 242 diff --git a/coregrind/m_syswrap/syswrap-ppc64-linux.c b/coregrind/m_syswrap/syswrap-ppc64-linux.c index bb5cb4f7b..3e7a14e40 100644 --- a/coregrind/m_syswrap/syswrap-ppc64-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc64-linux.c @@ -884,7 +884,7 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_epoll_create, sys_epoll_create), // 236 LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 237 LINXY(__NR_epoll_wait, sys_epoll_wait), // 238 -// _____(__NR_remap_file_pages, sys_remap_file_pages), // 239 + LINX_(__NR_remap_file_pages, sys_remap_file_pages), // 239 LINXY(__NR_timer_create, sys_timer_create), // 240 LINXY(__NR_timer_settime, sys_timer_settime), // 241 diff --git a/coregrind/m_syswrap/syswrap-riscv64-linux.c b/coregrind/m_syswrap/syswrap-riscv64-linux.c index c3ab78ef5..987205319 100644 --- a/coregrind/m_syswrap/syswrap-riscv64-linux.c +++ b/coregrind/m_syswrap/syswrap-riscv64-linux.c @@ -537,6 +537,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_(__NR_munlockall, sys_munlockall), /* 231 */ GENXY(__NR_mincore, sys_mincore), /* 232 */ GENX_(__NR_madvise, sys_madvise), /* 233 */ + LINX_(__NR_remap_file_pages, sys_remap_file_pages), /* 234 */ LINX_(__NR_mbind, sys_mbind), /* 235 */ LINXY(__NR_get_mempolicy, sys_get_mempolicy), /* 236 */ LINX_(__NR_set_mempolicy, sys_set_mempolicy), /* 237 */ diff --git a/coregrind/m_syswrap/syswrap-s390x-linux.c b/coregrind/m_syswrap/syswrap-s390x-linux.c index ad35a4ebc..8ab81d593 100644 --- a/coregrind/m_syswrap/syswrap-s390x-linux.c +++ b/coregrind/m_syswrap/syswrap-s390x-linux.c @@ -731,7 +731,7 @@ static SyscallTableEntry syscall_table[] = { GENXY(__NR_statfs64, sys_statfs64), // 265 GENXY(__NR_fstatfs64, sys_fstatfs64), // 266 -// ?????(__NR_remap_file_pages, ), + LINX_(__NR_remap_file_pages, sys_remap_file_pages), // 267 GENX_(268, sys_ni_syscall), /* unimplemented (by the kernel) */ // 268 GENX_(269, sys_ni_syscall), /* unimplemented (by the kernel) */ // 269 diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index 45c76a6db..7e68c4e0e 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -1468,7 +1468,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 255 LINXY(__NR_epoll_wait, sys_epoll_wait), // 256 -//zz // (__NR_remap_file_pages, sys_remap_file_pages), // 257 */Linux + LINX_(__NR_remap_file_pages, sys_remap_file_pages), // 257 */Linux LINX_(__NR_set_tid_address, sys_set_tid_address), // 258 LINXY(__NR_timer_create, sys_timer_create), // 259 diff --git a/include/vki/vki-scnums-riscv64-linux.h b/include/vki/vki-scnums-riscv64-linux.h index 17b6839f8..f084cf44e 100644 --- a/include/vki/vki-scnums-riscv64-linux.h +++ b/include/vki/vki-scnums-riscv64-linux.h @@ -261,6 +261,7 @@ #define __NR_munlockall 231 #define __NR_mincore 232 #define __NR_madvise 233 +#define __NR_remap_file_pages 234 #define __NR_mbind 235 #define __NR_get_mempolicy 236 #define __NR_set_mempolicy 237