Received: by 2002:a05:6358:45e:b0:b5:b6eb:e1f9 with SMTP id 30csp3077178rwe; Mon, 29 Aug 2022 05:34:04 -0700 (PDT) X-Google-Smtp-Source: AA6agR6nxKuqBWAS7GZgPRmWXxXBZS1Fy6UcbCOvkvrFfsnYOPkT0hWTjdJTGrhP8+Hbys94Z4r+ X-Received: by 2002:a05:6a00:2906:b0:52a:bc7f:f801 with SMTP id cg6-20020a056a00290600b0052abc7ff801mr16733018pfb.49.1661776444707; Mon, 29 Aug 2022 05:34:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1661776444; cv=none; d=google.com; s=arc-20160816; b=WjaU/0J03UnxY+BTQk+8gPCDHg7UmvZXc+BB8F8I6RWp5VTWrDtc0h29OfwIm0wiP1 mbVcOax+5hKqJWNFLlb/z7RQRAxmXQi1oIC/syxTW/onurdzdbb+j1cQPDSf6TuC6XK4 uNeulEzcmZwc6Sv/c8kZi0TIpeapRHACOk9ErGzqJ0AU78GXmhuvW7x6pPgx1GXYcjn0 bMB17tx26yeg6yEt//0/7A9NBc1i6fd56bKSfQyft77lyHtqAVHPTjyDw8T/kCcBR7xx yZTgEu67lzIUehRTUUy8ki7HcQi1ldLpfCMFXsYgM6pqAE0tA30pEDYbMfdrx52u+fdm Mr5g== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=1admor3wtQ66liGKPsqBzAze1TbRtQFp0aZxGAXyHv8=; b=ecU4/HIuDP6VRunflWVJh/oic8RrK58C1CAVyxR7l5gLk41tkFlOLULc4spcYrx8nt RHZXO7mQKM1a0zn4LVCxadYJaJhtpa0ce3Pz8Fr/RTIe65YYP7B1Aiokr6UtAWsJZ6+A ajXYxmio5tcYdhuUFUybiICGc6e+D/5nnfqpdw1BR2XZOJmmvvA0w17mJvWdCik9QJpb YjaSEjdfLrfRd3lhEEYFg07GdpicI10pOMqsuHCB56pWn480LeCifdG04P3P5D+K7tfe 7KxCNcaOy3lAPMfRG8F+g5ddPu25jCY3i2dEzkw1/Got8cl2usOX/R7ZX1F5MVwtSios gNSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=yQsWaH4r; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id rj8-20020a17090b3e8800b001f538744941si10086881pjb.34.2022.08.29.05.33.53; Mon, 29 Aug 2022 05:34:04 -0700 (PDT) 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; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=yQsWaH4r; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229995AbiH2LQX (ORCPT + 99 others); Mon, 29 Aug 2022 07:16:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42912 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231673AbiH2LO3 (ORCPT ); Mon, 29 Aug 2022 07:14:29 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8EA3D67446; Mon, 29 Aug 2022 04:10:19 -0700 (PDT) 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 35789611DA; Mon, 29 Aug 2022 11:10:16 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3F423C433D6; Mon, 29 Aug 2022 11:10:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1661771415; bh=/YP6VvDcJ9DScd+mjxxX5q2txVxjWzz7n9jvS0JRzxc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=yQsWaH4rwG2JkJU5h1VUCIkGbaaSkZDmwkuLJl/80qy5YndP87l/2nEkhW6XOjEAo FFIwcbpXY9vIpBmpQyvzgR8AMdyKXuWKP0rIR0+26L4sTD30yhx1q0YJyvYEoU+0ly b7Q5nFwf07UVJ0PWKniKV/G+B53H78ILlFt8en+U= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Chen Zhongjin , Ingo Molnar , "Steven Rostedt (Google)" Subject: [PATCH 5.15 101/136] x86/unwind/orc: Unwind ftrace trampolines with correct ORC entry Date: Mon, 29 Aug 2022 12:59:28 +0200 Message-Id: <20220829105808.840578337@linuxfoundation.org> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220829105804.609007228@linuxfoundation.org> References: <20220829105804.609007228@linuxfoundation.org> User-Agent: quilt/0.67 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE 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 From: Chen Zhongjin commit fc2e426b1161761561624ebd43ce8c8d2fa058da upstream. When meeting ftrace trampolines in ORC unwinding, unwinder uses address of ftrace_{regs_}call address to find the ORC entry, which gets next frame at sp+176. If there is an IRQ hitting at sub $0xa8,%rsp, the next frame should be sp+8 instead of 176. It makes unwinder skip correct frame and throw warnings such as "wrong direction" or "can't access registers", etc, depending on the content of the incorrect frame address. By adding the base address ftrace_{regs_}caller with the offset *ip - ops->trampoline*, we can get the correct address to find the ORC entry. Also change "caller" to "tramp_addr" to make variable name conform to its content. [ mingo: Clarified the changelog a bit. ] Fixes: 6be7fa3c74d1 ("ftrace, orc, x86: Handle ftrace dynamically allocated trampolines") Signed-off-by: Chen Zhongjin Signed-off-by: Ingo Molnar Reviewed-by: Steven Rostedt (Google) Cc: Link: https://lore.kernel.org/r/20220819084334.244016-1-chenzhongjin@huawei.com Signed-off-by: Greg Kroah-Hartman --- arch/x86/kernel/unwind_orc.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) --- a/arch/x86/kernel/unwind_orc.c +++ b/arch/x86/kernel/unwind_orc.c @@ -93,22 +93,27 @@ static struct orc_entry *orc_find(unsign static struct orc_entry *orc_ftrace_find(unsigned long ip) { struct ftrace_ops *ops; - unsigned long caller; + unsigned long tramp_addr, offset; ops = ftrace_ops_trampoline(ip); if (!ops) return NULL; + /* Set tramp_addr to the start of the code copied by the trampoline */ if (ops->flags & FTRACE_OPS_FL_SAVE_REGS) - caller = (unsigned long)ftrace_regs_call; + tramp_addr = (unsigned long)ftrace_regs_caller; else - caller = (unsigned long)ftrace_call; + tramp_addr = (unsigned long)ftrace_caller; + + /* Now place tramp_addr to the location within the trampoline ip is at */ + offset = ip - ops->trampoline; + tramp_addr += offset; /* Prevent unlikely recursion */ - if (ip == caller) + if (ip == tramp_addr) return NULL; - return orc_find(caller); + return orc_find(tramp_addr); } #else static struct orc_entry *orc_ftrace_find(unsigned long ip)