summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMark Salyzyn <salyzyn@google.com>2017-10-27 08:58:18 -0700
committerMichael Bestas <mkbestas@lineageos.org>2019-12-23 23:43:39 +0200
commita8a66d3f3c4477de5f2d9cc2427ab5189a2ba7ba (patch)
treef6d33680e6d1e5ffefe6a2978b1973afe156345d /lib
parent53834fd2b3866e4a08fb34cbf0d5b2fe6b38617c (diff)
FROMLIST: [PATCH v5 12/12] lib: vdso: do not expose gettimeofday, if no arch supported timer
(cherry pick from url https://patchwork.kernel.org/patch/10044539/) Take an effort to recode the arm64 vdso code from assembler to C previously submitted by Andrew Pinski <apinski@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 <salyzyn@android.com> Cc: James Morse <james.morse@arm.com> Cc: Russell King <linux@armlinux.org.uk> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Dmitry Safonov <dsafonov@virtuozzo.com> Cc: John Stultz <john.stultz@linaro.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Laura Abbott <labbott@redhat.com> Cc: Kees Cook <keescook@chromium.org> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Andy Gross <andy.gross@linaro.org> Cc: Kevin Brodsky <kevin.brodsky@arm.com> Cc: Andrew Pinski <apinski@cavium.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Bug: 63737556 Bug: 20045882 Change-Id: I362a7114db0aac800e16eb90d14a8739e18f42e4
Diffstat (limited to 'lib')
-rw-r--r--lib/vdso/vgettimeofday.c52
1 files changed, 20 insertions, 32 deletions
diff --git a/lib/vdso/vgettimeofday.c b/lib/vdso/vgettimeofday.c
index a062cf949273..075a1171944d 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)
@@ -291,30 +293,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)
@@ -328,6 +306,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;
@@ -344,6 +323,7 @@ notrace int __vdso_clock_gettime(clockid_t clock, struct timespec *ts)
if (do_boottime(vd, ts))
goto fallback;
break;
+#endif
default:
goto fallback;
}
@@ -353,6 +333,7 @@ fallback:
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();
@@ -374,21 +355,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;