From 3fb3e1bb9e9645cfc75142beea4c815040ecdaf7 Mon Sep 17 00:00:00 2001 From: Hailiang Date: Fri, 10 Oct 2025 10:40:51 +0800 Subject: [PATCH] add sw_64 support --- bpftrace-0.19.1-sw.patch | 210 +++++++++++++++++++++++++++++++++++++++ bpftrace.spec | 8 +- 2 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 bpftrace-0.19.1-sw.patch diff --git a/bpftrace-0.19.1-sw.patch b/bpftrace-0.19.1-sw.patch new file mode 100644 index 0000000..ee153e6 --- /dev/null +++ b/bpftrace-0.19.1-sw.patch @@ -0,0 +1,210 @@ +From 7c979e9cf918439883b8dd72f3e84edde3130494 Mon Sep 17 00:00:00 2001 +From: wuzx +Date: Tue, 8 Apr 2025 16:32:57 +0800 +Subject: [PATCH] add sw + +--- + src/arch/CMakeLists.txt | 2 + + src/arch/sw_64.cpp | 162 ++++++++++++++++++++++++++++++++++++++++ + src/utils.cpp | 3 + + 3 files changed, 167 insertions(+) + create mode 100644 src/arch/sw_64.cpp + +diff --git a/src/arch/CMakeLists.txt b/src/arch/CMakeLists.txt +index e6a1d0a..cef45cb 100644 +--- a/src/arch/CMakeLists.txt ++++ b/src/arch/CMakeLists.txt +@@ -14,6 +14,8 @@ elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") + add_library(arch riscv64.cpp) + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "loongarch64") + add_library(arch loongarch64.cpp) ++elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "sw_64") ++ add_library(arch sw_64.cpp) + else() + message(FATAL_ERROR "Unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR}") + endif() +diff --git a/src/arch/sw_64.cpp b/src/arch/sw_64.cpp +new file mode 100644 +index 0000000..7e41660 +--- /dev/null ++++ b/src/arch/sw_64.cpp +@@ -0,0 +1,162 @@ ++#include "arch.h" ++ ++#include ++#include ++ ++// SP points to the first argument that is passed on the stack ++#define ARG0_STACK 0 ++ ++namespace bpftrace { ++namespace arch { ++ ++// clang-format off ++static std::array registers = { ++ "v0", ++ "t0", ++ "t1", ++ "t2", ++ "t3", ++ "t4", ++ "t5", ++ "t6", ++ "t7", ++ "s0", ++ "s1", ++ "s2", ++ "s3", ++ "s4", ++ "s5", ++ "s6/fp", ++ "a0", ++ "a1", ++ "a2", ++ "a3", ++ "a4", ++ "a5", ++ "t8", ++ "t9", ++ "t10", ++ "t11", ++ "ra", ++ "pv", ++ "at", ++ "gp", ++ "sp", ++ "zero", ++ "pc", ++ "pstate", ++}; ++ ++// Alternative register names that match struct pt_regs ++static std::array ptrace_registers = { ++ "regs[0]", ++ "regs[1]", ++ "regs[2]", ++ "regs[3]", ++ "regs[4]", ++ "regs[5]", ++ "regs[6]", ++ "regs[7]", ++ "regs[8]", ++ "regs[9]", ++ "regs[10]", ++ "regs[11]", ++ "regs[12]", ++ "regs[13]", ++ "regs[14]", ++ "regs[15]", ++ "regs[16]", ++ "regs[17]", ++ "regs[18]", ++ "regs[19]", ++ "regs[20]", ++ "regs[21]", ++ "regs[22]", ++ "regs[23]", ++ "regs[24]", ++ "regs[25]", ++ "regs[26]", ++ "regs[27]", ++ "regs[28]", ++ "regs[29]", ++ "regs[30]", ++ "regs[31]", ++ "pc", ++ "pstate", ++}; ++ ++static std::array arg_registers = { ++ "a0", ++ "a1", ++ "a2", ++ "a3", ++ "a4", ++ "a5", ++}; ++// clang-format on ++ ++int offset(std::string reg_name) ++{ ++ auto it = find(registers.begin(), registers.end(), reg_name); ++ if (it == registers.end()) ++ { ++ // Also allow register names that match the fields in struct pt_regs. ++ // These appear in USDT probe arguments. ++ it = find(ptrace_registers.begin(), ptrace_registers.end(), reg_name); ++ if (it == ptrace_registers.end()) ++ { ++ return -1; ++ } ++ return distance(ptrace_registers.begin(), it); ++ } ++ return distance(registers.begin(), it); ++} ++ ++int max_arg() ++{ ++ return arg_registers.size() - 1; ++} ++ ++int arg_offset(int arg_num) ++{ ++ return offset(arg_registers.at(arg_num)); ++} ++ ++int pc_offset() ++{ ++ return offset("pc"); ++} ++ ++int ret_offset() ++{ ++ return offset("v0"); ++} ++ ++int sp_offset() ++{ ++ return offset("sp"); ++} ++ ++int arg_stack_offset() ++{ ++ return ARG0_STACK / 8; ++} ++ ++std::string name() ++{ ++ return std::string("sw_64"); ++} ++ ++std::vector invalid_watchpoint_modes() ++{ ++ throw std::runtime_error( ++ "Watchpoints are not supported on this architecture"); ++} ++ ++int get_kernel_ptr_width() ++{ ++ return 64; ++} ++ ++} // namespace arch ++} // namespace bpftrace +diff --git a/src/utils.cpp b/src/utils.cpp +index b3e4234..0fd9b83 100644 +--- a/src/utils.cpp ++++ b/src/utils.cpp +@@ -401,6 +401,9 @@ std::vector get_kernel_cflags(const char *uname_machine, + { + arch = "loongarch"; + } ++ } else if (!strncmp(uname_machine, "sw_64", 5)) { ++ arch = "sw_64"; ++ } + + // If ARCH env is defined, use it over uname + archenv = getenv("ARCH"); +-- +2.43.0 + diff --git a/bpftrace.spec b/bpftrace.spec index 97412f5..15c25c7 100644 --- a/bpftrace.spec +++ b/bpftrace.spec @@ -1,15 +1,16 @@ Name: bpftrace Version: 0.19.1 -Release: 2 +Release: 3 Summary: High-level tracing language for Linux eBPF License: ASL 2.0 URL: https://github.com/iovisor/bpftrace Source0: %{url}/archive/refs/tags/v%{version}.tar.gz +Patch1: bpftrace-0.19.1-sw.patch # Arches will be included as upstream support is added and dependencies are # satisfied in the respective arches -ExclusiveArch: x86_64 %{power64} aarch64 riscv64 loongarch64 +ExclusiveArch: x86_64 %{power64} aarch64 riscv64 loongarch64 sw_64 BuildRequires: gcc-c++ bison flex cmake elfutils-libelf-devel BuildRequires: zlib-devel llvm-devel clang clang-tools-extra clang-devel llvm-test @@ -68,6 +69,9 @@ find %{buildroot}%{_datadir}/%{name}/tools -type f -exec \ %changelog +* Fri Oct 10 2025 mahailiang - 0.19.1-3 +- add sw_64 support + * Tue Oct 29 2024 Wenlong Zhang - 0.19.1-2 - fix build error on loongarch64 -- Gitee