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

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

Commit Message

Lukasz Majewski April 26, 2020, 1:31 p.m.
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(-)

-- 
2.20.1

Comments

Alistair Francis via Libc-alpha April 27, 2020, 10:12 p.m. | #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

>
Alistair Francis via Libc-alpha April 28, 2020, 5:14 p.m. | #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.

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