sockperf: Add RISC-V support

configure rejected riscv hosts as not ported, and the TSC read fell back
to x86 rdtsc. Patch both, reading the time CSR with rdtime.

Tested by building for qemuriscv64 (musl, clang) and running a loopback
ping-pong under qemu-riscv64.

AI-Generated: Uses Claude Code
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
This commit is contained in:
Khem Raj committed 2026-10-18 17:38:48 -07:00
1 parent c794b5fe79
commit bcf3420637
2 files changed
+67

No files matched your search

@@ -0,0 +1,66 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Khem Raj <khem.raj@oss.qualcomm.com>
Date: Sun, 18 Oct 2026 17:20:00 -0700
Subject: [PATCH] Add RISC-V support
configure rejects riscv hosts with "it has not been ported", and
os_gettimeoftsc() falls back to the x86 rdtsc instruction for any
unknown architecture.
Accept riscv* hosts and read the time CSR with rdtime, which Linux lets
user mode access (unlike the cycle CSR). On rv32 read the high half
around the low half and retry on carry.
Upstream-Status: Pending
AI-Generated: Uses Claude Code
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
---
configure.ac | 2 ++
src/ticks_os.h | 14 ++++++++++++++
2 files changed, 16 insertions(+)
diff --git a/configure.ac b/configure.ac
index 258bbb0..13900cf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -29,6 +29,7 @@ case "$host" in
i386-*-freebsd*) TARGET=FREEBSD; TARGETDIR=x86;;
aarch64-*-*) TARGET=AARCH64; TARGETDIR=aarch64;;
s390*-*-*) TARGET=S390; TARGETDIR=s390;;
+ riscv*-*-*) TARGET=RISCV; TARGETDIR=riscv;;
esac
AC_SUBST(AM_RUNTESTFLAGS)
@@ -48,6 +49,7 @@ AM_CONDITIONAL(POWERPC_FREEBSD, test x$TARGET = xPOWERPC_FREEBSD)
AM_CONDITIONAL(FREEBSD, test x$TARGET = xFREEBSD)
AM_CONDITIONAL(AARCH64, test x$TARGET = xAARCH64)
AM_CONDITIONAL(S390, test x$TARGET = xS390)
+AM_CONDITIONAL(RISCV, test x$TARGET = xRISCV)
AC_SUBST(TARGET)
AC_SUBST(TARGETDIR)
diff --git a/src/ticks_os.h b/src/ticks_os.h
index 46e313c..023be3a 100644
--- a/src/ticks_os.h
+++ b/src/ticks_os.h
@@ -100,6 +100,20 @@ inline ticks_t os_gettimeoftsc() {
asm volatile("isb" : : : "memory");
asm volatile("mrs %0, cntvct_el0" : "=r" (ret));
return ret;
+#elif defined(__riscv)
+ // Linux allows user mode to read the time CSR, but not cycle
+#if __riscv_xlen == 64
+ uint64_t ret;
+ asm volatile("rdtime %0" : "=r"(ret));
+ return (ticks_t)ret;
+#else
+ uint32_t tmp;
+ do {
+ asm volatile("rdtimeh %0" : "=r"(upper_32));
+ asm volatile("rdtime %0" : "=r"(lower_32));
+ asm volatile("rdtimeh %0" : "=r"(tmp));
+ } while (upper_32 != tmp);
+#endif
#elif defined(__arm__)
// so the compiler will not complain. for
// AArch32 compile, this inline is not used
@@ -7,6 +7,7 @@ LIC_FILES_CHKSUM = "file://copying;md5=b4563b57c98bc23c8cecbc0b6d9546e9"
SRC_URI = "git://github.com/Mellanox/sockperf;branch=sockperf_v2;protocol=https \
file://0001-src-fix-missing-includes-for-musl-struct-timeval-ss.patch \
file://0002-Add-RISC-V-support.patch \
"
SRCREV = "3c65ad99cd385e18f8a2a655c19826e81a4d17e8"