gettimeofday.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Author: Huacai Chen <[email protected]>
  4. *
  5. * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  6. */
  7. #ifndef __ASM_VDSO_GETTIMEOFDAY_H
  8. #define __ASM_VDSO_GETTIMEOFDAY_H
  9. #ifndef __ASSEMBLY__
  10. #include <asm/unistd.h>
  11. #include <asm/vdso/vdso.h>
  12. #define VDSO_HAS_CLOCK_GETRES 1
  13. static __always_inline long gettimeofday_fallback(
  14. struct __kernel_old_timeval *_tv,
  15. struct timezone *_tz)
  16. {
  17. register struct __kernel_old_timeval *tv asm("a0") = _tv;
  18. register struct timezone *tz asm("a1") = _tz;
  19. register long nr asm("a7") = __NR_gettimeofday;
  20. register long ret asm("a0");
  21. asm volatile(
  22. " syscall 0\n"
  23. : "+r" (ret)
  24. : "r" (nr), "r" (tv), "r" (tz)
  25. : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7",
  26. "$t8", "memory");
  27. return ret;
  28. }
  29. static __always_inline long clock_gettime_fallback(
  30. clockid_t _clkid,
  31. struct __kernel_timespec *_ts)
  32. {
  33. register clockid_t clkid asm("a0") = _clkid;
  34. register struct __kernel_timespec *ts asm("a1") = _ts;
  35. register long nr asm("a7") = __NR_clock_gettime;
  36. register long ret asm("a0");
  37. asm volatile(
  38. " syscall 0\n"
  39. : "+r" (ret)
  40. : "r" (nr), "r" (clkid), "r" (ts)
  41. : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7",
  42. "$t8", "memory");
  43. return ret;
  44. }
  45. static __always_inline int clock_getres_fallback(
  46. clockid_t _clkid,
  47. struct __kernel_timespec *_ts)
  48. {
  49. register clockid_t clkid asm("a0") = _clkid;
  50. register struct __kernel_timespec *ts asm("a1") = _ts;
  51. register long nr asm("a7") = __NR_clock_getres;
  52. register long ret asm("a0");
  53. asm volatile(
  54. " syscall 0\n"
  55. : "+r" (ret)
  56. : "r" (nr), "r" (clkid), "r" (ts)
  57. : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7",
  58. "$t8", "memory");
  59. return ret;
  60. }
  61. static __always_inline u64 __arch_get_hw_counter(s32 clock_mode,
  62. const struct vdso_data *vd)
  63. {
  64. uint64_t count;
  65. __asm__ __volatile__(
  66. " rdtime.d %0, $zero\n"
  67. : "=r" (count));
  68. return count;
  69. }
  70. static inline bool loongarch_vdso_hres_capable(void)
  71. {
  72. return true;
  73. }
  74. #define __arch_vdso_hres_capable loongarch_vdso_hres_capable
  75. static __always_inline const struct vdso_data *__arch_get_vdso_data(void)
  76. {
  77. return get_vdso_data();
  78. }
  79. #endif /* !__ASSEMBLY__ */
  80. #endif /* __ASM_VDSO_GETTIMEOFDAY_H */