Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1137731imu; Wed, 16 Jan 2019 13:26:16 -0800 (PST) X-Google-Smtp-Source: ALg8bN52rmHHE466GLr2c3WO1qzxIst0LOHvRXFWwHQzUDLgAhPRf/Q9ZFIyfpI6SGkaBp/d+oqY X-Received: by 2002:a63:2b01:: with SMTP id r1mr10697119pgr.432.1547673976308; Wed, 16 Jan 2019 13:26:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547673976; cv=none; d=google.com; s=arc-20160816; b=D3dYTtAQR+mpUTBuxbKz8kUpqEQrcFg1XLH1doyTGCs3bQTZa93P6e0BjWvwZZuX0r ii/CJvDVdvkEGCqsOaK/k+/aYYh8s7Zy7cBUNd5Jqx6XtLh55FfyQLGDFmVJGzF/oGXo fKvbFVpc/Jeg0GFlrCO4XVp+Bi97Nu8nB0q39NQ0pSE5iWAIwI2t0Wk3JJQLblsVi6Mx PlhLkIsLzrevdQ1zRaLl68vW01IaVz5JTMPx3jMKm/EyAfhMAciMdzl5E7C3nrGg7/Yr BRT5VKYs+L5JSyovl6HWk+n4iGMqXR8gIf9nIJpmzeBHdpkmztx88S/qHA+p+eExSrnT JIrA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject; bh=4U8EMB8VR+JOhnayEFMV4OGb/K9Y+sN05Y4BHEUXjfM=; b=yyD2NMr/gSO2JmBJwBYiEGzC0d4FgfrQ4DBXqF/wEKEk2O5iV/3VYNnTDImB2Mygda 6/Uq4Oj1h/0A/ViXs5Wh5r7TzmyvuXaz6F0NtBZHyHC2hWz+GrWsFZdvKXbellrsfGvV gjgGg+r8mUzdMJ13EC8UDdJ6rAZ01ohokgp+ZurUJiIl5pxrzDoWkpGhgxqXc/W0dOa8 F8ij8dWdHFb0sEDKaP0j94uTVJeDf8AkrTSIMsKSiQzTx0XjXeZpe0gwwwCSy4l6VeA0 +YnuUcsAamZ2I3e/rOXAX6bXkX1IRAV6B3HLW+v+3s07I/gCV5GDFunn6j/PSD4YuCo/ rS6g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n18si7347839pfj.30.2019.01.16.13.26.00; Wed, 16 Jan 2019 13:26:16 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732100AbfAPJ5o (ORCPT + 99 others); Wed, 16 Jan 2019 04:57:44 -0500 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:44098 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729085AbfAPJ5n (ORCPT ); Wed, 16 Jan 2019 04:57:43 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 6AB6280D; Wed, 16 Jan 2019 01:57:43 -0800 (PST) Received: from [10.1.197.45] (e112298-lin.cambridge.arm.com [10.1.197.45]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 311893F70D; Wed, 16 Jan 2019 01:57:41 -0800 (PST) Subject: Re: [PATCH v6] arm64: implement ftrace with regs To: Torsten Duwe , Will Deacon , Catalin Marinas , Steven Rostedt , Josh Poimboeuf , Ingo Molnar , Mark Rutland , Ard Biesheuvel , Arnd Bergmann , AKASHI Takahiro , Amit Daniel Kachhap Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, live-patching@vger.kernel.org References: <20190104141053.360F768D93@newverein.lst.de> From: Julien Thierry Message-ID: <8eb70db4-92a2-95a2-075c-f26690aab3ed@arm.com> Date: Wed, 16 Jan 2019 09:57:39 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 In-Reply-To: <20190104141053.360F768D93@newverein.lst.de> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Torsten, On 04/01/2019 14:10, Torsten Duwe wrote: > Use -fpatchable-function-entry (gcc8) to add 2 NOPs at the beginning > of each function. Replace the first NOP thus generated with a quick LR > saver (move it to scratch reg x9), so the 2nd replacement insn, the call > to ftrace, does not clobber the value. Ftrace will then generate the > standard stack frames. > > Note that patchable-function-entry in GCC disables IPA-RA, which means > ABI register calling conventions are obeyed *and* scratch registers > such as x9 are available. > > Introduce and handle an ftrace_regs_trampoline for module PLTs, right > after ftrace_trampoline, and double the size of this special section. > > Signed-off-by: Torsten Duwe > I wanted to test this patch (and try to benchmark having the "mov x9, x30" always present in function prelude vs having two nops), but I cannot get this patch to apply (despite having a version including both commits below). Could you provide a git branch from which I could try to rebase the patch? (Or a new version of the series) > --- > > This patch applies on 4.20 with the additional changes > bdb85cd1d20669dfae813555dddb745ad09323ba > (arm64/module: switch to ADRP/ADD sequences for PLT entries) > and > 7dc48bf96aa0fc8aa5b38cc3e5c36ac03171e680 > (arm64: ftrace: always pass instrumented pc in x0) > along with their respective series, or alternatively on Linus' master, > which already has these. > > changes since v5: > > * fix mentioned pc in x0 to hold the start address of the call site, > not the return address or the branch address. > This resolves the problem found by Amit. > > --- > arch/arm64/Kconfig | 2 > arch/arm64/Makefile | 4 + > arch/arm64/include/asm/assembler.h | 1 > arch/arm64/include/asm/ftrace.h | 13 +++ > arch/arm64/include/asm/module.h | 3 > arch/arm64/kernel/Makefile | 6 - > arch/arm64/kernel/entry-ftrace.S | 131 ++++++++++++++++++++++++++++++++++ > arch/arm64/kernel/ftrace.c | 125 ++++++++++++++++++++++++-------- > arch/arm64/kernel/module-plts.c | 3 > arch/arm64/kernel/module.c | 2 > drivers/firmware/efi/libstub/Makefile | 3 > include/asm-generic/vmlinux.lds.h | 1 > include/linux/compiler_types.h | 4 + > 13 files changed, 262 insertions(+), 36 deletions(-) [...] > --- a/arch/arm64/kernel/entry-ftrace.S > +++ b/arch/arm64/kernel/entry-ftrace.S [...] > @@ -122,6 +124,7 @@ skip_ftrace_call: // } > ENDPROC(_mcount) > > #else /* CONFIG_DYNAMIC_FTRACE */ > +#ifndef CONFIG_DYNAMIC_FTRACE_WITH_REGS > /* > * _mcount() is used to build the kernel with -pg option, but all the branch > * instructions to _mcount() are replaced to NOP initially at kernel start up, > @@ -159,6 +162,124 @@ GLOBAL(ftrace_graph_call) // ftrace_gra > > mcount_exit > ENDPROC(ftrace_caller) > +#else /* CONFIG_DYNAMIC_FTRACE_WITH_REGS */ > + > +/* > + * Since no -pg or similar compiler flag is used, there should really be > + * no reference to _mcount; so do not define one. Only some value for > + * MCOUNT_ADDR is needed for comparison. Let it point here to have some > + * sort of magic value that can be recognised when debugging. > + */ > +GLOBAL(_mcount) > + ret /* make it differ from regs caller */ There's something I can't figure out. Since there are no callers to _mcount, how does the ftrace core builds up its record of patchable functions? I don't understand fully the core ftrace code but I've got the impression that without this record of struct dyn_ftrace, ftrace cannot patch in calls to tracers in the future. Am I missing something? Thanks, -- Julien Thierry