Take an effort to recode the arm64 vdso code from assembler to C
previously submitted by Andrew Pinski <apin...@cavium.com>, rework
it for use in both arm and arm64, overlapping any optimizations
for each architecture. But instead of landing it in arm64, land the
result into lib/vdso and unify both implementations to simplify
future maintenance.

If ARCH_PROVIDES_TIMER is not defined, do not expose gettimeofday.
libc will default directly to syscall.  Also ifdef clock_gettime
switch cases and stubs if not supported and other unused components.

Signed-off-by: Mark Salyzyn <saly...@android.com>
Tested-by: Mark Salyzyn <saly...@android.com>
Cc: James Morse <james.mo...@arm.com>
Cc: Russell King <li...@armlinux.org.uk>
Cc: Catalin Marinas <catalin.mari...@arm.com>
Cc: Will Deacon <will.dea...@arm.com>
Cc: Andy Lutomirski <l...@amacapital.net>
Cc: Dmitry Safonov <dsafo...@virtuozzo.com>
Cc: John Stultz <john.stu...@linaro.org>
Cc: Mark Rutland <mark.rutl...@arm.com>
Cc: Laura Abbott <labb...@redhat.com>
Cc: Kees Cook <keesc...@chromium.org>
Cc: Ard Biesheuvel <ard.biesheu...@linaro.org>
Cc: Andy Gross <andy.gr...@linaro.org>
Cc: Kevin Brodsky <kevin.brod...@arm.com>
Cc: Andrew Pinski <apin...@cavium.com>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: linux-kernel@vger.kernel.org
Cc: linux-arm-ker...@lists.infradead.org
Cc: Jeremy Linton <jeremy.lin...@arm.com>
Cc: android-ker...@android.com

v3:
- do not expose gettimeofday if arch does not support user space timer.

v4:
- update commit message to reflect overall reasoning of patch series.

v5:
- rebase
---
 lib/vdso/vgettimeofday.c | 52 ++++++++++++++++------------------------
 1 file changed, 20 insertions(+), 32 deletions(-)

diff --git a/lib/vdso/vgettimeofday.c b/lib/vdso/vgettimeofday.c
index 4c3af7bc6499..54e519c99c4b 100644
--- a/lib/vdso/vgettimeofday.c
+++ b/lib/vdso/vgettimeofday.c
@@ -30,7 +30,9 @@
 #include "compiler.h"
 #include "datapage.h"
 
+#ifdef ARCH_PROVIDES_TIMER
 DEFINE_FALLBACK(gettimeofday, struct timeval *, tv, struct timezone *, tz)
+#endif
 DEFINE_FALLBACK(clock_gettime, clockid_t, clock, struct timespec *, ts)
 DEFINE_FALLBACK(clock_getres, clockid_t, clock, struct timespec *, ts)
 
@@ -292,30 +294,6 @@ static notrace int do_boottime(const struct vdso_data *vd, 
struct timespec *ts)
        return 0;
 }
 
-#else /* ARCH_PROVIDES_TIMER */
-
-static notrace int do_realtime(const struct vdso_data *vd, struct timespec *ts)
-{
-       return -1;
-}
-
-static notrace int do_monotonic(const struct vdso_data *vd, struct timespec 
*ts)
-{
-       return -1;
-}
-
-static notrace int do_monotonic_raw(const struct vdso_data *vd,
-                                   struct timespec *ts)
-{
-       return -1;
-}
-
-static notrace int do_boottime(const struct vdso_data *vd,
-                              struct timespec *ts)
-{
-       return -1;
-}
-
 #endif /* ARCH_PROVIDES_TIMER */
 
 notrace int __vdso_clock_gettime(clockid_t clock, struct timespec *ts)
@@ -329,6 +307,7 @@ notrace int __vdso_clock_gettime(clockid_t clock, struct 
timespec *ts)
        case CLOCK_MONOTONIC_COARSE:
                do_monotonic_coarse(vd, ts);
                break;
+#ifdef ARCH_PROVIDES_TIMER
        case CLOCK_REALTIME:
                if (do_realtime(vd, ts))
                        goto fallback;
@@ -345,6 +324,7 @@ notrace int __vdso_clock_gettime(clockid_t clock, struct 
timespec *ts)
                if (do_boottime(vd, ts))
                        goto fallback;
                break;
+#endif
        default:
                goto fallback;
        }
@@ -354,6 +334,7 @@ notrace int __vdso_clock_gettime(clockid_t clock, struct 
timespec *ts)
        return clock_gettime_fallback(clock, ts);
 }
 
+#ifdef ARCH_PROVIDES_TIMER
 notrace int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
 {
        const struct vdso_data *vd = __get_datapage();
@@ -375,21 +356,28 @@ notrace int __vdso_gettimeofday(struct timeval *tv, 
struct timezone *tz)
 
        return 0;
 }
+#endif
 
 int __vdso_clock_getres(clockid_t clock, struct timespec *res)
 {
        long nsec;
 
-       if (clock == CLOCK_REALTIME ||
-           clock == CLOCK_BOOTTIME ||
-           clock == CLOCK_MONOTONIC ||
-           clock == CLOCK_MONOTONIC_RAW)
-               nsec = MONOTONIC_RES_NSEC;
-       else if (clock == CLOCK_REALTIME_COARSE ||
-                clock == CLOCK_MONOTONIC_COARSE)
+       switch (clock) {
+       case CLOCK_REALTIME_COARSE:
+       case CLOCK_MONOTONIC_COARSE:
                nsec = LOW_RES_NSEC;
-       else
+               break;
+#ifdef ARCH_PROVIDES_TIMER
+       case CLOCK_REALTIME:
+       case CLOCK_MONOTONIC:
+       case CLOCK_MONOTONIC_RAW:
+       case CLOCK_BOOTTIME:
+               nsec = MONOTONIC_RES_NSEC;
+               break;
+#endif
+       default:
                return clock_getres_fallback(clock, res);
+       }
 
        if (likely(res != NULL)) {
                res->tv_sec = 0;
-- 
2.19.0.605.g01d371f741-goog

Reply via email to