Kernel: Use syscall/sysret for syscalls in x86_64
This commit is contained in:
@@ -15,9 +15,7 @@ asm_syscall_handler:
|
||||
andl $-16, %esp
|
||||
|
||||
# push arguments
|
||||
subl $4, %esp
|
||||
pushl %ebp
|
||||
addl $24, (%esp)
|
||||
subl $8, %esp
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
pushl %edx
|
||||
@@ -65,7 +63,7 @@ sys_fork_trampoline:
|
||||
|
||||
call read_ip
|
||||
testl %eax, %eax
|
||||
jz .reload_stack
|
||||
jz .done
|
||||
|
||||
movl %esp, %ebx
|
||||
|
||||
@@ -81,9 +79,3 @@ sys_fork_trampoline:
|
||||
popl %ebx
|
||||
popl %ebp
|
||||
ret
|
||||
|
||||
.reload_stack:
|
||||
call get_thread_start_sp
|
||||
movl %eax, %esp
|
||||
xorl %eax, %eax
|
||||
jmp .done
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.macro maybe_load_kernel_segments, n
|
||||
cmpb $0x08, \n(%esp)
|
||||
je 1f
|
||||
testb $3, \n(%esp)
|
||||
jz 1f; jnp 1f
|
||||
|
||||
movw $0x10, %ax
|
||||
movw %ax, %ds
|
||||
@@ -13,8 +13,8 @@
|
||||
.endm
|
||||
|
||||
.macro maybe_load_userspace_segments, n
|
||||
cmpb $0x08, \n(%esp)
|
||||
je 1f
|
||||
testb $3, \n(%esp)
|
||||
jz 1f; jnp 1f
|
||||
|
||||
movw $(0x20 | 3), %bx
|
||||
movw %bx, %ds
|
||||
|
||||
@@ -1,50 +1,26 @@
|
||||
// arguments in RAX, RBX, RCX, RDX, RSI, RDI
|
||||
// System V ABI: RDI, RSI, RDX, RCX, R8, R9
|
||||
.global asm_syscall_handler
|
||||
asm_syscall_handler:
|
||||
swapgs
|
||||
pushq %rbx
|
||||
pushq %rcx
|
||||
pushq %rdx
|
||||
pushq %rdi
|
||||
pushq %rsi
|
||||
pushq %rbp
|
||||
pushq %r8
|
||||
pushq %r9
|
||||
pushq %r10
|
||||
|
||||
movq %rsp, %rax
|
||||
movq %gs:8, %rsp
|
||||
|
||||
pushq $(0x20 | 3)
|
||||
pushq %rax
|
||||
pushq %r11
|
||||
pushq %r12
|
||||
pushq %r13
|
||||
pushq %r14
|
||||
pushq %r15
|
||||
cld
|
||||
pushq $(0x28 | 3)
|
||||
pushq %rcx
|
||||
subq $8, %rsp
|
||||
|
||||
movq %rsi, %r8
|
||||
movq %rdi, %r9
|
||||
movq %rax, %rdi
|
||||
movq %rbx, %rsi
|
||||
xchgq %rcx, %rdx
|
||||
leaq 112(%rsp), %rbx
|
||||
pushq %rbx
|
||||
movq %r10, %rcx
|
||||
call cpp_syscall_handler
|
||||
addq $8, %rsp
|
||||
|
||||
popq %r15
|
||||
popq %r14
|
||||
popq %r13
|
||||
popq %r12
|
||||
popq %r11
|
||||
popq %r10
|
||||
popq %r9
|
||||
popq %r8
|
||||
popq %rbp
|
||||
popq %rsi
|
||||
popq %rdi
|
||||
popq %rdx
|
||||
popq %rcx
|
||||
popq %rbx
|
||||
movq 8(%rsp), %rcx
|
||||
movq 24(%rsp), %r11
|
||||
movq 32(%rsp), %rsp
|
||||
|
||||
swapgs
|
||||
iretq
|
||||
sysretq
|
||||
|
||||
.global sys_fork_trampoline
|
||||
sys_fork_trampoline:
|
||||
@@ -57,7 +33,7 @@ sys_fork_trampoline:
|
||||
|
||||
call read_ip
|
||||
testq %rax, %rax
|
||||
je .reload_stack
|
||||
je .done
|
||||
|
||||
movq %rax, %rsi
|
||||
movq %rsp, %rdi
|
||||
@@ -71,9 +47,3 @@ sys_fork_trampoline:
|
||||
popq %rbp
|
||||
popq %rbx
|
||||
ret
|
||||
|
||||
.reload_stack:
|
||||
call get_thread_start_sp
|
||||
movq %rax, %rsp
|
||||
xorq %rax, %rax
|
||||
jmp .done
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.macro swapgs_if_necessary, n
|
||||
cmpb $0x08, \n(%rsp)
|
||||
je 1f
|
||||
testb $3, \n(%rsp)
|
||||
jz 1f; jnp 1f
|
||||
swapgs
|
||||
1:
|
||||
.endm
|
||||
|
||||
Reference in New Issue
Block a user