PowerPC: Fix gettimeofday ifunc selection
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Mon, 20 Jan 2014 18:29:51 +0000 (12:29 -0600)
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Mon, 20 Jan 2014 18:29:51 +0000 (12:29 -0600)
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.

ChangeLog
NEWS
sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
sysdeps/unix/sysv/linux/powerpc/time.c

index 6297934ea4a4dfcd8b8d9b5f17e57f714f3208d0..ed1153f06cf7d45c69f2f19bc84edcdb4dd173ff 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/NEWS b/NEWS
index 87ab0485fd1381af74e0a50703df55581af1ec36..f4f22a8f3e5d46c66861607f6a70f69d17e93c12 100644 (file)
--- 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.
index 2085b68772a94d6402993cd119e05b0b0845ee02..97ea2a4a70ea75f8d5f8e9257aaaff733062187a 100644 (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");
 
index 023bc026be8b48b4d998eeaa92e5d39053d552a2..9f54d972461782928d73df51169054cdf7d52b26 100644 (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");