1 From 7335a36d0b5c1c597566f9aa3f458a5b6817c3b4 Mon Sep 17 00:00:00 2001
2 From: aurel32 <aurelien@aurel32.net>
3 Date: Fri, 22 Mar 2024 14:21:13 -0700
4 Subject: [PATCH] PR #1644: unscaledcycleclock: remove RISC-V support
6 Imported from GitHub PR https://github.com/abseil/abseil-cpp/pull/1644
8 Starting with Linux 6.6 [1], RDCYCLE is a privileged instruction on RISC-V and can't be used directly from userland. There is a sysctl option to change that as a transition period, but it will eventually disappear.
10 The RDTIME instruction is another less accurate alternative, however its frequency varies from board to board, and there is currently now way to get its frequency from userland [2].
12 Therefore this patch just removes the code for unscaledcycleclock on RISC-V. Without processor specific implementation, abseil relies on std::chrono::steady_clock::now().time_since_epoch() which is basically a wrapper around clock_gettime (CLOCK_MONOTONIC), which in turns use __vdso_clock_gettime(). On RISC-V this VDSO is just a wrapper around RDTIME correctly scaled to use nanoseconds units.
14 This fixes the testsuite on riscv64, tested on a VisionFive 2 board.
16 [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cc4c07c89aada16229084eeb93895c95b7eabaa3
17 [2] https://github.com/abseil/abseil-cpp/pull/1631
18 Merge 43356a2548cfde76e164d446cb69004b488c6a71 into 76f8011beabdaee872b5fde7546e02407b220cb1
20 Merging this change closes #1644
22 COPYBARA_INTEGRATE_REVIEW=https://github.com/abseil/abseil-cpp/pull/1644 from aurel32:rv64-no-unscaledcycleclock 43356a2548cfde76e164d446cb69004b488c6a71
23 PiperOrigin-RevId: 618286262
24 Change-Id: Ie4120a727e7d0bb185df6e06ea145c780ebe6652
26 Upstream-Status: Backport [https://github.com/abseil/abseil-cpp/commit/7335a36d]
27 [Adapted to apply on top of meta-oe's patch stack]
28 Signed-off-by: Scott Murray <scott.murray@konsulko.com>
30 .../absl/base/internal/unscaledcycleclock.cc | 12 ------------
31 .../absl/base/internal/unscaledcycleclock_config.h | 5 ++---
32 2 files changed, 2 insertions(+), 15 deletions(-)
34 diff --git a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc
35 index f11fecb..103b4f6 100644
36 --- a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc
37 +++ b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc
38 @@ -121,18 +121,6 @@ double UnscaledCycleClock::Frequency() {
39 return aarch64_timer_frequency;
42 -#elif defined(__riscv)
44 -int64_t UnscaledCycleClock::Now() {
45 - int64_t virtual_timer_value;
46 - asm volatile("rdcycle %0" : "=r"(virtual_timer_value));
47 - return virtual_timer_value;
50 -double UnscaledCycleClock::Frequency() {
51 - return base_internal::NominalCPUFrequency();
54 #elif defined(_M_IX86) || defined(_M_X64)
56 #pragma intrinsic(__rdtsc)
57 diff --git a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h
58 index 5e232c1..83552fc 100644
59 --- a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h
60 +++ b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h
62 // The following platforms have an implementation of a hardware counter.
63 #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || \
64 ((defined(__powerpc__) || defined(__ppc__)) && defined(__GLIBC__)) || \
65 - defined(__riscv) || \
66 defined(_M_IX86) || (defined(_M_X64) && !defined(_M_ARM64EC))
67 #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 1
70 #if ABSL_USE_UNSCALED_CYCLECLOCK
71 // This macro can be used to test if UnscaledCycleClock::Frequency()
72 // is NominalCPUFrequency() on a particular platform.
73 -#if (defined(__i386__) || defined(__x86_64__) || defined(__riscv) || \
74 - defined(_M_IX86) || defined(_M_X64))
75 +#if (defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || \
77 #define ABSL_INTERNAL_UNSCALED_CYCLECLOCK_FREQUENCY_IS_CPU_FREQUENCY