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.depull/1354/merge
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();
|
local_irq_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
rseq_syscall(regs);
|
rseq_debug_syscall_return(regs);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do one-time syscall specific work. If these work items are
|
* 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;
|
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 */
|
#else /* CONFIG_RSEQ */
|
||||||
static inline void rseq_note_user_irq_entry(void) { }
|
static inline void rseq_note_user_irq_entry(void) { }
|
||||||
static inline void rseq_exit_to_user_mode(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 /* !CONFIG_RSEQ */
|
||||||
|
|
||||||
#endif /* _LINUX_RSEQ_ENTRY_H */
|
#endif /* _LINUX_RSEQ_ENTRY_H */
|
||||||
|
|
|
||||||
|
|
@ -473,12 +473,11 @@ error:
|
||||||
force_sigsegv(sig);
|
force_sigsegv(sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_RSEQ
|
|
||||||
/*
|
/*
|
||||||
* Terminate the process if a syscall is issued within a restartable
|
* Terminate the process if a syscall is issued within a restartable
|
||||||
* sequence.
|
* sequence.
|
||||||
*/
|
*/
|
||||||
void rseq_syscall(struct pt_regs *regs)
|
void __rseq_debug_syscall_return(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct task_struct *t = current;
|
struct task_struct *t = current;
|
||||||
u64 csaddr;
|
u64 csaddr;
|
||||||
|
|
@ -496,6 +495,13 @@ void rseq_syscall(struct pt_regs *regs)
|
||||||
fail:
|
fail:
|
||||||
force_sig(SIGSEGV);
|
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
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue