diff options
Diffstat (limited to 'arch/x86/entry')
-rw-r--r-- | arch/x86/entry/entry_64.S | 69 | ||||
-rw-r--r-- | arch/x86/entry/entry_64_compat.S | 6 |
2 files changed, 11 insertions, 64 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 | ||
232 | GLOBAL(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 */ |
233 | tracesys: | 238 | tracesys: |
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 | */ |
274 | GLOBAL(int_ret_from_sys_call) | 279 | GLOBAL(int_ret_from_sys_call) |
275 | DISABLE_INTERRUPTS(CLBR_NONE) | ||
276 | int_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 */ | ||
280 | GLOBAL(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 | */ | ||
294 | int_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 */ | ||
307 | int_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 | |||
321 | int_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 | ||
327 | 1: movl $_TIF_WORK_MASK, %edi | ||
328 | int_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 | |||
334 | syscall_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 |
diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S index e5ebdd963a99..d9bbd316530e 100644 --- a/arch/x86/entry/entry_64_compat.S +++ b/arch/x86/entry/entry_64_compat.S | |||
@@ -210,10 +210,10 @@ sysexit_from_sys_call: | |||
210 | .endm | 210 | .endm |
211 | 211 | ||
212 | .macro auditsys_exit exit | 212 | .macro auditsys_exit exit |
213 | testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT), ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) | ||
214 | jnz ia32_ret_from_sys_call | ||
215 | TRACE_IRQS_ON | 213 | TRACE_IRQS_ON |
216 | ENABLE_INTERRUPTS(CLBR_NONE) | 214 | ENABLE_INTERRUPTS(CLBR_NONE) |
215 | testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT), ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) | ||
216 | jnz ia32_ret_from_sys_call | ||
217 | movl %eax, %esi /* second arg, syscall return value */ | 217 | movl %eax, %esi /* second arg, syscall return value */ |
218 | cmpl $-MAX_ERRNO, %eax /* is it an error ? */ | 218 | cmpl $-MAX_ERRNO, %eax /* is it an error ? */ |
219 | jbe 1f | 219 | jbe 1f |
@@ -232,7 +232,7 @@ sysexit_from_sys_call: | |||
232 | movq %rax, R10(%rsp) | 232 | movq %rax, R10(%rsp) |
233 | movq %rax, R9(%rsp) | 233 | movq %rax, R9(%rsp) |
234 | movq %rax, R8(%rsp) | 234 | movq %rax, R8(%rsp) |
235 | jmp int_with_check | 235 | jmp int_ret_from_sys_call_irqs_off |
236 | .endm | 236 | .endm |
237 | 237 | ||
238 | sysenter_auditsys: | 238 | sysenter_auditsys: |