From: Ard Biesheuvel <ardb@kernel.org>
To: linux@armlinux.org.uk
Cc: linux-arm-kernel@lists.infradead.org,
Ard Biesheuvel <ardb@kernel.org>,
Steven Rostedt <rostedt@goodmis.org>,
Sudeep Holla <sudeep.holla@arm.com>,
Cristian Marussi <cristian.marussi@arm.com>,
Nathan Chancellor <nathan@kernel.org>,
Nick Desaulniers <ndesaulniers@google.com>,
Arnd Bergmann <arnd@arndb.de>,
Linus Walleij <linus.walleij@linaro.org>,
Masami Hiramatsu <mhiramat@kernel.org>
Subject: [PATCH v2 09/12] ARM: kprobes: treat R7 as the frame pointer register in Thumb2 builds
Date: Mon, 31 Jan 2022 18:03:44 +0100 [thread overview]
Message-ID: <20220131170347.381551-10-ardb@kernel.org> (raw)
In-Reply-To: <20220131170347.381551-1-ardb@kernel.org>
Thumb2 code uses R7 as the frame pointer rather than R11, because the
opcodes to access it are generally shorter.
This means that there are cases where we cannot simply add it to the
clobber list of an asm() block, but need to preserve/restore it
explicitly, or the compiler may complain in some cases (e.g., Clang
builds with ftrace enabled).
Since R11 is not special in that case, clobber it instead, and use it to
preserve/restore the value of R7.
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
arch/arm/include/asm/opcodes.h | 14 ++++++++
arch/arm/probes/kprobes/actions-common.c | 6 ++--
arch/arm/probes/kprobes/actions-thumb.c | 38 ++++++++++++++++----
3 files changed, 48 insertions(+), 10 deletions(-)
diff --git a/arch/arm/include/asm/opcodes.h b/arch/arm/include/asm/opcodes.h
index 38e3eabff5c3..9a6362408ea0 100644
--- a/arch/arm/include/asm/opcodes.h
+++ b/arch/arm/include/asm/opcodes.h
@@ -230,4 +230,18 @@ extern __u32 __opcode_to_mem_thumb32(__u32);
".short " __stringify(first) ", " __stringify(second) "\n\t"
#endif
+/*
+ * Which register to preserve and which register can be clobbered in inline asm
+ * that needs to be compatible with code that emits frame pointers.
+ */
+#ifdef CONFIG_THUMB2_KERNEL
+#define FPREG_PRESERVE "r7"
+#define FPREG_CLOBBER "r11"
+#define FPREG_PRESERVE_R7
+#else
+#define FPREG_PRESERVE "fp"
+#define FPREG_CLOBBER "r7"
+#define FPREG_PRESERVE_R11
+#endif
+
#endif /* __ASM_ARM_OPCODES_H */
diff --git a/arch/arm/probes/kprobes/actions-common.c b/arch/arm/probes/kprobes/actions-common.c
index 836aebe596cd..f0efe16e2fdb 100644
--- a/arch/arm/probes/kprobes/actions-common.c
+++ b/arch/arm/probes/kprobes/actions-common.c
@@ -84,7 +84,7 @@ emulate_generic_r0_12_noflags(probes_opcode_t insn,
register void *rfn asm("lr") = asi->insn_fn;
__asm__ __volatile__ (
- "stmdb sp!, {%[regs], r11} \n\t"
+ "stmdb sp!, {%[regs], " FPREG_PRESERVE "}\n\t"
"ldmia %[regs], {r0-r12} \n\t"
#if __LINUX_ARM_ARCH__ >= 6
"blx %[fn] \n\t"
@@ -96,10 +96,10 @@ emulate_generic_r0_12_noflags(probes_opcode_t insn,
#endif
"ldr lr, [sp], #4 \n\t" /* lr = regs */
"stmia lr, {r0-r12} \n\t"
- "ldr r11, [sp], #4 \n\t"
+ "ldr " FPREG_PRESERVE ", [sp], #4\n\t"
: [regs] "=r" (rregs), [fn] "=r" (rfn)
: "0" (rregs), "1" (rfn)
- : "r0", "r2", "r3", "r4", "r5", "r6", "r7",
+ : "r0", "r2", "r3", "r4", "r5", "r6", FPREG_CLOBBER,
"r8", "r9", "r10", "r12", "memory", "cc"
);
}
diff --git a/arch/arm/probes/kprobes/actions-thumb.c b/arch/arm/probes/kprobes/actions-thumb.c
index 7884fcb81c26..873757326533 100644
--- a/arch/arm/probes/kprobes/actions-thumb.c
+++ b/arch/arm/probes/kprobes/actions-thumb.c
@@ -447,14 +447,20 @@ t16_emulate_loregs(probes_opcode_t insn,
__asm__ __volatile__ (
"msr cpsr_fs, %[oldcpsr] \n\t"
+#ifdef FPREG_PRESERVE_R7
+ "mov fp, r7 \n\t"
+#endif
"ldmia %[regs], {r0-r7} \n\t"
"blx %[fn] \n\t"
"stmia %[regs], {r0-r7} \n\t"
+#ifdef FPREG_PRESERVE_R7
+ "mov r7, fp \n\t"
+#endif
"mrs %[newcpsr], cpsr \n\t"
: [newcpsr] "=r" (newcpsr)
: [oldcpsr] "r" (oldcpsr), [regs] "r" (regs),
[fn] "r" (asi->insn_fn)
- : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
+ : "r0", "r1", "r2", "r3", "r4", "r5", "r6", FPREG_CLOBBER,
"lr", "memory", "cc"
);
@@ -524,15 +530,21 @@ t16_emulate_push(probes_opcode_t insn,
struct arch_probes_insn *asi, struct pt_regs *regs)
{
__asm__ __volatile__ (
+#ifdef FPREG_PRESERVE_R7
+ "mov fp, r7 \n\t"
+#endif
"ldr r9, [%[regs], #13*4] \n\t"
"ldr r8, [%[regs], #14*4] \n\t"
"ldmia %[regs], {r0-r7} \n\t"
"blx %[fn] \n\t"
"str r9, [%[regs], #13*4] \n\t"
+#ifdef FPREG_PRESERVE_R7
+ "mov r7, fp \n\t"
+#endif
:
: [regs] "r" (regs), [fn] "r" (asi->insn_fn)
- : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9",
- "lr", "memory", "cc"
+ : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r8", "r9",
+ FPREG_CLOBBER, "lr", "memory", "cc"
);
}
@@ -558,15 +570,21 @@ t16_emulate_pop_nopc(probes_opcode_t insn,
struct arch_probes_insn *asi, struct pt_regs *regs)
{
__asm__ __volatile__ (
+#ifdef FPREG_PRESERVE_R7
+ "mov fp, r7 \n\t"
+#endif
"ldr r9, [%[regs], #13*4] \n\t"
"ldmia %[regs], {r0-r7} \n\t"
"blx %[fn] \n\t"
"stmia %[regs], {r0-r7} \n\t"
"str r9, [%[regs], #13*4] \n\t"
+#ifdef FPREG_PRESERVE_R7
+ "mov r7, fp \n\t"
+#endif
:
: [regs] "r" (regs), [fn] "r" (asi->insn_fn)
- : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r9",
- "lr", "memory", "cc"
+ : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r9",
+ FPREG_CLOBBER, "lr", "memory", "cc"
);
}
@@ -577,15 +595,21 @@ t16_emulate_pop_pc(probes_opcode_t insn,
register unsigned long pc asm("r8");
__asm__ __volatile__ (
+#ifdef FPREG_PRESERVE_R7
+ "mov fp, r7 \n\t"
+#endif
"ldr r9, [%[regs], #13*4] \n\t"
"ldmia %[regs], {r0-r7} \n\t"
"blx %[fn] \n\t"
"stmia %[regs], {r0-r7} \n\t"
"str r9, [%[regs], #13*4] \n\t"
+#ifdef FPREG_PRESERVE_R7
+ "mov r7, fp \n\t"
+#endif
: "=r" (pc)
: [regs] "r" (regs), [fn] "r" (asi->insn_fn)
- : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r9",
- "lr", "memory", "cc"
+ : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r9",
+ FPREG_CLOBBER, "lr", "memory", "cc"
);
bx_write_pc(pc, regs);
--
2.30.2
_______________________________________________
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:[~2022-01-31 17:22 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-31 17:03 [PATCH v2 00/12] ARM: ftrace fixes and cleanups Ard Biesheuvel
2022-01-31 17:03 ` [PATCH v2 01/12] ARM: ftrace: ensure that ADR take Thumb bit into account Ard Biesheuvel
2022-01-31 17:03 ` [PATCH v2 02/12] ARM: ftrace: use ADD not POP to counter PUSH at entry Ard Biesheuvel
2022-01-31 17:03 ` [PATCH v2 03/12] ARM: ftrace: use trampolines to keep .init.text in branching range Ard Biesheuvel
2022-01-31 17:03 ` [PATCH v2 04/12] ARM: ftrace: avoid redundant loads or clobbering IP Ard Biesheuvel
2022-01-31 17:03 ` [PATCH v2 05/12] ARM: ftrace: avoid unnecessary literal loads Ard Biesheuvel
2022-01-31 17:03 ` [PATCH v2 06/12] ARM: ftrace: enable HAVE_FUNCTION_GRAPH_FP_TEST Ard Biesheuvel
2022-01-31 17:03 ` [PATCH v2 07/12] ARM: unwind: track location of LR value in stack frame Ard Biesheuvel
2022-01-31 17:03 ` [PATCH v2 08/12] ARM: ftrace: enable the graph tracer with the EABI unwinder Ard Biesheuvel
2022-01-31 17:03 ` Ard Biesheuvel [this message]
2022-01-31 18:31 ` [PATCH v2 09/12] ARM: kprobes: treat R7 as the frame pointer register in Thumb2 builds Nick Desaulniers
2022-02-01 7:42 ` Ard Biesheuvel
2022-02-01 13:18 ` Masami Hiramatsu
2022-02-01 14:05 ` Ard Biesheuvel
2022-02-02 6:10 ` Masami Hiramatsu
2022-02-02 8:00 ` Ard Biesheuvel
2022-01-31 17:03 ` [PATCH v2 10/12] drivers/firmware/scmi: disable ftrace for Clang " Ard Biesheuvel
2022-01-31 18:37 ` Nick Desaulniers
2022-02-01 8:12 ` Ard Biesheuvel
2022-01-31 22:04 ` Sudeep Holla
2022-01-31 17:03 ` [PATCH v2 11/12] ARM: cacheflush: avoid clobbering the frame pointer in Thumb2 mode Ard Biesheuvel
2022-01-31 18:40 ` Nick Desaulniers
2022-01-31 17:03 ` [PATCH v2 12/12] Revert "ARM: 9144/1: forbid ftrace with clang and thumb2_kernel" Ard Biesheuvel
2022-01-31 18:42 ` Nick Desaulniers
2022-01-31 17:21 ` [PATCH v2 00/12] ARM: ftrace fixes and cleanups Steven Rostedt
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=20220131170347.381551-10-ardb@kernel.org \
--to=ardb@kernel.org \
--cc=arnd@arndb.de \
--cc=cristian.marussi@arm.com \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux@armlinux.org.uk \
--cc=mhiramat@kernel.org \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=rostedt@goodmis.org \
--cc=sudeep.holla@arm.com \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).