blob: a8f9315b9eaeff990bf3781b3f085b16619acf8b [file] [log] [blame]
Thomas Gleixner27d6b4d2020-07-23 00:00:04 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2#ifndef _ASM_X86_ENTRY_COMMON_H
3#define _ASM_X86_ENTRY_COMMON_H
4
Thomas Gleixner167fd212020-07-23 00:00:05 +02005#include <linux/user-return-notifier.h>
6
7#include <asm/nospec-branch.h>
8#include <asm/io_bitmap.h>
9#include <asm/fpu/api.h>
10
Thomas Gleixner27d6b4d2020-07-23 00:00:04 +020011/* Check that the stack and regs on entry from user mode are sane. */
12static __always_inline void arch_check_user_regs(struct pt_regs *regs)
13{
14 if (IS_ENABLED(CONFIG_DEBUG_ENTRY)) {
15 /*
16 * Make sure that the entry code gave us a sensible EFLAGS
17 * register. Native because we want to check the actual CPU
18 * state, not the interrupt state as imagined by Xen.
19 */
20 unsigned long flags = native_save_fl();
21 WARN_ON_ONCE(flags & (X86_EFLAGS_AC | X86_EFLAGS_DF |
22 X86_EFLAGS_NT));
23
24 /* We think we came from user mode. Make sure pt_regs agrees. */
25 WARN_ON_ONCE(!user_mode(regs));
26
27 /*
28 * All entries from user mode (except #DF) should be on the
29 * normal thread stack and should have user pt_regs in the
30 * correct location.
31 */
32 WARN_ON_ONCE(!on_thread_stack());
33 WARN_ON_ONCE(regs != task_pt_regs(current));
34 }
35}
36#define arch_check_user_regs arch_check_user_regs
37
Thomas Gleixner167fd212020-07-23 00:00:05 +020038#define ARCH_SYSCALL_EXIT_WORK (_TIF_SINGLESTEP)
39
40static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
41 unsigned long ti_work)
42{
43 if (ti_work & _TIF_USER_RETURN_NOTIFY)
44 fire_user_return_notifiers();
45
46 if (unlikely(ti_work & _TIF_IO_BITMAP))
47 tss_update_io_bitmap();
48
49 fpregs_assert_state_consistent();
50 if (unlikely(ti_work & _TIF_NEED_FPU_LOAD))
51 switch_fpu_return();
52
53#ifdef CONFIG_COMPAT
54 /*
55 * Compat syscalls set TS_COMPAT. Make sure we clear it before
56 * returning to user mode. We need to clear it *after* signal
57 * handling, because syscall restart has a fixup for compat
58 * syscalls. The fixup is exercised by the ptrace_syscall_32
59 * selftest.
60 *
61 * We also need to clear TS_REGS_POKED_I386: the 32-bit tracer
62 * special case only applies after poking regs and before the
63 * very next return to user mode.
64 */
65 current_thread_info()->status &= ~(TS_COMPAT | TS_I386_REGS_POKED);
66#endif
67}
68#define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare
69
70static __always_inline void arch_exit_to_user_mode(void)
71{
72 mds_user_clear_cpu_buffers();
73}
74#define arch_exit_to_user_mode arch_exit_to_user_mode
75
Thomas Gleixner27d6b4d2020-07-23 00:00:04 +020076#endif