|
@@ -39,12 +39,13 @@ saved_pc .req lr
|
|
|
|
|
|
.section .entry.text,"ax",%progbits
|
|
|
.align 5
|
|
|
-#if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACKING))
|
|
|
+#if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACKING) || \
|
|
|
+ IS_ENABLED(CONFIG_DEBUG_RSEQ))
|
|
|
/*
|
|
|
* This is the fast syscall return path. We do as little as possible here,
|
|
|
* such as avoiding writing r0 to the stack. We only use this path if we
|
|
|
- * have tracing and context tracking disabled - the overheads from those
|
|
|
- * features make this path too inefficient.
|
|
|
+ * have tracing, context tracking and rseq debug disabled - the overheads
|
|
|
+ * from those features make this path too inefficient.
|
|
|
*/
|
|
|
ret_fast_syscall:
|
|
|
UNWIND(.fnstart )
|
|
@@ -71,14 +72,20 @@ fast_work_pending:
|
|
|
/* fall through to work_pending */
|
|
|
#else
|
|
|
/*
|
|
|
- * The "replacement" ret_fast_syscall for when tracing or context tracking
|
|
|
- * is enabled. As we will need to call out to some C functions, we save
|
|
|
- * r0 first to avoid needing to save registers around each C function call.
|
|
|
+ * The "replacement" ret_fast_syscall for when tracing, context tracking,
|
|
|
+ * or rseq debug is enabled. As we will need to call out to some C functions,
|
|
|
+ * we save r0 first to avoid needing to save registers around each C function
|
|
|
+ * call.
|
|
|
*/
|
|
|
ret_fast_syscall:
|
|
|
UNWIND(.fnstart )
|
|
|
UNWIND(.cantunwind )
|
|
|
str r0, [sp, #S_R0 + S_OFF]! @ save returned r0
|
|
|
+#if IS_ENABLED(CONFIG_DEBUG_RSEQ)
|
|
|
+ /* do_rseq_syscall needs interrupts enabled. */
|
|
|
+ mov r0, sp @ 'regs'
|
|
|
+ bl do_rseq_syscall
|
|
|
+#endif
|
|
|
disable_irq_notrace @ disable interrupts
|
|
|
ldr r2, [tsk, #TI_ADDR_LIMIT]
|
|
|
cmp r2, #TASK_SIZE
|
|
@@ -113,6 +120,12 @@ ENDPROC(ret_fast_syscall)
|
|
|
*/
|
|
|
ENTRY(ret_to_user)
|
|
|
ret_slow_syscall:
|
|
|
+#if IS_ENABLED(CONFIG_DEBUG_RSEQ)
|
|
|
+ /* do_rseq_syscall needs interrupts enabled. */
|
|
|
+ enable_irq_notrace @ enable interrupts
|
|
|
+ mov r0, sp @ 'regs'
|
|
|
+ bl do_rseq_syscall
|
|
|
+#endif
|
|
|
disable_irq_notrace @ disable interrupts
|
|
|
ENTRY(ret_to_user_from_irq)
|
|
|
ldr r2, [tsk, #TI_ADDR_LIMIT]
|