From patchwork Fri Jan 27 13:05:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xim X-Patchwork-Id: 49380 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp825844wrn; Fri, 27 Jan 2023 05:13:29 -0800 (PST) X-Google-Smtp-Source: AMrXdXv9OPD2hq7GXICjr8tixdF6538wk3k3uaYDmMrogZiVeOR1le0G/ddIhHPAo0fVsYNcVHPY X-Received: by 2002:a17:906:9f07:b0:877:60d7:3181 with SMTP id fy7-20020a1709069f0700b0087760d73181mr34928587ejc.17.1674825209665; Fri, 27 Jan 2023 05:13:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674825209; cv=none; d=google.com; s=arc-20160816; b=wpAgKucUiJMEvI9Ph8GB+ZGLIILzYf9M2xPsJLzit09Oy+oLXmkxabflCwSUEOZaL/ BHg2pkiuSWg28E+EbDxKh49otNOFQlUFRqh8nw8EHpt86Sc7MOebWYhGG0SnHpMRNnQm Ngnqt4x/YWCRS/8+RT8xmC9qU9p7oBJx2tyUJ8e6jusNUaQmQK0SYJTYuptP4oT/YCID OEv1wUd5B5sbwugxRWKz7crOPBup6CPEK2vNGIXN1ho8eKQJycuRhFsUj7h9ci3KR1dA xUOB/I6DtWIq7nRP3ckK+UZGX+A0JJn+vwGNIuuC8LO+H4SHfNto6J8BBSZTPQTh/6to RV5g== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=m0bWMOxb3QBuF7pulRUyjksg1qiYGEZKNI2YN9WGi2k=; b=0/HarRvfV1pWKQJEs9WBigfQXThkeI7sePhIgeZkTvLDUNF6MfVPOXZbiXaXi4HC8k 4e4yM2fscuQhUGm09YgUXdGnK4Vwoe2jlqFswSuPcrXf25dqPWixl2dNmHnl5hjOepkC /4Blgj16tJCm0MLc5FIAGm3gPW+tJYzMpyj3odVk1Wc92bSxxbKgDBHyoFylNPOdBcol xaYxY26dPAZFD8O59hMsKeICziHe223fRcWUpQWOPfiEwKDd6m1bxtSvmYMd/wCjXXPb lSoe42B84hCBILEVqIrbU3jneUDn4cpO/KhHTKFAq2UBAqkSOJf6tCa3ThzOEfOcA5P1 JEwQ== 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 Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id s26-20020a170906221a00b007c173f77500si5237947ejs.427.2023.01.27.05.13.05; Fri, 27 Jan 2023 05:13:29 -0800 (PST) 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 S232456AbjA0NGm (ORCPT + 99 others); Fri, 27 Jan 2023 08:06:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47620 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230458AbjA0NGb (ORCPT ); Fri, 27 Jan 2023 08:06:31 -0500 Received: from cstnet.cn (smtp80.cstnet.cn [159.226.251.80]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id A874B7D6C5 for ; Fri, 27 Jan 2023 05:06:28 -0800 (PST) Received: from cgk-Precision-3650-Tower.. (unknown [219.141.235.82]) by APP-01 (Coremail) with SMTP id qwCowADX3Eg9zNNjDyF3Ag--.52827S6; Fri, 27 Jan 2023 21:06:08 +0800 (CST) From: Chen Guokai To: paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, rostedt@goodmis.org, mingo@redhat.com, sfr@canb.auug.org.au Cc: linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, liaochang1@huawei.com, Chen Guokai Subject: [PATCH v6 02/13] riscv/kprobe: Allocate detour buffer from module region Date: Fri, 27 Jan 2023 21:05:30 +0800 Message-Id: <20230127130541.1250865-3-chenguokai17@mails.ucas.ac.cn> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230127130541.1250865-1-chenguokai17@mails.ucas.ac.cn> References: <20230127130541.1250865-1-chenguokai17@mails.ucas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: qwCowADX3Eg9zNNjDyF3Ag--.52827S6 X-Coremail-Antispam: 1UD129KBjvJXoW7ur1kJFWrtw13AFyfAFWrKrg_yoW8uFyxpF 4DCr45XrZ8Aw13GrWayw1v9r9YqFykJr47KrW2vr10vw43tr47Aw4v934Fqr95JrWj9Fy5 Wr4q9ryYkFWUA3DanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUQj14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jryl82xGYIkIc2 x26xkF7I0E14v26r4j6ryUM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_JFI_Gr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1l84 ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVCY1x0267AKxVW8Jr0_Cr1U M2vYz4IE04k24VAvwVAKI4IrM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64 kE6c02F40Ex7xfMcIj6xIIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm 72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYx C7M4IIrI8v6xkF7I0E8cxan2IY04v7MxkIecxEwVAFwVW5GwCF04k20xvY0x0EwIxGrwCF x2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14 v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY 67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2 IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_ Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0pREtCwUUUUU= X-Originating-IP: [219.141.235.82] X-CM-SenderInfo: xfkh0w5xrntxyrx6ztxlovh3xfdvhtffof0/1tbiCgUEE2PTtMIZwAABsG X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_MSPIKE_H2, SPF_HELO_PASS,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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1756181518946929876?= X-GMAIL-MSGID: =?utf-8?q?1756181518946929876?= From: Liao Chang To address the limitation of PC-relative branch instruction on riscv architecture, detour buffer slot used for optprobes has to be allocated at virtual address that can access from kernel and modules text via AUIPC/JALR. For the time being, the vmalloc region is far from kernel/modules text, the distance between them is half of kernel address space [1], which can't transfer control to 32-bit pc-relative address, hence it needs to override the alloc_optinsn_page() to allocate detour buffer from module region. [1] Documentation/riscv/vm-layout.rst Signed-off-by: Liao Chang Co-developed-by: Chen Guokai Signed-off-by: Chen Guokai --- arch/riscv/kernel/probes/kprobes.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/arch/riscv/kernel/probes/kprobes.c b/arch/riscv/kernel/probes/kprobes.c index f21592d20306..e1856b04db04 100644 --- a/arch/riscv/kernel/probes/kprobes.c +++ b/arch/riscv/kernel/probes/kprobes.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -84,6 +85,29 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) } #ifdef CONFIG_MMU +#if defined(CONFIG_OPTPROBES) && defined(CONFIG_64BIT) +void *alloc_optinsn_page(void) +{ + void *page; + + page = __vmalloc_node_range(PAGE_SIZE, 1, MODULES_VADDR, + MODULES_END, GFP_KERNEL, + PAGE_KERNEL, 0, NUMA_NO_NODE, + __builtin_return_address(0)); + if (!page) + return NULL; + + set_vm_flush_reset_perms(page); + /* + * First make the page read-only, and only then make it executable to + * prevent it from being W+X in between. + */ + set_memory_rox((unsigned long)page, 1); + + return page; +} +#endif + void *alloc_insn_page(void) { return __vmalloc_node_range(PAGE_SIZE, 1, VMALLOC_START, VMALLOC_END,