mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
y2038: linux: Provide __adjtime64 implementation
This patch provides new __adjtime64 explicit 64 bit function for adjusting Linux kernel clock. Internally, the __clock_adjtime64 syscall is used instead of __adjtimex. This patch is necessary for having architectures with __WORDSIZE == 32 Y2038 safe. Moreover, a 32 bit version - __adjtime has been refactored to internally use __adjtime64. The __adjtime is now supposed to be used on systems still supporting 32 bit time (__TIMESIZE != 64) - hence the necessary conversions between struct timeval and 64 bit struct __timeval64. 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 __adjtime64 and __adjtime. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
parent
8f8a6cae48
commit
0308077e3a
@ -26,6 +26,15 @@ extern int __settimezone (const struct timezone *__tz)
|
||||
attribute_hidden;
|
||||
extern int __adjtime (const struct timeval *__delta,
|
||||
struct timeval *__olddelta);
|
||||
|
||||
# include <struct___timeval64.h>
|
||||
# if __TIMESIZE == 64
|
||||
# define __adjtime64 __adjtime
|
||||
# else
|
||||
extern int __adjtime64 (const struct __timeval64 *itv,
|
||||
struct __timeval64 *otv);
|
||||
libc_hidden_proto (__adjtime64)
|
||||
# endif
|
||||
extern int __getitimer (enum __itimer_which __which,
|
||||
struct itimerval *__value);
|
||||
extern int __setitimer (enum __itimer_which __which,
|
||||
|
@ -24,13 +24,13 @@
|
||||
#define MIN_SEC (INT_MIN / 1000000L + 2)
|
||||
|
||||
int
|
||||
__adjtime (const struct timeval *itv, struct timeval *otv)
|
||||
__adjtime64 (const struct __timeval64 *itv, struct __timeval64 *otv)
|
||||
{
|
||||
struct timex tntx;
|
||||
struct __timex64 tntx;
|
||||
|
||||
if (itv)
|
||||
{
|
||||
struct timeval tmp;
|
||||
struct __timeval64 tmp;
|
||||
|
||||
/* We will do some check here. */
|
||||
tmp.tv_sec = itv->tv_sec + itv->tv_usec / 1000000L;
|
||||
@ -43,7 +43,7 @@ __adjtime (const struct timeval *itv, struct timeval *otv)
|
||||
else
|
||||
tntx.modes = ADJ_OFFSET_SS_READ;
|
||||
|
||||
if (__glibc_unlikely (__adjtimex (&tntx) < 0))
|
||||
if (__glibc_unlikely (__clock_adjtime64 (CLOCK_REALTIME, &tntx) < 0))
|
||||
return -1;
|
||||
|
||||
if (otv)
|
||||
@ -62,6 +62,24 @@ __adjtime (const struct timeval *itv, struct timeval *otv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if __TIMESIZE != 64
|
||||
libc_hidden_def (__adjtime64)
|
||||
|
||||
int
|
||||
__adjtime (const struct timeval *itv, struct timeval *otv)
|
||||
{
|
||||
struct __timeval64 itv64, otv64;
|
||||
int retval;
|
||||
|
||||
itv64 = valid_timeval_to_timeval64 (*itv);
|
||||
retval = __adjtime64 (&itv64, otv != NULL ? &otv64 : NULL);
|
||||
if (otv != NULL)
|
||||
*otv = valid_timeval64_to_timeval (otv64);
|
||||
|
||||
return retval;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef VERSION_adjtime
|
||||
weak_alias (__adjtime, __wadjtime);
|
||||
default_symbol_version (__wadjtime, adjtime, VERSION_adjtime);
|
||||
|
Loading…
Reference in New Issue
Block a user