diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/gettimeofday.c | 20 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/time.c | 20 |
4 files changed, 45 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index 4e3a8220fe..0992488a6a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2014-01-16 Adhemerval Zanella <azanella@linux.vnet.ibm.com> + + [BZ#16430] + * sysdeps/unix/sysv/linux/powerpc/gettimeofday.c + (__GI___gettimeofday): Alias for a different internal symbol to avoid + local calls issues by not having a PLT stub required for IFUNC calls. + * sysdeps/unix/sysv/linux/powerpc/time.c (__GI_time): Likewise. + 2013-11-16 Alan Modra <amodra@gmail.com> * NEWS: Mention powerpc64le support and bugs fixed. diff --git a/NEWS b/NEWS index 2c6ad91d52..db471a4ee8 100644 --- a/NEWS +++ b/NEWS @@ -10,7 +10,7 @@ Version 2.18.1 * The following bugs are resolved with this release: 14155, 14547, 14699, 15532, 15427, 15522, 15680, 15723, 15734, 15735, - 15797, 15892, 15895, 15909, 15917, 15996, 16072, 16150. + 15797, 15892, 15895, 15909, 15917, 15996, 16072, 16150, 16430. * 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 48c3f84d86..3ee063dba6 100644 --- a/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c @@ -44,8 +44,24 @@ asm (".type __gettimeofday, %gnu_indirect_function"); /* This is doing "libc_hidden_def (__gettimeofday)" but the compiler won't let us do it in C because it doesn't know we're defining __gettimeofday here in this file. */ -asm (".globl __GI___gettimeofday\n" - "__GI___gettimeofday = __gettimeofday"); +asm (".globl __GI___gettimeofday"); + +/* __GI___gettimeofday is defined as hidden and for ppc32 it enables the + compiler make a local call (symbol@local) for internal GLIBC usage. It + means the PLT won't be used and the ifunc resolver will be called directly. + For ppc64 a call to a function in another translation unit might use a + different toc pointer thus disallowing direct branchess and making internal + ifuncs calls safe. */ +#ifdef __powerpc64__ +asm ("__GI___gettimeofday = __gettimeofday"); +#else +int +__gettimeofday_vsyscall (struct timeval *tv, struct timezone *tz) +{ + return INLINE_VSYSCALL (gettimeofday, 2, tv, tz); +} +asm ("__GI___gettimeofday = __gettimeofday_vsyscall"); +#endif #else diff --git a/sysdeps/unix/sysv/linux/powerpc/time.c b/sysdeps/unix/sysv/linux/powerpc/time.c index 2d77ecec9b..85cc20e6e0 100644 --- a/sysdeps/unix/sysv/linux/powerpc/time.c +++ b/sysdeps/unix/sysv/linux/powerpc/time.c @@ -54,8 +54,24 @@ asm (".type time, %gnu_indirect_function"); /* This is doing "libc_hidden_def (time)" but the compiler won't * let us do it in C because it doesn't know we're defining time * here in this file. */ -asm (".globl __GI_time\n" - "__GI_time = time"); +asm (".globl __GI_time"); + +/* __GI_time is defined as hidden and for ppc32 it enables the + compiler make a local call (symbol@local) for internal GLIBC usage. It + means the PLT won't be used and the ifunc resolver will be called directly. + For ppc64 a call to a function in another translation unit might use a + different toc pointer thus disallowing direct branchess and making internal + ifuncs calls safe. */ +#ifdef __powerpc64__ +asm ("__GI_time = time"); +#else +time_t +__time_vsyscall (time_t *t) +{ + return INLINE_VSYSCALL (time, 1, t); +} +asm ("__GI_time = __time_vsyscall"); +#endif #else |