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.
This commit is contained in:
Adhemerval Zanella 2014-01-20 12:29:51 -06:00
parent 2bc52556b7
commit d98720e07f
4 changed files with 18 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2014-01-20 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
[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 <allan@archlinux.org>
* po/ca.po: Update Catalan translation from translation project.

2
NEWS
View File

@ -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.

View File

@ -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");

View File

@ -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");