-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
arm64: vdso: Substitute gettimeofday() with C implementation
To take advantage of the commonly defined vdso interface for gettimeofday() the architectural code requires an adaptation. Re-implement the gettimeofday VDSO in C in order to use lib/vdso. With the new implementation arm64 gains support for CLOCK_BOOTTIME and CLOCK_TAI. [ tglx: Reformatted the function line breaks ] Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Shijith Thotton <sthotton@marvell.com> Tested-by: Andre Przywara <andre.przywara@arm.com> Cc: linux-arch@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-mips@vger.kernel.org Cc: linux-kselftest@vger.kernel.org Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Russell King <linux@armlinux.org.uk> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Paul Burton <paul.burton@mips.com> Cc: Daniel Lezcano <daniel.lezcano@linaro.org> Cc: Mark Salyzyn <salyzyn@android.com> Cc: Peter Collingbourne <pcc@google.com> Cc: Shuah Khan <shuah@kernel.org> Cc: Dmitry Safonov <0x7f454c46@gmail.com> Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk> Cc: Huw Davies <huw@codeweavers.com> Link: https://lkml.kernel.org/r/20190621095252.32307-5-vincenzo.frascino@arm.com
- Loading branch information
Vincenzo Frascino
authored and
Thomas Gleixner
committed
Jun 22, 2019
1 parent
44f57d7
commit 28b1a82
Showing
8 changed files
with
220 additions
and
387 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* Copyright (C) 2018 ARM Limited | ||
*/ | ||
#ifndef __ASM_VDSO_GETTIMEOFDAY_H | ||
#define __ASM_VDSO_GETTIMEOFDAY_H | ||
|
||
#ifndef __ASSEMBLY__ | ||
|
||
#include <asm/unistd.h> | ||
#include <uapi/linux/time.h> | ||
|
||
#define VDSO_HAS_CLOCK_GETRES 1 | ||
|
||
static __always_inline | ||
int gettimeofday_fallback(struct __kernel_old_timeval *_tv, | ||
struct timezone *_tz) | ||
{ | ||
register struct timezone *tz asm("x1") = _tz; | ||
register struct __kernel_old_timeval *tv asm("x0") = _tv; | ||
register long ret asm ("x0"); | ||
register long nr asm("x8") = __NR_gettimeofday; | ||
|
||
asm volatile( | ||
" svc #0\n" | ||
: "=r" (ret) | ||
: "r" (tv), "r" (tz), "r" (nr) | ||
: "memory"); | ||
|
||
return ret; | ||
} | ||
|
||
static __always_inline | ||
long clock_gettime_fallback(clockid_t _clkid, struct __kernel_timespec *_ts) | ||
{ | ||
register struct __kernel_timespec *ts asm("x1") = _ts; | ||
register clockid_t clkid asm("x0") = _clkid; | ||
register long ret asm ("x0"); | ||
register long nr asm("x8") = __NR_clock_gettime; | ||
|
||
asm volatile( | ||
" svc #0\n" | ||
: "=r" (ret) | ||
: "r" (clkid), "r" (ts), "r" (nr) | ||
: "memory"); | ||
|
||
return ret; | ||
} | ||
|
||
static __always_inline | ||
int clock_getres_fallback(clockid_t _clkid, struct __kernel_timespec *_ts) | ||
{ | ||
register struct __kernel_timespec *ts asm("x1") = _ts; | ||
register clockid_t clkid asm("x0") = _clkid; | ||
register long ret asm ("x0"); | ||
register long nr asm("x8") = __NR_clock_getres; | ||
|
||
asm volatile( | ||
" svc #0\n" | ||
: "=r" (ret) | ||
: "r" (clkid), "r" (ts), "r" (nr) | ||
: "memory"); | ||
|
||
return ret; | ||
} | ||
|
||
static __always_inline u64 __arch_get_hw_counter(s32 clock_mode) | ||
{ | ||
u64 res; | ||
|
||
asm volatile("mrs %0, cntvct_el0" : "=r" (res) :: "memory"); | ||
|
||
return res; | ||
} | ||
|
||
static __always_inline | ||
const struct vdso_data *__arch_get_vdso_data(void) | ||
{ | ||
return _vdso_data; | ||
} | ||
|
||
#endif /* !__ASSEMBLY__ */ | ||
|
||
#endif /* __ASM_VDSO_GETTIMEOFDAY_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
#ifndef __ASM_VDSO_VSYSCALL_H | ||
#define __ASM_VDSO_VSYSCALL_H | ||
|
||
#ifndef __ASSEMBLY__ | ||
|
||
#include <linux/timekeeper_internal.h> | ||
#include <vdso/datapage.h> | ||
|
||
#define VDSO_PRECISION_MASK ~(0xFF00ULL<<48) | ||
|
||
extern struct vdso_data *vdso_data; | ||
|
||
/* | ||
* Update the vDSO data page to keep in sync with kernel timekeeping. | ||
*/ | ||
static __always_inline | ||
struct vdso_data *__arm64_get_k_vdso_data(void) | ||
{ | ||
return vdso_data; | ||
} | ||
#define __arch_get_k_vdso_data __arm64_get_k_vdso_data | ||
|
||
static __always_inline | ||
int __arm64_get_clock_mode(struct timekeeper *tk) | ||
{ | ||
u32 use_syscall = !tk->tkr_mono.clock->archdata.vdso_direct; | ||
|
||
return use_syscall; | ||
} | ||
#define __arch_get_clock_mode __arm64_get_clock_mode | ||
|
||
static __always_inline | ||
int __arm64_use_vsyscall(struct vdso_data *vdata) | ||
{ | ||
return !vdata[CS_HRES_COARSE].clock_mode; | ||
} | ||
#define __arch_use_vsyscall __arm64_use_vsyscall | ||
|
||
static __always_inline | ||
void __arm64_update_vsyscall(struct vdso_data *vdata, struct timekeeper *tk) | ||
{ | ||
vdata[CS_HRES_COARSE].mask = VDSO_PRECISION_MASK; | ||
vdata[CS_RAW].mask = VDSO_PRECISION_MASK; | ||
} | ||
#define __arch_update_vsyscall __arm64_update_vsyscall | ||
|
||
/* The asm-generic header needs to be included after the definitions above */ | ||
#include <asm-generic/vdso/vsyscall.h> | ||
|
||
#endif /* !__ASSEMBLY__ */ | ||
|
||
#endif /* __ASM_VDSO_VSYSCALL_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.