[libc] Enable utimes function for riscv (#139181)

RV32 uses SYS_utimensat_time64 instead of SYS_utimensat but the call is
the same.
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 4bc27b8..6ee6cd3 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -289,7 +289,7 @@
     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 ca5a6cc..6d74cc6 100644
--- a/libc/include/sys/syscall.h.def
+++ b/libc/include/sys/syscall.h.def
@@ -2305,6 +2305,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 e6e3d07..76b6993 100644
--- a/libc/src/sys/time/linux/utimes.cpp
+++ b/libc/src/sys/time/linux/utimes.cpp
@@ -9,6 +9,7 @@
 #include "src/sys/time/utimes.h"
 
 #include "hdr/fcntl_macros.h"
+#include "hdr/types/struct_timespec.h"
 #include "hdr/types/struct_timeval.h"
 
 #include "src/__support/OSUtil/syscall.h"
@@ -20,14 +21,24 @@
 
 namespace LIBC_NAMESPACE_DECL {
 
+#ifdef 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<int>(SYS_utimes, path, times);
-#elif defined(SYS_utimensat)
+  ret = LIBC_NAMESPACE::syscall_impl<int>(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 @@
 
   // utimensat syscall.
   // flags=0 means don't follow symlinks (like utimes)
-  ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_utimensat, AT_FDCWD, path, ts_ptr,
-                                          0);
-
-#else
-#error "utimensat and utimes syscalls not available."
+  ret = LIBC_NAMESPACE::syscall_impl<int>(UTIMES_SYSCALL_ID, AT_FDCWD, path,
+                                          ts_ptr, 0);
 #endif // SYS_utimensat
 
   if (ret < 0) {