Message ID | 20200508145640.16336-8-lukma@denx.de |
---|---|
State | New |
Headers | show |
Series | y2038: Convert clock_adjtime related syscalls to support 64 bit time | expand |
On 08/05/2020 11:56, Lukasz Majewski wrote: > This patch provides new __ntp_gettimex64 explicit 64 bit function for getting > time parameters via NTP interface. > > The call to __adjtimex in __ntp_gettime64 function has been replaced with > direct call to __clock_adjtime64 syscall, to simplify the code. > > Moreover, a 32 bit version - __ntp_gettimex has been refactored to internally > use __ntp_gettimex64. > > The __ntp_gettimex is now supposed to be used on systems still supporting 32 > bit time (__TIMESIZE != 64) - hence the necessary conversions between struct > ntptimeval and 64 bit struct __ntptimeval64. > > 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 __ntp_gettimex64 and __ntp_gettimex. Ok with a doubt below. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> > --- > sysdeps/unix/sysv/linux/include/sys/timex.h | 3 +++ > sysdeps/unix/sysv/linux/ntp_gettimex.c | 24 ++++++++++++++++++--- > 2 files changed, 24 insertions(+), 3 deletions(-) > > diff --git a/sysdeps/unix/sysv/linux/include/sys/timex.h b/sysdeps/unix/sysv/linux/include/sys/timex.h > index ef53515803..335a38c3bd 100644 > --- a/sysdeps/unix/sysv/linux/include/sys/timex.h > +++ b/sysdeps/unix/sysv/linux/include/sys/timex.h > @@ -34,6 +34,7 @@ libc_hidden_proto (__adjtimex) > # define ___adjtimex64 ___adjtimex > # define __ntptimeval64 ntptimeval > # define __ntp_gettime64 __ntp_gettime > +# define __ntp_gettimex64 __ntp_gettimex > # else > > struct __timex64 > @@ -94,6 +95,8 @@ struct __ntptimeval64 > }; > extern int __ntp_gettime64 (struct __ntptimeval64 *ntv); > libc_hidden_proto (__ntp_gettime64) > +extern int __ntp_gettimex64 (struct __ntptimeval64 *ntv); > +libc_hidden_proto (__ntp_gettimex64) > > # endif > > diff --git a/sysdeps/unix/sysv/linux/ntp_gettimex.c b/sysdeps/unix/sysv/linux/ntp_gettimex.c > index 0f26d4806e..7d0328c6ca 100644 > --- a/sysdeps/unix/sysv/linux/ntp_gettimex.c > +++ b/sysdeps/unix/sysv/linux/ntp_gettimex.c > @@ -15,6 +15,7 @@ > License along with the GNU C Library; if not, see > <https://www.gnu.org/licenses/>. */ > > +#include <time.h> > #include <sys/timex.h> > > #ifndef MOD_OFFSET > @@ -23,13 +24,13 @@ > > > int > -ntp_gettimex (struct ntptimeval *ntv) > +__ntp_gettimex64 (struct __ntptimeval64 *ntv) > { > - struct timex tntx; > + struct __timex64 tntx; > int result; > > tntx.modes = 0; > - result = __adjtimex (&tntx); > + result = __clock_adjtime64 (CLOCK_REALTIME, &tntx); > ntv->time = tntx.time; > ntv->maxerror = tntx.maxerror; > ntv->esterror = tntx.esterror; > @@ -40,3 +41,20 @@ ntp_gettimex (struct ntptimeval *ntv) > ntv->__glibc_reserved4 = 0; > return result; > } Ok. As for ntp_gettimex64, maybe add a comment stating that using CLOCK_REALTIME should not make the function fail with EINVAL, ENODEV, or EOPNOTSUPP. I am not sure about EPERM in this situation, should we check for that and avoid seeting NTV in such situation? > + > +#if __TIMESIZE != 64 > +libc_hidden_def (__ntp_gettimex64) > + > +int > +__ntp_gettimex (struct ntptimeval *ntv) > +{ > + struct __ntptimeval64 ntv64; > + int result; > + > + result = __ntp_gettimex64 (&ntv64); > + *ntv = valid_ntptimeval64_to_ntptimeval (ntv64); > + > + return result; > +} > +#endif > +strong_alias (__ntp_gettimex, ntp_gettimex) >
diff --git a/sysdeps/unix/sysv/linux/include/sys/timex.h b/sysdeps/unix/sysv/linux/include/sys/timex.h index ef53515803..335a38c3bd 100644 --- a/sysdeps/unix/sysv/linux/include/sys/timex.h +++ b/sysdeps/unix/sysv/linux/include/sys/timex.h @@ -34,6 +34,7 @@ libc_hidden_proto (__adjtimex) # define ___adjtimex64 ___adjtimex # define __ntptimeval64 ntptimeval # define __ntp_gettime64 __ntp_gettime +# define __ntp_gettimex64 __ntp_gettimex # else struct __timex64 @@ -94,6 +95,8 @@ struct __ntptimeval64 }; extern int __ntp_gettime64 (struct __ntptimeval64 *ntv); libc_hidden_proto (__ntp_gettime64) +extern int __ntp_gettimex64 (struct __ntptimeval64 *ntv); +libc_hidden_proto (__ntp_gettimex64) # endif diff --git a/sysdeps/unix/sysv/linux/ntp_gettimex.c b/sysdeps/unix/sysv/linux/ntp_gettimex.c index 0f26d4806e..7d0328c6ca 100644 --- a/sysdeps/unix/sysv/linux/ntp_gettimex.c +++ b/sysdeps/unix/sysv/linux/ntp_gettimex.c @@ -15,6 +15,7 @@ License along with the GNU C Library; if not, see <https://www.gnu.org/licenses/>. */ +#include <time.h> #include <sys/timex.h> #ifndef MOD_OFFSET @@ -23,13 +24,13 @@ int -ntp_gettimex (struct ntptimeval *ntv) +__ntp_gettimex64 (struct __ntptimeval64 *ntv) { - struct timex tntx; + struct __timex64 tntx; int result; tntx.modes = 0; - result = __adjtimex (&tntx); + result = __clock_adjtime64 (CLOCK_REALTIME, &tntx); ntv->time = tntx.time; ntv->maxerror = tntx.maxerror; ntv->esterror = tntx.esterror; @@ -40,3 +41,20 @@ ntp_gettimex (struct ntptimeval *ntv) ntv->__glibc_reserved4 = 0; return result; } + +#if __TIMESIZE != 64 +libc_hidden_def (__ntp_gettimex64) + +int +__ntp_gettimex (struct ntptimeval *ntv) +{ + struct __ntptimeval64 ntv64; + int result; + + result = __ntp_gettimex64 (&ntv64); + *ntv = valid_ntptimeval64_to_ntptimeval (ntv64); + + return result; +} +#endif +strong_alias (__ntp_gettimex, ntp_gettimex)