aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/entry/entry_64.S
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@kernel.org>2015-07-03 15:44:28 -0400
committerIngo Molnar <mingo@kernel.org>2015-07-07 04:59:07 -0400
commit29ea1b258b98a862e59d72556714b75051ae93fb (patch)
tree60725448da62bb6eb3dc300ad565b23eb1ce7131 /arch/x86/entry/entry_64.S
parentcb6f64ed5a04036eef07e70b57dd5dd78f2fbcef (diff)
x86/entry/64: Migrate 64-bit and compat syscalls to the new exit handlers and remove old assembly code
These need to be migrated together, as the compat case used to jump into the middle of the 64-bit exit code. Remove the old assembly code. Signed-off-by: Andy Lutomirski <luto@kernel.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: Denys Vlasenko <vda.linux@googlemail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Kees Cook <keescook@chromium.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rik van Riel <riel@redhat.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: paulmck@linux.vnet.ibm.com Link: http://lkml.kernel.org/r/d4d1d70de08ac3640badf50048a9e8f18fe2497f.1435952415.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
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