summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Benjamin Barenblat <bbaren@google.com>2024-03-31 21:05:25 -0400
committerGravatar Benjamin Barenblat <bbaren@google.com>2024-03-31 21:05:25 -0400
commitf8c62635a698fb2ff487765eba6a73485ea0b230 (patch)
tree5716eefd4b18968a35a36aa0805219944d5e63f5
parentcd9fc91c8c4c5190c5c9b220706be7f69ce75e39 (diff)
Apply an upstream patch to prevent SIGILLs on RISC-V
Upstream has accepted Aurelien Jarno’s patch removing RISC-V support from unscaledcycleclock. Include it here, fixing https://bugs.debian.org/1059532. Also reenable parallel test runs on RISC-V, per https://bugs.debian.org/1059532#16.
-rw-r--r--debian/changelog7
-rw-r--r--debian/copyright4
-rw-r--r--debian/patches/riscv-rdcycle.diff71
-rw-r--r--debian/patches/series1
-rwxr-xr-xdebian/rules6
5 files changed, 83 insertions, 6 deletions
diff --git a/debian/changelog b/debian/changelog
index 7c68791d..6b941b55 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+abseil (20230802.1-3) UNRELEASED; urgency=medium
+
+ * Apply an upstream patch to prevent SIGILLs on RISC-V. (Closes:
+ #1059532)
+
+ -- Benjamin Barenblat <bbaren@debian.org> Sun, 31 Mar 2024 20:33:48 -0400
+
abseil (20230802.1-2) experimental; urgency=medium
* Disable a unit test to work around https://bugs.debian.org/1059340.
diff --git a/debian/copyright b/debian/copyright
index 19a3388c..50743e9c 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -15,6 +15,10 @@ Files: debian/*
Copyright: 2020-2022 Google LLC
License: Apache-2.0
+Files: debian/patches/riscv-nan-formatting.diff
+Copyright: 2024 aurel32 <aurelien@aurel32.net>
+License: Apache-2.0
+
License: Apache-2.0
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
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
diff --git a/debian/patches/series b/debian/patches/series
index 397734ac..ee48fdd3 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -5,3 +5,4 @@ empty-flags-library.diff
cordz-info-statistics-test.diff
pkg-config-directives.diff
riscv-nan-formatting.diff
+riscv-rdcycle.diff
diff --git a/debian/rules b/debian/rules
index 7f76c033..16a2e263 100755
--- a/debian/rules
+++ b/debian/rules
@@ -28,12 +28,6 @@ else
ABSL_RUN_TESTS=ON
endif
-# Debian's RISC-V builders don't have enough resources to run tests in parallel.
-# See https://bugs.debian.org/1025221.
-ifneq ($(filter $(DEB_HOST_ARCH),riscv64),)
-ABSL_TEST_EXTRA_ARGS=--no-parallel
-endif
-
%:
dh $@