1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (C) 2018 ARM Limited 4 */ 5 #ifndef __ASM_VDSO_GETTIMEOFDAY_H 6 #define __ASM_VDSO_GETTIMEOFDAY_H 7 8 #ifndef __ASSEMBLY__ 9 10 #include <asm/barrier.h> 11 #include <asm/cp15.h> 12 #include <asm/unistd.h> 13 #include <uapi/linux/time.h> 14 15 extern struct vdso_data *__get_datapage(void); 16 17 static __always_inline int gettimeofday_fallback( 18 struct __kernel_old_timeval *_tv, 19 struct timezone *_tz) 20 { 21 register struct timezone *tz asm("r1") = _tz; 22 register struct __kernel_old_timeval *tv asm("r0") = _tv; 23 register long ret asm ("r0"); 24 register long nr asm("r7") = __NR_gettimeofday; 25 26 asm volatile( 27 " swi #0\n" 28 : "=r" (ret) 29 : "r" (tv), "r" (tz), "r" (nr) 30 : "memory"); 31 32 return ret; 33 } 34 35 static __always_inline long clock_gettime_fallback( 36 clockid_t _clkid, 37 struct __kernel_timespec *_ts) 38 { 39 register struct __kernel_timespec *ts asm("r1") = _ts; 40 register clockid_t clkid asm("r0") = _clkid; 41 register long ret asm ("r0"); 42 register long nr asm("r7") = __NR_clock_gettime64; 43 44 asm volatile( 45 " swi #0\n" 46 : "=r" (ret) 47 : "r" (clkid), "r" (ts), "r" (nr) 48 : "memory"); 49 50 return ret; 51 } 52 53 static __always_inline u64 __arch_get_hw_counter(int clock_mode) 54 { 55 #ifdef CONFIG_ARM_ARCH_TIMER 56 u64 cycle_now; 57 58 isb(); 59 cycle_now = read_sysreg(CNTVCT); 60 61 return cycle_now; 62 #else 63 return -EINVAL; /* use fallback */ 64 #endif 65 } 66 67 static __always_inline const struct vdso_data *__arch_get_vdso_data(void) 68 { 69 return __get_datapage(); 70 } 71 72 #endif /* !__ASSEMBLY__ */ 73 74 #endif /* __ASM_VDSO_GETTIMEOFDAY_H */ 75