summaryrefslogtreecommitdiff
blob: b98cc9dc5fd627f1aa2aea941d7cceb9f9eafb3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Add timer for riscv.
Upstream PR status: https://github.com/facebook/rocksdb/pull/9215
This PR hasn't been merged into the main branch.
https://bugs.gentoo.org/834855

--- a/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h
+++ b/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h
@@ -101,7 +101,7 @@ int toku_clock_gettime(clockid_t clk_id, struct timespec *ts) __attribute__((__v
 typedef uint64_t tokutime_t;  // Time type used in by tokutek timers.
 
 #if 0
-// The value of tokutime_t is not specified here. 
+// The value of tokutime_t is not specified here.
 // It might be microseconds since 1/1/1970 (if gettimeofday() is
 // used), or clock cycles since boot (if rdtsc is used).  Or something
 // else.
@@ -133,6 +133,23 @@ static inline tokutime_t toku_time_now(void) {
   return result;
 #elif defined(__powerpc__)
   return __ppc_get_timebase();
+#elif defined(__riscv) && __riscv_xlen == 32
+  uint32_t cycles_lo, cycles_hi0, cycles_hi1;
+  // Implemented in assembly because Clang insisted on branching.
+  asm volatile(
+               "rdcycleh %0\n"
+               "rdcycle %1\n"
+               "rdcycleh %2\n"
+               "sub %0, %0, %2\n"
+               "seqz %0, %0\n"
+               "sub %0, zero, %0\n"
+               "and %1, %1, %0\n"
+               : "=r"(cycles_hi0), "=r"(cycles_lo), "=r"(cycles_hi1));
+  return (static_cast<uint64_t>(cycles_hi1) << 32) | cycles_lo;
+#elif defined(__riscv) && __riscv_xlen == 64
+  uint64_t cycles;
+  asm volatile("rdcycle %0" : "=r"(cycles));
+  return cycles;
 #else
 #error No timer implementation for this platform
 #endif