aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/entry/entry_64.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/entry/entry_64.S')
-rw-r--r--arch/x86/entry/entry_64.S69
1 files changed, 8 insertions, 61 deletions
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index ccfcba90de6e..4ca5b782ed70 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -229,6 +229,11 @@ entry_SYSCALL_64_fastpath:
229 */ 229 */
230 USERGS_SYSRET64 230 USERGS_SYSRET64
231 231
232GLOBAL(int_ret_from_sys_call_irqs_off)
233 TRACE_IRQS_ON
234 ENABLE_INTERRUPTS(CLBR_NONE)
235 jmp int_ret_from_sys_call
236
232 /* Do syscall entry tracing */ 237 /* Do syscall entry tracing */
233tracesys: 238tracesys:
234 movq %rsp, %rdi 239 movq %rsp, %rdi
@@ -272,69 +277,11 @@ tracesys_phase2:
272 * Has correct iret frame. 277 * Has correct iret frame.
273 */ 278 */
274GLOBAL(int_ret_from_sys_call) 279GLOBAL(int_ret_from_sys_call)
275 DISABLE_INTERRUPTS(CLBR_NONE)
276int_ret_from_sys_call_irqs_off: /* jumps come here from the irqs-off SYSRET path */
277 TRACE_IRQS_OFF
278 movl $_TIF_ALLWORK_MASK, %edi
279 /* edi: mask to check */
280GLOBAL(int_with_check)
281 LOCKDEP_SYS_EXIT_IRQ
282 GET_THREAD_INFO(%rcx)
283 movl TI_flags(%rcx), %edx
284 andl %edi, %edx
285 jnz int_careful
286 andl $~TS_COMPAT, TI_status(%rcx)
287 jmp syscall_return
288
289 /*
290 * Either reschedule or signal or syscall exit tracking needed.
291 * First do a reschedule test.
292 * edx: work, edi: workmask
293 */
294int_careful:
295 bt $TIF_NEED_RESCHED, %edx
296 jnc int_very_careful
297 TRACE_IRQS_ON
298 ENABLE_INTERRUPTS(CLBR_NONE)
299 pushq %rdi
300 SCHEDULE_USER
301 popq %rdi
302 DISABLE_INTERRUPTS(CLBR_NONE)
303 TRACE_IRQS_OFF
304 jmp int_with_check
305
306 /* handle signals and tracing -- both require a full pt_regs */
307int_very_careful:
308 TRACE_IRQS_ON
309 ENABLE_INTERRUPTS(CLBR_NONE)
310 SAVE_EXTRA_REGS 280 SAVE_EXTRA_REGS
311 /* Check for syscall exit trace */ 281 movq %rsp, %rdi
312 testl $_TIF_WORK_SYSCALL_EXIT, %edx 282 call syscall_return_slowpath /* returns with IRQs disabled */
313 jz int_signal
314 pushq %rdi
315 leaq 8(%rsp), %rdi /* &ptregs -> arg1 */
316 call syscall_trace_leave
317 popq %rdi
318 andl $~(_TIF_WORK_SYSCALL_EXIT|_TIF_SYSCALL_EMU), %edi
319 jmp int_restore_rest
320
321int_signal:
322 testl $_TIF_DO_NOTIFY_MASK, %edx
323 jz 1f
324 movq %rsp, %rdi /* &ptregs -> arg1 */
325 xorl %esi, %esi /* oldset -> arg2 */
326 call do_notify_resume
3271: movl $_TIF_WORK_MASK, %edi
328int_restore_rest:
329 RESTORE_EXTRA_REGS 283 RESTORE_EXTRA_REGS
330 DISABLE_INTERRUPTS(CLBR_NONE) 284 TRACE_IRQS_IRETQ /* we're about to change IF */
331 TRACE_IRQS_OFF
332 jmp int_with_check
333
334syscall_return:
335 /* The IRETQ could re-enable interrupts: */
336 DISABLE_INTERRUPTS(CLBR_ANY)
337 TRACE_IRQS_IRETQ
338 285
339 /* 286 /*
340 * Try to use SYSRET instead of IRET if we're returning to 287 * Try to use SYSRET instead of IRET if we're returning to