new file mode 100644
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef __ASM_ENTRY_H__
+#define __ASM_ENTRY_H__
+
+struct pt_regs;
+
+/*
+ * These are copies of generic entry headers so we can transition
+ * to generic entry once they are semantically equivalent.
+ */
+void irqentry_enter_from_user_mode(struct pt_regs *regs);
+void irqentry_exit_to_user_mode(struct pt_regs *regs);
+
+#endif /* __ASM_ENTRY_H__ */
@@ -17,7 +17,7 @@ CFLAGS_REMOVE_return_address.o = -pg
# Object file lists.
-obj-y := elf.o entry-common.o irq.o opcodes.o \
+obj-y := elf.o entry.o entry-common.o irq.o opcodes.o \
process.o ptrace.o reboot.o io.o \
setup.o signal.o sigreturn_codes.o \
stacktrace.o sys_arm.o time.o traps.o \
@@ -405,7 +405,7 @@ ENDPROC(__fiq_abt)
#ifdef CONFIG_TRACE_IRQFLAGS
bl trace_hardirqs_off
#endif
- ct_user_exit save = 0
+ asm_irqentry_enter_from_user_mode save = 0
.endif
.endm
@@ -111,7 +111,7 @@ ENTRY(ret_to_user_from_irq)
no_work_pending:
asm_trace_hardirqs_on save = 0
- ct_user_enter save = 0
+ asm_irqentry_exit_to_user_mode save = 0
#ifdef CONFIG_GCC_PLUGIN_STACKLEAK
bl stackleak_erase_on_task_stack
@@ -191,7 +191,7 @@ ENTRY(vector_swi)
alignment_trap r10, ip, cr_alignment
asm_trace_hardirqs_on save=0
enable_irq_notrace
- ct_user_exit save=0
+ asm_irqentry_enter_from_user_mode save = 0
/*
* Get the system call number.
@@ -362,31 +362,31 @@ ALT_UP_B(.L1_\@)
.endm
/*
- * Context tracking subsystem. Used to instrument transitions
+ * Context tracking and other mode transitions. Used to instrument transitions
* between user and kernel mode.
- */
- .macro ct_user_exit, save = 1
-#ifdef CONFIG_CONTEXT_TRACKING_USER
+*/
+ .macro asm_irqentry_enter_from_user_mode, save = 1
.if \save
stmdb sp!, {r0-r3, ip, lr}
- bl user_exit_callable
+ mov r0, sp @ regs
+ bl irqentry_enter_from_user_mode
ldmia sp!, {r0-r3, ip, lr}
.else
- bl user_exit_callable
+ mov r0, sp @ regs
+ bl irqentry_enter_from_user_mode
.endif
-#endif
.endm
- .macro ct_user_enter, save = 1
-#ifdef CONFIG_CONTEXT_TRACKING_USER
+ .macro asm_irqentry_exit_to_user_mode, save = 1
.if \save
stmdb sp!, {r0-r3, ip, lr}
- bl user_enter_callable
+ mov r0, sp @ regs
+ bl irqentry_exit_to_user_mode
ldmia sp!, {r0-r3, ip, lr}
.else
- bl user_enter_callable
+ mov r0, sp @ regs
+ bl irqentry_exit_to_user_mode
.endif
-#endif
.endm
/*
new file mode 100644
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <asm/entry.h>
+#include <linux/context_tracking.h>
+
+noinstr void irqentry_enter_from_user_mode(struct pt_regs *regs)
+{
+ /* This context tracking call has inverse naming */
+ user_exit_callable();
+}
+
+noinstr void irqentry_exit_to_user_mode(struct pt_regs *regs)
+{
+ /* This context tracking call has inverse naming */
+ user_enter_callable();
+}
The callbacks to the context tracking will be repurposed for several uses that are needed on the IRQ transition to/from userspace. Rename the macro, establish call sites in C calling into the context tracking following the corresponding generic entry function prototypes, despite the assembly macro names become a bit long this makes it clear to readers exactly what is going on and where this call will go. Drop the ifdefs pertaining to context tracking from the macro. The C calls we will use have stubs that will compile these out anyway. The inversion of the signature of the context tracking calls are especially confusing since the generic entry uses the reverse semantics: *enter from* user mode (to kernel mode) and *exit to* user mode (from kernel mode) instead of the other way around as the old context tracker code user_exit_callable() and user_enter_callable() which have inverted semantics. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> --- arch/arm/include/asm/entry.h | 14 ++++++++++++++ arch/arm/kernel/Makefile | 2 +- arch/arm/kernel/entry-armv.S | 2 +- arch/arm/kernel/entry-common.S | 4 ++-- arch/arm/kernel/entry-header.S | 24 ++++++++++++------------ arch/arm/kernel/entry.c | 15 +++++++++++++++ 6 files changed, 45 insertions(+), 16 deletions(-)