From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A379DC433EF for ; Tue, 25 Jan 2022 15:48:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=EJPvUy8MW18wJDgRott9nFD1mKN4nKc6l9waRW4aHr4=; b=aUWmuyZwLmT6dB vuWGk4G+dCZXZZMzTbJx5FF8TIwa+MyHliVj/EJzxR/Wh+s4YKKyRx/HoIdHAcdD6DGWz8qvw4E+0 4t7iCCAvN8vOcy748JsP8hbuFKYQkOAjJ39F5fH28ptnfuYus7JK1k8xUej0YZn6FbPVPOn/Nddeq o5MoiVTtxPhBwV+fTtGOWFyuQ8rnw/AXnnWTrMtoOErfjf8QtKbczjXBAV2uxCUASi/WlOsigKYPz SEtrV8BVLMe9KuPOqbUzqFT6YYx1kH7NKtNWapp1nlZto/EKz0Lb0Psfcd5ZTsRTC2JaaP39OLpaL 8u+o5TYMmn3FfRdKsK3w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nCO2E-008SLU-Uy; Tue, 25 Jan 2022 15:47:08 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nCNsl-008Q6I-Ej for linux-arm-kernel@lists.infradead.org; Tue, 25 Jan 2022 15:37:21 +0000 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 02937616EE; Tue, 25 Jan 2022 15:37:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7075AC340EC; Tue, 25 Jan 2022 15:37:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1643125038; bh=oE4EogkbvH4JHmDSMuHNYrQKpOrjuBfdYLtkICGz69o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dz8WxKq4OzHj6nuuIe8phhS++xI7Yz7YCXl4m4m/kXL6ocCYzbVrzaWBe8+wD74KA mipKpmf2x6EJk34GzJYxuXVTdfM0Gs0jkvGlB7wVHPfMq0Jkbyr6ufCrx9oMFQz3Xn OLvj87LPehXxDYjnlA+Ra8LmZPGZANBh59Gv3akJSjhewvujRFgR154MVG7ULRoTEs eVbmAr7gANjYyFysXnL8+ayC4L4s8TBrHZfg4LdgsQFM08sOt5qlH+UHuIbmCu6p1E vk7tvw2bIKuaZgcD7It/vbJI/LzEc4WLcQhPxmpCbu3ANL+B+hmQ2hql07IlE0vzAy NmM0GoW9aFJtg== From: Ard Biesheuvel To: linux@armlinux.org.uk, linux-arm-kernel@lists.infradead.org Cc: Ard Biesheuvel , Arnd Bergmann , Linus Walleij , Nick Desaulniers Subject: [PATCH 3/8] ARM: ftrace: use trampolines to keep .init.text in branching range Date: Tue, 25 Jan 2022 16:36:51 +0100 Message-Id: <20220125153656.1802079-4-ardb@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220125153656.1802079-1-ardb@kernel.org> References: <20220125153656.1802079-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2770; h=from:subject; bh=oE4EogkbvH4JHmDSMuHNYrQKpOrjuBfdYLtkICGz69o=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBh8BkO67rLCE+yiHm/7TzNj2QO+B+5dpsn8ClM04Pz STRV/7iJAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYfAZDgAKCRDDTyI5ktmPJMcXC/ 9nM8yBJ26ZBJRvTggyOAJi9zDm3QeMXMpn7Zws8DLOL1twvJ5aFsH2OdA8TyncRrwpa4yf1fMNvWIv 3j4cMXkazL+ZbVpEFR/GdhVk8mcgJsafTqx/4YoSz+VotbM/rFEXFPc7YH2B1R34PSlYt78wVZHRdM pCZI9clZy5Ik9bEnGlj9Qodue/vGhZeQ5ivG8ZejEk9M5OrKkyB0XNUwyTAvSPkjx6//+eCZ6HmHxR TxjuXXNxEH1U29GzlZ5taoFODA5MHH0ezXyFU2oRN1AfAAsPo5KYgZlGFrYZ46Bw7m3YESuMtTr7CQ h9uEMWGvoBxn14x29dbEzJA0YYKq+h7PNXX0tkDm9qzyMM/MB/jmPRo26pUFZa4DSQ6EDTJJ09yQ9a xQLxSWbfrNpjHWR+JavRd06fbGCQEctn+QgHUFlxfGG2/Ro8AJ67KPc+KdshcBCxHLKFoFm5Boy2mH pD3yjty2hZYFchlM2g2P8LGKO1Yw0yXY05YNMANd8cVu0= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220125_073719_643360_035E8679 X-CRM114-Status: GOOD ( 18.06 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Kernel images that are large in comparison to the range of a direct branch may fail to work as expected with ftrace, as patching a direct branch to one of the core ftrace routines may not be possible from the .init.text section, if it is emitted too far away from the normal .text section. This is more likely to affect Thumb2 builds, given that its range is only -/+ 16 MiB (as opposed to ARM which has -/+ 32 MiB), but may occur in either ISA. To work around this, add a couple of trampolines to .init.text and swap these in when the ftrace patching code is operating on callers in .init.text. Signed-off-by: Ard Biesheuvel --- arch/arm/kernel/entry-ftrace.S | 16 ++++++++++++++++ arch/arm/kernel/ftrace.c | 19 +++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/arch/arm/kernel/entry-ftrace.S b/arch/arm/kernel/entry-ftrace.S index dca12a09322a..237d435e29aa 100644 --- a/arch/arm/kernel/entry-ftrace.S +++ b/arch/arm/kernel/entry-ftrace.S @@ -270,3 +270,19 @@ ENTRY(ftrace_stub) .Lftrace_stub: ret lr ENDPROC(ftrace_stub) + +#ifdef CONFIG_DYNAMIC_FTRACE + + __INIT + + .macro init_tramp, dst:req +ENTRY(\dst\()_from_init) + ldr pc, =\dst +ENDPROC(\dst\()_from_init) + .endm + + init_tramp ftrace_caller +#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS + init_tramp ftrace_regs_caller +#endif +#endif diff --git a/arch/arm/kernel/ftrace.c b/arch/arm/kernel/ftrace.c index db72d3a6522d..d2326794fd09 100644 --- a/arch/arm/kernel/ftrace.c +++ b/arch/arm/kernel/ftrace.c @@ -51,9 +51,18 @@ static unsigned long ftrace_nop_replace(struct dyn_ftrace *rec) return NOP; } +void ftrace_caller_from_init(void); +void ftrace_regs_caller_from_init(void); + static unsigned long adjust_address(struct dyn_ftrace *rec, unsigned long addr) { - return addr; + if (!IS_ENABLED(CONFIG_DYNAMIC_FTRACE) || + likely(!is_kernel_inittext(rec->ip))) + return addr; + if (!IS_ENABLED(CONFIG_DYNAMIC_FTRACE_WITH_REGS) || + addr == (unsigned long)&ftrace_caller) + return (unsigned long)&ftrace_caller_from_init; + return (unsigned long)&ftrace_regs_caller_from_init; } int ftrace_arch_code_modify_prepare(void) @@ -189,7 +198,13 @@ int ftrace_make_nop(struct module *mod, #endif new = ftrace_nop_replace(rec); - ret = ftrace_modify_code(ip, old, new, true); + /* + * Locations in .init.text may call __gnu_mcount_mc via a linker + * emitted veneer if they are too far away from its implementation, and + * so validation may fail spuriously in such cases. Let's work around + * this by omitting those from validation. + */ + ret = ftrace_modify_code(ip, old, new, !is_kernel_inittext(ip)); return ret; } -- 2.30.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel