@@ -227,10 +227,14 @@ libc_hidden_proto (__sched_rr_get_interval64);
#if __TIMESIZE == 64
# define __settimeofday64 __settimeofday
+# define __gettimeofday64 __gettimeofday
#else
extern int __settimeofday64 (const struct __timeval64 *tv,
const struct timezone *tz);
libc_hidden_proto (__settimeofday64)
+extern int __gettimeofday64 (struct __timeval64 *restrict tv,
+ void *restrict tz);
+libc_hidden_proto (__gettimeofday64)
#endif
/* Compute the `struct tm' representation of T,
@@ -54,5 +54,47 @@ __gettimeofday (struct timeval *restrict tv, void *restrict tz)
# endif
weak_alias (__gettimeofday, gettimeofday)
#else /* USE_IFUNC_GETTIMEOFDAY */
-# include <time/gettimeofday.c>
+/* Conversion of gettimeofday function to support 64 bit time on archs
+ with __WORDSIZE == 32 and __TIMESIZE == 32/64 */
+#include <errno.h>
+
+int
+__gettimeofday64 (struct __timeval64 *restrict tv, void *restrict tz)
+{
+ if (__glibc_unlikely (tz != 0))
+ memset (tz, 0, sizeof (struct timezone));
+
+ struct __timespec64 ts64;
+ int ret = __clock_gettime64 (CLOCK_REALTIME, &ts64);
+
+ if (ret == 0 && tv)
+ *tv = timespec64_to_timeval64 (ts64);
+
+ return ret;
+}
+
+# if __TIMESIZE != 64
+libc_hidden_def (__gettimeofday64)
+
+int
+__gettimeofday (struct timeval *restrict tv, void *restrict tz)
+{
+ struct __timeval64 tv64;
+ int ret = __gettimeofday64 (tv ? &tv64 : NULL, tz);
+
+ if (ret == 0 && tv)
+ {
+ if (! in_time_t_range (tv64.tv_sec))
+ {
+ __set_errno (EOVERFLOW);
+ return -1;
+ }
+
+ *tv = valid_timeval64_to_timeval (tv64);
+ }
+
+ return ret;
+}
+# endif
+weak_alias (__gettimeofday, gettimeofday)
#endif
@@ -15,5 +15,7 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#define USE_IFUNC_GETTIMEOFDAY
+#ifdef __powerpc64__
+# define USE_IFUNC_GETTIMEOFDAY
+#endif
#include <sysdeps/unix/sysv/linux/gettimeofday.c>
@@ -16,5 +16,7 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#define USE_IFUNC_GETTIMEOFDAY
+#ifdef __x86_64__
+# define USE_IFUNC_GETTIMEOFDAY
+#endif
#include <sysdeps/unix/sysv/linux/gettimeofday.c>