forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 431
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
1 parent
afc76b8
commit c22b0bc
Showing
13 changed files
with
773 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
|
||
#ifndef _ASM_RISCV_PROBES_H | ||
#define _ASM_RISCV_PROBES_H | ||
|
||
typedef u32 probe_opcode_t; | ||
typedef bool (probes_handler_t) (u32 opcode, unsigned long addr, struct pt_regs *); | ||
|
||
/* architecture specific copy of original instruction */ | ||
struct arch_probe_insn { | ||
probe_opcode_t *insn; | ||
probes_handler_t *handler; | ||
/* restore address after simulation */ | ||
unsigned long restore; | ||
}; | ||
|
||
#ifdef CONFIG_KPROBES | ||
typedef u32 kprobe_opcode_t; | ||
struct arch_specific_insn { | ||
struct arch_probe_insn api; | ||
}; | ||
#endif | ||
|
||
#endif /* _ASM_RISCV_PROBES_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
# SPDX-License-Identifier: GPL-2.0 | ||
obj-$(CONFIG_KPROBES) += kprobes.o decode-insn.o simulate-insn.o | ||
obj-$(CONFIG_KPROBES) += kprobes_trampoline.o | ||
CFLAGS_REMOVE_simulate-insn.o = $(CC_FLAGS_FTRACE) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
// SPDX-License-Identifier: GPL-2.0+ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/kprobes.h> | ||
#include <linux/module.h> | ||
#include <linux/kallsyms.h> | ||
#include <asm/sections.h> | ||
|
||
#include "decode-insn.h" | ||
#include "simulate-insn.h" | ||
|
||
/* Return: | ||
* INSN_REJECTED If instruction is one not allowed to kprobe, | ||
* INSN_GOOD_NO_SLOT If instruction is supported but doesn't use its slot. | ||
*/ | ||
enum probe_insn __kprobes | ||
riscv_probe_decode_insn(probe_opcode_t *addr, struct arch_probe_insn *api) | ||
{ | ||
probe_opcode_t insn = le32_to_cpu(*addr); | ||
|
||
/* | ||
* Reject instructions list: | ||
*/ | ||
RISCV_INSN_REJECTED(system, insn); | ||
RISCV_INSN_REJECTED(fence, insn); | ||
|
||
/* | ||
* Simulate instructions list: | ||
* TODO: the REJECTED ones below need to be implemented | ||
*/ | ||
#ifdef CONFIG_RISCV_ISA_C | ||
RISCV_INSN_REJECTED(c_j, insn); | ||
RISCV_INSN_REJECTED(c_jr, insn); | ||
RISCV_INSN_REJECTED(c_jal, insn); | ||
RISCV_INSN_REJECTED(c_jalr, insn); | ||
RISCV_INSN_REJECTED(c_beqz, insn); | ||
RISCV_INSN_REJECTED(c_bnez, insn); | ||
RISCV_INSN_REJECTED(c_ebreak, insn); | ||
#endif | ||
|
||
RISCV_INSN_REJECTED(auipc, insn); | ||
RISCV_INSN_REJECTED(branch, insn); | ||
|
||
RISCV_INSN_SET_SIMULATE(jal, insn); | ||
RISCV_INSN_SET_SIMULATE(jalr, insn); | ||
|
||
return INSN_GOOD; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
/* SPDX-License-Identifier: GPL-2.0+ */ | ||
|
||
#ifndef _RISCV_KERNEL_KPROBES_DECODE_INSN_H | ||
#define _RISCV_KERNEL_KPROBES_DECODE_INSN_H | ||
|
||
#include <asm/sections.h> | ||
#include <asm/kprobes.h> | ||
|
||
enum probe_insn { | ||
INSN_REJECTED, | ||
INSN_GOOD_NO_SLOT, | ||
INSN_GOOD, | ||
}; | ||
|
||
enum probe_insn __kprobes | ||
riscv_probe_decode_insn(probe_opcode_t *addr, struct arch_probe_insn *asi); | ||
|
||
#endif /* _RISCV_KERNEL_KPROBES_DECODE_INSN_H */ |
Oops, something went wrong.