mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
rseq: Use static branch for syscall exit debug when GENERIC_IRQ_ENTRY=y
Make the syscall exit debug mechanism available via the static branch on architectures which utilize the generic entry code. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Link: https://patch.msgid.link/20251027084307.333440475@linutronix.de
This commit is contained in:
committed by
Ingo Molnar
parent
c1cbad8f99
commit
eaa9088d56
@@ -146,7 +146,7 @@ static __always_inline void syscall_exit_to_user_mode_work(struct pt_regs *regs)
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
rseq_syscall(regs);
|
||||
rseq_debug_syscall_return(regs);
|
||||
|
||||
/*
|
||||
* Do one-time syscall specific work. If these work items are
|
||||
|
||||
@@ -296,9 +296,18 @@ static __always_inline void rseq_exit_to_user_mode(void)
|
||||
ev->events = 0;
|
||||
}
|
||||
|
||||
void __rseq_debug_syscall_return(struct pt_regs *regs);
|
||||
|
||||
static inline void rseq_debug_syscall_return(struct pt_regs *regs)
|
||||
{
|
||||
if (static_branch_unlikely(&rseq_debug_enabled))
|
||||
__rseq_debug_syscall_return(regs);
|
||||
}
|
||||
|
||||
#else /* CONFIG_RSEQ */
|
||||
static inline void rseq_note_user_irq_entry(void) { }
|
||||
static inline void rseq_exit_to_user_mode(void) { }
|
||||
static inline void rseq_debug_syscall_return(struct pt_regs *regs) { }
|
||||
#endif /* !CONFIG_RSEQ */
|
||||
|
||||
#endif /* _LINUX_RSEQ_ENTRY_H */
|
||||
|
||||
@@ -473,12 +473,11 @@ error:
|
||||
force_sigsegv(sig);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_RSEQ
|
||||
/*
|
||||
* Terminate the process if a syscall is issued within a restartable
|
||||
* sequence.
|
||||
*/
|
||||
void rseq_syscall(struct pt_regs *regs)
|
||||
void __rseq_debug_syscall_return(struct pt_regs *regs)
|
||||
{
|
||||
struct task_struct *t = current;
|
||||
u64 csaddr;
|
||||
@@ -496,6 +495,13 @@ void rseq_syscall(struct pt_regs *regs)
|
||||
fail:
|
||||
force_sig(SIGSEGV);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_RSEQ
|
||||
/* Kept around to keep GENERIC_ENTRY=n architectures supported. */
|
||||
void rseq_syscall(struct pt_regs *regs)
|
||||
{
|
||||
__rseq_debug_syscall_return(regs);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user