// arguments in RAX, RBX, RCX, RDX, RSI, RDI
// System V ABI: RDI, RSI, RDX, RCX, R8, R9
.global asm_syscall_handler
asm_syscall_handler:
	pushq %rbx
	pushq %rcx
	pushq %rdx
	pushq %rdi
	pushq %rsi
	pushq %rbp
	pushq %r8
	pushq %r9
	pushq %r10
	pushq %r11
	pushq %r12
	pushq %r13
	pushq %r14
	pushq %r15

	movq %rsi, %r8
	movq %rdi, %r9
	movq %rax, %rdi
	movq %rbx, %rsi
	xchgq %rcx, %rdx
	leaq 112(%rsp), %rbx
	pushq %rbx
	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
	iretq


.global sys_fork_trampoline
sys_fork_trampoline:
	pushq %rbx
	pushq %rbp
	pushq %r12
	pushq %r13
	pushq %r14
	pushq %r15

	call read_ip
	testq %rax, %rax
	je .reload_stack

	movq %rax, %rsi
	movq %rsp, %rdi
	call sys_fork

 .done:
	popq %r15
	popq %r14
	popq %r13
	popq %r12
	popq %rbp
	popq %rbx
	ret

 .reload_stack:
	call get_thread_start_sp
	movq %rax, %rsp
	xorq %rax, %rax
	jmp .done