29
29
# define _TIF_SYSCALL_AUDIT (0)
30
30
#endif
31
31
32
+ #ifndef _TIF_PATCH_PENDING
33
+ # define _TIF_PATCH_PENDING (0)
34
+ #endif
35
+
36
+ #ifndef _TIF_UPROBE
37
+ # define _TIF_UPROBE (0)
38
+ #endif
39
+
32
40
/*
33
41
* TIF flags handled in syscall_enter_from_usermode()
34
42
*/
41
49
_TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_EMU | \
42
50
ARCH_SYSCALL_ENTER_WORK)
43
51
52
+ /*
53
+ * TIF flags handled in syscall_exit_to_user_mode()
54
+ */
55
+ #ifndef ARCH_SYSCALL_EXIT_WORK
56
+ # define ARCH_SYSCALL_EXIT_WORK (0)
57
+ #endif
58
+
59
+ #define SYSCALL_EXIT_WORK \
60
+ (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
61
+ _TIF_SYSCALL_TRACEPOINT | ARCH_SYSCALL_EXIT_WORK)
62
+
63
+ /*
64
+ * TIF flags handled in exit_to_user_mode_loop()
65
+ */
66
+ #ifndef ARCH_EXIT_TO_USER_MODE_WORK
67
+ # define ARCH_EXIT_TO_USER_MODE_WORK (0)
68
+ #endif
69
+
70
+ #define EXIT_TO_USER_MODE_WORK \
71
+ (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
72
+ _TIF_NEED_RESCHED | _TIF_PATCH_PENDING | \
73
+ ARCH_EXIT_TO_USER_MODE_WORK)
74
+
44
75
/**
45
76
* arch_check_user_regs - Architecture specific sanity check for user mode regs
46
77
* @regs: Pointer to currents pt_regs
@@ -105,6 +136,149 @@ static inline __must_check int arch_syscall_enter_tracehook(struct pt_regs *regs
105
136
*/
106
137
long syscall_enter_from_user_mode (struct pt_regs * regs , long syscall );
107
138
139
+ /**
140
+ * local_irq_enable_exit_to_user - Exit to user variant of local_irq_enable()
141
+ * @ti_work: Cached TIF flags gathered with interrupts disabled
142
+ *
143
+ * Defaults to local_irq_enable(). Can be supplied by architecture specific
144
+ * code.
145
+ */
146
+ static inline void local_irq_enable_exit_to_user (unsigned long ti_work );
147
+
148
+ #ifndef local_irq_enable_exit_to_user
149
+ static inline void local_irq_enable_exit_to_user (unsigned long ti_work )
150
+ {
151
+ local_irq_enable ();
152
+ }
153
+ #endif
154
+
155
+ /**
156
+ * local_irq_disable_exit_to_user - Exit to user variant of local_irq_disable()
157
+ *
158
+ * Defaults to local_irq_disable(). Can be supplied by architecture specific
159
+ * code.
160
+ */
161
+ static inline void local_irq_disable_exit_to_user (void );
162
+
163
+ #ifndef local_irq_disable_exit_to_user
164
+ static inline void local_irq_disable_exit_to_user (void )
165
+ {
166
+ local_irq_disable ();
167
+ }
168
+ #endif
169
+
170
+ /**
171
+ * arch_exit_to_user_mode_work - Architecture specific TIF work for exit
172
+ * to user mode.
173
+ * @regs: Pointer to currents pt_regs
174
+ * @ti_work: Cached TIF flags gathered with interrupts disabled
175
+ *
176
+ * Invoked from exit_to_user_mode_loop() with interrupt enabled
177
+ *
178
+ * Defaults to NOOP. Can be supplied by architecture specific code.
179
+ */
180
+ static inline void arch_exit_to_user_mode_work (struct pt_regs * regs ,
181
+ unsigned long ti_work );
182
+
183
+ #ifndef arch_exit_to_user_mode_work
184
+ static inline void arch_exit_to_user_mode_work (struct pt_regs * regs ,
185
+ unsigned long ti_work )
186
+ {
187
+ }
188
+ #endif
189
+
190
+ /**
191
+ * arch_exit_to_user_mode_prepare - Architecture specific preparation for
192
+ * exit to user mode.
193
+ * @regs: Pointer to currents pt_regs
194
+ * @ti_work: Cached TIF flags gathered with interrupts disabled
195
+ *
196
+ * Invoked from exit_to_user_mode_prepare() with interrupt disabled as the last
197
+ * function before return. Defaults to NOOP.
198
+ */
199
+ static inline void arch_exit_to_user_mode_prepare (struct pt_regs * regs ,
200
+ unsigned long ti_work );
201
+
202
+ #ifndef arch_exit_to_user_mode_prepare
203
+ static inline void arch_exit_to_user_mode_prepare (struct pt_regs * regs ,
204
+ unsigned long ti_work )
205
+ {
206
+ }
207
+ #endif
208
+
209
+ /**
210
+ * arch_exit_to_user_mode - Architecture specific final work before
211
+ * exit to user mode.
212
+ *
213
+ * Invoked from exit_to_user_mode() with interrupt disabled as the last
214
+ * function before return. Defaults to NOOP.
215
+ *
216
+ * This needs to be __always_inline because it is non-instrumentable code
217
+ * invoked after context tracking switched to user mode.
218
+ *
219
+ * An architecture implementation must not do anything complex, no locking
220
+ * etc. The main purpose is for speculation mitigations.
221
+ */
222
+ static __always_inline void arch_exit_to_user_mode (void );
223
+
224
+ #ifndef arch_exit_to_user_mode
225
+ static __always_inline void arch_exit_to_user_mode (void ) { }
226
+ #endif
227
+
228
+ /**
229
+ * arch_do_signal - Architecture specific signal delivery function
230
+ * @regs: Pointer to currents pt_regs
231
+ *
232
+ * Invoked from exit_to_user_mode_loop().
233
+ */
234
+ void arch_do_signal (struct pt_regs * regs );
235
+
236
+ /**
237
+ * arch_syscall_exit_tracehook - Wrapper around tracehook_report_syscall_exit()
238
+ * @regs: Pointer to currents pt_regs
239
+ * @step: Indicator for single step
240
+ *
241
+ * Defaults to tracehook_report_syscall_exit(). Can be replaced by
242
+ * architecture specific code.
243
+ *
244
+ * Invoked from syscall_exit_to_user_mode()
245
+ */
246
+ static inline void arch_syscall_exit_tracehook (struct pt_regs * regs , bool step );
247
+
248
+ #ifndef arch_syscall_exit_tracehook
249
+ static inline void arch_syscall_exit_tracehook (struct pt_regs * regs , bool step )
250
+ {
251
+ tracehook_report_syscall_exit (regs , step );
252
+ }
253
+ #endif
254
+
255
+ /**
256
+ * syscall_exit_to_user_mode - Handle work before returning to user mode
257
+ * @regs: Pointer to currents pt_regs
258
+ *
259
+ * Invoked with interrupts enabled and fully valid regs. Returns with all
260
+ * work handled, interrupts disabled such that the caller can immediately
261
+ * switch to user mode. Called from architecture specific syscall and ret
262
+ * from fork code.
263
+ *
264
+ * The call order is:
265
+ * 1) One-time syscall exit work:
266
+ * - rseq syscall exit
267
+ * - audit
268
+ * - syscall tracing
269
+ * - tracehook (single stepping)
270
+ *
271
+ * 2) Preparatory work
272
+ * - Exit to user mode loop (common TIF handling). Invokes
273
+ * arch_exit_to_user_mode_work() for architecture specific TIF work
274
+ * - Architecture specific one time work arch_exit_to_user_mode_prepare()
275
+ * - Address limit and lockdep checks
276
+ *
277
+ * 3) Final transition (lockdep, tracing, context tracking, RCU). Invokes
278
+ * arch_exit_to_user_mode() to handle e.g. speculation mitigations
279
+ */
280
+ void syscall_exit_to_user_mode (struct pt_regs * regs );
281
+
108
282
/**
109
283
* irqentry_enter_from_user_mode - Establish state before invoking the irq handler
110
284
* @regs: Pointer to currents pt_regs
@@ -118,4 +292,19 @@ long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall);
118
292
*/
119
293
void irqentry_enter_from_user_mode (struct pt_regs * regs );
120
294
295
+ /**
296
+ * irqentry_exit_to_user_mode - Interrupt exit work
297
+ * @regs: Pointer to current's pt_regs
298
+ *
299
+ * Invoked with interrupts disbled and fully valid regs. Returns with all
300
+ * work handled, interrupts disabled such that the caller can immediately
301
+ * switch to user mode. Called from architecture specific interrupt
302
+ * handling code.
303
+ *
304
+ * The call order is #2 and #3 as described in syscall_exit_to_user_mode().
305
+ * Interrupt exit is not invoking #1 which is the syscall specific one time
306
+ * work.
307
+ */
308
+ void irqentry_exit_to_user_mode (struct pt_regs * regs );
309
+
121
310
#endif
0 commit comments