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 60A3EC433EF for ; Mon, 31 Jan 2022 17:18:19 +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=8tb03p4Z+uqtrXJgEcRNUnyQhfWXxA4g5eGoNDoh59s=; b=fJQp/se/OlmiBd cbo7k4c59fZh3amxdiqG8rsxdItF5v4eEQsN8RGn4adBvm4hvo+/Fw4WHBzaMRyeDnIzpXjw9ykNs VrYTFh22louUb4dPRFIr03lhLwK8GrpWZGIKpuGAgdoqBxzUULjbJMjA8MUN5h7FQCz091XqeBYhB vTLScWklb5WJeeEI1JUNZ7Na4mSzndCkrnwDODrRoyhwJJDay+Dct/RKTiBYRZ4bnsfoCoO/T3imL wYzvqYChJe9kW7yYYXATsf94fngC+eX7zyZ6fJel4ztCNJ1Y3j3KmXLnk9GLlGuLYIguvBmy8gTnz 9sBn7XJDYWde8b2v84ng==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nEaI4-00A30i-6S; Mon, 31 Jan 2022 17:16:33 +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 1nEa5z-009zFV-NB for linux-arm-kernel@lists.infradead.org; Mon, 31 Jan 2022 17:04:05 +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 2B4DE60C53; Mon, 31 Jan 2022 17:04:03 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 485F5C340F0; Mon, 31 Jan 2022 17:04:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1643648642; bh=S92vjQASIbm03/4J9WJj/LmLrpxHAozfPyknG+D7Ak4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mMngvpF5lsXmiEaEz7Oulvauz47Po7AeonDPOrilt2FExSRJqZV3Vw3Mg9bUd1Z1w +O0m2jjP2RO67S0nrwu9ZzNUMTEEPo6Ah/DuWxvTtQZZgDowPTMICR8BJ337Upwwq1 bjG4pUCr+Zd1ncl03h3lwOovLmFgHGi9nPCKAdRtAIUOlQ0yEtyp5PlbeNSzV+AHVK JdHSlxvF+Vi5x8mBKpn/PA/8pVjUYwNe4MFYqh1IEqTLxgWx8zpU8UkgU7OK8+mgs7 S/NdPQPVqRFm2t4/NTmCJtSjk/YVPiAhXIcQg1/RshM+L4B3xrlW5LdX/NalaCtdYD sToTLI/0jgW4w== 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 v2 03/12] ARM: ftrace: use trampolines to keep .init.text in branching range Date: Mon, 31 Jan 2022 18:03:38 +0100 Message-Id: <20220131170347.381551-4-ardb@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220131170347.381551-1-ardb@kernel.org> References: <20220131170347.381551-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2972; h=from:subject; bh=S92vjQASIbm03/4J9WJj/LmLrpxHAozfPyknG+D7Ak4=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBh+BZhVer5e/7I1GqLdxW8lRXe2lengezafIAk/pS5 vsV+KmmJAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYfgWYQAKCRDDTyI5ktmPJDLAC/ 4sW29V8SXNycm1WJicj8zPGvpoyy9iMg5fV6xBC01RYZhS+m4RyUkfGyIgKiI63JpYKuc0ZPr18ijs J+RD5RsngiW5N58yQxfvTD+begAaJrZPT3/JcZIDBXp/ru/GTaxw1UD8Qjib4VlTwfMnyZd3d++R8w jek6fd1+r7irGiYm2GdMGb4L7VAYGLq11+qnA/KnQmvFl4hUU2R2O+IW30Nwaiz/F8uhWI91lbUCJP DG5dpqFNZXgZZ9GvSJsip+hh2nMPKbeO4SiRvTT5Boy82LhvrldB/NDnnMfuyQj5mqvHT1pF9muhqA YhBn9m72GmXUAVTVxBBQOx5VAzSoO0/HhsnaOpzOvy7tvxkNCuz6R145FZXV1L503G2s50A/ivfx36 OWfNKWh/jbclFpc+limYtMo7lxmAd2FtyweoFwVxBEEH+GWa0QdXqLOFLoyTUL1UW6PdRgJrLRDRqv SaTDE7ee6MJgmuPKrSbKOO8yfrcB1dCSvv3S7ywliv2Ww= 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-20220131_090403_886396_61911298 X-CRM114-Status: GOOD ( 18.41 ) 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 --- 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 db72d3a6522d..cb9eb8a463c5 100644 --- a/arch/arm/kernel/ftrace.c +++ b/arch/arm/kernel/ftrace.c @@ -51,9 +51,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) @@ -189,7 +200,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