From 5376c0d2dfa0f8f99c123a35c9b640d66d9cbd93 Mon Sep 17 00:00:00 2001 From: "Mikhail R. Gadelha" Date: Thu, 8 May 2025 11:21:59 -0300 Subject: [PATCH 1/3] [libc] Enable utimes function for riscv RV32 uses SYS_utimensat_time64 instead of SYS_utimensat but the call is the same. --- libc/config/linux/riscv/entrypoints.txt | 2 +- libc/include/sys/syscall.h.def | 4 ++++ libc/src/sys/time/linux/utimes.cpp | 22 +++++++++++++++------- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt index 30d9d00dfefc9..0ee53e26a9286 100644 --- a/libc/config/linux/riscv/entrypoints.txt +++ b/libc/config/linux/riscv/entrypoints.txt @@ -290,7 +290,7 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.sys.statvfs.statvfs # sys/utimes.h entrypoints - # libc.src.sys.time.utimes + libc.src.sys.time.utimes # sys/utsname.h entrypoints libc.src.sys.utsname.uname diff --git a/libc/include/sys/syscall.h.def b/libc/include/sys/syscall.h.def index 03c19eb0885ed..6f309c8bab331 100644 --- a/libc/include/sys/syscall.h.def +++ b/libc/include/sys/syscall.h.def @@ -2301,6 +2301,10 @@ #define SYS_utimes __NR_utimes #endif +#ifdef __NR_utimensat_time64 +#define SYS_utimensat_time64 __NR_utimensat_time64 +#endif + #ifdef __NR_utrap_install #define SYS_utrap_install __NR_utrap_install #endif diff --git a/libc/src/sys/time/linux/utimes.cpp b/libc/src/sys/time/linux/utimes.cpp index e6e3d073a81a4..aed04160d5f9d 100644 --- a/libc/src/sys/time/linux/utimes.cpp +++ b/libc/src/sys/time/linux/utimes.cpp @@ -10,6 +10,7 @@ #include "hdr/fcntl_macros.h" #include "hdr/types/struct_timeval.h" +#include "hdr/types/struct_timespec.h" #include "src/__support/OSUtil/syscall.h" #include "src/__support/common.h" @@ -20,14 +21,24 @@ namespace LIBC_NAMESPACE_DECL { +#if SYS_utimes +constexpr auto UTIMES_SYSCALL_ID = SYS_utimes; +#elif defined(SYS_utimensat) +constexpr auto UTIMES_SYSCALL_ID = SYS_utimensat; +#elif defined(SYS_utimensat_time64) +constexpr auto UTIMES_SYSCALL_ID = SYS_utimensat_time64; +#else +#error "utimes, utimensat, utimensat_time64, syscalls not available." +#endif + LLVM_LIBC_FUNCTION(int, utimes, (const char *path, const struct timeval times[2])) { int ret; #ifdef SYS_utimes // No need to define a timespec struct, use the syscall directly. - ret = LIBC_NAMESPACE::syscall_impl(SYS_utimes, path, times); -#elif defined(SYS_utimensat) + ret = LIBC_NAMESPACE::syscall_impl(UTIMES_SYSCALL_ID, path, times); +#elif defined(SYS_utimensat) || defined(SYS_utimensat_time64) // the utimensat syscall requires a timespec struct, not timeval. struct timespec ts[2]; struct timespec *ts_ptr = nullptr; // default value if times is nullptr @@ -59,11 +70,8 @@ LLVM_LIBC_FUNCTION(int, utimes, // utimensat syscall. // flags=0 means don't follow symlinks (like utimes) - ret = LIBC_NAMESPACE::syscall_impl(SYS_utimensat, AT_FDCWD, path, ts_ptr, - 0); - -#else -#error "utimensat and utimes syscalls not available." + ret = LIBC_NAMESPACE::syscall_impl(UTIMES_SYSCALL_ID, AT_FDCWD, path, + ts_ptr, 0); #endif // SYS_utimensat if (ret < 0) { From decfa4ca49c9d6be789e87c48ae5d9fa1000d1af Mon Sep 17 00:00:00 2001 From: "Mikhail R. Gadelha" Date: Thu, 8 May 2025 21:48:26 -0300 Subject: [PATCH 2/3] Include order Signed-off-by: Mikhail R. Gadelha --- libc/src/sys/time/linux/utimes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libc/src/sys/time/linux/utimes.cpp b/libc/src/sys/time/linux/utimes.cpp index aed04160d5f9d..7a27a64151b46 100644 --- a/libc/src/sys/time/linux/utimes.cpp +++ b/libc/src/sys/time/linux/utimes.cpp @@ -9,8 +9,8 @@ #include "src/sys/time/utimes.h" #include "hdr/fcntl_macros.h" -#include "hdr/types/struct_timeval.h" #include "hdr/types/struct_timespec.h" +#include "hdr/types/struct_timeval.h" #include "src/__support/OSUtil/syscall.h" #include "src/__support/common.h" From f8ed14a7bca0e92bd65c63d42c2d18fa274e23ce Mon Sep 17 00:00:00 2001 From: "Mikhail R. Gadelha" Date: Tue, 13 May 2025 18:50:50 -0300 Subject: [PATCH 3/3] Fixed ifdef Signed-off-by: Mikhail R. Gadelha --- libc/src/sys/time/linux/utimes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libc/src/sys/time/linux/utimes.cpp b/libc/src/sys/time/linux/utimes.cpp index 7a27a64151b46..76b69937a5f48 100644 --- a/libc/src/sys/time/linux/utimes.cpp +++ b/libc/src/sys/time/linux/utimes.cpp @@ -21,7 +21,7 @@ namespace LIBC_NAMESPACE_DECL { -#if SYS_utimes +#ifdef SYS_utimes constexpr auto UTIMES_SYSCALL_ID = SYS_utimes; #elif defined(SYS_utimensat) constexpr auto UTIMES_SYSCALL_ID = SYS_utimensat;