#ifndef _DL_VDSO_CALLS_H #define _DL_VDSO_CALLS_H #include #include #include #include void __attribute__((weak)) *_get__dl__vdso_clock_gettime(void); #if defined(__UCLIBC_USE_TIME64__) #include "internal/time64_helpers.h" void __attribute__((weak)) *_get__dl__vdso_clock_gettime64(void); typedef int (*clock_gettime_func)(clockid_t clock_id, struct __ts64_struct *tp); #else typedef int (*clock_gettime_func)(clockid_t clock_id, struct timespec *tp); #endif extern int __libc_clock_gettime(clockid_t clock_id, struct timespec *tp); static int __attribute__ ((used)) __generic_vdso_clock_gettime(clockid_t clock_id, struct timespec *tp); static int __attribute__ ((used)) __generic_vdso_clock_gettime(clockid_t clock_id, struct timespec *tp) { void *impl = NULL; #if defined(__UCLIBC_USE_TIME64__) if (&_get__dl__vdso_clock_gettime64 && (impl = _get__dl__vdso_clock_gettime64())) { struct __ts64_struct __ts64; int __ret = ((clock_gettime_func)impl)(clock_id, &__ts64); if (__ret != 0) { __set_errno(-__ret); return -1; } if (tp) { tp->tv_sec = __ts64.tv_sec; tp->tv_nsec = __ts64.tv_nsec; } return 0; } /* fallback to syscall */ return __libc_clock_gettime(clock_id, tp); #else if (&_get__dl__vdso_clock_gettime && (impl = _get__dl__vdso_clock_gettime())) { int __ret = ((clock_gettime_func)impl)(clock_id, tp); if (__ret != 0) { __set_errno(-__ret); return -1; } return 0; } /* fallback to syscall */ return __libc_clock_gettime(clock_id, tp); #endif } static int __attribute__ ((used)) __generic_vdso_gettimeofday(struct timeval *tv, __timezone_ptr_t tz) { struct timespec ts; int __res = __generic_vdso_clock_gettime(CLOCK_REALTIME, &ts); tv->tv_sec = ts.tv_sec; tv->tv_usec = (suseconds_t)ts.tv_nsec / 1000; return __res; } #endif /* _DL_VDSO_CALLS_H */