[PATCH v2 0/2] riscv: kprobes: simulate nop and c.nop instructions
Xiaofeng Yuan
yuanxiaofeng at eswincomputing.com
Tue Aug 25 05:20:18 PDT 2026
nop and c.nop have no architectural effect, so handling them through
an out-of-line instruction slot and single-stepping is pure overhead.
This series simulates them directly in the breakpoint handler by
advancing the program counter, following the approach already used on
arm64, and extends the RISC-V kprobes KUnit test to cover both paths.
riscv_probe_decode_insn() is shared by kprobes and uprobes, so the
simulation also applies to uprobes placed on nop instructions. This is
relevant for USDT probe sites in user-space binaries, which are
nop/c.nop instructions on RISC-V, the same use case that motivated the
arm64 implementation. In kernel text, nops are also found at ftrace
mcount call sites and disabled jump_label sites.
Measured on QEMU (RISC-V virt, emulated), this reduces the per-hit
cost of a kprobe on a nop by roughly 40% compared to single-stepping
through the out-of-line slot.
Changes since v1:
- patch 1: add the above use-case justification and benchmark result
to the commit message (per Nam Cao's review).
- patch 2: simplify the test functions to load KPROBE_TEST_MAGIC
directly instead of splitting it into LOWER/UPPER halves (per Nam
Cao's review).
Verified by cross-compiling for RISC-V and running the kprobes KUnit
test in QEMU (ok 1 kprobes_riscv).
Xiaofeng Yuan (2):
riscv: kprobes: simulate nop and c.nop instructions
riscv: kprobes: add nop and c.nop to the KUnit test
arch/riscv/include/asm/insn.h | 11 +++++++++
arch/riscv/kernel/probes/decode-insn.c | 6 +++++
arch/riscv/kernel/probes/simulate-insn.c | 14 +++++++++++
arch/riscv/kernel/probes/simulate-insn.h | 2 ++
.../kernel/tests/kprobes/test-kprobes-asm.S | 23 +++++++++++++++++++
5 files changed, 56 insertions(+)
--
2.43.0
More information about the linux-riscv
mailing list