diff options
Diffstat (limited to 'arch/x86/kernel/entry_64.S')
-rw-r--r-- | arch/x86/kernel/entry_64.S | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 734ebd1d3caa..cdc79b5cfcd9 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -481,7 +481,12 @@ GLOBAL(system_call_after_swapgs) | |||
481 | testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) | 481 | testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
482 | jnz tracesys | 482 | jnz tracesys |
483 | system_call_fastpath: | 483 | system_call_fastpath: |
484 | #if __SYSCALL_MASK == ~0 | ||
484 | cmpq $__NR_syscall_max,%rax | 485 | cmpq $__NR_syscall_max,%rax |
486 | #else | ||
487 | andl $__SYSCALL_MASK,%eax | ||
488 | cmpl $__NR_syscall_max,%eax | ||
489 | #endif | ||
485 | ja badsys | 490 | ja badsys |
486 | movq %r10,%rcx | 491 | movq %r10,%rcx |
487 | call *sys_call_table(,%rax,8) # XXX: rip relative | 492 | call *sys_call_table(,%rax,8) # XXX: rip relative |
@@ -595,7 +600,12 @@ tracesys: | |||
595 | */ | 600 | */ |
596 | LOAD_ARGS ARGOFFSET, 1 | 601 | LOAD_ARGS ARGOFFSET, 1 |
597 | RESTORE_REST | 602 | RESTORE_REST |
603 | #if __SYSCALL_MASK == ~0 | ||
598 | cmpq $__NR_syscall_max,%rax | 604 | cmpq $__NR_syscall_max,%rax |
605 | #else | ||
606 | andl $__SYSCALL_MASK,%eax | ||
607 | cmpl $__NR_syscall_max,%eax | ||
608 | #endif | ||
599 | ja int_ret_from_sys_call /* RAX(%rsp) set to -ENOSYS above */ | 609 | ja int_ret_from_sys_call /* RAX(%rsp) set to -ENOSYS above */ |
600 | movq %r10,%rcx /* fixup for C */ | 610 | movq %r10,%rcx /* fixup for C */ |
601 | call *sys_call_table(,%rax,8) | 611 | call *sys_call_table(,%rax,8) |
@@ -735,6 +745,40 @@ ENTRY(stub_rt_sigreturn) | |||
735 | CFI_ENDPROC | 745 | CFI_ENDPROC |
736 | END(stub_rt_sigreturn) | 746 | END(stub_rt_sigreturn) |
737 | 747 | ||
748 | #ifdef CONFIG_X86_X32_ABI | ||
749 | PTREGSCALL stub_x32_sigaltstack, sys32_sigaltstack, %rdx | ||
750 | |||
751 | ENTRY(stub_x32_rt_sigreturn) | ||
752 | CFI_STARTPROC | ||
753 | addq $8, %rsp | ||
754 | PARTIAL_FRAME 0 | ||
755 | SAVE_REST | ||
756 | movq %rsp,%rdi | ||
757 | FIXUP_TOP_OF_STACK %r11 | ||
758 | call sys32_x32_rt_sigreturn | ||
759 | movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer | ||
760 | RESTORE_REST | ||
761 | jmp int_ret_from_sys_call | ||
762 | CFI_ENDPROC | ||
763 | END(stub_x32_rt_sigreturn) | ||
764 | |||
765 | ENTRY(stub_x32_execve) | ||
766 | CFI_STARTPROC | ||
767 | addq $8, %rsp | ||
768 | PARTIAL_FRAME 0 | ||
769 | SAVE_REST | ||
770 | FIXUP_TOP_OF_STACK %r11 | ||
771 | movq %rsp, %rcx | ||
772 | call sys32_execve | ||
773 | RESTORE_TOP_OF_STACK %r11 | ||
774 | movq %rax,RAX(%rsp) | ||
775 | RESTORE_REST | ||
776 | jmp int_ret_from_sys_call | ||
777 | CFI_ENDPROC | ||
778 | END(stub_x32_execve) | ||
779 | |||
780 | #endif | ||
781 | |||
738 | /* | 782 | /* |
739 | * Build the entry stubs and pointer table with some assembler magic. | 783 | * Build the entry stubs and pointer table with some assembler magic. |
740 | * We pack 7 stubs into a single 32-byte chunk, which will fit in a | 784 | * We pack 7 stubs into a single 32-byte chunk, which will fit in a |