lkml.org 
[lkml]   [2023]   [Jan]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 01/13] riscv/kprobe: Prepare the skeleton to implement RISCV OPTPROBES
    Date
    From: Liao Chang <liaochang1@huawei.com>

    Prepare skeleton to implement optimized kprobe on RISCV, although some
    architecture specific functions are left blank, they do not change the
    correctness of existing kprobe code, on account of these functions just
    return zero. To avoid each patch being too complicated to review and
    test, these functions will be implemented incrementally.

    Signed-off-by: Liao Chang <liaochang1@huawei.com>
    Co-developed-by: Chen Guokai <chenguokai17@mails.ucas.ac.cn>
    Signed-off-by: Chen Guokai <chenguokai17@mails.ucas.ac.cn>
    ---
    arch/riscv/Kconfig | 1 +
    arch/riscv/include/asm/kprobes.h | 32 ++++++++++++++
    arch/riscv/kernel/probes/Makefile | 1 +
    arch/riscv/kernel/probes/opt.c | 51 +++++++++++++++++++++++
    arch/riscv/kernel/probes/opt_trampoline.S | 12 ++++++
    5 files changed, 97 insertions(+)
    create mode 100644 arch/riscv/kernel/probes/opt.c
    create mode 100644 arch/riscv/kernel/probes/opt_trampoline.S

    diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
    index 9c687da7756d..48a639c7c055 100644
    --- a/arch/riscv/Kconfig
    +++ b/arch/riscv/Kconfig
    @@ -101,6 +101,7 @@ config RISCV
    select HAVE_KPROBES if !XIP_KERNEL
    select HAVE_KPROBES_ON_FTRACE if !XIP_KERNEL
    select HAVE_KRETPROBES if !XIP_KERNEL
    + select HAVE_OPTPROBES if !XIP_KERNEL
    select HAVE_RETHOOK if !XIP_KERNEL
    select HAVE_MOVE_PMD
    select HAVE_MOVE_PUD
    diff --git a/arch/riscv/include/asm/kprobes.h b/arch/riscv/include/asm/kprobes.h
    index e7882ccb0fd4..96cd36e67e2e 100644
    --- a/arch/riscv/include/asm/kprobes.h
    +++ b/arch/riscv/include/asm/kprobes.h
    @@ -41,5 +41,37 @@ int kprobe_fault_handler(struct pt_regs *regs, unsigned int trapnr);
    bool kprobe_breakpoint_handler(struct pt_regs *regs);
    bool kprobe_single_step_handler(struct pt_regs *regs);

    +#ifdef CONFIG_OPTPROBES
    +
    +/* optinsn template addresses */
    +extern __visible kprobe_opcode_t optprobe_template_entry[];
    +extern __visible kprobe_opcode_t optprobe_template_end[];
    +
    +#define MAX_OPTINSN_SIZE \
    + ((unsigned long)optprobe_template_end - \
    + (unsigned long)optprobe_template_entry)
    +
    +/*
    + * For RVI and RVC hybrid encoding kernel, although long jump just needs
    + * 2 RVI instructions(AUIPC/JALR), optimized instructions are 10 bytes long
    + * at most to ensure no RVI would be truncated actually, so it means four
    + * combinations:
    + * - 2 RVI
    + * - 4 RVC
    + * - 2 RVC + 1 RVI
    + * - 3 RVC + 1 RVI (truncated, need padding)
    + */
    +#define MAX_COPIED_INSN 4
    +#define MAX_OPTIMIZED_LENGTH 10
    +
    +struct arch_optimized_insn {
    + kprobe_opcode_t copied_insn[MAX_COPIED_INSN];
    + /* detour code buffer */
    + kprobe_opcode_t *insn;
    + unsigned long length;
    + int rd;
    +};
    +
    +#endif /* CONFIG_OPTPROBES */
    #endif /* CONFIG_KPROBES */
    #endif /* _ASM_RISCV_KPROBES_H */
    diff --git a/arch/riscv/kernel/probes/Makefile b/arch/riscv/kernel/probes/Makefile
    index c40139e9ca47..3d837eb5f9be 100644
    --- a/arch/riscv/kernel/probes/Makefile
    +++ b/arch/riscv/kernel/probes/Makefile
    @@ -3,4 +3,5 @@ obj-$(CONFIG_KPROBES) += kprobes.o decode-insn.o simulate-insn.o
    obj-$(CONFIG_RETHOOK) += rethook.o rethook_trampoline.o
    obj-$(CONFIG_KPROBES_ON_FTRACE) += ftrace.o
    obj-$(CONFIG_UPROBES) += uprobes.o decode-insn.o simulate-insn.o
    +obj-$(CONFIG_OPTPROBES) += opt.o opt_trampoline.o
    CFLAGS_REMOVE_simulate-insn.o = $(CC_FLAGS_FTRACE)
    diff --git a/arch/riscv/kernel/probes/opt.c b/arch/riscv/kernel/probes/opt.c
    new file mode 100644
    index 000000000000..56c8a227c857
    --- /dev/null
    +++ b/arch/riscv/kernel/probes/opt.c
    @@ -0,0 +1,51 @@
    +// SPDX-License-Identifier: GPL-2.0-or-later
    +/*
    + * Kernel Probes Jump Optimization (Optprobes)
    + *
    + * Copyright (C) Guokai Chen, 2022
    + * Author: Guokai Chen chenguokai17@mails.ucas.ac.cn
    + */
    +
    +#define pr_fmt(fmt) "optprobe: " fmt
    +
    +#include <linux/kprobes.h>
    +#include <asm/kprobes.h>
    +
    +int arch_prepared_optinsn(struct arch_optimized_insn *optinsn)
    +{
    + return 0;
    +}
    +
    +int arch_check_optimized_kprobe(struct optimized_kprobe *op)
    +{
    + return 0;
    +}
    +
    +int arch_prepare_optimized_kprobe(struct optimized_kprobe *op,
    + struct kprobe *orig)
    +{
    + return 0;
    +}
    +
    +void arch_remove_optimized_kprobe(struct optimized_kprobe *op)
    +{
    +}
    +
    +void arch_optimize_kprobes(struct list_head *oplist)
    +{
    +}
    +
    +void arch_unoptimize_kprobes(struct list_head *oplist,
    + struct list_head *done_list)
    +{
    +}
    +
    +void arch_unoptimize_kprobe(struct optimized_kprobe *op)
    +{
    +}
    +
    +int arch_within_optimized_kprobe(struct optimized_kprobe *op,
    + kprobe_opcode_t *addr)
    +{
    + return 0;
    +}
    diff --git a/arch/riscv/kernel/probes/opt_trampoline.S b/arch/riscv/kernel/probes/opt_trampoline.S
    new file mode 100644
    index 000000000000..16160c4367ff
    --- /dev/null
    +++ b/arch/riscv/kernel/probes/opt_trampoline.S
    @@ -0,0 +1,12 @@
    +/* SPDX-License-Identifier: GPL-2.0-only */
    +/*
    + * Copyright (C) 2022 Guokai Chen
    + */
    +
    +#include <linux/linkage.h>
    +
    +#incldue <asm/csr.h>
    +#include <asm/asm-offsets.h>
    +
    +SYM_ENTRY(optprobe_template_entry, SYM_L_GLOBAL, SYM_A_NONE)
    +SYM_ENTRY(optprobe_template_end, SYM_L_GLOBAL, SYM_A_NONE)
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-03-26 23:58    [W:6.024 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site