[PATCH 05/10] y2038: linux: Provide ___adjtimex64 implementation

Alistair Francis alistair23@gmail.com
Mon Apr 27 22:12:57 GMT 2020


On Sun, Apr 26, 2020 at 6:31 AM Lukasz Majewski <lukma@denx.de> wrote:
>
> This patch provides new ___adjtimex64 explicit 64 bit function for adjusting
> Linux kernel clock.
>
> Internally, the __clock_adjtime64 syscall is used. This patch is necessary
> for having architectures with __WORDSIZE == 32 Y2038 safe.
>
> Moreover, a 32 bit version - ___adjtimex has been refactored to internally
> use ___adjtimex64.
>
> The ___adjtimex is now supposed to be used on systems still supporting 32
> bit time (__TIMESIZE != 64) - hence the necessary conversions between struct
> timex and 64 bit struct __timex64.
>
> Last but not least, in ___adjtimex64 function the __clock_adjtime syscall has
> been replaced with __clock_adjtime64 to support 64 bit time on architectures
> with __WORDSIZE == 32 and __TIMESIZE != 64.
>
> Build tests:
> ./src/scripts/build-many-glibcs.py glibcs
>
> Run-time tests:
> - Run specific tests on ARM/x86 32bit systems (qemu):
>   https://github.com/lmajewski/meta-y2038 and run tests:
>   https://github.com/lmajewski/y2038-tests/commits/master
>
> Above tests were performed with Y2038 redirection applied as well as without to
> test the proper usage of both ___adjtimex64 and ___adjtimex.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>

Alistair

> ---
>  sysdeps/unix/sysv/linux/adjtimex.c          | 21 +++++++++++++++++++--
>  sysdeps/unix/sysv/linux/include/sys/timex.h |  3 +++
>  2 files changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/sysdeps/unix/sysv/linux/adjtimex.c b/sysdeps/unix/sysv/linux/adjtimex.c
> index ebc17476a7..683cc65696 100644
> --- a/sysdeps/unix/sysv/linux/adjtimex.c
> +++ b/sysdeps/unix/sysv/linux/adjtimex.c
> @@ -20,11 +20,28 @@
>  #include <sysdep.h>
>
>  int
> -___adjtimex (struct timex *buf)
> +___adjtimex64 (struct __timex64 *tx64)
>  {
> -  return __clock_adjtime (CLOCK_REALTIME, buf);
> +  return __clock_adjtime64 (CLOCK_REALTIME, tx64);
>  }
>
> +#if __TIMESIZE != 64
> +libc_hidden_def (___adjtimex64)
> +
> +int
> +___adjtimex (struct timex *tx)
> +{
> +  struct __timex64 tx64;
> +  int retval;
> +
> +  tx64 = valid_timex_to_timex64 (*tx);
> +  retval = ___adjtimex64 (&tx64);
> +  *tx = valid_timex64_to_timex (tx64);
> +
> +  return retval;
> +}
> +#endif
> +
>  #ifdef VERSION_adjtimex
>  weak_alias (___adjtimex, __wadjtimex);
>  weak_alias (___adjtimex, __wnadjtime);
> diff --git a/sysdeps/unix/sysv/linux/include/sys/timex.h b/sysdeps/unix/sysv/linux/include/sys/timex.h
> index f1bb364db4..fdfffe2f3a 100644
> --- a/sysdeps/unix/sysv/linux/include/sys/timex.h
> +++ b/sysdeps/unix/sysv/linux/include/sys/timex.h
> @@ -31,6 +31,7 @@ libc_hidden_proto (__adjtimex)
>  #  if __TIMESIZE == 64
>  #   define __timex64 timex
>  #   define __clock_adjtime64 __clock_adjtime
> +#   define ___adjtimex64 ___adjtimex
>  #  else
>
>  struct __timex64
> @@ -66,6 +67,8 @@ struct __timex64
>  };
>  extern int __clock_adjtime64 (const clockid_t clock_id, struct __timex64 *tx64);
>  libc_hidden_proto (__clock_adjtime64);
> +extern int ___adjtimex64 (struct __timex64 *tx64);
> +libc_hidden_proto (___adjtimex64)
>  #  endif
>
>  /* Convert a known valid struct timex into a struct __timex64.  */
> --
> 2.20.1
>


More information about the Libc-alpha mailing list