Received: by 2002:a05:7412:8d10:b0:f3:1519:9f41 with SMTP id bj16csp2455828rdb; Fri, 8 Dec 2023 08:35:42 -0800 (PST) X-Google-Smtp-Source: AGHT+IFhhRBYFjmtHvurAsk87BMaUxkweWzhARhqlYXg0tkBFfX5GKpU+wjrd+wn17VR4nOqUGJv X-Received: by 2002:a17:902:6848:b0:1d0:8383:742d with SMTP id f8-20020a170902684800b001d08383742dmr284970pln.37.1702053341845; Fri, 08 Dec 2023 08:35:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702053341; cv=none; d=google.com; s=arc-20160816; b=LF3J9ijaYofbgGUs/n4TtBYKB8T9oM1xrvd/u0XOX7e1JmGnCbploR3yH8rtCOVK+g jgsgC/PjOH6MqcY9Y4UQ9VK3LBEW+r3deUt5pz7f/0ApqWZN69sqPu1QiEnO9bEkxVUn B8q4mjlTyURVEDrKtnGh9vEBa+8xqgCPOpA8H3QarTm+B2H/o1TuVZacV6RY1jcjd+Lz dCn/lGU63eYlllyr1Wm32HK1gMhjQabx2kMEc9ooXODGMaXT09lpfjb8j4m1q0XmRk5t QtoC/ALFCqi3dcCI2MEoPeGsjfYI0YrJnEFG8SkvgZx1hDhbpLE6Eqqf1ceZSmJqltw5 Wsqw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=flmwpFYlHPfwJ5j53vome/fsbY5rLsze73Qnv9Zpp2Q=; fh=hPWrg32dlFKNN5MdTsgIUJTVaEJ0Jhxi8OfbSIPXQ0A=; b=dviUpkS2wJy6k7HVsgJDd2G7kbdvjTzNo5lJVs3LBjXGHKzIVUAWmc1geb1KVKqFNM VEjqC07CVzwRUmPHNsbmf5C73QhlnZWIOMxx1GeEPLV9y22nurKgH397+LQvAPmhppAe VVUWfkrhm3Vn0TfgDPAu7OzWuWm9+VmlTSAnl6DuDzuKVbz3Mh/JmuudBsYmmlm6Ag6C KaDrg8A7KL1gopHEldLxAaSTuGD3ZEc7f7tTVPvyT37D8JmS63eYZdIjJmCb+sT2fcQi vjOVMG2gzgyJL6FLg3OXHPj9tofcnIbCMU1QRCcakjX7+IXMCq5epYwekzKIJb4P3H4R ws9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=dgZj87RJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from fry.vger.email (fry.vger.email. [2620:137:e000::3:8]) by mx.google.com with ESMTPS id l12-20020a170903120c00b001d0087bbf19si1826511plh.440.2023.12.08.08.35.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 Dec 2023 08:35:41 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) client-ip=2620:137:e000::3:8; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=dgZj87RJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by fry.vger.email (Postfix) with ESMTP id 9606E81BFBAF; Fri, 8 Dec 2023 08:35:37 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at fry.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1574178AbjLHQfI (ORCPT + 99 others); Fri, 8 Dec 2023 11:35:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41292 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1574057AbjLHQfD (ORCPT ); Fri, 8 Dec 2023 11:35:03 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 73A1C19AA for ; Fri, 8 Dec 2023 08:35:08 -0800 (PST) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2CBEEC433C8; Fri, 8 Dec 2023 16:35:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1702053308; bh=SUBvtEn9z9UrSU17r7Cw0HAstRv+zJkI6nOLOYxgtBI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dgZj87RJDMQntv41jgP4YNzanNPs+Fpah5vLvv/Fi7x0xv29OoS4clgN/qIAyR3jV hNHJeCEa/bbQa3tIPnXKAXv1XPy755Z5yFhAqz/ZNGNCeHC60vxB53+qo4cZ5ZDMGt 1bKvP6XKSFo//muVUOZZnkbmDgADqtIdir6Z1wlBqONgp6SxBcA0Fpg4TBCaa7JPoH DyIwjCw1N0hyzBtUCNEkS+BkeEJHcvJ2vMCyeg2HJIFUbmpLMN74veO6ZY9RsKKn+X WnLEVHuFTlAKZL/rOOjuiuX5Vaa7uEQymnLPerK8Spbtr8wV1Ef8GfvngNKvimkVO8 EumXuDYVXZszg== From: Naveen N Rao To: , Cc: Michael Ellerman , Nicholas Piggin , Christophe Leroy , "Aneesh Kumar K.V" , Steven Rostedt , Mark Rutland , Florent Revest , Masami Hiramatsu Subject: [RFC PATCH 2/9] powerpc/ftrace: Unify 32-bit and 64-bit ftrace entry code Date: Fri, 8 Dec 2023 22:00:41 +0530 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.2 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on fry.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (fry.vger.email [0.0.0.0]); Fri, 08 Dec 2023 08:35:37 -0800 (PST) On 32-bit powerpc, gcc generates a three instruction sequence for function profiling: mflr r0 stw r0, 4(r1) bl _mcount On kernel boot, the call to _mcount() is nop-ed out, to be patched back in when ftrace is actually enabled. The 'stw' instruction therefore is not necessary unless ftrace is enabled. Nop it out during ftrace init. When ftrace is enabled, we want the 'stw' so that stack unwinding works properly. Perform the same within the ftrace handler, similar to 64-bit powerpc. For 64-bit powerpc, early versions of gcc used to emit a three instruction sequence for function profiling (with -mprofile-kernel) with a 'std' instruction to mimic the 'stw' above. Address that scenario also by nop-ing out the 'std' instruction during ftrace init. Signed-off-by: Naveen N Rao --- arch/powerpc/kernel/trace/ftrace.c | 6 ++++-- arch/powerpc/kernel/trace/ftrace_entry.S | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/arch/powerpc/kernel/trace/ftrace.c b/arch/powerpc/kernel/trace/ftrace.c index 82010629cf88..2956196c98ff 100644 --- a/arch/powerpc/kernel/trace/ftrace.c +++ b/arch/powerpc/kernel/trace/ftrace.c @@ -229,13 +229,15 @@ int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec) /* Expected sequence: 'mflr r0', 'stw r0,4(r1)', 'bl _mcount' */ ret = ftrace_validate_inst(ip - 8, ppc_inst(PPC_RAW_MFLR(_R0))); if (!ret) - ret = ftrace_validate_inst(ip - 4, ppc_inst(PPC_RAW_STW(_R0, _R1, 4))); + ret = ftrace_modify_code(ip - 4, ppc_inst(PPC_RAW_STW(_R0, _R1, 4)), + ppc_inst(PPC_RAW_NOP())); } else if (IS_ENABLED(CONFIG_MPROFILE_KERNEL)) { /* Expected sequence: 'mflr r0', ['std r0,16(r1)'], 'bl _mcount' */ ret = ftrace_read_inst(ip - 4, &old); if (!ret && !ppc_inst_equal(old, ppc_inst(PPC_RAW_MFLR(_R0)))) { ret = ftrace_validate_inst(ip - 8, ppc_inst(PPC_RAW_MFLR(_R0))); - ret |= ftrace_validate_inst(ip - 4, ppc_inst(PPC_RAW_STD(_R0, _R1, 16))); + ret |= ftrace_modify_code(ip - 4, ppc_inst(PPC_RAW_STD(_R0, _R1, 16)), + ppc_inst(PPC_RAW_NOP())); } } else { return -EINVAL; diff --git a/arch/powerpc/kernel/trace/ftrace_entry.S b/arch/powerpc/kernel/trace/ftrace_entry.S index 40677416d7b2..17d1ed3d0b40 100644 --- a/arch/powerpc/kernel/trace/ftrace_entry.S +++ b/arch/powerpc/kernel/trace/ftrace_entry.S @@ -33,6 +33,8 @@ * and then arrange for the ftrace function to be called. */ .macro ftrace_regs_entry allregs + /* Save the original return address in A's stack frame */ + PPC_STL r0, LRSAVE(r1) /* Create a minimal stack frame for representing B */ PPC_STLU r1, -STACK_FRAME_MIN_SIZE(r1) @@ -44,8 +46,6 @@ SAVE_GPRS(3, 10, r1) #ifdef CONFIG_PPC64 - /* Save the original return address in A's stack frame */ - std r0, LRSAVE+SWITCH_FRAME_SIZE+STACK_FRAME_MIN_SIZE(r1) /* Ok to continue? */ lbz r3, PACA_FTRACE_ENABLED(r13) cmpdi r3, 0 -- 2.43.0