From: Douglas Anderson <dianders@chromium.org> To: Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will@kernel.org> Cc: Nick Desaulniers <ndesaulniers@google.com>, Seth LaForge <sethml@google.com>, Ricky Liang <jcliang@chromium.org>, Douglas Anderson <dianders@chromium.org>, Alexander Shishkin <alexander.shishkin@linux.intel.com>, Arnaldo Carvalho de Melo <acme@kernel.org>, Ingo Molnar <mingo@redhat.com>, Jiri Olsa <jolsa@redhat.com>, Mark Rutland <mark.rutland@arm.com>, Namhyung Kim <namhyung@kernel.org>, Nathan Chancellor <nathan@kernel.org>, Peter Zijlstra <peterz@infradead.org>, clang-built-linux@googlegroups.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Subject: [PATCH 3/3] arm64: perf: Add a config option saying 32-bit thumb code uses R11 for FP Date: Fri, 7 May 2021 13:55:13 -0700 [thread overview] Message-ID: <20210507135509.3.Ib4ca8cf998782d53b9613b12a6aca65605b91c72@changeid> (raw) In-Reply-To: <20210507205513.640780-1-dianders@chromium.org> The frame pointer story for 32-bit ARM/Thumb code is a bit of a nightmare. See the patch ("arm64: perf: perf_callchain_user() compat support clang/non-APCS-gcc-arm") (including the inline comments) for some details. Apparently, all hope is not lost for some resolution to this story. Recently it's been agreed upon that the frame pointer should be R11 across both ARM and Thumb. This should, at least, allow us to crawl through mixed code. Unfortunately I can't think of any automagic way to figure out if code is using R7 or R11 for the frame pointer. We'll force the person compiling the kernel to choose one or the other. NOTE: apparently as-of right now (2021Q1) there are no compilers out there that actually support this. Thus this patch is untested. However, it's so simple that it feels right to land it now while everyone is thinking about it. I have, at least, confirmed that tracing Thumb code produced with the old compiler _breaks_ when I set this option. ;-) Signed-off-by: Douglas Anderson <dianders@chromium.org> --- arch/arm64/Kconfig | 12 ++++++++++++ arch/arm64/kernel/perf_callchain.c | 12 ++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 9f1d8566bbf9..f123736ac535 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1062,6 +1062,18 @@ config ARCH_SPARSEMEM_ENABLE select SPARSEMEM_VMEMMAP_ENABLE select SPARSEMEM_VMEMMAP +config PERF_COMPAT_THUMB_FP_R11 + bool "Assume userspace 32-bit Thumb code uses R11 for Frame pointer" + help + Historically R11 was the frame pointer (FP) for 32-bit ARM code + and R7 was the frame pointer for 32-bit Thumb code. This resulted in + the inability to use the FP for stack crawling with mixed code. + The 2019Q4 Issue of AAPCS revised the frame pointer to be R11 for + BOTH ARM and Thumb. If your userspace was built with this new + standard then say "yes" here. + depends on PERF_EVENTS + depends on COMPAT + config HW_PERF_EVENTS def_bool y depends on ARM_PMU diff --git a/arch/arm64/kernel/perf_callchain.c b/arch/arm64/kernel/perf_callchain.c index b3cd9f371469..c8187acdbf3f 100644 --- a/arch/arm64/kernel/perf_callchain.c +++ b/arch/arm64/kernel/perf_callchain.c @@ -311,12 +311,16 @@ static void compat_perf_callchain_user(struct perf_callchain_entry_ctx *entry, /* * Assuming userspace is compiled with frame pointers then it's in - * R11 for ARM code and R7 for thumb code. If it's thumb mode we'll - * also set the low bit of the PC to match how the PC indicates thumb - * mode when crawling down the stack. + * R11 for ARM code and R7 for thumb code (unless you've got a really + * new compiler). If it's thumb mode we'll also set the low bit of + * the PC to match how the PC indicates thumb mode when crawling + * down the stack. */ if (compat_thumb_mode(regs)) { - fp = regs->regs[7]; + if (IS_ENABLED(CONFIG_PERF_COMPAT_THUMB_FP_R11)) + fp = regs->regs[11]; + else + fp = regs->regs[7]; pc |= BIT(0); } else { fp = regs->compat_fp; -- 2.31.1.607.g51e8a6a459-goog
WARNING: multiple messages have this Message-ID (diff)
From: Douglas Anderson <dianders@chromium.org> To: Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will@kernel.org> Cc: Nick Desaulniers <ndesaulniers@google.com>, Seth LaForge <sethml@google.com>, Ricky Liang <jcliang@chromium.org>, Douglas Anderson <dianders@chromium.org>, Alexander Shishkin <alexander.shishkin@linux.intel.com>, Arnaldo Carvalho de Melo <acme@kernel.org>, Ingo Molnar <mingo@redhat.com>, Jiri Olsa <jolsa@redhat.com>, Mark Rutland <mark.rutland@arm.com>, Namhyung Kim <namhyung@kernel.org>, Nathan Chancellor <nathan@kernel.org>, Peter Zijlstra <peterz@infradead.org>, clang-built-linux@googlegroups.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Subject: [PATCH 3/3] arm64: perf: Add a config option saying 32-bit thumb code uses R11 for FP Date: Fri, 7 May 2021 13:55:13 -0700 [thread overview] Message-ID: <20210507135509.3.Ib4ca8cf998782d53b9613b12a6aca65605b91c72@changeid> (raw) In-Reply-To: <20210507205513.640780-1-dianders@chromium.org> The frame pointer story for 32-bit ARM/Thumb code is a bit of a nightmare. See the patch ("arm64: perf: perf_callchain_user() compat support clang/non-APCS-gcc-arm") (including the inline comments) for some details. Apparently, all hope is not lost for some resolution to this story. Recently it's been agreed upon that the frame pointer should be R11 across both ARM and Thumb. This should, at least, allow us to crawl through mixed code. Unfortunately I can't think of any automagic way to figure out if code is using R7 or R11 for the frame pointer. We'll force the person compiling the kernel to choose one or the other. NOTE: apparently as-of right now (2021Q1) there are no compilers out there that actually support this. Thus this patch is untested. However, it's so simple that it feels right to land it now while everyone is thinking about it. I have, at least, confirmed that tracing Thumb code produced with the old compiler _breaks_ when I set this option. ;-) Signed-off-by: Douglas Anderson <dianders@chromium.org> --- arch/arm64/Kconfig | 12 ++++++++++++ arch/arm64/kernel/perf_callchain.c | 12 ++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 9f1d8566bbf9..f123736ac535 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1062,6 +1062,18 @@ config ARCH_SPARSEMEM_ENABLE select SPARSEMEM_VMEMMAP_ENABLE select SPARSEMEM_VMEMMAP +config PERF_COMPAT_THUMB_FP_R11 + bool "Assume userspace 32-bit Thumb code uses R11 for Frame pointer" + help + Historically R11 was the frame pointer (FP) for 32-bit ARM code + and R7 was the frame pointer for 32-bit Thumb code. This resulted in + the inability to use the FP for stack crawling with mixed code. + The 2019Q4 Issue of AAPCS revised the frame pointer to be R11 for + BOTH ARM and Thumb. If your userspace was built with this new + standard then say "yes" here. + depends on PERF_EVENTS + depends on COMPAT + config HW_PERF_EVENTS def_bool y depends on ARM_PMU diff --git a/arch/arm64/kernel/perf_callchain.c b/arch/arm64/kernel/perf_callchain.c index b3cd9f371469..c8187acdbf3f 100644 --- a/arch/arm64/kernel/perf_callchain.c +++ b/arch/arm64/kernel/perf_callchain.c @@ -311,12 +311,16 @@ static void compat_perf_callchain_user(struct perf_callchain_entry_ctx *entry, /* * Assuming userspace is compiled with frame pointers then it's in - * R11 for ARM code and R7 for thumb code. If it's thumb mode we'll - * also set the low bit of the PC to match how the PC indicates thumb - * mode when crawling down the stack. + * R11 for ARM code and R7 for thumb code (unless you've got a really + * new compiler). If it's thumb mode we'll also set the low bit of + * the PC to match how the PC indicates thumb mode when crawling + * down the stack. */ if (compat_thumb_mode(regs)) { - fp = regs->regs[7]; + if (IS_ENABLED(CONFIG_PERF_COMPAT_THUMB_FP_R11)) + fp = regs->regs[11]; + else + fp = regs->regs[7]; pc |= BIT(0); } else { fp = regs->compat_fp; -- 2.31.1.607.g51e8a6a459-goog _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2021-05-07 20:55 UTC|newest] Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-05-07 20:55 [PATCH 0/3] arm64: perf: Make compat tracing better Douglas Anderson 2021-05-07 20:55 ` Douglas Anderson 2021-05-07 20:55 ` [PATCH 1/3] arm64: perf: perf_callchain_user() compat support for clang/non-APCS-gcc-arm Douglas Anderson 2021-05-07 20:55 ` Douglas Anderson 2021-05-07 20:55 ` [PATCH 2/3] arm64: perf: Improve compat perf_callchain_user() for clang leaf functions Douglas Anderson 2021-05-07 20:55 ` Douglas Anderson 2021-06-07 9:14 ` James Clark 2021-06-07 9:14 ` James Clark 2021-06-07 20:57 ` Doug Anderson 2021-06-07 20:57 ` Doug Anderson 2021-05-07 20:55 ` Douglas Anderson [this message] 2021-05-07 20:55 ` [PATCH 3/3] arm64: perf: Add a config option saying 32-bit thumb code uses R11 for FP Douglas Anderson 2021-05-25 15:04 ` [PATCH 0/3] arm64: perf: Make compat tracing better Doug Anderson 2021-05-25 15:04 ` Doug Anderson 2021-06-02 17:55 ` Will Deacon 2021-06-02 17:55 ` Will Deacon 2021-06-07 20:34 ` Doug Anderson 2021-06-07 20:34 ` Doug Anderson
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210507135509.3.Ib4ca8cf998782d53b9613b12a6aca65605b91c72@changeid \ --to=dianders@chromium.org \ --cc=acme@kernel.org \ --cc=alexander.shishkin@linux.intel.com \ --cc=catalin.marinas@arm.com \ --cc=clang-built-linux@googlegroups.com \ --cc=jcliang@chromium.org \ --cc=jolsa@redhat.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-perf-users@vger.kernel.org \ --cc=mark.rutland@arm.com \ --cc=mingo@redhat.com \ --cc=namhyung@kernel.org \ --cc=nathan@kernel.org \ --cc=ndesaulniers@google.com \ --cc=peterz@infradead.org \ --cc=sethml@google.com \ --cc=will@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.