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 49E6BC433FE for ; Thu, 3 Feb 2022 08:26:26 +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=nMDT8p4aAKiBgOcWrWNUctO3ddpDFgSY0R65LM1IGgE=; b=4O7R1DhG8Fhtxk r9xXD0Z4sg1/Onm0cUpwxHfmE/BuA1mw21mI2KpJP+mZBpCnao0Tpgsg1mMM9ujMApXsUcXaXO92r UJub8HSm0A84BbAXuoUgvetbjBErj7fr2UcN67zdjoDjMA+Na3MXVoEy2gqC5zAzxYYLwtMFlYVDT +kVVK1+bi0STo9BtmmPAAN1av87wWiVEEncwi8JimAn/u9fafsNxRiAGH0BWse0ygypbfwxltXmsa umJhMoUYrosfOWAtheUsxl5X6p7C93SBIdJmHrDJEQ9BBhuL0QHOM9RFHU2RfSdkHJM+Cc2Alj79I wjUvKO95vhrSTxn80v8g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nFXQB-000KKJ-3E; Thu, 03 Feb 2022 08:24:51 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nFXNx-000JKU-Qo for linux-arm-kernel@lists.infradead.org; Thu, 03 Feb 2022 08:22:35 +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 67AA661841; Thu, 3 Feb 2022 08:22:33 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8505BC340EF; Thu, 3 Feb 2022 08:22:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1643876552; bh=jc7I3Z+IG06CAL+tjTQKf67tnYV2+jk9Yn8fdREYNmw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=noOfea5CyC+V/foIiTU0hdv/IaGcss8TcrQX7TEfLTmmV3EvPfoHL0h/fPAO4PBS+ 5W8DsrWBB+I52r//6P/iL9hlzrWKeHbVgFgl3BBCWiJJfT8oUE6iCr6KLBQrZb1VPB QtD8n0AGyWTZq8HDQXFsQpPl7DdZN8PmzUsHnztJ5gaSyrS4vSDF3NcX7ZaDIebUXq hKSGfiJVGTdMh/dCDitVzG8bfzvkoOwo7U7f1BpfXC3Y3aTe8lfsBBV3XWKzvbxVdV PqTUqHAhyGPdZ2ekVf42Yh1CujRCFSVdKMw7/0gRG3PNCskwUqyNY7/X2sEG+BiFTh eZHOkxMc9bb4A== 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 07/13] ARM: unwind: track location of LR value in stack frame Date: Thu, 3 Feb 2022 09:21:58 +0100 Message-Id: <20220203082204.1176734-8-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=3473; h=from:subject; bh=jc7I3Z+IG06CAL+tjTQKf67tnYV2+jk9Yn8fdREYNmw=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBh+5CfN6G+ODk7ZMot5aDcwguopnHKEW5droQBE2eN icesTASJAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYfuQnwAKCRDDTyI5ktmPJBzUC/ 9Vae58WunqihTTCSuTUMaKeYWsWeFuL1e8L5JuW9bPwMf61F4XGfziLjkydYOdSY4oWxca0vLsuVNy AuD3nc0+9dxBq8CzhROpew9AY79akHYf90GGYA6TGdPJqno7ZyRHhBt55/DCH2mj8Lcv3ucIlsSPiM XgoYfKoAcV9Xcb51pLjkNrv76U7Dzcf5LiIMhiVEoCzjLj40hQYY7ZGQNoqFEYuq80bs73kHnUjeXX 7+vPDZN8A+kn3cJvL812EM9JGAHkY1C3NpsvO/10HRTKRk5ZgAwwRrOudg0ql3xr3bYetCsSatUzjC TmSRg0OIbDx/sU8eaxQBAzioO6uj0FzMhTq1C2NXnF9fmfMUI9dFn+OsJVoTjuEN5yRHrBAkwK/t2C HSyujKzBuXFUPbozhQ9vNZ8YYLogWIX4DPkLzhRKRbNtgl1ODXZazEZhgnf7oVdC8jw2XiQNmZSVAs OzuxJm7fXFytpXtQRYkSOeo3pMxvidLY/vE1K14Z8o3r0= 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_002234_001760_A6496FD4 X-CRM114-Status: GOOD ( 22.82 ) 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 The ftrace graph tracer needs to override the return address of an instrumented function, in order to install a hook that gets invoked when the function returns again. Currently, we only support this when building for ARM using GCC with frame pointers, as in this case, it is guaranteed that the function will reload LR from [FP, #-4] in all cases, and we can simply pass that address to the ftrace code. In order to support this for configurations that rely on the EABI unwinder, such as Thumb2 builds, make the unwinder keep track of the address from which LR was unwound, permitting ftrace to make use of this in a subsequent patch. Drop the call to is_kernel_text_address(), which is problematic in terms of ftrace recursion, given that it may be instrumented itself. The call is redundant anyway, as no unwind directives will be found unless the PC points to memory that is known to contain executable code. Signed-off-by: Ard Biesheuvel --- arch/arm/include/asm/stacktrace.h | 3 +++ arch/arm/kernel/Makefile | 1 + arch/arm/kernel/unwind.c | 7 ++++--- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/arch/arm/include/asm/stacktrace.h b/arch/arm/include/asm/stacktrace.h index d87d60532b86..e56503fd9447 100644 --- a/arch/arm/include/asm/stacktrace.h +++ b/arch/arm/include/asm/stacktrace.h @@ -14,6 +14,9 @@ struct stackframe { unsigned long sp; unsigned long lr; unsigned long pc; + + /* address of the LR value on the stack */ + unsigned long *lr_addr; #ifdef CONFIG_KRETPROBES struct llist_node *kr_cur; struct task_struct *tsk; diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index ae295a3bcfef..56511856ff9d 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -10,6 +10,7 @@ ifdef CONFIG_FUNCTION_TRACER CFLAGS_REMOVE_ftrace.o = -pg CFLAGS_REMOVE_insn.o = -pg CFLAGS_REMOVE_patch.o = -pg +CFLAGS_REMOVE_unwind.o = -pg endif CFLAGS_REMOVE_return_address.o = -pg diff --git a/arch/arm/kernel/unwind.c b/arch/arm/kernel/unwind.c index c5ea328c428d..b4e468a7674b 100644 --- a/arch/arm/kernel/unwind.c +++ b/arch/arm/kernel/unwind.c @@ -55,6 +55,7 @@ struct unwind_ctrl_block { const unsigned long *insn; /* pointer to the current instructions word */ unsigned long sp_low; /* lowest value of sp allowed */ unsigned long sp_high; /* highest value of sp allowed */ + unsigned long *lr_addr; /* address of LR value on the stack */ /* * 1 : check for stack overflow for each register pop. * 0 : save overhead if there is plenty of stack remaining. @@ -239,6 +240,8 @@ static int unwind_pop_register(struct unwind_ctrl_block *ctrl, * from being tracked by KASAN. */ ctrl->vrs[reg] = READ_ONCE_NOCHECK(*(*vsp)); + if (reg == 14) + ctrl->lr_addr = *vsp; (*vsp)++; return URC_OK; } @@ -395,9 +398,6 @@ int unwind_frame(struct stackframe *frame) pr_debug("%s(pc = %08lx lr = %08lx sp = %08lx)\n", __func__, frame->pc, frame->lr, frame->sp); - if (!kernel_text_address(frame->pc)) - return -URC_FAILURE; - idx = unwind_find_idx(frame->pc); if (!idx) { pr_warn("unwind: Index not found %08lx\n", frame->pc); @@ -476,6 +476,7 @@ int unwind_frame(struct stackframe *frame) frame->lr = ctrl.vrs[LR]; frame->pc = ctrl.vrs[PC]; frame->sp_low = ctrl.sp_low; + frame->lr_addr = ctrl.lr_addr; return URC_OK; } -- 2.30.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel