[libc-commits] [libc] ba38e56 - [libc] Enable setitimer and getitimer functions on riscv (#139182)
via libc-commits
libc-commits at lists.llvm.org
Fri May 16 14:55:35 PDT 2025
Author: Mikhail R. Gadelha
Date: 2025-05-16T18:55:32-03:00
New Revision: ba38e56c989af932eaa7b287a8e6197abf693e57
URL: https://github.com/llvm/llvm-project/commit/ba38e56c989af932eaa7b287a8e6197abf693e57
DIFF: https://github.com/llvm/llvm-project/commit/ba38e56c989af932eaa7b287a8e6197abf693e57.diff
LOG: [libc] Enable setitimer and getitimer functions on riscv (#139182)
These functions don't have a _time64 variant, so we can't use time_t
directly (since our time_t is a uint64_t). The workaround is to use
longs when doing the syscall and write back when necessary.
Added:
Modified:
libc/config/linux/riscv/entrypoints.txt
libc/src/sys/time/linux/getitimer.cpp
libc/src/sys/time/linux/setitimer.cpp
Removed:
################################################################################
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 6ee6cd3c7ba11..0b645a2d2fb8b 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -370,8 +370,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.sys.uio.readv
# sys/time.h entrypoints
- # libc.src.sys.time.setitimer
- # libc.src.sys.time.getitimer
+ libc.src.sys.time.setitimer
+ libc.src.sys.time.getitimer
)
if(LLVM_LIBC_INCLUDE_SCUDO)
diff --git a/libc/src/sys/time/linux/getitimer.cpp b/libc/src/sys/time/linux/getitimer.cpp
index bbdbaa57dfd30..fec06aa4086e9 100644
--- a/libc/src/sys/time/linux/getitimer.cpp
+++ b/libc/src/sys/time/linux/getitimer.cpp
@@ -16,8 +16,22 @@
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(int, getitimer, (int which, struct itimerval *curr_value)) {
- long ret =
- LIBC_NAMESPACE::syscall_impl<long>(SYS_getitimer, which, curr_value);
+ long ret = 0;
+ if constexpr (sizeof(time_t) > sizeof(long)) {
+ // There is no SYS_getitimer_time64 call, so we can't use time_t directly.
+ long curr_value32[4];
+ ret =
+ LIBC_NAMESPACE::syscall_impl<long>(SYS_getitimer, which, curr_value32);
+ if (!ret) {
+ curr_value->it_interval.tv_sec = curr_value32[0];
+ curr_value->it_interval.tv_usec = curr_value32[1];
+ curr_value->it_value.tv_sec = curr_value32[2];
+ curr_value->it_value.tv_usec = curr_value32[3];
+ }
+ } else {
+ ret = LIBC_NAMESPACE::syscall_impl<long>(SYS_getitimer, which, curr_value);
+ }
+
// On failure, return -1 and set errno.
if (ret < 0) {
libc_errno = static_cast<int>(-ret);
diff --git a/libc/src/sys/time/linux/setitimer.cpp b/libc/src/sys/time/linux/setitimer.cpp
index b50356004701d..def04a4740118 100644
--- a/libc/src/sys/time/linux/setitimer.cpp
+++ b/libc/src/sys/time/linux/setitimer.cpp
@@ -17,8 +17,30 @@ namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(int, setitimer,
(int which, const struct itimerval *new_value,
struct itimerval *old_value)) {
- long ret = LIBC_NAMESPACE::syscall_impl<long>(SYS_setitimer, which, new_value,
- old_value);
+ long ret = 0;
+ if constexpr (sizeof(time_t) > sizeof(long)) {
+ // There is no SYS_setitimer_time64 call, so we can't use time_t directly,
+ // and need to convert it to long first.
+ long new_value32[4] = {static_cast<long>(new_value->it_interval.tv_sec),
+ new_value->it_interval.tv_usec,
+ static_cast<long>(new_value->it_value.tv_sec),
+ new_value->it_value.tv_usec};
+ long old_value32[4];
+
+ ret = LIBC_NAMESPACE::syscall_impl<long>(SYS_setitimer, which, new_value32,
+ old_value32);
+
+ if (!ret && old_value) {
+ old_value->it_interval.tv_sec = old_value32[0];
+ old_value->it_interval.tv_usec = old_value32[1];
+ old_value->it_value.tv_sec = old_value32[2];
+ old_value->it_value.tv_usec = old_value32[3];
+ }
+ } else {
+ ret = LIBC_NAMESPACE::syscall_impl<long>(SYS_setitimer, which, new_value,
+ old_value);
+ }
+
// On failure, return -1 and set errno.
if (ret < 0) {
libc_errno = static_cast<int>(-ret);
More information about the libc-commits
mailing list