diff --git a/1000-backport-bpftrace-Add-support-for-loongarch.patch b/1000-backport-bpftrace-Add-support-for-loongarch.patch new file mode 100644 index 0000000000000000000000000000000000000000..0c44cb70286bbb1ebf22c626cc4a1685e0e030f7 --- /dev/null +++ b/1000-backport-bpftrace-Add-support-for-loongarch.patch @@ -0,0 +1,201 @@ +From d10fb5fe25ba95da6ce378ba57834fff476c9a4c Mon Sep 17 00:00:00 2001 +From: Hengqi Chen +Date: Mon, 19 Dec 2022 23:06:50 +0800 +Subject: [PATCH 1/2] bpftrace: Add support for loongarch + +commit cf54d1682c19c0b2ebc7f81160282345c0aded79 upstream. + +Add initial support for loongarch ([0]). This enables building +on loongarch machine and makes kprobe/kretprobe works as expected. + + [0]: https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html + +Signed-off-by: Hengqi Chen +Signed-off-by: Yingkun Meng +--- + src/arch/CMakeLists.txt | 2 + + src/arch/loongarch64.cpp | 159 +++++++++++++++++++++++++++++++++++++++ + 2 files changed, 161 insertions(+) + create mode 100644 src/arch/loongarch64.cpp + +diff --git a/src/arch/CMakeLists.txt b/src/arch/CMakeLists.txt +index 76bb217e3f16..a2381a4ed277 100644 +--- a/src/arch/CMakeLists.txt ++++ b/src/arch/CMakeLists.txt +@@ -10,6 +10,8 @@ elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + add_library(arch x86_64.cpp) + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "mips64") + add_library(arch mips64.cpp) ++elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "loongarch64") ++ add_library(arch loongarch64.cpp) + else() + message(FATAL_ERROR "Unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR}") + endif() +diff --git a/src/arch/loongarch64.cpp b/src/arch/loongarch64.cpp +new file mode 100644 +index 000000000000..04b91a32b1fb +--- /dev/null ++++ b/src/arch/loongarch64.cpp +@@ -0,0 +1,159 @@ ++#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 = { ++ "r0", ++ "r1", ++ "r2", ++ "r3", ++ "r4", ++ "r5", ++ "r6", ++ "r7", ++ "r8", ++ "r9", ++ "r10", ++ "r11", ++ "r12", ++ "r13", ++ "r14", ++ "r15", ++ "r16", ++ "r17", ++ "r18", ++ "r19", ++ "r20", ++ "r21", ++ "r22", ++ "r23", ++ "r24", ++ "r25", ++ "r26", ++ "r27", ++ "r28", ++ "r29", ++ "r30", ++ "r31", ++ "orig_a0", ++ "pc", ++}; ++ ++// 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]", ++ "orig_a0", ++ "csr_era", ++}; ++ ++static std::array arg_registers = { ++ "r4", ++ "r5", ++ "r6", ++ "r7", ++ "r8", ++ "r9", ++ "r10", ++ "r11", ++}; ++// 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("r4"); ++} ++ ++int sp_offset() ++{ ++ return offset("r3"); ++} ++ ++int arg_stack_offset() ++{ ++ return ARG0_STACK / 8; ++} ++ ++std::string name() ++{ ++ return std::string("loongarch64"); ++} ++ ++std::vector invalid_watchpoint_modes() ++{ ++ throw std::runtime_error( ++ "Watchpoints are not supported on this architecture"); ++} ++ ++} // namespace arch ++} // namespace bpftrace +-- +2.33.0 + diff --git a/1001-backport-fix-kernel-cflags-for-loongarch.patch b/1001-backport-fix-kernel-cflags-for-loongarch.patch new file mode 100644 index 0000000000000000000000000000000000000000..942f565dd1e259cbc0aa2120dabd1addc46b228f --- /dev/null +++ b/1001-backport-fix-kernel-cflags-for-loongarch.patch @@ -0,0 +1,34 @@ +From 140ac44cc4514768acd76534842d554c3d510624 Mon Sep 17 00:00:00 2001 +From: wangguofeng +Date: Wed, 14 Jun 2023 09:39:16 +0800 +Subject: [PATCH 2/2] fix kernel cflags for loongarch + +commit 960fb8c1eadf671e5d4de4947b56801b241ae444 upstream. + +The arch should return loongarch in loongarch64 machine, but it +return loongarch64, because it is loongarch in kernel source tree. + +Signed-off-by: wangguofeng +Signed-off-by: Yingkun Meng +--- + src/utils.cpp | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/src/utils.cpp b/src/utils.cpp +index 11240d2a16c9..e98bba481337 100644 +--- a/src/utils.cpp ++++ b/src/utils.cpp +@@ -268,6 +268,10 @@ std::vector get_kernel_cflags( + } else if (!strncmp(uname_machine, "aarch64", 7)) { + arch = "arm64"; + } ++ else if (!strncmp(uname_machine, "loongarch", 9)) ++ { ++ arch = "loongarch"; ++ } + + // If ARCH env is defined, use it over uname + archenv = getenv("ARCH"); +-- +2.33.0 + diff --git a/bpftrace.spec b/bpftrace.spec index 0d10b5fbf3446cc7f7f963aa287a33a9eb2b3e79..0afc412fcf88e77c026a4a02c5530ca04b90c0da 100644 --- a/bpftrace.spec +++ b/bpftrace.spec @@ -1,15 +1,18 @@ Name: bpftrace Version: 0.14.1 -Release: 3 +Release: 4 Summary: High-level tracing language for Linux eBPF License: ASL 2.0 URL: https://github.com/iovisor/bpftrace Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz +Patch1000: 1000-backport-bpftrace-Add-support-for-loongarch.patch +Patch1001: 1001-backport-fix-kernel-cflags-for-loongarch.patch + # Arches will be included as upstream support is added and dependencies are # satisfied in the respective arches -ExclusiveArch: x86_64 %{power64} aarch64 +ExclusiveArch: x86_64 %{power64} aarch64 loongarch64 BuildRequires: gcc-c++ bison flex cmake elfutils-libelf-devel BuildRequires: zlib-devel llvm-devel clang-devel @@ -65,6 +68,9 @@ find %{buildroot}%{_datadir}/%{name}/tools -type f -exec \ %changelog +* Wed Jun 14 2023 Yingkun Meng - 0.14.1-4 +- Add loongarch support + * Thu Jun 9 2022 LemmyHuang - 0.14.1-3 - fix abort on startup caused by llvm compiler