gettimeofday.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. #ifndef __ASSEMBLY__
  8. #include <asm/barrier.h>
  9. #include <asm/errno.h>
  10. #include <asm/unistd.h>
  11. #include <asm/vdso/cp15.h>
  12. #include <uapi/linux/time.h>
  13. #define VDSO_HAS_CLOCK_GETRES 1
  14. extern struct vdso_data *__get_datapage(void);
  15. static __always_inline int gettimeofday_fallback(
  16. struct __kernel_old_timeval *_tv,
  17. struct timezone *_tz)
  18. {
  19. register struct timezone *tz asm("r1") = _tz;
  20. register struct __kernel_old_timeval *tv asm("r0") = _tv;
  21. register long ret asm ("r0");
  22. register long nr asm("r7") = __NR_gettimeofday;
  23. asm volatile(
  24. " swi #0\n"
  25. : "=r" (ret)
  26. : "r" (tv), "r" (tz), "r" (nr)
  27. : "memory");
  28. return ret;
  29. }
  30. static __always_inline long clock_gettime_fallback(
  31. clockid_t _clkid,
  32. struct __kernel_timespec *_ts)
  33. {
  34. register struct __kernel_timespec *ts asm("r1") = _ts;
  35. register clockid_t clkid asm("r0") = _clkid;
  36. register long ret asm ("r0");
  37. register long nr asm("r7") = __NR_clock_gettime64;
  38. asm volatile(
  39. " swi #0\n"
  40. : "=r" (ret)
  41. : "r" (clkid), "r" (ts), "r" (nr)
  42. : "memory");
  43. return ret;
  44. }
  45. static __always_inline long clock_gettime32_fallback(
  46. clockid_t _clkid,
  47. struct old_timespec32 *_ts)
  48. {
  49. register struct old_timespec32 *ts asm("r1") = _ts;
  50. register clockid_t clkid asm("r0") = _clkid;
  51. register long ret asm ("r0");
  52. register long nr asm("r7") = __NR_clock_gettime;
  53. asm volatile(
  54. " swi #0\n"
  55. : "=r" (ret)
  56. : "r" (clkid), "r" (ts), "r" (nr)
  57. : "memory");
  58. return ret;
  59. }
  60. static __always_inline int clock_getres_fallback(
  61. clockid_t _clkid,
  62. struct __kernel_timespec *_ts)
  63. {
  64. register struct __kernel_timespec *ts asm("r1") = _ts;
  65. register clockid_t clkid asm("r0") = _clkid;
  66. register long ret asm ("r0");
  67. register long nr asm("r7") = __NR_clock_getres_time64;
  68. asm volatile(
  69. " swi #0\n"
  70. : "=r" (ret)
  71. : "r" (clkid), "r" (ts), "r" (nr)
  72. : "memory");
  73. return ret;
  74. }
  75. static __always_inline int clock_getres32_fallback(
  76. clockid_t _clkid,
  77. struct old_timespec32 *_ts)
  78. {
  79. register struct old_timespec32 *ts asm("r1") = _ts;
  80. register clockid_t clkid asm("r0") = _clkid;
  81. register long ret asm ("r0");
  82. register long nr asm("r7") = __NR_clock_getres;
  83. asm volatile(
  84. " swi #0\n"
  85. : "=r" (ret)
  86. : "r" (clkid), "r" (ts), "r" (nr)
  87. : "memory");
  88. return ret;
  89. }
  90. static inline bool arm_vdso_hres_capable(void)
  91. {
  92. return IS_ENABLED(CONFIG_ARM_ARCH_TIMER);
  93. }
  94. #define __arch_vdso_hres_capable arm_vdso_hres_capable
  95. static __always_inline u64 __arch_get_hw_counter(int clock_mode,
  96. const struct vdso_data *vd)
  97. {
  98. #ifdef CONFIG_ARM_ARCH_TIMER
  99. u64 cycle_now;
  100. /*
  101. * Core checks for mode already, so this raced against a concurrent
  102. * update. Return something. Core will do another round and then
  103. * see the mode change and fallback to the syscall.
  104. */
  105. if (clock_mode == VDSO_CLOCKMODE_NONE)
  106. return 0;
  107. isb();
  108. cycle_now = read_sysreg(CNTVCT);
  109. return cycle_now;
  110. #else
  111. /* Make GCC happy. This is compiled out anyway */
  112. return 0;
  113. #endif
  114. }
  115. static __always_inline const struct vdso_data *__arch_get_vdso_data(void)
  116. {
  117. return __get_datapage();
  118. }
  119. #endif /* !__ASSEMBLY__ */
  120. #endif /* __ASM_VDSO_GETTIMEOFDAY_H */