summaryrefslogtreecommitdiff
path: root/debian/patches/riscv-rdcycle.diff
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/riscv-rdcycle.diff')
-rw-r--r--debian/patches/riscv-rdcycle.diff71
1 files changed, 71 insertions, 0 deletions
diff --git a/debian/patches/riscv-rdcycle.diff b/debian/patches/riscv-rdcycle.diff
new file mode 100644
index 00000000..24682c93
--- /dev/null
+++ b/debian/patches/riscv-rdcycle.diff
@@ -0,0 +1,71 @@
+From: aurel32 <aurelien@aurel32.net>
+Subject: unscaledcycleclock: remove RISC-V support
+Bug-Debian: https://bugs.debian.org/1059532
+Origin: upstream, https://github.com/abseil/abseil-cpp/commit/7335a36d0b5c1c597566f9aa3f458a5b6817c3b4
+
+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.
+
+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].
+
+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.
+
+This fixes the testsuite on riscv64, tested on a VisionFive 2 board.
+
+[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cc4c07c89aada16229084eeb93895c95b7eabaa3
+[2] https://github.com/abseil/abseil-cpp/pull/1631
+
+--- a/absl/base/internal/unscaledcycleclock.cc
++++ b/absl/base/internal/unscaledcycleclock.cc
+@@ -121,18 +121,6 @@
+ return aarch64_timer_frequency;
+ }
+
+-#elif defined(__riscv)
+-
+-int64_t UnscaledCycleClock::Now() {
+- int64_t virtual_timer_value;
+- asm volatile("rdcycle %0" : "=r"(virtual_timer_value));
+- return virtual_timer_value;
+-}
+-
+-double UnscaledCycleClock::Frequency() {
+- return base_internal::NominalCPUFrequency();
+-}
+-
+ #elif defined(_M_IX86) || defined(_M_X64)
+
+ #pragma intrinsic(__rdtsc)
+--- a/absl/base/internal/unscaledcycleclock_config.h
++++ b/absl/base/internal/unscaledcycleclock_config.h
+@@ -21,8 +21,8 @@
+
+ // The following platforms have an implementation of a hardware counter.
+ #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || \
+- defined(__powerpc__) || defined(__ppc__) || defined(__riscv) || \
+- defined(_M_IX86) || (defined(_M_X64) && !defined(_M_ARM64EC))
++ defined(__powerpc__) || defined(__ppc__) || defined(_M_IX86) || \
++ (defined(_M_X64) && !defined(_M_ARM64EC))
+ #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 1
+ #else
+ #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 0
+@@ -53,8 +53,8 @@
+ #if ABSL_USE_UNSCALED_CYCLECLOCK
+ // This macro can be used to test if UnscaledCycleClock::Frequency()
+ // is NominalCPUFrequency() on a particular platform.
+-#if (defined(__i386__) || defined(__x86_64__) || defined(__riscv) || \
+- defined(_M_IX86) || defined(_M_X64))
++#if (defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || \
++ defined(_M_X64))
+ #define ABSL_INTERNAL_UNSCALED_CYCLECLOCK_FREQUENCY_IS_CPU_FREQUENCY
+ #endif
+ #endif