Received: by 2002:a05:6358:111d:b0:dc:6189:e246 with SMTP id f29csp1257047rwi; Mon, 31 Oct 2022 13:47:00 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5GOtRKuaLpsyaVdsG8Lo3XYV8aVvPN3ssFf7BH0nK25ivhpn07UszpKJ1tFApNS0G9eQPK X-Received: by 2002:a17:90a:5e04:b0:20b:1f20:5069 with SMTP id w4-20020a17090a5e0400b0020b1f205069mr33231702pjf.126.1667249219769; Mon, 31 Oct 2022 13:46:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1667249219; cv=none; d=google.com; s=arc-20160816; b=Inl8z+u3Eu4+xmMOHU+8YQg0J/mZIQXfy2TeEmKpzTqgnY2S5v9vj1TldCG5Wm2sAQ 5WOALC0hqG6fgI26Swo/O8j4abO3cEA0pPUkrmMZ/oglLX/4igWw7vZV5dU66k+B1oAM 1EwRSJz7ejJ0QbxVarLXlBV8efNKsj9Vz4I10HshAels+CW8O3ac0C3TixgG6RWG+pKO aqpD233INGcNjv0CrXrOfsd6CTvmOX7udlJ5AulRjhEJy/AxlkXmRrhS+7INLILDcMAT AgtAwAIwFQY9In/pJMRZhps+shPLPcbnGMINRnx6emF+URMfbyzIKpcscaoC4vciSrCb copw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=VEs/cecB0fwwZLZm5EPYb9t4KVH+qw8c4R+GuqDyTOo=; b=jjxFvuuz0ui8o1THeZJQCrMx4EJBpYSe3zCzyPXWT22+jbS3rKvrf+Og4xy30h+YoM EQ7Dgp797RHoEhpacbLXSCex/MHvBapduNWlxN7ZBeW8JWjBECTRMXR3iyzcN7aWOR7b 8tzA+lPvMw9WtIPgAqU/97xX68oNEeSJ/7MWkLalnBzYTtayah9RoQWm0SOVVYaSMaQy ufn8PBA9xhC/kYxjMLM7jZ3ZjBjH07npjUnp+nMW8yS0rCBTfHdfnTR1h9DGehoyHgVq iMZgyYyT4yPFaYtj/ZkP/hPI5EFEBc37ov7jpQX57vcYVR92CbeAunTwcEAOjBHi6aB6 0sKg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=KUQKivPb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f14-20020a056a00238e00b0056bce3dfaa8si9583781pfc.27.2022.10.31.13.46.39; Mon, 31 Oct 2022 13:46:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=KUQKivPb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229542AbiJaTmS (ORCPT + 98 others); Mon, 31 Oct 2022 15:42:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53688 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229546AbiJaTmR (ORCPT ); Mon, 31 Oct 2022 15:42:17 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EF86362E1 for ; Mon, 31 Oct 2022 12:42:15 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 6EF4C6144F for ; Mon, 31 Oct 2022 19:42:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C0DDCC433C1; Mon, 31 Oct 2022 19:42:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1667245334; bh=Gv2H5/Dm7CG/NW0uP4eH9RzWH55ATCVV74kel/qO6Ho=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=KUQKivPbTObKmBECq9FvalimepMvnRULufJlEunrPC7E8fTTCHZbFlrd3m7T2lhbQ 82nqvzBvkl7Kbr+eSAEgPkF2NOcGR6mJKnD43siltXPrLfmpZK6wmfDxB1j52IgzP8 eb18+Nqd0g6QmM3KCwvU1Q11zceyx+wvtonks7JSo8QBV4brO7wys8gRMzw7qg/FQw VllotmgeJ38L5JUjsMdnT3ZbTZXCuauOJ9D9XXIP+liY0zaHsFx18etXTbEb3EHlvV MDCNo8NH99AX8oXwZyAszXfFUJHmS7xo7NpV6mHoeURWYPMwQaf/+9GBeAe9HW3agw Zd7OmpwstmMyg== Date: Mon, 31 Oct 2022 19:42:09 +0000 From: Conor Dooley To: Chen Guokai Cc: paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, rostedt@goodmis.org, mingo@redhat.com, sfr@canb.auug.org.au, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, liaochang1@huawei.com Subject: Re: [PATCH 1/8] riscv/kprobe: Prepare the skeleton to implement RISCV OPTPROBES feature Message-ID: References: <20221030090141.2550837-1-chenguokai17@mails.ucas.ac.cn> <20221030090141.2550837-2-chenguokai17@mails.ucas.ac.cn> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20221030090141.2550837-2-chenguokai17@mails.ucas.ac.cn> X-Spam-Status: No, score=-8.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hey Chen Guokai, On Sun, Oct 30, 2022 at 05:01:34PM +0800, Chen Guokai wrote: > From: Liao Chang > > Prepare skeleton to implement optimized kprobe on RISCV, it consists > of Makfile, Kconfig and some architecture specific files: kprobe.h and > opt.c opt.c includes some macro, type definition and functions required > by kprobe framework, opt_trampoline.S provides a piece of assembly code > template used to construct the detour buffer as the target of long jump > instruction(s) for each optimzed kprobe. > > Since the jump range of PC-relative instruction JAL is +/-1M, that is > too small to reach the detour buffer, hence the foudamental idea to > address OPTPROBES on RISCV is to replace 'EBREAK' with 'AUIPC+JALR'. which > means it needs to clobber one more instruction beside the kprobe > instruction, furthermore, RISCV supports hybird RVI and RVC in single > kernel binary, so in theory a pair of 'AUIPC/JALR' is about to clobber > 10 bytes(3 RVC and 1 RVI, 2 bytes is padding for alignment) at worst > case. The second hardsome problem is looking for one integer register as > the destination of 'AUIPC/JALR' without any side-effect. > > More solution details will be introduced in the coming commits. nit: you can drop this reference to future commits. > > Co-developed-by: Chen Guokai > Signed-off-by: Chen Guokai > Signed-off-by: Liao Chang FYI, your signoff should come last since you're sending the patches, so this would become: > Signed-off-by: Liao Chang > Co-developed-by: Chen Guokai > Signed-off-by: Chen Guokai I noticed on some of the other patches that your SoB is missing there, for example patch 2. Thanks, Conor. > --- > 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 6b48a3ae9843..ca29306c93e2 100644 > --- a/arch/riscv/Kconfig > +++ b/arch/riscv/Kconfig > @@ -99,6 +99,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_MOVE_PMD > select HAVE_MOVE_PUD > select HAVE_PCI > diff --git a/arch/riscv/include/asm/kprobes.h b/arch/riscv/include/asm/kprobes.h > index 217ef89f22b9..22b73a2fd1fd 100644 > --- a/arch/riscv/include/asm/kprobes.h > +++ b/arch/riscv/include/asm/kprobes.h > @@ -43,5 +43,37 @@ bool kprobe_single_step_handler(struct pt_regs *regs); > void __kretprobe_trampoline(void); > void __kprobes *trampoline_probe_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 hybird encoding kernel, althought long jump just needs > + * 2 RVI instructions(AUIPC+JALR), optimized instructions is 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 7f0840dcc31b..6255b4600875 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_KPROBES) += kprobes_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 > +#include > + > +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 > + > +#incldue > +#include > + > +SYM_ENTRY(optprobe_template_entry, SYM_L_GLOBAL, SYM_A_NONE) > +SYM_ENTRY(optprobe_template_end, SYM_L_GLOBAL, SYM_A_NONE) > -- > 2.25.1 > > > _______________________________________________ > linux-riscv mailing list > linux-riscv@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-riscv