Commit ddccf40f authored by Arnd Bergmann's avatar Arnd Bergmann

y2038: vdso: change timeval to __kernel_old_timeval

The gettimeofday() function in vdso uses the traditional 'timeval'
structure layout, which will be incompatible with future versions of
glibc on 32-bit architectures that use a 64-bit time_t.

This interface is problematic for y2038, when time_t overflows on 32-bit
architectures, but the plan so far is that a libc with 64-bit time_t
will not call into the gettimeofday() vdso helper at all, and only
have a method for entering clock_gettime().  This means we don't have
to fix it here, though we probably want to add a new clock_gettime()
entry point using a 64-bit version of 'struct timespec' at some point.

Changing the vdso code to use __kernel_old_timeval helps isolate
this usage from the other ones that still need to be fixed properly,
and it gets us closer to removing the 'timeval' definition from the
kernel sources.
Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent 94c467dd
...@@ -230,10 +230,10 @@ notrace int __vdso_clock_getres(clockid_t clk_id, struct timespec *res) ...@@ -230,10 +230,10 @@ notrace int __vdso_clock_getres(clockid_t clk_id, struct timespec *res)
return 0; return 0;
} }
static notrace inline int gettimeofday_fallback(struct timeval *_tv, static notrace inline int gettimeofday_fallback(struct __kernel_old_timeval *_tv,
struct timezone *_tz) struct timezone *_tz)
{ {
register struct timeval *tv asm("$r0") = _tv; register struct __kernel_old_timeval *tv asm("$r0") = _tv;
register struct timezone *tz asm("$r1") = _tz; register struct timezone *tz asm("$r1") = _tz;
register int ret asm("$r0"); register int ret asm("$r0");
...@@ -246,7 +246,7 @@ static notrace inline int gettimeofday_fallback(struct timeval *_tv, ...@@ -246,7 +246,7 @@ static notrace inline int gettimeofday_fallback(struct timeval *_tv,
return ret; return ret;
} }
notrace int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz) notrace int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
{ {
struct timespec ts; struct timespec ts;
struct vdso_data *vdata; struct vdso_data *vdata;
......
...@@ -393,8 +393,8 @@ int main(void) ...@@ -393,8 +393,8 @@ int main(void)
OFFSET(CFG_DCACHE_LOGBLOCKSZ, vdso_data, dcache_log_block_size); OFFSET(CFG_DCACHE_LOGBLOCKSZ, vdso_data, dcache_log_block_size);
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
OFFSET(CFG_SYSCALL_MAP64, vdso_data, syscall_map_64); OFFSET(CFG_SYSCALL_MAP64, vdso_data, syscall_map_64);
OFFSET(TVAL64_TV_SEC, timeval, tv_sec); OFFSET(TVAL64_TV_SEC, __kernel_old_timeval, tv_sec);
OFFSET(TVAL64_TV_USEC, timeval, tv_usec); OFFSET(TVAL64_TV_USEC, __kernel_old_timeval, tv_usec);
OFFSET(TVAL32_TV_SEC, old_timeval32, tv_sec); OFFSET(TVAL32_TV_SEC, old_timeval32, tv_sec);
OFFSET(TVAL32_TV_USEC, old_timeval32, tv_usec); OFFSET(TVAL32_TV_USEC, old_timeval32, tv_usec);
OFFSET(TSPC64_TV_SEC, timespec, tv_sec); OFFSET(TSPC64_TV_SEC, timespec, tv_sec);
...@@ -402,8 +402,8 @@ int main(void) ...@@ -402,8 +402,8 @@ int main(void)
OFFSET(TSPC32_TV_SEC, old_timespec32, tv_sec); OFFSET(TSPC32_TV_SEC, old_timespec32, tv_sec);
OFFSET(TSPC32_TV_NSEC, old_timespec32, tv_nsec); OFFSET(TSPC32_TV_NSEC, old_timespec32, tv_nsec);
#else #else
OFFSET(TVAL32_TV_SEC, timeval, tv_sec); OFFSET(TVAL32_TV_SEC, __kernel_old_timeval, tv_sec);
OFFSET(TVAL32_TV_USEC, timeval, tv_usec); OFFSET(TVAL32_TV_USEC, __kernel_old_timeval, tv_usec);
OFFSET(TSPC32_TV_SEC, timespec, tv_sec); OFFSET(TSPC32_TV_SEC, timespec, tv_sec);
OFFSET(TSPC32_TV_NSEC, timespec, tv_nsec); OFFSET(TSPC32_TV_NSEC, timespec, tv_nsec);
#endif #endif
......
...@@ -74,7 +74,7 @@ notrace static long vdso_fallback_gettime(long clock, struct timespec *ts) ...@@ -74,7 +74,7 @@ notrace static long vdso_fallback_gettime(long clock, struct timespec *ts)
return o0; return o0;
} }
notrace static long vdso_fallback_gettimeofday(struct timeval *tv, struct timezone *tz) notrace static long vdso_fallback_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
{ {
register long num __asm__("g1") = __NR_gettimeofday; register long num __asm__("g1") = __NR_gettimeofday;
register long o0 __asm__("o0") = (long) tv; register long o0 __asm__("o0") = (long) tv;
...@@ -304,7 +304,7 @@ __vdso_clock_gettime_stick(clockid_t clock, struct timespec *ts) ...@@ -304,7 +304,7 @@ __vdso_clock_gettime_stick(clockid_t clock, struct timespec *ts)
} }
notrace int notrace int
__vdso_gettimeofday(struct timeval *tv, struct timezone *tz) __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
{ {
struct vvar_data *vvd = get_vvar_data(); struct vvar_data *vvd = get_vvar_data();
...@@ -312,7 +312,7 @@ __vdso_gettimeofday(struct timeval *tv, struct timezone *tz) ...@@ -312,7 +312,7 @@ __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
if (likely(tv != NULL)) { if (likely(tv != NULL)) {
union tstv_t { union tstv_t {
struct timespec ts; struct timespec ts;
struct timeval tv; struct __kernel_old_timeval tv;
} *tstv = (union tstv_t *) tv; } *tstv = (union tstv_t *) tv;
do_realtime(vvd, &tstv->ts); do_realtime(vvd, &tstv->ts);
/* /*
...@@ -336,11 +336,11 @@ __vdso_gettimeofday(struct timeval *tv, struct timezone *tz) ...@@ -336,11 +336,11 @@ __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
return vdso_fallback_gettimeofday(tv, tz); return vdso_fallback_gettimeofday(tv, tz);
} }
int int
gettimeofday(struct timeval *, struct timezone *) gettimeofday(struct __kernel_old_timeval *, struct timezone *)
__attribute__((weak, alias("__vdso_gettimeofday"))); __attribute__((weak, alias("__vdso_gettimeofday")));
notrace int notrace int
__vdso_gettimeofday_stick(struct timeval *tv, struct timezone *tz) __vdso_gettimeofday_stick(struct __kernel_old_timeval *tv, struct timezone *tz)
{ {
struct vvar_data *vvd = get_vvar_data(); struct vvar_data *vvd = get_vvar_data();
...@@ -348,7 +348,7 @@ __vdso_gettimeofday_stick(struct timeval *tv, struct timezone *tz) ...@@ -348,7 +348,7 @@ __vdso_gettimeofday_stick(struct timeval *tv, struct timezone *tz)
if (likely(tv != NULL)) { if (likely(tv != NULL)) {
union tstv_t { union tstv_t {
struct timespec ts; struct timespec ts;
struct timeval tv; struct __kernel_old_timeval tv;
} *tstv = (union tstv_t *) tv; } *tstv = (union tstv_t *) tv;
do_realtime_stick(vvd, &tstv->ts); do_realtime_stick(vvd, &tstv->ts);
/* /*
......
...@@ -184,7 +184,7 @@ bool emulate_vsyscall(unsigned long error_code, ...@@ -184,7 +184,7 @@ bool emulate_vsyscall(unsigned long error_code,
*/ */
switch (vsyscall_nr) { switch (vsyscall_nr) {
case 0: case 0:
if (!write_ok_or_segv(regs->di, sizeof(struct timeval)) || if (!write_ok_or_segv(regs->di, sizeof(struct __kernel_old_timeval)) ||
!write_ok_or_segv(regs->si, sizeof(struct timezone))) { !write_ok_or_segv(regs->si, sizeof(struct timezone))) {
ret = -EFAULT; ret = -EFAULT;
goto check_fault; goto check_fault;
......
...@@ -25,7 +25,7 @@ int __vdso_clock_gettime(clockid_t clock, struct timespec *ts) ...@@ -25,7 +25,7 @@ int __vdso_clock_gettime(clockid_t clock, struct timespec *ts)
int clock_gettime(clockid_t, struct timespec *) int clock_gettime(clockid_t, struct timespec *)
__attribute__((weak, alias("__vdso_clock_gettime"))); __attribute__((weak, alias("__vdso_clock_gettime")));
int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz) int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
{ {
long ret; long ret;
...@@ -34,7 +34,7 @@ int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz) ...@@ -34,7 +34,7 @@ int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
return ret; return ret;
} }
int gettimeofday(struct timeval *, struct timezone *) int gettimeofday(struct __kernel_old_timeval *, struct timezone *)
__attribute__((weak, alias("__vdso_gettimeofday"))); __attribute__((weak, alias("__vdso_gettimeofday")));
time_t __vdso_time(time_t *t) time_t __vdso_time(time_t *t)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment