# uint64_t read_rip()
.global read_rip
read_rip:
	popq %rax
	jmp *%rax

exit_thread_trampoline:
	movq 8(%rsp), %rdi
	ret

# void start_thread(uint64_t rsp, uint64_t rip)
.global start_thread
start_thread:
	movq %rdi, %rsp
	popq %rdi
	movq $0, %rbp
	pushq $exit_thread_trampoline
	sti
	jmp *%rsi

# void continue_thread(uint64_t rsp, uint64_t rip)
.global continue_thread
continue_thread:
	movq %rdi, %rsp
	movq $0, %rax
	jmp *%rsi

# void thread_userspace_trampoline(uint64_t rsp, uint64_t rip, int argc, char** argv, char** envp)
.global thread_userspace_trampoline
thread_userspace_trampoline:
	pushq $0x23
	pushq %rdi
	pushfq
	pushq $0x1B
	pushq %rsi
	movq %rdx, %rdi
	movq %rcx, %rsi
	movq %r8, %rdx
	iretq