What name should we use instead of __ts? I suggest ____uclibc_ts_internal,
it starts with four underscores, so it seems to be okay. As another option
we can put these macroses inside some private header.

сб, 24 февр. 2024 г., 21:58 Max Filippov <jcmvb...@gmail.com>:

> On Sat, Feb 24, 2024 at 10:22 AM Dmitry Chestnykh
> <dm.chestn...@gmail.com> wrote:
> >
> > For BE architectures there is one significant difference
> > in comparison with time64 support for little-endian
> > architectures like ARMv7.
> > The difference is that we strictly need to pass two 64bit
> > values to system calls because Linux Kernel internally uses
> > `struct __kernel_timespec` and similar, which consists of two
> > 64bit fields.
> > For this reason many files have been changed to convert
> > pointers to timespec-family structures (mixed of 64bit and 32bit values)
> > to the pointer of the similar but 64bit-only structures
> > for using as system calls args.
> > This is general prerequisite for any BE architecture.
> >
> > Signed-off-by: Dmitry Chestnykh <dm.chestn...@gmail.com>
> > ---
> >  include/time.h                                | 27 +++++++++++++++++++
> >  libc/inet/socketcalls.c                       |  2 +-
> >  libc/misc/sysvipc/sem.c                       |  6 ++++-
> >  libc/signal/sigwait.c                         |  3 ++-
> >  libc/sysdeps/linux/common/__rt_sigtimedwait.c |  6 ++---
> >  libc/sysdeps/linux/common/__rt_sigwaitinfo.c  |  2 +-
> >  libc/sysdeps/linux/common/alarm.c             |  2 +-
> >  libc/sysdeps/linux/common/clock_getres.c      | 13 +++++++--
> >  libc/sysdeps/linux/common/clock_gettime.c     | 12 ++++++++-
> >  libc/sysdeps/linux/common/clock_settime.c     |  5 +++-
> >  libc/sysdeps/linux/common/ppoll.c             |  2 +-
> >  libc/sysdeps/linux/common/pselect.c           |  2 +-
> >  libc/sysdeps/linux/common/select.c            | 12 ++++++---
> >  libc/sysdeps/linux/common/time.c              |  2 +-
> >  libc/sysdeps/linux/common/timerfd.c           |  5 +++-
> >  libc/sysdeps/linux/common/utimensat.c         | 16 ++++++++++-
> >  libpthread/nptl/pthread_mutex_timedlock.c     |  2 +-
> >  .../sysdeps/unix/sysv/linux/lowlevellock.c    |  5 ++--
> >  .../sysdeps/unix/sysv/linux/lowlevellock.h    | 27 +++++++++++++++++--
> >  .../unix/sysv/linux/lowlevelrobustlock.c      |  1 -
> >  .../sysdeps/unix/sysv/linux/timer_settime.c   |  2 +-
> >  librt/clock_gettime.c                         | 11 ++++++--
> >  librt/clock_nanosleep.c                       |  5 ++--
> >  librt/mq_timedreceive.c                       |  8 +++---
> >  librt/mq_timedsend.c                          |  6 ++++-
> >  librt/timer_settime.c                         |  9 +++++--
> >  26 files changed, 154 insertions(+), 39 deletions(-)
> >
> > diff --git a/include/time.h b/include/time.h
> > index 1a1408990..880a80d85 100644
> > --- a/include/time.h
> > +++ b/include/time.h
> > @@ -122,6 +122,16 @@ struct timespec
> >      long int tv_nsec;          /* Nanoseconds.  */
> >    };
> >
> > +#if defined(__UCLIBC_USE_TIME64__)
> > +
> > +struct __ts64_struct {
> > +   __S64_TYPE tv_sec;
> > +   __S64_TYPE tv_nsec;
> > +};
> > +
> > +#define TO_TS64_P(__ts) (&(struct __ts64_struct) {.tv_sec =
> (__ts)->tv_sec, .tv_nsec = (__ts)->tv_nsec})
>
> This doesn't look like a reserved name, so I'm not sure you can
> use this name in the time.h. Also I think that checking whether
> __ts is NULL is better done inside this macro.
>
> > +#endif
> > +
> >  #endif /* timespec not defined and <time.h> or need timespec.  */
> >  #undef __need_timespec
> >
> > @@ -165,6 +175,23 @@ struct itimerspec
> >      struct timespec it_value;
> >    };
> >
> > +#if defined(__UCLIBC_USE_TIME64__)
> > +
> > +struct __its64_struct {
> > +    __S64_TYPE interval_tv_sec;
> > +    __S64_TYPE interval_tv_nsec;
> > +    __S64_TYPE value_tv_sec;
> > +    __S64_TYPE value_tv_nsec;
> > +};
> > +
> > +#define TO_ITS64_P(__its) (&(struct __its64_struct) {.interval_tv_sec =
> (__its)->it_interval.tv_sec, \
> > +                                                     .interval_tv_nsec
> = (__its)->it_interval.tv_nsec, \
> > +                                                     .value_tv_sec =
> (__its)->it_value.tv_sec, \
> > +                                                     .value_tv_nsec =
> (__its)->it_value.tv_nsec})
> > +
>
> Same here.
>
> > +#endif
> > +
> > +
> >  /* We can use a simple forward declaration.  */
> >  struct sigevent;
> >
> > diff --git a/libc/inet/socketcalls.c b/libc/inet/socketcalls.c
> > index eb0983698..ea623878a 100644
> > --- a/libc/inet/socketcalls.c
> > +++ b/libc/inet/socketcalls.c
> > @@ -273,7 +273,7 @@ static ssize_t __NC(recvmmsg)(int sockfd, struct
> mmsghdr *msg, size_t vlen,
> >                               int flags, struct timespec *tmo)
> >  {
> >  # if defined(__UCLIBC_USE_TIME64__) && defined(__NR_recvmmsg_time64)
> > -       return (ssize_t)INLINE_SYSCALL(recvmmsg_time64, 5, sockfd, msg,
> vlen, flags, tmo);
> > +       return (ssize_t)INLINE_SYSCALL(recvmmsg_time64, 5, sockfd, msg,
> vlen, flags, tmo ? TO_TS64_P(tmo) : 0);
> >  # elif defined(__NR_recvmmsg)
> >         return (ssize_t)INLINE_SYSCALL(recvmmsg, 5, sockfd, msg, vlen,
> flags, tmo);
> >  # elif __NR_socketcall
> > diff --git a/libc/misc/sysvipc/sem.c b/libc/misc/sysvipc/sem.c
> > index cd541761c..48d345984 100644
> > --- a/libc/misc/sysvipc/sem.c
> > +++ b/libc/misc/sysvipc/sem.c
> > @@ -96,7 +96,11 @@ int semop (int semid, struct sembuf *sops, size_t
> nsops)
> >  #ifdef L_semtimedop
> >
> >  #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_semtimedop_time64)
> > -_syscall4_time64(int, semtimedop, int, semid, struct sembuf *, sops,
> size_t, nsops, const struct timespec *, timeout)
> > +int semtimedop(int semid, struct sembuf *sops, size_t nsops, const
> struct timespec *timeout)
> > +{
> > +    return INLINE_SYSCALL(semtimedop_time64, 4, semid, sops, nsops,
> timeout ? TO_TS64_P(timeout) : 0);
> > +}
> > +
> >  #elif defined(__NR_semtimedop)
> >  _syscall4(int, semtimedop, int, semid, struct sembuf *, sops, size_t,
> nsops, const struct timespec *, timeout)
> >
> > diff --git a/libc/signal/sigwait.c b/libc/signal/sigwait.c
> > index 3557a039e..b237534cd 100644
> > --- a/libc/signal/sigwait.c
> > +++ b/libc/signal/sigwait.c
> > @@ -24,7 +24,8 @@
> >  #include <signal.h>
> >  #include <cancel.h>
> >
> > -#if defined __NR_rt_sigtimedwait && defined __UCLIBC_HAS_REALTIME__
> > +#if (defined(__NR_rt_sigtimedwait) || (defined(__UCLIBC_USE_TIME64__)
> && defined(__NR_rt_sigtimedwait_time64))) && \
> > +    defined(__UCLIBC_HAS_REALTIME__)
> >
> >  #include <string.h>
> >
> > diff --git a/libc/sysdeps/linux/common/__rt_sigtimedwait.c
> b/libc/sysdeps/linux/common/__rt_sigtimedwait.c
> > index bd82ca6d5..44e1ce928 100644
> > --- a/libc/sysdeps/linux/common/__rt_sigtimedwait.c
> > +++ b/libc/sysdeps/linux/common/__rt_sigtimedwait.c
> > @@ -9,7 +9,7 @@
> >
> >  #include <sys/syscall.h>
> >
> > -#ifdef __NR_rt_sigtimedwait
> > +#if defined(__NR_rt_sigtimedwait) ||
> (defined(__NR_rt_sigtimedwait_time64) && defined(__UCLIBC_USE_TIME64__))
> >  # include <signal.h>
> >  # include <cancel.h>
> >  # ifdef __UCLIBC_HAS_THREADS_NATIVE__
> > @@ -54,7 +54,7 @@ int __NC(sigtimedwait)(const sigset_t *set, siginfo_t
> *info,
> >         /* on uClibc we use the kernel sigset_t size */
> >  # if defined(__UCLIBC_USE_TIME64__) &&
> defined(__NR_rt_sigtimedwait_time64)
> >         result = INLINE_SYSCALL(rt_sigtimedwait_time64, 4, set, info,
> > -                                   timeout, __SYSCALL_SIGSET_T_SIZE);
> > +                                   timeout ? TO_TS64_P(timeout) : 0,
> __SYSCALL_SIGSET_T_SIZE);
> >  # else
> >         result = INLINE_SYSCALL(rt_sigtimedwait, 4, set, info,
> >                                     timeout, __SYSCALL_SIGSET_T_SIZE);
> > @@ -72,7 +72,7 @@ int __NC(sigtimedwait)(const sigset_t *set, siginfo_t
> *info,
> >         /* on uClibc we use the kernel sigset_t size */
> >  # if defined(__UCLIBC_USE_TIME64__) &&
> defined(__NR_rt_sigtimedwait_time64)
> >         return INLINE_SYSCALL(rt_sigtimedwait_time64, 4, set, info,
> > -                             timeout, __SYSCALL_SIGSET_T_SIZE);
> > +                             timeout ? TO_TS64_P(timeout) : 0,
> __SYSCALL_SIGSET_T_SIZE);
> >  # else
> >         return INLINE_SYSCALL(rt_sigtimedwait, 4, set, info,
> >                               timeout, __SYSCALL_SIGSET_T_SIZE);
> > diff --git a/libc/sysdeps/linux/common/__rt_sigwaitinfo.c
> b/libc/sysdeps/linux/common/__rt_sigwaitinfo.c
> > index d2d176a64..7830b2e2c 100644
> > --- a/libc/sysdeps/linux/common/__rt_sigwaitinfo.c
> > +++ b/libc/sysdeps/linux/common/__rt_sigwaitinfo.c
> > @@ -9,7 +9,7 @@
> >
> >  #include <sys/syscall.h>
> >
> > -#ifdef __NR_rt_sigtimedwait
> > +#if defined(__NR_rt_sigtimedwait) || (defined(__UCLIBC_USE_TIME64__) &&
> defined(__NR_rt_sigtimedwait_time64))
> >  # define __need_NULL
> >  # include <stddef.h>
> >  # include <signal.h>
> > diff --git a/libc/sysdeps/linux/common/alarm.c
> b/libc/sysdeps/linux/common/alarm.c
> > index 4e6e2215b..861f6ad8e 100644
> > --- a/libc/sysdeps/linux/common/alarm.c
> > +++ b/libc/sysdeps/linux/common/alarm.c
> > @@ -9,7 +9,7 @@
> >  #include <sys/syscall.h>
> >  #include <unistd.h>
> >
> > -#ifdef __NR_alarm && !defined(__UCLIBC_USE_TIME64__)
> > +#if defined(__NR_alarm) && !defined(__UCLIBC_USE_TIME64__)
> >  _syscall1(unsigned int, alarm, unsigned int, seconds)
> >  #else
> >  # include <sys/time.h>
> > diff --git a/libc/sysdeps/linux/common/clock_getres.c
> b/libc/sysdeps/linux/common/clock_getres.c
> > index d4b989958..c1818f9ce 100644
> > --- a/libc/sysdeps/linux/common/clock_getres.c
> > +++ b/libc/sysdeps/linux/common/clock_getres.c
> > @@ -10,9 +10,18 @@
> >  #include <sys/syscall.h>
> >  #include <time.h>
> >
> > -
> >  #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_clock_getres_time64)
> > -_syscall2_time64(int, clock_getres, clockid_t, clock_id, struct
> timespec*, res)
> > +int clock_getres(clockid_t clock_id, struct timespec *res)
> > +{
> > +       struct __ts64_struct __ts64;
> > +       int __ret = INLINE_SYSCALL(clock_getres_time64, 2, clock_id,
> &__ts64);
> > +       if (__ret == 0 && res) {
> > +               res->tv_sec = __ts64.tv_sec;
> > +               res->tv_nsec = __ts64.tv_nsec;
> > +       };
> > +
> > +       return __ret;
> > +}
> >  #elif defined(__NR_clock_getres)
> >  _syscall2(int, clock_getres, clockid_t, clock_id, struct timespec*, res)
> >  #else
> > diff --git a/libc/sysdeps/linux/common/clock_gettime.c
> b/libc/sysdeps/linux/common/clock_gettime.c
> > index a595bd691..00212a9ef 100644
> > --- a/libc/sysdeps/linux/common/clock_gettime.c
> > +++ b/libc/sysdeps/linux/common/clock_gettime.c
> > @@ -12,7 +12,17 @@
> >  #include <time.h>
> >
> >  #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_clock_gettime64)
> > -_syscall2_64(int, clock_gettime, clockid_t, clock_id, struct timespec*,
> tp)
> > +int clock_gettime(clockid_t clock_id, struct timespec *tp)
> > +{
> > +       struct __ts64_struct __ts64;
> > +       int __ret = INLINE_SYSCALL(clock_gettime64, 2, clock_id,
> &__ts64);
> > +       if (tp) {
> > +               tp->tv_sec = __ts64.tv_sec;
> > +               tp->tv_nsec = __ts64.tv_nsec;
> > +       }
> > +
> > +       return __ret;
> > +}
> >  #elif defined(__NR_clock_gettime)
> >  _syscall2(int, clock_gettime, clockid_t, clock_id, struct timespec*, tp)
> >  #else
> > diff --git a/libc/sysdeps/linux/common/clock_settime.c
> b/libc/sysdeps/linux/common/clock_settime.c
> > index 89550af5a..666ae4075 100644
> > --- a/libc/sysdeps/linux/common/clock_settime.c
> > +++ b/libc/sysdeps/linux/common/clock_settime.c
> > @@ -12,7 +12,10 @@
> >
> >
> >  #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_clock_settime64)
> > -_syscall2_64(int, clock_settime, clockid_t, clock_id, const struct
> timespec*, tp)
> > +int clock_settime(clockid_t clock_id, const struct timespec *tp)
> > +{
> > +       return INLINE_SYSCALL(clock_settime64, 2, clock_id, tp ?
> TO_TS64_P(tp) : 0);
> > +}
> >  #elif defined(__NR_clock_settime)
> >  _syscall2(int, clock_settime, clockid_t, clock_id, const struct
> timespec*, tp)
> >  #else
> > diff --git a/libc/sysdeps/linux/common/ppoll.c
> b/libc/sysdeps/linux/common/ppoll.c
> > index cb36149c5..3b98a2760 100644
> > --- a/libc/sysdeps/linux/common/ppoll.c
> > +++ b/libc/sysdeps/linux/common/ppoll.c
> > @@ -38,7 +38,7 @@ __NC(ppoll)(struct pollfd *fds, nfds_t nfds, const
> struct timespec *timeout,
> >                 timeout = &tval;
> >         }
> >  #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_ppoll_time64)
> > -       return INLINE_SYSCALL(ppoll_time64, 5, fds, nfds, timeout,
> sigmask, __SYSCALL_SIGSET_T_SIZE);
> > +       return INLINE_SYSCALL(ppoll_time64, 5, fds, nfds, timeout ?
> TO_TS64_P(timeout) : 0, sigmask, __SYSCALL_SIGSET_T_SIZE);
> >  #else
> >         return INLINE_SYSCALL(ppoll, 5, fds, nfds, timeout, sigmask,
> __SYSCALL_SIGSET_T_SIZE);
> >  #endif
> > diff --git a/libc/sysdeps/linux/common/pselect.c
> b/libc/sysdeps/linux/common/pselect.c
> > index 23bdab5cf..3ceb51012 100644
> > --- a/libc/sysdeps/linux/common/pselect.c
> > +++ b/libc/sysdeps/linux/common/pselect.c
> > @@ -57,7 +57,7 @@ static int __NC(pselect)(int nfds, fd_set *readfds,
> fd_set *writefds,
> >                 sigmask = (void *)&data;
> >         }
> >  #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_pselect6_time64)
> > -       return INLINE_SYSCALL(pselect6_time64, 6, nfds, readfds,
> writefds, exceptfds, timeout, sigmask);
> > +       return INLINE_SYSCALL(pselect6_time64, 6, nfds, readfds,
> writefds, exceptfds, timeout ? TO_TS64_P(timeout) : 0, sigmask);
> >  #else
> >         return INLINE_SYSCALL(pselect6, 6, nfds, readfds, writefds,
> exceptfds, timeout, sigmask);
> >  #endif
> > diff --git a/libc/sysdeps/linux/common/select.c
> b/libc/sysdeps/linux/common/select.c
> > index 3132a109c..05d2b55b2 100644
> > --- a/libc/sysdeps/linux/common/select.c
> > +++ b/libc/sysdeps/linux/common/select.c
> > @@ -15,7 +15,7 @@
> >  # define __NR_select __NR__newselect
> >  #endif
> >
> > -#if !defined __NR_select && defined __NR_pselect6
> > +#if defined(__NR_pselect6) || defined(__NR_pselect6_time64)
> >  # include <stdint.h>
> >  # define USEC_PER_SEC 1000000L
> >  #endif
> > @@ -23,9 +23,7 @@
> >  int __NC(select)(int n, fd_set *readfds, fd_set *writefds, fd_set
> *exceptfds,
> >                  struct timeval *timeout)
> >  {
> > -#ifdef __NR_select
> > -       return INLINE_SYSCALL(select, 5, n, readfds, writefds,
> exceptfds, timeout);
> > -#elif defined __NR_pselect6
> > +#if defined(__NR_pselect6) || defined(__NR_pselect6_time64)
> >         struct timespec _ts, *ts = 0;
> >         if (timeout) {
> >                 uint32_t usec;
> > @@ -47,8 +45,14 @@ int __NC(select)(int n, fd_set *readfds, fd_set
> *writefds, fd_set *exceptfds,
> >
> >                 ts = &_ts;
> >         }
> > +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_pselect6_time64)
> > +       return INLINE_SYSCALL(pselect6_time64, 6, n, readfds, writefds,
> exceptfds, ts ? TO_TS64_P(ts) : 0, 0);
> > +#else
> >         return INLINE_SYSCALL(pselect6, 6, n, readfds, writefds,
> exceptfds, ts, 0);
> >  #endif
> > +#elif defined(__NR_select)
> > +       return INLINE_SYSCALL(select, 5, n, readfds, writefds,
> exceptfds, ts);
> > +#endif
> >  }
> >  /* we should guard it, but we need it in other files, so let it fail
> >   * if we miss any of the syscalls */
> > diff --git a/libc/sysdeps/linux/common/time.c
> b/libc/sysdeps/linux/common/time.c
> > index 22403f174..d084ffaad 100644
> > --- a/libc/sysdeps/linux/common/time.c
> > +++ b/libc/sysdeps/linux/common/time.c
> > @@ -9,7 +9,7 @@
> >  #include <sys/syscall.h>
> >  #include <time.h>
> >
> > -#ifdef __NR_time
> > +#if defined(__NR_time) && !defined(__UCLIBC_USE_TIME64__)
> >  _syscall_noerr1(time_t, time, time_t *, t)
> >  #else
> >  # include <sys/time.h>
> > diff --git a/libc/sysdeps/linux/common/timerfd.c
> b/libc/sysdeps/linux/common/timerfd.c
> > index 0f19b44ed..07bfb09b7 100644
> > --- a/libc/sysdeps/linux/common/timerfd.c
> > +++ b/libc/sysdeps/linux/common/timerfd.c
> > @@ -21,7 +21,10 @@ _syscall2(int, timerfd_create, int, clockid, int,
> flags)
> >   */
> >  #if defined(__NR_timerfd_settime) || defined(__NR_timerfd_settime64)
> >  #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_timerfd_settime64)
> > -_syscall4_64(int, timerfd_settime, int, ufd, int, flags, const struct
> itimerspec *, utmr, struct itimerspec *, otmr)
> > +int timerfd_settime(int ufd, int flags, const struct itimerspec *utmr,
> struct itimerspec *otmr)
> > +{
> > +    return INLINE_SYSCALL(timerfd_settime64, 4, ufd, flags, utmr ?
> TO_ITS64_P(utmr) : 0, otmr);
> > +}
> >  #else
> >  _syscall4(int, timerfd_settime, int, ufd, int, flags, const struct
> itimerspec *, utmr, struct itimerspec *, otmr)
> >  #endif
> > diff --git a/libc/sysdeps/linux/common/utimensat.c
> b/libc/sysdeps/linux/common/utimensat.c
> > index 6a78ebb4f..339a35559 100644
> > --- a/libc/sysdeps/linux/common/utimensat.c
> > +++ b/libc/sysdeps/linux/common/utimensat.c
> > @@ -11,7 +11,21 @@
> >
> >  #if defined(__NR_utimensat) || defined(__NR_utimensat_time64)
> >  #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_utimensat_time64)
> > -_syscall4_time64(int, utimensat, int, fd, const char *, path, const
> struct timespec *, times, int, flags)
> > +int utimensat(int fd, const char *path, const struct timespec times[2],
> int flags)
> > +{
> > +    struct __ts64_struct __times64[2] = {
> > +        {
> > +            .tv_sec = times ? times[0].tv_sec : 0,
> > +            .tv_nsec = times ? times[0].tv_nsec : 0
> > +        },
> > +        {
> > +            .tv_sec = times ? times[1].tv_sec : 0,
> > +            .tv_nsec = times ? times[1].tv_nsec : 0
> > +        }
> > +    };
> > +
> > +    return INLINE_SYSCALL(utimensat_time64, 4, fd, path, times ?
> &__times64 : 0, flags);
> > +}
> >  #else
> >  _syscall4(int, utimensat, int, fd, const char *, path, const struct
> timespec *, times, int, flags)
> >  #endif
> > diff --git a/libpthread/nptl/pthread_mutex_timedlock.c
> b/libpthread/nptl/pthread_mutex_timedlock.c
> > index 25f9ec3b2..7bb9a0aaf 100644
> > --- a/libpthread/nptl/pthread_mutex_timedlock.c
> > +++ b/libpthread/nptl/pthread_mutex_timedlock.c
> > @@ -268,7 +268,7 @@ pthread_mutex_timedlock (
> >             int e = INTERNAL_SYSCALL (futex_time64, __err, 4,
> &mutex->__data.__lock,
> >                                       __lll_private_flag (FUTEX_LOCK_PI,
> >                                                           private), 1,
> > -                                     abstime);
> > +                                     abstime ? TO_TS64_P(abstime) : 0);
> >  #else
> >             int e = INTERNAL_SYSCALL (futex, __err, 4,
> &mutex->__data.__lock,
> >                                       __lll_private_flag (FUTEX_LOCK_PI,
> > diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.c
> b/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.c
> > index 4294a20b0..e168b3925 100644
> > --- a/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.c
> > +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.c
> > @@ -95,7 +95,7 @@ __lll_timedwait_tid (int *tidp, const struct timespec
> *abstime)
> >    while ((tid = *tidp) != 0)
> >      {
> >        struct timeval tv;
> > -      struct timespec rt;
> > +      struct timespec rt, *rtp;
> >
> >        /* Get the current time.  */
> >        (void) __gettimeofday (&tv, NULL);
> > @@ -115,7 +115,8 @@ __lll_timedwait_tid (int *tidp, const struct
> timespec *abstime)
> >
> >        /* Wait until thread terminates.  The kernel so far does not use
> >          the private futex operations for this.  */
> > -      if (lll_futex_timed_wait (tidp, tid, &rt, LLL_SHARED) ==
> -ETIMEDOUT)
> > +      rtp = &rt;
> > +      if (lll_futex_timed_wait (tidp, tid, rtp, LLL_SHARED) ==
> -ETIMEDOUT)
>
> Not needed, right?
>
> >         return ETIMEDOUT;
> >      }
> >
> > diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.h
> b/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.h
> > index e72fe5234..909b0aad3 100644
> > --- a/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.h
> > +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.h
> > @@ -71,8 +71,31 @@
> >  # endif
> >  #endif
> >
> > +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_futex_time64)
> > +
> >  #define lll_futex_wait(futexp, val, private) \
> > -  lll_futex_timed_wait(futexp, val, NULL, private)
> > +  ({
>      \
> > +    INTERNAL_SYSCALL_DECL (__err);
>      \
> > +    long int __ret;
>       \
> > +    __ret = INTERNAL_SYSCALL (futex_time64, __err, 4, (futexp),
>               \
> > +                             __lll_private_flag (FUTEX_WAIT, private),
>      \
> > +                             (val), NULL);                           \
> > +    __ret;
>      \
> > +  })
> > +
> > +#else
> > +
> > +#define lll_futex_wait(futexp, val, private) \
> > +  ({
>      \
> > +    INTERNAL_SYSCALL_DECL (__err);
>      \
> > +    long int __ret;
>       \
> > +    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),
>      \
> > +                             __lll_private_flag (FUTEX_WAIT, private),
>      \
> > +                             (val), NULL);                           \
> > +    __ret;
>      \
> > +  })
> > +
> > +#endif
> >
> >  #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_futex_time64)
> >
> > @@ -82,7 +105,7 @@
> >      long int __ret;
>       \
> >      __ret = INTERNAL_SYSCALL (futex_time64, __err, 4, (futexp),
>               \
> >                               __lll_private_flag (FUTEX_WAIT, private),
>      \
> > -                             (val), (timespec));
>      \
> > +                             (val), (TO_TS64_P(timespec)));
>               \
>
> This is missing the 'timespec is non-NULL' check.
> Which should be inside the macro anyway.
>
> >      __ret;
>      \
> >    })
> >
> > diff --git
> a/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c
> b/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c
> > index 7b4e84343..6403f7ea0 100644
> > --- a/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c
> > +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c
> > @@ -99,7 +99,6 @@ __lll_robust_timedlock_wait (int *futex, const struct
> timespec *abstime,
> >        if (oldval != newval
> >           && atomic_compare_and_exchange_bool_acq (futex, newval,
> oldval))
> >         continue;
> > -
>
> Please don't do random formatting changes.
>
> >        lll_futex_timed_wait (futex, newval, &rt, private);
> >
> >      try:
> > diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_settime.c
> b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_settime.c
> > index 80d242f21..4fa600cb6 100644
> > --- a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_settime.c
> > +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_settime.c
> > @@ -56,7 +56,7 @@ timer_settime (
> >        /* Delete the kernel timer object.  */
> >  # if defined(__UCLIBC_USE_TIME64__) && defined(__NR_timer_settime64)
> >        int res = INLINE_SYSCALL (timer_settime64, 4, kt->ktimerid, flags,
> > -                               value, ovalue);
> > +                               value ? TO_ITS64_P(value) : 0, ovalue);
> >  # else
> >        int res = INLINE_SYSCALL (timer_settime, 4, kt->ktimerid, flags,
> >                                 value, ovalue);
> > diff --git a/librt/clock_gettime.c b/librt/clock_gettime.c
> > index b66b60231..c514e1a54 100644
> > --- a/librt/clock_gettime.c
> > +++ b/librt/clock_gettime.c
> > @@ -24,8 +24,15 @@
> >
> >  #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_clock_gettime64)
> >  #define SYSCALL_GETTIME \
> > -  retval = INLINE_SYSCALL (clock_gettime64, 2, clock_id, tp); \
> > -  break
> > +  { \
> > +  struct __ts64_struct __ts64; \
> > +  retval = INLINE_SYSCALL (clock_gettime64, 2, clock_id, &__ts64); \
> > +  if (tp) { \
> > +    tp->tv_sec = __ts64.tv_sec; \
> > +    tp->tv_nsec = __ts64.tv_nsec; \
> > +  } \
> > +  break; \
> > +  }
> >  #else
> >  #define SYSCALL_GETTIME \
> >    retval = INLINE_SYSCALL (clock_gettime, 2, clock_id, tp); \
> > diff --git a/librt/clock_nanosleep.c b/librt/clock_nanosleep.c
> > index eaae75720..cb7b2afa3 100644
> > --- a/librt/clock_nanosleep.c
> > +++ b/librt/clock_nanosleep.c
> > @@ -21,7 +21,6 @@
> >
> >  #include "kernel-posix-cpu-timers.h"
> >
> > -
>
> Please don't do random formatting changes.
>
> >  /* We can simply use the syscall.  The CPU clocks are not supported
> >     with this function.  */
> >  int
> > @@ -38,7 +37,7 @@ clock_nanosleep (clockid_t clock_id, int flags, const
> struct timespec *req,
> >
> >    if (SINGLE_THREAD_P)
> >  #if defined(__UCLIBC_USE_TIME64__) &&
> defined(__NR_clock_nanosleep_time64)
> > -    r = INTERNAL_SYSCALL (clock_nanosleep_time64, err, 4, clock_id,
> flags, req, rem);
> > +    r = INTERNAL_SYSCALL (clock_nanosleep_time64, err, 4, clock_id,
> flags, req ? TO_TS64_P(req) : 0, rem);
> >  #else
> >      r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags,
> req, rem);
> >  #endif
> > @@ -47,7 +46,7 @@ clock_nanosleep (clockid_t clock_id, int flags, const
> struct timespec *req,
> >  #ifdef __NEW_THREADS
> >        int oldstate = LIBC_CANCEL_ASYNC ();
> >  #if defined(__UCLIBC_USE_TIME64__) &&
> defined(__NR_clock_nanosleep_time64)
> > -      r = INTERNAL_SYSCALL (clock_nanosleep_time64, err, 4, clock_id,
> flags, req, rem);
> > +      r = INTERNAL_SYSCALL (clock_nanosleep_time64, err, 4, clock_id,
> flags, req ? TO_TS64_P(req): 0, rem);
> >  #else
> >        r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags,
> req,
> >                             rem);
> > diff --git a/librt/mq_timedreceive.c b/librt/mq_timedreceive.c
> > index db1ae1aa8..2570b6f9e 100644
> > --- a/librt/mq_timedreceive.c
> > +++ b/librt/mq_timedreceive.c
> > @@ -9,12 +9,14 @@
> >  #include <cancel.h>
> >
> >  #if defined(__UCLIBC_USE_TIME64__) &&
> defined(__NR_mq_timedreceive_time64)
> > -#define __NR___mq_timedreceive_nocancel __NR_mq_timedreceive_time64
> > +int _NC(mq_timedreceive)(mqd_t mqdes, char *restrict msg_ptr, size_t
> msg_len, unsigned int *restrict msq_prio, const struct timespec *restrict
> abs_timeout)
> > +{
> > +       return INLINE_SYSCALL(mq_timedreceive_time64, 5, mqdes, msg_ptr,
> msg_len, msq_prio, abs_timeout ? TO_TS64_P(abs_timeout) : 0);
> > +}
> >  #else
> >  #define __NR___mq_timedreceive_nocancel __NR_mq_timedreceive
> > -#endif
> > -
> >  _syscall5(ssize_t, __NC(mq_timedreceive), mqd_t, mqdes, char
> *__restrict, msg_ptr, size_t, msg_len, unsigned int *__restrict, msq_prio,
> const struct timespec *__restrict, abs_timeout)
> > +#endif
> >
> >  CANCELLABLE_SYSCALL(ssize_t, mq_timedreceive, (mqd_t mqdes, char
> *__restrict msg_ptr, size_t msq_len, unsigned int *__restrict msq_prio,
> const struct timespec *__restrict abs_timeout),
> >                     (mqdes, msg_ptr, msq_len, msq_prio, abs_timeout))
> > diff --git a/librt/mq_timedsend.c b/librt/mq_timedsend.c
> > index 6afaf5157..bcbc0685f 100644
> > --- a/librt/mq_timedsend.c
> > +++ b/librt/mq_timedsend.c
> > @@ -10,11 +10,15 @@
> >
> >  #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_mq_timedsend_time64)
> >  #define __NR___mq_timedsend_nocancel __NR_mq_timedsend_time64
> > +int _NC(mq_timedsend)(mqd_t mqdes, const char *msg_ptr, size_t msg_len,
> unsigned int msq_prio, const struct timespec *abs_timeout)
> > +{
> > +       return INLINE_SYSCALL(mq_timedsend_time64, 5, mqdes, msg_ptr,
> msg_len, msq_prio, abs_timeout ? TO_TS64_P(abs_timeout) : 0);
> > +}
> >  #else
> >  #define __NR___mq_timedsend_nocancel __NR_mq_timedsend
> > +_syscall5(int, __NC(mq_timedsend), mqd_t, mqdes, const char *, msg_ptr,
> size_t, msg_len, unsigned int, msq_prio, const struct timespec *,
> abs_timeout)
> >  #endif
> >
> > -_syscall5(int, __NC(mq_timedsend), mqd_t, mqdes, const char *, msg_ptr,
> size_t, msg_len, unsigned int, msq_prio, const struct timespec *,
> abs_timeout)
> >  CANCELLABLE_SYSCALL(int, mq_timedsend, (mqd_t mqdes, const char
> *msg_ptr, size_t msq_len, unsigned int msq_prio, const struct timespec
> *abs_timeout),
> >                     (mqdes, msg_ptr, msq_len, msq_prio, abs_timeout))
> >  lt_libc_hidden(mq_timedsend)
> > diff --git a/librt/timer_settime.c b/librt/timer_settime.c
> > index 022880297..6bf5f8307 100644
> > --- a/librt/timer_settime.c
> > +++ b/librt/timer_settime.c
> > @@ -12,10 +12,14 @@
> >  #if defined(__NR_timer_settime) || defined(__NR_timer_settime64)
> >
> >  #if defined(__UCLIBC_USE_TIME64__) && defined(__NR_timer_settime64)
> > -#define __NR___syscall_timer_settime __NR_timer_settime64
> > +int timer_settime(timer_t timerid, int flags, const struct itimerspec
> *value, struct itimerspec *ovalue)
> > +{
> > +       struct timer *kt = (struct timer *)timerid;
> > +
> > +       return INLINE_SYSCALL(timer_settime64, 4, kt->ktimerid, flags,
> value ? TO_ITS64_P(value) : 0, ovalue);
> > +}
> >  #else
> >  #define __NR___syscall_timer_settime __NR_timer_settime
> > -#endif
> >
> >  static __inline__ _syscall4(int, __syscall_timer_settime,
> kernel_timer_t, ktimerid,
> >                         int, flags, const void *, value, void *, ovalue);
> > @@ -31,3 +35,4 @@ int timer_settime(timer_t timerid, int flags, const
> struct itimerspec *value,
> >  }
> >
> >  #endif
> > +#endif
> > --
> > 2.43.2
> >
> > _______________________________________________
> > devel mailing list -- devel@uclibc-ng.org
> > To unsubscribe send an email to devel-le...@uclibc-ng.org
>
>
>
> --
> Thanks.
> -- Max
>
_______________________________________________
devel mailing list -- devel@uclibc-ng.org
To unsubscribe send an email to devel-le...@uclibc-ng.org

Reply via email to