aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>2014-01-23 11:07:47 -0600
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>2014-01-23 11:07:47 -0600
commit01d6218aead2f93e81223097ad134a2999d84e2c (patch)
treed014c1e8e3fd6be395aab2c51e82fd6bb4b47ae1
parenta21742a515c18de4b46070b5eff5eedf43f9c7c5 (diff)
downloadglibc-01d6218aead2f93e81223097ad134a2999d84e2c.zip
glibc-01d6218aead2f93e81223097ad134a2999d84e2c.tar.gz
glibc-01d6218aead2f93e81223097ad134a2999d84e2c.tar.bz2
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.
-rw-r--r--ChangeLog7
-rw-r--r--NEWS2
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/gettimeofday.c7
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/time.c7
4 files changed, 18 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 47607ed..ac1a76a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2014-01-23 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-23 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
+
[BZ #16414]
* sysdeps/powerpc/powerpc64/fpu/s_truncl.S: Remove wrong
implementation.
diff --git a/NEWS b/NEWS
index 4190e85..5c2f07a 100644
--- a/NEWS
+++ b/NEWS
@@ -11,7 +11,7 @@ Version 2.18.1
14143, 14155, 14547, 14699, 15532, 15427, 15522, 15680, 15723, 15734,
15735, 15797, 15892, 15895, 15909, 15917, 15996, 16072, 16150, 16414,
- 16430.
+ 16430, 16431.
* Support for powerpc64le has been added.
diff --git a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
index 3ee063d..0313874 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 85cc20e..cd40a29 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");