From: Martin Cermak Date: Thu, 15 May 2025 10:03:55 +0000 (+0200) Subject: Wrap linux specific cachestat syscall X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=41f0f95d9415faa5f76fcab92f45ca05957c4032;p=thirdparty%2Fvalgrind.git Wrap linux specific cachestat syscall cachestat takes an fd, cstat_range and flags arguments and writes out page cache statistics via the cstat struct. Declare a sys_cachestat wrapper in priv_syswrap-linux.h and hook it for {amd64,arm,arm64,mips64,nanomips,ppc32,ppc64,riscv64,s390x,x86}-linux using LINXY with PRE/POST handlers in syswrap-linux.c. Define __NR_cachestat for amd64, arm, arm64, mips32, mips64, nanomips, ppc32, ppc64, riscv64, s390x, and x86. https://bugs.kde.org/show_bug.cgi?id=501741 --- diff --git a/NEWS b/NEWS index 065f32fd5..a1a5fa24d 100644 --- a/NEWS +++ b/NEWS @@ -30,6 +30,7 @@ are not entered into bugzilla tend to get forgotten about or ignored. 503914 mount syscall param filesystemtype may be NULL 504101 Add a "vgstack" script 504177 FILE DESCRIPTORS banner shows when closing some inherited fds +501741 syscall cachestat not wrapped To see details of a given bug, visit https://bugs.kde.org/show_bug.cgi?id=XXXXXX diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index 4dad82dfb..966eae543 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -59,6 +59,7 @@ DECL_TEMPLATE(linux, sys_tee); DECL_TEMPLATE(linux, sys_vmsplice); DECL_TEMPLATE(linux, sys_readahead); DECL_TEMPLATE(linux, sys_move_pages); +DECL_TEMPLATE(linux, sys_cachestat); // clone is similar enough between linux variants to have a generic // version, but which will call an extern defined in syswrap--linux.c diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index 646a83240..c22683192 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -902,6 +902,7 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_memfd_secret, sys_memfd_secret), // 447 + LINXY(__NR_cachestat, sys_cachestat), // 451 LINX_(__NR_fchmodat2, sys_fchmodat2), // 452 }; diff --git a/coregrind/m_syswrap/syswrap-arm-linux.c b/coregrind/m_syswrap/syswrap-arm-linux.c index a12053dd0..05cd1e4b6 100644 --- a/coregrind/m_syswrap/syswrap-arm-linux.c +++ b/coregrind/m_syswrap/syswrap-arm-linux.c @@ -1073,6 +1073,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_(__NR_landlock_add_rule, sys_landlock_add_rule), // 445 LINX_(__NR_landlock_restrict_self, sys_landlock_restrict_self), // 446 + LINXY(__NR_cachestat, sys_cachestat), // 451 LINX_(__NR_fchmodat2, sys_fchmodat2), // 452 }; diff --git a/coregrind/m_syswrap/syswrap-arm64-linux.c b/coregrind/m_syswrap/syswrap-arm64-linux.c index c8bb486c4..28cb3647c 100644 --- a/coregrind/m_syswrap/syswrap-arm64-linux.c +++ b/coregrind/m_syswrap/syswrap-arm64-linux.c @@ -853,6 +853,7 @@ static SyscallTableEntry syscall_main_table[] = { LINXY(__NR_memfd_secret, sys_memfd_secret), // 447 + LINXY(__NR_cachestat, sys_cachestat), // 451 LINX_(__NR_fchmodat2, sys_fchmodat2), // 452 }; diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index afd4a618b..d4653d027 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -6196,6 +6196,26 @@ PRE(sys_fchmodat) PRE_MEM_RASCIIZ( "fchmodat(path)", ARG2 ); } +PRE(sys_cachestat) +{ + PRINT("sys_cachestat ( %lu, %#lx, %#lx, %lu )", ARG1, ARG2, ARG3, ARG4); + PRE_REG_READ4(long, "cachestat", + unsigned long, fd, struct vki_cachestat_range *, cstat_range, + struct vki_cachestat*, cstat, unsigned long, flags); + if (!ML_(fd_allowed)(ARG1, "cachestat", tid, False)) + SET_STATUS_Failure( VKI_EBADF ); + const struct vki_cachestat_range *cstat_range = (struct vki_cachestat_range *)(Addr)ARG2; + PRE_MEM_READ("cachestat(cstat_range)", ARG2, sizeof(*cstat_range) ); + const struct vki_cachestat *cstat = (struct vki_cachestat *)(Addr)ARG3; + PRE_MEM_WRITE("cachestat(cstat)", ARG3, sizeof(*cstat) ); +} + +POST(sys_cachestat) +{ + vg_assert(SUCCESS); + POST_MEM_WRITE(ARG3, sizeof(struct vki_cachestat)); +} + PRE(sys_fchmodat2) { FUSE_COMPATIBLE_MAY_BLOCK(); diff --git a/coregrind/m_syswrap/syswrap-mips32-linux.c b/coregrind/m_syswrap/syswrap-mips32-linux.c index 3644a088e..d16a9a4bc 100644 --- a/coregrind/m_syswrap/syswrap-mips32-linux.c +++ b/coregrind/m_syswrap/syswrap-mips32-linux.c @@ -1180,6 +1180,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_(__NR_landlock_add_rule, sys_landlock_add_rule), // 445 LINX_(__NR_landlock_restrict_self, sys_landlock_restrict_self), // 446 + LINXY(__NR_cachestat, sys_cachestat), // 451 LINX_(__NR_fchmodat2, sys_fchmodat2), // 452 }; diff --git a/coregrind/m_syswrap/syswrap-mips64-linux.c b/coregrind/m_syswrap/syswrap-mips64-linux.c index ba73b68d8..fe1f3db7f 100644 --- a/coregrind/m_syswrap/syswrap-mips64-linux.c +++ b/coregrind/m_syswrap/syswrap-mips64-linux.c @@ -835,6 +835,7 @@ static SyscallTableEntry syscall_main_table[] = { LINXY (__NR_landlock_create_ruleset, sys_landlock_create_ruleset), LINX_ (__NR_landlock_add_rule, sys_landlock_add_rule), LINX_ (__NR_landlock_restrict_self, sys_landlock_restrict_self), + LINXY (__NR_cachestat, sys_cachestat), LINX_ (__NR_fchmodat2, sys_fchmodat2), LINXY (__NR_userfaultfd, sys_userfaultfd), }; diff --git a/coregrind/m_syswrap/syswrap-nanomips-linux.c b/coregrind/m_syswrap/syswrap-nanomips-linux.c index 728607317..87153737d 100644 --- a/coregrind/m_syswrap/syswrap-nanomips-linux.c +++ b/coregrind/m_syswrap/syswrap-nanomips-linux.c @@ -840,6 +840,7 @@ static SyscallTableEntry syscall_main_table[] = { LINXY (__NR_landlock_create_ruleset,sys_landlock_create_ruleset), LINX_ (__NR_landlock_add_rule, sys_landlock_add_rule), LINX_ (__NR_landlock_restrict_self, sys_landlock_restrict_self), + LINXY (__NR_cachestat, sys_cachestat), LINX_ (__NR_fchmodat2, sys_fchmodat2), }; diff --git a/coregrind/m_syswrap/syswrap-ppc32-linux.c b/coregrind/m_syswrap/syswrap-ppc32-linux.c index 089a9a59b..bc180b8b1 100644 --- a/coregrind/m_syswrap/syswrap-ppc32-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc32-linux.c @@ -1079,6 +1079,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_landlock_add_rule, sys_landlock_add_rule), // 445 LINX_(__NR_landlock_restrict_self, sys_landlock_restrict_self), // 446 + LINXY(__NR_cachestat, sys_cachestat), // 451 LINX_ (__NR_fchmodat2, sys_fchmodat2), // 452 }; diff --git a/coregrind/m_syswrap/syswrap-ppc64-linux.c b/coregrind/m_syswrap/syswrap-ppc64-linux.c index 007fa6336..6e97358e8 100644 --- a/coregrind/m_syswrap/syswrap-ppc64-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc64-linux.c @@ -1046,6 +1046,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_landlock_add_rule, sys_landlock_add_rule), // 445 LINX_(__NR_landlock_restrict_self, sys_landlock_restrict_self), // 446 + LINXY (__NR_cachestat, sys_cachestat), // 451 LINX_ (__NR_fchmodat2, sys_fchmodat2), // 452 }; diff --git a/coregrind/m_syswrap/syswrap-riscv64-linux.c b/coregrind/m_syswrap/syswrap-riscv64-linux.c index ebf9c3105..7a1ff0751 100644 --- a/coregrind/m_syswrap/syswrap-riscv64-linux.c +++ b/coregrind/m_syswrap/syswrap-riscv64-linux.c @@ -597,6 +597,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_(__NR_landlock_add_rule, sys_landlock_add_rule), /* 445 */ LINX_(__NR_landlock_restrict_self, sys_landlock_restrict_self), /* 446 */ LINXY(__NR_memfd_secret, sys_memfd_secret), /* 447 */ + LINXY(__NR_cachestat, sys_cachestat), /* 451 */ LINX_(__NR_fchmodat2, sys_fchmodat2), /* 452 */ }; diff --git a/coregrind/m_syswrap/syswrap-s390x-linux.c b/coregrind/m_syswrap/syswrap-s390x-linux.c index 9191c2093..f4ceae461 100644 --- a/coregrind/m_syswrap/syswrap-s390x-linux.c +++ b/coregrind/m_syswrap/syswrap-s390x-linux.c @@ -888,6 +888,7 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_memfd_secret, sys_memfd_secret), // 447 + LINXY (__NR_cachestat, sys_cachestat), // 451 LINX_ (__NR_fchmodat2, sys_fchmodat2), // 452 }; diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index d7f173cd9..662780588 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -1674,6 +1674,7 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_memfd_secret, sys_memfd_secret), // 447 + LINXY(__NR_cachestat, sys_cachestat), // 451 LINX_(__NR_fchmodat2, sys_fchmodat2), // 452 }; diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index 29e62ce86..0d2bed6dc 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -5478,6 +5478,19 @@ struct vki_open_how { #define VKI_CLOSE_RANGE_UNSHARE (1U << 1) #define VKI_CLOSE_RANGE_CLOEXEC (1U << 2) +struct vki_cachestat_range { + __vki_u64 off; + __vki_u64 len; +}; + +struct vki_cachestat { + __vki_u64 nr_cache; + __vki_u64 nr_dirty; + __vki_u64 nr_writeback; + __vki_u64 nr_evicted; + __vki_u64 nr_recently_evicted; +}; + //---------------------------------------------------------------------- // From linux/magic.h //---------------------------------------------------------------------- diff --git a/include/vki/vki-scnums-shared-linux.h b/include/vki/vki-scnums-shared-linux.h index 20346ca71..616f8052d 100644 --- a/include/vki/vki-scnums-shared-linux.h +++ b/include/vki/vki-scnums-shared-linux.h @@ -54,6 +54,7 @@ #define __NR_memfd_secret 447 +#define __NR_cachestat 451 #define __NR_fchmodat2 452 #endif