0001
0002
0003 #ifndef __ASM_VDSO_CSKY_GETTIMEOFDAY_H
0004 #define __ASM_VDSO_CSKY_GETTIMEOFDAY_H
0005
0006 #ifndef __ASSEMBLY__
0007
0008 #include <asm/barrier.h>
0009 #include <asm/unistd.h>
0010 #include <abi/regdef.h>
0011 #include <uapi/linux/time.h>
0012
0013 #define VDSO_HAS_CLOCK_GETRES 1
0014
0015 static __always_inline
0016 int gettimeofday_fallback(struct __kernel_old_timeval *_tv,
0017 struct timezone *_tz)
0018 {
0019 register struct __kernel_old_timeval *tv asm("a0") = _tv;
0020 register struct timezone *tz asm("a1") = _tz;
0021 register long ret asm("a0");
0022 register long nr asm(syscallid) = __NR_gettimeofday;
0023
0024 asm volatile ("trap 0\n"
0025 : "=r" (ret)
0026 : "r"(tv), "r"(tz), "r"(nr)
0027 : "memory");
0028
0029 return ret;
0030 }
0031
0032 static __always_inline
0033 long clock_gettime_fallback(clockid_t _clkid, struct __kernel_timespec *_ts)
0034 {
0035 register clockid_t clkid asm("a0") = _clkid;
0036 register struct __kernel_timespec *ts asm("a1") = _ts;
0037 register long ret asm("a0");
0038 register long nr asm(syscallid) = __NR_clock_gettime64;
0039
0040 asm volatile ("trap 0\n"
0041 : "=r" (ret)
0042 : "r"(clkid), "r"(ts), "r"(nr)
0043 : "memory");
0044
0045 return ret;
0046 }
0047
0048 static __always_inline
0049 long clock_gettime32_fallback(clockid_t _clkid, struct old_timespec32 *_ts)
0050 {
0051 register clockid_t clkid asm("a0") = _clkid;
0052 register struct old_timespec32 *ts asm("a1") = _ts;
0053 register long ret asm("a0");
0054 register long nr asm(syscallid) = __NR_clock_gettime;
0055
0056 asm volatile ("trap 0\n"
0057 : "=r" (ret)
0058 : "r"(clkid), "r"(ts), "r"(nr)
0059 : "memory");
0060
0061 return ret;
0062 }
0063
0064 static __always_inline
0065 int clock_getres_fallback(clockid_t _clkid, struct __kernel_timespec *_ts)
0066 {
0067 register clockid_t clkid asm("a0") = _clkid;
0068 register struct __kernel_timespec *ts asm("a1") = _ts;
0069 register long ret asm("a0");
0070 register long nr asm(syscallid) = __NR_clock_getres_time64;
0071
0072 asm volatile ("trap 0\n"
0073 : "=r" (ret)
0074 : "r"(clkid), "r"(ts), "r"(nr)
0075 : "memory");
0076
0077 return ret;
0078 }
0079
0080 static __always_inline
0081 int clock_getres32_fallback(clockid_t _clkid, struct old_timespec32 *_ts)
0082 {
0083 register clockid_t clkid asm("a0") = _clkid;
0084 register struct old_timespec32 *ts asm("a1") = _ts;
0085 register long ret asm("a0");
0086 register long nr asm(syscallid) = __NR_clock_getres;
0087
0088 asm volatile ("trap 0\n"
0089 : "=r" (ret)
0090 : "r"(clkid), "r"(ts), "r"(nr)
0091 : "memory");
0092
0093 return ret;
0094 }
0095
0096 uint64_t csky_pmu_read_cc(void);
0097 static __always_inline u64 __arch_get_hw_counter(s32 clock_mode,
0098 const struct vdso_data *vd)
0099 {
0100 #ifdef CONFIG_CSKY_PMU_V1
0101 return csky_pmu_read_cc();
0102 #else
0103 return 0;
0104 #endif
0105 }
0106
0107 static __always_inline const struct vdso_data *__arch_get_vdso_data(void)
0108 {
0109 return _vdso_data;
0110 }
0111
0112 #endif
0113
0114 #endif