diff mbox series

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

Message ID 20200426133110.5312-6-lukma@denx.de
State New
Headers show
Series y2038: Convert clock_adjtime related syscalls to support 64 bit time | expand

Commit Message

Lukasz Majewski April 26, 2020, 1:31 p.m. UTC
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.
---
 sysdeps/unix/sysv/linux/adjtimex.c          | 21 +++++++++++++++++++--
 sysdeps/unix/sysv/linux/include/sys/timex.h |  3 +++
 2 files changed, 22 insertions(+), 2 deletions(-)

Comments

Alistair Francis April 27, 2020, 10:12 p.m. UTC | #1
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
>
Adhemerval Zanella Netto April 28, 2020, 5:14 p.m. UTC | #2
On 26/04/2020 10:31, Lukasz Majewski 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.

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
>  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);
>  }
>  

Ok.

> +#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);

Ok.

> 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.  */
> 

Ok.
diff mbox series

Patch

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.  */