aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/entry/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/entry/common.c')
-rw-r--r--arch/x86/entry/common.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c
index df56ca394877..81c0e12d831c 100644
--- a/arch/x86/entry/common.c
+++ b/arch/x86/entry/common.c
@@ -73,6 +73,7 @@ static long syscall_trace_enter(struct pt_regs *regs)
73 73
74 struct thread_info *ti = pt_regs_to_thread_info(regs); 74 struct thread_info *ti = pt_regs_to_thread_info(regs);
75 unsigned long ret = 0; 75 unsigned long ret = 0;
76 bool emulated = false;
76 u32 work; 77 u32 work;
77 78
78 if (IS_ENABLED(CONFIG_DEBUG_ENTRY)) 79 if (IS_ENABLED(CONFIG_DEBUG_ENTRY))
@@ -80,11 +81,19 @@ static long syscall_trace_enter(struct pt_regs *regs)
80 81
81 work = ACCESS_ONCE(ti->flags) & _TIF_WORK_SYSCALL_ENTRY; 82 work = ACCESS_ONCE(ti->flags) & _TIF_WORK_SYSCALL_ENTRY;
82 83
84 if (unlikely(work & _TIF_SYSCALL_EMU))
85 emulated = true;
86
87 if ((emulated || (work & _TIF_SYSCALL_TRACE)) &&
88 tracehook_report_syscall_entry(regs))
89 return -1L;
90
91 if (emulated)
92 return -1L;
93
83#ifdef CONFIG_SECCOMP 94#ifdef CONFIG_SECCOMP
84 /* 95 /*
85 * Do seccomp first -- it should minimize exposure of other 96 * Do seccomp after ptrace, to catch any tracer changes.
86 * code, and keeping seccomp fast is probably more valuable
87 * than the rest of this.
88 */ 97 */
89 if (work & _TIF_SECCOMP) { 98 if (work & _TIF_SECCOMP) {
90 struct seccomp_data sd; 99 struct seccomp_data sd;
@@ -117,13 +126,6 @@ static long syscall_trace_enter(struct pt_regs *regs)
117 } 126 }
118#endif 127#endif
119 128
120 if (unlikely(work & _TIF_SYSCALL_EMU))
121 ret = -1L;
122
123 if ((ret || test_thread_flag(TIF_SYSCALL_TRACE)) &&
124 tracehook_report_syscall_entry(regs))
125 ret = -1L;
126
127 if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) 129 if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
128 trace_sys_enter(regs, regs->orig_ax); 130 trace_sys_enter(regs, regs->orig_ax);
129 131