[PATCH v2 0/4] openrisc: Add support for KProbes
From: Sahil Siddiq
Date: Wed Sep 30 2026 - 16:32:12 EST
Hi,
Apologies for the delay. This is v2 of the patch series to add KProbe
support for OpenRISC.
The series also adds support for Kretprobes (which depends on the rethook
framework [1]). Kretprobes are fired on function return.
In order to build the kernel with Kprobes and Kretprobes enabled, the
following config options are required:
1. CONFIG_HAVE_KPROBES=y
2. CONFIG_KPROBES=y
3. CONFIG_RETHOOK=y
4. CONFIG_KRETPROBES=y
I tested the generic functionality of Kprobes and Kretprobes using the
tests located at "lib/tests" [2], samples located at "samples/kprobes" [3],
as well as a few test modules that I have published here [4]. The following
options are required to build the samples and tests:
1. CONFIG_SAMPLES=y
2. CONFIG_SAMPLE_KPROBES=m
3. CONFIG_SAMPLE_KRETPROBES=m
4. CONFIG_KPROBES_SANITY_TEST=m
I have also added unit tests at "arch/openrisc/kernel/tests" to verify
that Kprobes work properly when inserted at branch instructions, and
that delay slots are handled correctly. The tests are based on the Kprobe
testsuite added for RISC-V. The following options need to be enabled to
build the tests:
1. CONFIG_KUNIT=y
2. CONFIG_RUNTIME_KERNEL_TESTING_MENU=y
3. CONFIG_OR_KPROBES_KUNIT=m
Below are the results of the tests and sample modules when run in my
environment.
- kretprobe_example:
/home # insmod kretprobe_example.ko
Planted return probe at kernel_clone: (ptrval)
/home # ls >/dev/null
kernel_clone returned 35 and took 1302450 ns to execute
/home # rmmod kretprobe_example.ko
kernel_clone returned 36 and took 1121200 ns to execute
kretprobe at (ptrval) unregistered
Missed probing 0 instances of kernel_clone
- test_kprobes:
/home # insmod test_kprobes.ko
KTAP version 1
1..1
KTAP version 1
# Subtest: kprobes_test
# module: test_kprobes
1..5
ok 1 test_kprobe
ok 2 test_kprobes
ok 3 test_kprobe_missed
ok 4 test_kretprobe
ok 5 test_kretprobes
# kprobes_test: pass:5 fail:0 skip:0 total:5
# Totals: pass:5 fail:0 skip:0 total:5
ok 1 kprobes_test
- openrisc_test_kprobes:
/home # insmod openrisc_test_kprobes.ko
KTAP version 1
1..1
KTAP version 1
# Subtest: kprobes_openrisc
# module: openrisc_test_kprobes
1..1
ok 1 test_kprobe_openrisc
ok 1 kprobes_openrisc
I have also made changes based on the review comments I received for
v1 [5] including several of Sachiko's comments [6]. I chose not to make
changes in a few places. I'll send emails as a reply to this thread
explaining my reasoning inline.
Thanks,
Sahil
[1] https://lkml.rescloud.iu.edu/2203.0/05974.html
[2] https://github.com/torvalds/linux/tree/master/lib/tests
[3] https://github.com/torvalds/linux/tree/master/samples/kprobes
[4] https://github.com/valdaarhun/or-dev
[5] https://lwn.net/ml/all/20260407185650.79816-1-sahilcdq0@xxxxxxxxx/
[6] https://sashiko.dev/#/patchset/20260407185650.79816-1-sahilcdq0%40gmail.com
Sahil Siddiq (4):
openrisc: Add utilities and clean up simulation of instructions
openrisc: Add KProbes
openrisc: Add unit tests for KProbes on branch instructions
openrisc: Add Kretprobes
arch/openrisc/Kconfig | 3 +
arch/openrisc/Kconfig.debug | 30 +-
arch/openrisc/configs/or1ksim_defconfig | 2 +
arch/openrisc/configs/virt_defconfig | 2 +
arch/openrisc/include/asm/asm.h | 22 +
arch/openrisc/include/asm/break.h | 19 +
arch/openrisc/include/asm/cpuinfo.h | 3 +
arch/openrisc/include/asm/insn-def.h | 64 ++-
arch/openrisc/include/asm/kprobes.h | 77 ++++
arch/openrisc/include/asm/spr_defs.h | 1 +
arch/openrisc/kernel/Makefile | 5 +-
arch/openrisc/kernel/entry.S | 16 +
arch/openrisc/kernel/insn.c | 84 ++++
arch/openrisc/kernel/kprobes.c | 400 ++++++++++++++++++
arch/openrisc/kernel/rethook.c | 32 ++
arch/openrisc/kernel/rethook.h | 8 +
arch/openrisc/kernel/rethook_trampoline.S | 97 +++++
arch/openrisc/kernel/setup.c | 4 +
arch/openrisc/kernel/tests/Makefile | 3 +
arch/openrisc/kernel/tests/test_kprobes.c | 59 +++
arch/openrisc/kernel/tests/test_kprobes.h | 24 ++
arch/openrisc/kernel/tests/test_kprobes_asm.S | 147 +++++++
arch/openrisc/kernel/traps.c | 82 ++--
arch/openrisc/lib/memcpy.c | 2 +
arch/openrisc/lib/memset.S | 4 +
arch/openrisc/mm/fault.c | 5 +
samples/kprobes/kprobe_example.c | 8 +
27 files changed, 1152 insertions(+), 51 deletions(-)
create mode 100644 arch/openrisc/include/asm/asm.h
create mode 100644 arch/openrisc/include/asm/break.h
create mode 100644 arch/openrisc/include/asm/kprobes.h
create mode 100644 arch/openrisc/kernel/insn.c
create mode 100644 arch/openrisc/kernel/kprobes.c
create mode 100644 arch/openrisc/kernel/rethook.c
create mode 100644 arch/openrisc/kernel/rethook.h
create mode 100644 arch/openrisc/kernel/rethook_trampoline.S
create mode 100644 arch/openrisc/kernel/tests/Makefile
create mode 100644 arch/openrisc/kernel/tests/test_kprobes.c
create mode 100644 arch/openrisc/kernel/tests/test_kprobes.h
create mode 100644 arch/openrisc/kernel/tests/test_kprobes_asm.S
--
2.55.0