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 85462C433EF for ; Thu, 3 Feb 2022 08:24:23 +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=48OH1xPZmYH9iCD/b0rRQxYrYuasyh02QtJiXcRDNNI=; b=Xr23BZC3dKpebc PfkFkUCx1CNKILpUX07bNEJ8KauS61o3JrvfDZXvBuWX8d+uCzTD+yrEmvBYsVXnV9GkVfcgeos+S Z74+0MGPUhbCHsQ7RZHtXnxWV4KAtgJVgfEaatnNhYaEuugzqwCNgeWU+33uNKDBPD0dFlF2LAghr Mc3IeZf02tuzwPA/lDi3jGFHwiLvk0TwQCiZOBbViULhuYjsJhk0gT9E734gbHOcOFJcWJbsnOW59 oSVdN6OB0dIqsDgAYfUd1Zj4uCbtYJERFMnoCDH6ZYtsqBlAwHq6U+ZSLdx37ajwgDwF0PuUTiKc1 LBTfi+I+5Z5GuUbopRDw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nFXOQ-000JSg-CD; Thu, 03 Feb 2022 08:23:02 +0000 Received: from ams.source.kernel.org ([2604:1380:4601:e00::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nFXNo-000JHD-KQ for linux-arm-kernel@lists.infradead.org; Thu, 03 Feb 2022 08:22:26 +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 ams.source.kernel.org (Postfix) with ESMTPS id 23656B83359; Thu, 3 Feb 2022 08:22:23 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9143DC340ED; Thu, 3 Feb 2022 08:22:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1643876541; bh=aJI2nTvxvW2BB7Dr1TI6vsTHD3YMWzfIJ3zO19JCVt8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Iiai9cY1FSa2iqGfKhPdFIRy0nKlNVDlHPb3plgwepft3gOf1Ouhj5CT6w9P5QlpR PHUKvT5v5baioX5UsZy8YKQOyY8g4xHyqZyX6fIt+9Oh82O55cL0K9nrt8nw57//Co EyrIqB0nQ82HqHhHjkrjTSvaAMUAIlLLNnZKRaTSdguUpnnmmEu1fqLSafV0BZA175 4q87cBSrHEW7Hkmw22k1ehdxKCTg3kll/6Kg3ZoqVW5WHXLo0dSgaVGkO7/KBPdmMU UoepzkFYxHYHdjw5YUOyTynMCQwSfcnjERwAgzD0cDiuM2HKo9Kiy4zquqXOTkLqA1 pC+gVp4xEyU6w== From: Ard Biesheuvel To: linux@armlinux.org.uk Cc: linux-arm-kernel@lists.infradead.org, Ard Biesheuvel , Steven Rostedt , Sudeep Holla , Cristian Marussi , Nathan Chancellor , Nick Desaulniers , Arnd Bergmann , Linus Walleij , Masami Hiramatsu Subject: [PATCH v3 03/13] ARM: ftrace: use trampolines to keep .init.text in branching range Date: Thu, 3 Feb 2022 09:21:54 +0100 Message-Id: <20220203082204.1176734-4-ardb@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220203082204.1176734-1-ardb@kernel.org> References: <20220203082204.1176734-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3087; h=from:subject; bh=aJI2nTvxvW2BB7Dr1TI6vsTHD3YMWzfIJ3zO19JCVt8=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBh+5CYjBVQ8m1+N7c5Ic/3XSUS0f81zDN/Vrko8xJR dt1jSTyJAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYfuQmAAKCRDDTyI5ktmPJOJkDA CLr+JlRsWQIgz3t/lp2OLskGY/BWuRK6xeQO44+n2+tXO0/2O95ZDNSeU5jwsXW8Ln12RzeItyxt0f jO8jNU4U5Dr/6CRKZ+ISq7I+K7hhxsZnJTlfk65N2wR4nMQU67hpJ7ceZnPux797gAhlWy4wINpvTT HtMhuZe6E6f+tzJWTMUBraTg3qD4QpeC1YKyVOrXuXn5Z50axZaIphTu//U9fI8GaAIyrI/IW9TPEe N1sC7o+jEi9DSPzaj96f59wf7XRQ5LzAzxdp4842EpP+J64kW/di/TPFbbyJFJh2baNQg2n8/1vPp4 5PG61FQeYJygG9N1U2Uy2TQjgrFGAqS3nx/Fe2q660c7D2sfjrTkJ5WIys8+FXOYzVL5WqGmf6rvJW cffRcU3r9U1lDO3H/rbbrFX3nkK30HrCTsmFTuyhbqhB3h+f7/3KjlAEmYWxSL+RO2O10Tkkus/K/i 74n3T3CwKyHoHf3QrSMMTbeyrR78Yv0BzbnWWmzcPjX/E= 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-20220203_002225_014311_807C30C5 X-CRM114-Status: GOOD ( 18.81 ) 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 Reviewed-by: Nick Desaulniers Reviewed-by: Linus Walleij Reviewed-by: Steven Rostedt (Google) --- arch/arm/kernel/entry-ftrace.S | 16 ++++++++++++++ arch/arm/kernel/ftrace.c | 23 +++++++++++++++++--- 2 files changed, 36 insertions(+), 3 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 811cadf7eefc..74d3913f5590 100644 --- a/arch/arm/kernel/ftrace.c +++ b/arch/arm/kernel/ftrace.c @@ -62,9 +62,20 @@ static unsigned long ftrace_nop_replace(struct dyn_ftrace *rec) return NOP; } -static unsigned long adjust_address(struct dyn_ftrace *rec, unsigned long addr) +void ftrace_caller_from_init(void); +void ftrace_regs_caller_from_init(void); + +static unsigned long __ref adjust_address(struct dyn_ftrace *rec, + unsigned long addr) { - return addr; + if (!IS_ENABLED(CONFIG_DYNAMIC_FTRACE) || + system_state >= SYSTEM_FREEING_INITMEM || + 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) @@ -200,7 +211,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