From: Adhemerval Zanella Date: Mon, 20 Jan 2014 18:29:51 +0000 (-0600) Subject: PowerPC: Fix gettimeofday ifunc selection X-Git-Tag: glibc-2.19~97 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d98720e07f67fbeec00f9e1347840404240d3c48;p=thirdparty%2Fglibc.git PowerPC: Fix gettimeofday ifunc selection The IFUNC selector for gettimeofday runs before _libc_vdso_platform_setup where __vdso_gettimeofday is set. The selector then sets __gettimeofday (the internal version used within GLIBC) to use the system call version instead of the vDSO one. This patch changes the check if vDSO is available to get its value directly instead of rely on __vdso_gettimeofday. This patch changes it by getting the vDSO value directly. It fixes BZ#16431. --- diff --git a/ChangeLog b/ChangeLog index 6297934ea4a..ed1153f06cf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2014-01-20 Adhemerval Zanella + + [BZ#16431] + * sysdeps/unix/sysv/linux/powerpc/gettimeofday.c (__gettimeofday): + Adjust the vDSO correctly for internal calls. + * sysdeps/unix/sysv/linux/powerpc/time.c (time): Likewise. + 2014-01-20 Allan McRae * po/ca.po: Update Catalan translation from translation project. diff --git a/NEWS b/NEWS index 87ab0485fd1..f4f22a8f3e5 100644 --- a/NEWS +++ b/NEWS @@ -25,7 +25,7 @@ Version 2.19 16151, 16153, 16167, 16169, 16172, 16195, 16214, 16245, 16271, 16274, 16283, 16289, 16293, 16314, 16316, 16330, 16337, 16338, 16356, 16365, 16366, 16369, 16372, 16375, 16379, 16384, 16385, 16386, 16387, 16390, - 16394, 16400, 16407, 16408, 16414, 16430, 16453. + 16394, 16400, 16407, 16408, 16414, 16430, 16431, 16453. * Slovenian translations for glibc messages have been contributed by the Translation Project's Slovenian team of translators. diff --git a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c index 2085b68772a..97ea2a4a70e 100644 --- a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c @@ -35,9 +35,12 @@ __gettimeofday_syscall (struct timeval *tv, struct timezone *tz) void * gettimeofday_ifunc (void) { + PREPARE_VERSION (linux2615, "LINUX_2.6.15", 123718565); + /* If the vDSO is not available we fall back syscall. */ - return (__vdso_gettimeofday ? VDSO_IFUNC_RET (__vdso_gettimeofday) - : __gettimeofday_syscall); + void *vdso_gettimeofday = _dl_vdso_vsym ("__kernel_gettimeofday", &linux2615); + return (vdso_gettimeofday ? VDSO_IFUNC_RET (vdso_gettimeofday) + : (void*)__gettimeofday_syscall); } asm (".type __gettimeofday, %gnu_indirect_function"); diff --git a/sysdeps/unix/sysv/linux/powerpc/time.c b/sysdeps/unix/sysv/linux/powerpc/time.c index 023bc026be8..9f54d972461 100644 --- a/sysdeps/unix/sysv/linux/powerpc/time.c +++ b/sysdeps/unix/sysv/linux/powerpc/time.c @@ -45,9 +45,12 @@ time_syscall (time_t *t) void * time_ifunc (void) { + PREPARE_VERSION (linux2615, "LINUX_2.6.15", 123718565); + /* If the vDSO is not available we fall back to the syscall. */ - return (__vdso_time ? VDSO_IFUNC_RET (__vdso_time) - : time_syscall); + void *vdso_time = _dl_vdso_vsym ("__kernel_time", &linux2615); + return (vdso_time ? VDSO_IFUNC_RET (vdso_time) + : (void*)time_syscall); } asm (".type time, %gnu_indirect_function");