[PATCH v6 07/13] riscv/kprobe: Prepare detour buffer for optimized kprobe
Björn Töpel
bjorn at kernel.org
Wed Feb 1 05:30:28 PST 2023
Chen Guokai <chenguokai17 at mails.ucas.ac.cn> writes:
> diff --git a/arch/riscv/kernel/probes/opt.c b/arch/riscv/kernel/probes/opt.c
> index d84aa1420fa2..a47f7d2bf3a6 100644
> --- a/arch/riscv/kernel/probes/opt.c
> +++ b/arch/riscv/kernel/probes/opt.c
> @@ -11,9 +11,32 @@
> #include <linux/kprobes.h>
> #include <asm/kprobes.h>
> #include <asm/patch.h>
> +#include <asm/asm-offsets.h>
>
> #include "simulate-insn.h"
> #include "decode-insn.h"
> +#include "../../net/bpf_jit.h"
> +
> +static void optimized_callback(struct optimized_kprobe *op,
> + struct pt_regs *regs)
> +{
> + if (kprobe_disabled(&op->kp))
> + return;
> +
> + preempt_disable();
> + if (kprobe_running()) {
> + kprobes_inc_nmissed_count(&op->kp);
> + } else {
> + __this_cpu_write(current_kprobe, &op->kp);
> + /* Save skipped registers */
> + instruction_pointer_set(regs, (unsigned long)op->kp.addr);
> + get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE;
> + opt_pre_handler(&op->kp, regs);
> + __this_cpu_write(current_kprobe, NULL);
> + }
> + preempt_enable();
> +}
> +NOKPROBE_SYMBOL(optimized_callback)
>
> static int in_auipc_jalr_range(long val)
> {
> @@ -30,6 +53,11 @@ static int in_auipc_jalr_range(long val)
> #endif
> }
>
> +#define DETOUR_ADDR(code, offs) \
> + ((void *)((unsigned long)(code) + (offs)))
> +#define DETOUR_INSN(code, offs) \
> + (*(kprobe_opcode_t *)((unsigned long)(code) + (offs)))
Can this cause a misaligned u32 load exception?
Björn
More information about the linux-riscv
mailing list