Messages in this thread Patch in this message | | | Date | Tue, 25 Feb 2020 23:08:06 +0100 | From | Thomas Gleixner <> | Subject | [patch 5/8] x86/entry/common: Provide trace/kprobe safe exit to user space functions |
| |
Split prepare_enter_to_user_mode() and mark it notrace/noprobe so the irq flags tracing on return can be put into it.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- arch/x86/entry/common.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
--- a/arch/x86/entry/common.c +++ b/arch/x86/entry/common.c @@ -196,7 +196,7 @@ static void exit_to_usermode_loop(struct } /* Called with IRQs disabled. */ -__visible inline void prepare_exit_to_usermode(struct pt_regs *regs) +static inline void __prepare_exit_to_usermode(struct pt_regs *regs) { struct thread_info *ti = current_thread_info(); u32 cached_flags; @@ -241,6 +241,12 @@ static void exit_to_usermode_loop(struct mds_user_clear_cpu_buffers(); } +__visible inline notrace void prepare_exit_to_usermode(struct pt_regs *regs) +{ + __prepare_exit_to_usermode(regs); +} +NOKPROBE_SYMBOL(prepare_exit_to_usermode); + #define SYSCALL_EXIT_WORK_FLAGS \ (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ _TIF_SINGLESTEP | _TIF_SYSCALL_TRACEPOINT) @@ -271,7 +277,7 @@ static void syscall_slow_exit_work(struc * Called with IRQs on and fully valid regs. Returns with IRQs off in a * state such that we can immediately switch to user mode. */ -__visible inline void syscall_return_slowpath(struct pt_regs *regs) +__visible inline notrace void syscall_return_slowpath(struct pt_regs *regs) { struct thread_info *ti = current_thread_info(); u32 cached_flags = READ_ONCE(ti->flags); @@ -292,8 +298,9 @@ static void syscall_slow_exit_work(struc syscall_slow_exit_work(regs, cached_flags); local_irq_disable(); - prepare_exit_to_usermode(regs); + __prepare_exit_to_usermode(regs); } +NOKPROBE_SYMBOL(syscall_return_slowpath); #ifdef CONFIG_X86_64 static __always_inline @@ -417,7 +424,7 @@ static __always_inline long do_fast_sysc /* User code screwed up. */ local_irq_disable(); regs->ax = -EFAULT; - prepare_exit_to_usermode(regs); + __prepare_exit_to_usermode(regs); return 0; /* Keep it simple: use IRET. */ }
| |