mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 13:00:06 +00:00
y2038: linux: Provide ___adjtimex64 implementation
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> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
parent
63ff4a6d17
commit
8f8a6cae48
@ -20,11 +20,28 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
|
||||||
int
|
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
|
#ifdef VERSION_adjtimex
|
||||||
weak_alias (___adjtimex, __wadjtimex);
|
weak_alias (___adjtimex, __wadjtimex);
|
||||||
weak_alias (___adjtimex, __wnadjtime);
|
weak_alias (___adjtimex, __wnadjtime);
|
||||||
|
@ -31,6 +31,7 @@ libc_hidden_proto (__adjtimex)
|
|||||||
# if __TIMESIZE == 64
|
# if __TIMESIZE == 64
|
||||||
# define __timex64 timex
|
# define __timex64 timex
|
||||||
# define __clock_adjtime64 __clock_adjtime
|
# define __clock_adjtime64 __clock_adjtime
|
||||||
|
# define ___adjtimex64 ___adjtimex
|
||||||
# else
|
# else
|
||||||
|
|
||||||
struct __timex64
|
struct __timex64
|
||||||
@ -74,6 +75,8 @@ struct __timex64
|
|||||||
};
|
};
|
||||||
extern int __clock_adjtime64 (const clockid_t clock_id, struct __timex64 *tx64);
|
extern int __clock_adjtime64 (const clockid_t clock_id, struct __timex64 *tx64);
|
||||||
libc_hidden_proto (__clock_adjtime64);
|
libc_hidden_proto (__clock_adjtime64);
|
||||||
|
extern int ___adjtimex64 (struct __timex64 *tx64);
|
||||||
|
libc_hidden_proto (___adjtimex64)
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Convert a known valid struct timex into a struct __timex64. */
|
/* Convert a known valid struct timex into a struct __timex64. */
|
||||||
|
Loading…
Reference in New Issue
Block a user