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