Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp3775110rwb; Tue, 20 Sep 2022 04:42:58 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7DyxzHwXD8hc+pk8J0P7w5j/BtsMyJpUJJf7k4HH8iqFh06aQgqZ6/j+FHkRGtVvpQKtxz X-Received: by 2002:a17:906:fe49:b0:73d:70c5:1a52 with SMTP id wz9-20020a170906fe4900b0073d70c51a52mr16954954ejb.469.1663674178026; Tue, 20 Sep 2022 04:42:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1663674178; cv=none; d=google.com; s=arc-20160816; b=jmblNi+wxmoPq+RYEF0YsJarPhJmrSOw2s77T19sykFT7u9FTIDBx6QJZ6ZHL3YT9D 5IfxSkV3wzslWgRB8pjPd59qqVNBs8OFFANjsyTAbs2iS5vOycSAksuSMH+x3J64/eWt Gvr+Exa1tF44slMssnNHZa1Qf1Kk495NGt/Ovz9n1ncr2jPTnBpTWSAI++vV/H1jrdyM OdI+Fzz+KWPvfgfb2zsYQQ7YUOC2pUSHsUu9bpMw3tzzoHorBQ3XLV5ZUsF2UR49m5z0 oEpo86rNMoicyfNAHA25fLvboEAp3JcTW6Xl39QNBH5YtXiWHuqNwR51I3UpznoY6qyt 8IlA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=ctQ4+/Y+w0kSeLLUnexmuLP3+Y1jUA5SlAJbI6NxF6U=; b=0fMVY7VsrZ5TKxznTr1uKG6M4hTCvi2w0jVdwK3izhEjLMFHwp3Aabf7mM+D4wUOO4 qvLZkUMvwQfnz+ei+fPb25Tn/RtfcUHCwTTO4Gcy/sIpuw0/WhBTZ6je1Nzv3BF11f0x wXvVi06GIZXz1OEuQeQ6ieN7kTLnuAgzvE5xtwLAkPByg2cvRyu/OTsdrUNH5zbffX+x CLwpPZvMhbpq8FmF/nM6+jJGHyeiag2LqF4aSy101B3A0UdabXNyugOjhwkZLkBFAETu UZFe+J6yx/+Xs73uZeoV/yiaYrv8R/gfjB1X1nnYySJqi/OVyV1AXnEXmv3o9GV5uWtF jEUA== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id qw18-20020a1709066a1200b00781c1645926si1142327ejc.524.2022.09.20.04.42.32; Tue, 20 Sep 2022 04:42:58 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229766AbiITLfF convert rfc822-to-8bit (ORCPT + 99 others); Tue, 20 Sep 2022 07:35:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54558 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229609AbiITLfD (ORCPT ); Tue, 20 Sep 2022 07:35:03 -0400 X-Greylist: delayed 6776 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Tue, 20 Sep 2022 04:35:01 PDT Received: from h3cspam01-ex.h3c.com (smtp.h3c.com [221.12.31.13]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1C26965251 for ; Tue, 20 Sep 2022 04:35:00 -0700 (PDT) Received: from h3cspam01-ex.h3c.com (localhost [127.0.0.2] (may be forged)) by h3cspam01-ex.h3c.com with ESMTP id 28K9g1OR099096 for ; Tue, 20 Sep 2022 17:42:01 +0800 (GMT-8) (envelope-from wang.binglei@h3c.com) Received: from mail.maildlp.com ([172.25.15.155]) by h3cspam01-ex.h3c.com with ESMTP id 28K9dsDj085705; Tue, 20 Sep 2022 17:39:54 +0800 (GMT-8) (envelope-from wang.binglei@h3c.com) Received: from DAG2EX10-IDC.srv.huawei-3com.com (unknown [172.20.54.133]) by mail.maildlp.com (Postfix) with ESMTP id ED25722BE810; Tue, 20 Sep 2022 17:40:56 +0800 (CST) Received: from localhost.localdomain (10.99.222.162) by DAG2EX10-IDC.srv.huawei-3com.com (172.20.54.133) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.17; Tue, 20 Sep 2022 17:39:55 +0800 From: Binglei Wang To: CC: , , , , , "wang.binglei" Subject: [PATCH] rethook: add riscv rethook implementation. Date: Tue, 20 Sep 2022 17:36:30 +0800 Message-ID: <20220920093630.32085-1-wang.binglei@h3c.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.99.222.162] X-ClientProxiedBy: BJSMTP01-EX.srv.huawei-3com.com (10.63.20.132) To DAG2EX10-IDC.srv.huawei-3com.com (172.20.54.133) Content-Transfer-Encoding: 8BIT X-DNSRBL: X-MAIL: h3cspam01-ex.h3c.com 28K9g1OR099096 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,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 From: "wang.binglei" Most of the code copied from arch/riscv/kernel/probes/kprobes_trampoline.S Signed-off-by: wang.binglei --- arch/riscv/Kconfig | 1 + arch/riscv/kernel/probes/Makefile | 1 + arch/riscv/kernel/probes/kprobes.c | 7 ++ arch/riscv/kernel/probes/rethook.c | 24 +++++ arch/riscv/kernel/probes/rethook_trampoline.S | 94 +++++++++++++++++++ 5 files changed, 127 insertions(+) create mode 100644 arch/riscv/kernel/probes/rethook.c create mode 100644 arch/riscv/kernel/probes/rethook_trampoline.S diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index ed66c31e4..c5cae0825 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -97,6 +97,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_RETHOOK if !XIP_KERNEL select HAVE_MOVE_PMD select HAVE_MOVE_PUD select HAVE_PCI diff --git a/arch/riscv/kernel/probes/Makefile b/arch/riscv/kernel/probes/Makefile index 7f0840dcc..ee345e7e9 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_RETHOOK) += rethook.o rethook_trampoline.o CFLAGS_REMOVE_simulate-insn.o = $(CC_FLAGS_FTRACE) diff --git a/arch/riscv/kernel/probes/kprobes.c b/arch/riscv/kernel/probes/kprobes.c index e6e950b7c..2c1847921 100644 --- a/arch/riscv/kernel/probes/kprobes.c +++ b/arch/riscv/kernel/probes/kprobes.c @@ -345,6 +345,7 @@ int __init arch_populate_kprobe_blacklist(void) return ret; } +#ifndef CONFIG_KRETPROBE_ON_RETHOOK void __kprobes __used *trampoline_probe_handler(struct pt_regs *regs) { return (void *)kretprobe_trampoline_handler(regs, NULL); @@ -357,6 +358,12 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri, ri->fp = NULL; regs->ra = (unsigned long) &__kretprobe_trampoline; } +#else +void __kprobes *trampoline_probe_handler(struct pt_regs *regs) +{ + return NULL; +} +#endif int __kprobes arch_trampoline_kprobe(struct kprobe *p) { diff --git a/arch/riscv/kernel/probes/rethook.c b/arch/riscv/kernel/probes/rethook.c new file mode 100644 index 000000000..47853bc36 --- /dev/null +++ b/arch/riscv/kernel/probes/rethook.c @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Generic return hook for riscv. + */ + +#include +#include + +/* This is called from arch_rethook_trampoline() */ +unsigned long __used arch_rethook_trampoline_callback(struct pt_regs *regs) +{ + return rethook_trampoline_handler(regs, regs->s0); +} +NOKPROBE_SYMBOL(arch_rethook_trampoline_callback); + +void arch_rethook_prepare(struct rethook_node *rhn, struct pt_regs *regs, bool mcount) +{ + rhn->ret_addr = regs->ra; + rhn->frame = regs->s0; + + /* replace return addr with trampoline */ + regs->ra = (u64)arch_rethook_trampoline; +} +NOKPROBE_SYMBOL(arch_rethook_prepare); diff --git a/arch/riscv/kernel/probes/rethook_trampoline.S b/arch/riscv/kernel/probes/rethook_trampoline.S new file mode 100644 index 000000000..aa79630ac --- /dev/null +++ b/arch/riscv/kernel/probes/rethook_trampoline.S @@ -0,0 +1,94 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * rethook trampoline. + * Copied from arch/riscv/kernel/probes/kprobes_trampoline.S + */ +#include + +#include +#include + + .text + .altmacro + + .macro save_all_base_regs + REG_S x1, PT_RA(sp) + REG_S x3, PT_GP(sp) + REG_S x4, PT_TP(sp) + REG_S x5, PT_T0(sp) + REG_S x6, PT_T1(sp) + REG_S x7, PT_T2(sp) + REG_S x8, PT_S0(sp) + REG_S x9, PT_S1(sp) + REG_S x10, PT_A0(sp) + REG_S x11, PT_A1(sp) + REG_S x12, PT_A2(sp) + REG_S x13, PT_A3(sp) + REG_S x14, PT_A4(sp) + REG_S x15, PT_A5(sp) + REG_S x16, PT_A6(sp) + REG_S x17, PT_A7(sp) + REG_S x18, PT_S2(sp) + REG_S x19, PT_S3(sp) + REG_S x20, PT_S4(sp) + REG_S x21, PT_S5(sp) + REG_S x22, PT_S6(sp) + REG_S x23, PT_S7(sp) + REG_S x24, PT_S8(sp) + REG_S x25, PT_S9(sp) + REG_S x26, PT_S10(sp) + REG_S x27, PT_S11(sp) + REG_S x28, PT_T3(sp) + REG_S x29, PT_T4(sp) + REG_S x30, PT_T5(sp) + REG_S x31, PT_T6(sp) + .endm + + .macro restore_all_base_regs + REG_L x3, PT_GP(sp) + REG_L x4, PT_TP(sp) + REG_L x5, PT_T0(sp) + REG_L x6, PT_T1(sp) + REG_L x7, PT_T2(sp) + REG_L x8, PT_S0(sp) + REG_L x9, PT_S1(sp) + REG_L x10, PT_A0(sp) + REG_L x11, PT_A1(sp) + REG_L x12, PT_A2(sp) + REG_L x13, PT_A3(sp) + REG_L x14, PT_A4(sp) + REG_L x15, PT_A5(sp) + REG_L x16, PT_A6(sp) + REG_L x17, PT_A7(sp) + REG_L x18, PT_S2(sp) + REG_L x19, PT_S3(sp) + REG_L x20, PT_S4(sp) + REG_L x21, PT_S5(sp) + REG_L x22, PT_S6(sp) + REG_L x23, PT_S7(sp) + REG_L x24, PT_S8(sp) + REG_L x25, PT_S9(sp) + REG_L x26, PT_S10(sp) + REG_L x27, PT_S11(sp) + REG_L x28, PT_T3(sp) + REG_L x29, PT_T4(sp) + REG_L x30, PT_T5(sp) + REG_L x31, PT_T6(sp) + .endm + +ENTRY(arch_rethook_trampoline) + addi sp, sp, -(PT_SIZE_ON_STACK) + save_all_base_regs + + move a0, sp /* pt_regs */ + + call arch_rethook_trampoline_callback + + /* use the result as the return-address */ + move ra, a0 + + restore_all_base_regs + addi sp, sp, PT_SIZE_ON_STACK + + ret +ENDPROC(arch_rethook_trampoline) -- 2.17.1 ------------------------------------------------------------------------------------------------------------------------------------- ???ʼ????丽???????»??????ŵı?????Ϣ???????ڷ??͸???????ַ???г? ?ĸ??˻?Ⱥ?顣??ֹ?κ??????????κ???ʽʹ?ã?????????????ȫ???????ֵ?й¶?????ơ? ??ɢ???????ʼ??е???Ϣ?????????????˱??ʼ????????????绰???ʼ?֪ͨ?????˲?ɾ???? ?ʼ??? This e-mail and its attachments contain confidential information from New H3C, which is intended only for the person or entity whose address is listed above. Any use of the information contained herein in any way (including, but not limited to, total or partial disclosure, reproduction, or dissemination) by persons other than the intended recipient(s) is prohibited. If you receive this e-mail in error, please notify the sender by phone or email immediately and delete it!