[PATCH v2 0/2] riscv: kprobes: simulate nop and c.nop instructions
Xiaofeng Yuan <[email protected]>
| Newsgroups | org.infradead.lists.linux-riscv |
|---|---|
| Message-ID | <[email protected]> |
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 _______________________________________________ linux-riscv mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-riscv