[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