riscv: Add kprobes supported
authorGuo Ren <guoren@linux.alibaba.com>
Thu, 17 Dec 2020 16:01:42 +0000 (16:01 +0000)
committerPalmer Dabbelt <palmerdabbelt@google.com>
Thu, 14 Jan 2021 23:09:06 +0000 (15:09 -0800)
commitc22b0bcb1dd024cb9caad9230e3a387d8b061df5
treef35a8b91116cb256acdcdd85939c6f06dc967bb9
parentafc76b8b80112189b6f11e67e19cf58301944814
riscv: Add kprobes supported

This patch enables "kprobe & kretprobe" to work with ftrace
interface. It utilized software breakpoint as single-step
mechanism.

Some instructions which can't be single-step executed must be
simulated in kernel execution slot, such as: branch, jal, auipc,
la ...

Some instructions should be rejected for probing and we use a
blacklist to filter, such as: ecall, ebreak, ...

We use ebreak & c.ebreak to replace origin instruction and the
kprobe handler prepares an executable memory slot for out-of-line
execution with a copy of the original instruction being probed.
In execution slot we add ebreak behind original instruction to
simulate a single-setp mechanism.

The patch is based on packi's work [1] and csky's work [2].
 - The kprobes_trampoline.S is all from packi's patch
 - The single-step mechanism is new designed for riscv without hw
   single-step trap
 - The simulation codes are from csky
 - Frankly, all codes refer to other archs' implementation

 [1] https://lore.kernel.org/linux-riscv/20181113195804.22825-1-me@packi.ch/
 [2] https://lore.kernel.org/linux-csky/20200403044150.20562-9-guoren@kernel.org/

Signed-off-by: Guo Ren <guoren@linux.alibaba.com>
Co-developed-by: Patrick Stählin <me@packi.ch>
Signed-off-by: Patrick Stählin <me@packi.ch>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Tested-by: Zong Li <zong.li@sifive.com>
Reviewed-by: Pekka Enberg <penberg@kernel.org>
Cc: Patrick Stählin <me@packi.ch>
Cc: Palmer Dabbelt <palmerdabbelt@google.com>
Cc: Björn Töpel <bjorn.topel@gmail.com>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
13 files changed:
arch/riscv/Kconfig
arch/riscv/include/asm/kprobes.h
arch/riscv/include/asm/probes.h [new file with mode: 0644]
arch/riscv/kernel/Makefile
arch/riscv/kernel/probes/Makefile [new file with mode: 0644]
arch/riscv/kernel/probes/decode-insn.c [new file with mode: 0644]
arch/riscv/kernel/probes/decode-insn.h [new file with mode: 0644]
arch/riscv/kernel/probes/kprobes.c [new file with mode: 0644]
arch/riscv/kernel/probes/kprobes_trampoline.S [new file with mode: 0644]
arch/riscv/kernel/probes/simulate-insn.c [new file with mode: 0644]
arch/riscv/kernel/probes/simulate-insn.h [new file with mode: 0644]
arch/riscv/kernel/traps.c
arch/riscv/mm/fault.c